【发布时间】:2017-12-10 23:34:32
【问题描述】:
我正在为客户创建一个自定义系统。他已经安装了带有 WooCommerce 的 Wordpress 来销售他的产品。我知道它确实有效。他的销售、运输、跟踪,一切都很好。
我正在尝试做的是捕获每一次有效、成功的销售并将数据传递给第 3 方 API(我在 Yii2 框架上创建的)。我的系统需要“告知”每笔已完成的销售。我不关心待处理,只关心完成。
在找到其他关于此的 SO 线程后,我使用了 woocommerce_payment_complete 动作挂钩。看起来合法:)
但是,当我使用它时,它只适用于免费结账(当贝宝因 100% 优惠券而被绕过时)。它将数据发送到我的第 3 方 API 就好了。然后我使用 PayPal 沙盒交易进行了测试。两者都充满电,还有 99% 的优惠券(在测试期间不会耗尽沙盒资金)。使用 PayPal 时,从用户端看起来一切正常(返回商家,成功收款页面),但没有数据传递给我的 3rd 方 API。很奇怪,因为免费购买(绕过贝宝的 100% 优惠券)效果很好。
也许这个动作钩子不能正常工作。也许 WooCommerce 现在有一个新的,而我正在使用旧的?我应该使用哪个动作挂钩?
也许当 WooCommerce 使用 PayPal 沙箱时,此操作挂钩无法正常工作?我还没有用真钱测试过真正的交易,这就是沙盒的意义,用大声笑来测试!据我所知,它可以在实时测试期间工作。
也许这个动作钩子不适用于 PayPal?
希望有更多 Wordpress 和 WooCommerce 经验的人可以帮助我缩小范围。
这里是我的自定义插件的胆量,用于捕获动作钩子。我的自定义插件只有一个简单的 1 选项页面来输入 API url,因此可以从 WP 管理仪表板轻松更改(截断为 SO)。
<?php
if ( ! defined( 'ABSPATH' ) ) {
die('Access Denied!');
}
define('WCO_ROOT_DIR', __DIR__);
function init()
{
add_action( 'woocommerce_payment_complete', 'wco_payment_complete' );
}
function wco_payment_complete( $order_id )
{
$order = wc_get_order( $order_id );
$billingEmail = $order->billing_email;
$products = $order->get_items();
$items = [];
foreach($products as $prod){
$items[$prod['product_id']] = $prod['name'];
}
// gets the API url from database
$url = get_option('wco_api_url');
$response = wp_remote_post( $url, array(
'method' => 'POST',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(),
'body' => array( 'billingemail' => $billingEmail, 'items' => $items ),
'cookies' => array()
)
);
if ( is_wp_error( $response ) )
{
$error_message = $response->get_error_message();
file_put_contents(ABSPATH . '/wco-orders.log', '[WooCompletedOrders] Error: ' . $error_message, FILE_APPEND | LOCK_EX);
} else {
$logData = '--------------------' . PHP_EOL;
$logData .= '[WooCompletedOrders] Success: Posted data to API: ' . PHP_EOL;
$logData .= print_r($order, true);
$logData .= '--------------------' . PHP_EOL;
file_put_contents(ABSPATH . '/wco-orders.log', $logData, FILE_APPEND | LOCK_EX);
}
}
init();
【问题讨论】:
-
通过PayPal重定向支付的订单的订单状态如何?它们是更新为“已完成”还是被保留为“处理中”?
-
@AndrewAngell 他们处于“等待状态”。当它免费时,绕过贝宝,并且钩子有效(传递给我的第 3 方 api),它们列为“处理中”。
标签: php wordpress paypal woocommerce hook-woocommerce