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并通知管理员,而不是继续挂起订单。
效果验证:确保每一步都正确
完成代码开发后,务必进行以下测试:
- 创建虚拟商品:在 WooCommerce 产品编辑页,勾选“虚拟”和“仅下载”选项。
- 模拟支付:使用 WooCommerce 自带的“现金交付”或“银行转账”等离线支付方式,将订单状态手动改为“已完成”。
- 检查卡密发放:登录用户账户查看订单详情,或检查注册邮箱是否收到包含卡密的邮件。
- 查看库存变化:确认数据库中对应卡密已被标记为已使用。
此外,建议使用 [WP Crontrol] 插件检查定时任务是否正常,防止因缓存问题导致交付延迟。
常见问题解答:
- 为什么订单状态已完成,但卡密没发? 请检查钩子是否挂载成功,并排查是否有其他插件修改了订单状态。
- 如何防止卡密被重复使用? 在发放时立即将卡密状态更新为“已使用”,并使用数据库唯一索引或事务来保证原子性。
- 能否支持多种虚拟商品(如下载链接和卡密混合)? 可以,但需在代码中根据产品类型区分交付逻辑。
如果你正在处理 WooCommerce 虚拟商品售卖流程,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
只要按步骤操作,并理解核心钩子与库存管理逻辑,你就能实现一个稳定可靠的自动发卡系统。