通过webhook等待付款状态时,订单付款状态检查失败



我正在构建一个支付插件。它的工作方式是点击结账页面上的支付选项,用户在他们的手机上得到一个链接,在那里他们可以完成支付,然后触发一个webhook到WooCommerce网站,状态根据webhook收到的数据更新为支付/失败。

要求是,点击支付选项后显示的旋转器保持在webhook数据被接收或在2分钟后超时。现在webhook正在做它的工作,但是spinner背后的逻辑失败了。不知道哪里出了问题

这是代码得到触发后的短信与链接发送给用户。do...while循环内部的逻辑不起作用

WC()->cart->empty_cart();
$order->update_status('wc-pending', __('Awaiting payment.', 'txtdomain'));
$loop = 8;
$loopOrder = wc_get_order($order_id);
do {
sleep(15);
$loopOrder = wc_get_order($order_id);
$loop--;
} while ($loopOrder->get_status() == "pending" && $loop >= 0);
if ($loopOrder->get_status() == "pending" || $loopOrder->get_status() == "failed") {
$_SESSION["order_id"] = $order_id;
$_SESSION["timeout"] = (time() + ($GLOBALS['retry_delay_in_minutes'] * 60));
$error_message = 'Timed out. Please wait <span id="retry_timer">' . ($_SESSION["timeout"] - time()) . '</span> seconds before retrying';
if($loopOrder->get_status() == "failed"){
$error_message = 'Payment failed. Please wait <span id="retry_timer">' . ($_SESSION["timeout"] - time()) . '</span> seconds before retrying';
}
wc_add_notice($error_message, 'error');
return array(
'result' => 'failed',
);
} else {
return array(
'result' => 'success',
'redirect' => $order->get_checkout_order_received_url()
);
}

和下面是在接收webhook

时触发的代码
$order = wc_get_order($request["OrderNumber"]);
if ($request["StatusID"] == 0) {
$order->update_status('wc-failed');
} else {
update_post_meta($request["OrderNumber"], 'invoiceid', $request["TransactionID"]);
$shipping = false;
foreach ($order->get_items() as $order_item) {
$item = wc_get_product($order_item->get_product_id());
if (!$item->is_virtual()) {
$shipping = true;
}
}
if ($shipping) {
$order->update_status('wc-processing');
} else {
$order->update_status('wc-completed');
}
}
return true;

经过多次尝试和错误后,我明白$loopOrder = wc_get_order($order_id);不会从数据库加载订单信息。因此,为了获取更新的信息,在获取当前信息后添加$loopOrder->save();解决了这个问题。

看起来像你的do/while条件检查get_status()方法的返回值对无前缀字符串"pending"one_answers"failed",而第二块代码中的update_status()方法可能是将用于订单状态的类变量设置为字符串,这些字符串都包含"wc-"前缀(wc-failed, wc-processing, wc-completed等)

$loopOrder->get_status() == "pending"更改为$loopOrder->get_status() == "wc-pending",将$loopOrder->get_status() == "failed"更改为$loopOrder->get_status() == "wc-failed"

最新更新