如何在WooCommerce中创建支付完成触发的自定义Webhook并定制Payload
解决WooCommerce支付完成时Webhook携带完整订单Payload的问题
问题背景
你已经通过将Webhook触发器设为Action、动作名称指定woocommerce_payment_complete,实现了支付完成时触发Webhook,但默认情况下该动作触发的Webhook没有携带订单详情Payload,需要通过自定义代码调整Payload内容。
具体实现方案
1. 注入自定义代码
在WordPress中,可通过woocommerce_webhook_payload过滤器修改Webhook的Payload内容,针对woocommerce_payment_complete动作的Webhook做定向修改:
add_filter( 'woocommerce_webhook_payload', 'custom_payment_complete_webhook_payload', 10, 4 ); function custom_payment_complete_webhook_payload( $payload, $resource, $resource_id, $webhook ) { // 仅针对woocommerce_payment_complete动作的Webhook生效 if ( $webhook->get_topic() === 'action' && $webhook->get_hook() === 'woocommerce_payment_complete' ) { // 获取对应订单对象 $order = wc_get_order( $resource_id ); if ( $order ) { // 提取订单完整基础数据 $payload = $order->get_data(); // 可选:补充订单行项、支付信息等细节字段 $payload['line_items'] = []; foreach ( $order->get_items() as $item_id => $item ) { $payload['line_items'][] = [ 'id' => $item_id, 'name' => $item->get_name(), 'quantity' => $item->get_quantity(), 'subtotal' => $item->get_subtotal(), 'total' => $item->get_total() ]; } $payload['payment_method'] = $order->get_payment_method_title(); $payload['payment_status'] = $order->get_status(); } } return $payload; }
2. 代码说明
woocommerce_webhook_payload过滤器允许直接修改Webhook发送的Payload,入参包含原始Payload、资源类型、资源ID、Webhook实例。- 通过判断Webhook的主题为
action且动作名称匹配woocommerce_payment_complete,确保只修改目标Webhook的内容。 - 用
wc_get_order( $resource_id )获取完整订单对象,get_data()方法可导出订单的全部基础数据数组。 - 可选的补充字段部分,可根据业务需求添加订单行项、支付方式、订单状态等细节信息。
3. 验证效果
添加代码后,完成一笔测试支付,检查Webhook发送到目标端点的Payload,即可看到包含完整订单详情的数据。
内容的提问来源于stack exchange,提问作者AlePouroullis
相关产品推荐
相关产品推荐

