WooCommerce虚拟商品售卖流程

在使用 WooCommerce 售卖虚拟商品时,最常遇到的问题就是如何实现自动交付,比如用户付款后自动发放卡密、下载链接或会员权限。
本文将从零开始,详细讲解 WooCommerce 虚拟商品自动发卡与自动交付插件的二次开发方法,让你即使不懂代码,也能按步骤完成配置与开发,最终实现全自动售卖。

开发前的准备:你需要什么?

在进行二次开发前,请先确认你的环境满足以下条件:

  • 一个可用的 WordPress 站点,并已安装 WooCommerce 插件。
  • 一个用于存放虚拟商品数据的载体,如自定义数据表或第三方发卡平台 API。
  • 基础的 PHP 和 WordPress 钩子(Hook)知识,若没有,可先参考相关基础教程。
  • 一个用于测试的沙盒环境,避免在正式站点上直接调试。

此外,建议在本地或子目录搭建一个测试站,优先使用官方主题和默认插件环境进行开发。

核心流程:订单状态与自动交付逻辑

自动交付的关键在于监听 WooCommerce 的订单状态变化。
当订单状态变为 completed(已完成)时,触发交付动作。
常见交付物包括:

  • 卡密文本或图片,可直接发送到用户邮箱或订单详情页。
  • 下载链接,需设置临时访问权限或防盗链。
  • 会员权限,通过用户角色或会员插件实现。

若你售卖的是卡密,通常会在后台手动导入或通过 API 获取库存,然后每次支付成功后从库存中取出一条未使用的卡密,标记为已售出,并发送给用户。

二次开发:实现自动发卡的关键代码

下面是一个简化的 PHP 代码示例,展示如何挂载订单完成钩子,并查找库存数据进行交付:

add_action( 'woocommerce_order_status_completed', 'auto_deliver_virtual_product', 10, 1 );

function auto_deliver_virtual_product( $order_id ) {
    $order = wc_get_order( $order_id );
    $items = $order->get_items();

    foreach ( $items as $item ) {
        $product_id = $item->get_product_id();
        $is_virtual = get_post_meta( $product_id, '_virtual', true );
        if ( $is_virtual !== 'yes' ) continue;

        // 从自定义表或第三方 API 获取未使用卡密
        $card = get_unused_card();
        if ( $card ) {
            // 标记卡密已使用,并关联订单号
            mark_card_used( $card->id, $order_id );
            // 发送邮件给用户,包含卡密信息
            $order->add_order_note( '卡密已发放:' . $card->code );
            wc_mail( $order->get_billing_email(), '您的虚拟商品卡密', '您的卡密是:' . $card->code );
        } else {
            $order->update_status( 'on-hold', '库存不足,请及时补货。' );
        }
    }
}

注意:上述代码仅为逻辑演示,实际使用时需要根据你的卡密存储方式调整 get_unused_card()mark_card_used() 函数。
若你使用的是第三方发卡平台,可直接调用其 API 获取和标记卡密。

避坑指南:四个注意点

二次开发过程中,新手常会遇到以下问题,请提前规避:

  • 订单状态判断不准确:务必使用 woocommerce_order_status_completed 钩子,而不是 woocommerce_payment_complete,后者可能因支付网关回调延迟而漏触发。
  • 库存不同步:如果使用自定义表存储卡密,需确保写入和更新操作使用事务,防止并发时重复发送同一卡密。
  • 邮件发送失败:建议使用 SMTP 插件配置邮件服务,否则可能被服务器默认的 PHP mail 函数限制,导致用户收不到卡密。
  • 忽略订单失败:当库存不足时,应立即将订单状态置为 on-hold 并通知管理员,而不是继续挂起订单。

效果验证:确保每一步都正确

完成代码开发后,务必进行以下测试:

  1. 创建虚拟商品:在 WooCommerce 产品编辑页,勾选“虚拟”和“仅下载”选项。
  2. 模拟支付:使用 WooCommerce 自带的“现金交付”或“银行转账”等离线支付方式,将订单状态手动改为“已完成”。
  3. 检查卡密发放:登录用户账户查看订单详情,或检查注册邮箱是否收到包含卡密的邮件。
  4. 查看库存变化:确认数据库中对应卡密已被标记为已使用。

此外,建议使用 [WP Crontrol] 插件检查定时任务是否正常,防止因缓存问题导致交付延迟。

常见问题解答:

  • 为什么订单状态已完成,但卡密没发? 请检查钩子是否挂载成功,并排查是否有其他插件修改了订单状态。
  • 如何防止卡密被重复使用? 在发放时立即将卡密状态更新为“已使用”,并使用数据库唯一索引或事务来保证原子性。
  • 能否支持多种虚拟商品(如下载链接和卡密混合)? 可以,但需在代码中根据产品类型区分交付逻辑。

如果你正在处理 WooCommerce 虚拟商品售卖流程,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
只要按步骤操作,并理解核心钩子与库存管理逻辑,你就能实现一个稳定可靠的自动发卡系统。

分享到:
上一篇
静态独立IP产品客户协议,明确IP屏蔽不属于服务商责任条款
下一篇
WordPress防止插件主题泄露版本号
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意