通过 webhook 等待付款状态时,订单付款状态检查失败
Order payment status check failing when waiting for payment status through a webhook
我正在构建一个支付插件。它的工作方式是点击结帐页面上的支付选项,用户在他们的手机 phone 上获得一个 link ,他们可以在其中完成支付,然后触发到 WooCommerce 网站的网络钩子和状态获取根据 webhook 中收到的数据更新为 paid/failed。
要求是点击支付选项后显示的微调器保持打开状态,直到收到 webhook 数据或在 2 分钟后超时。现在 webhook 正在做它的工作,但微调器背后的逻辑失败了。不确定出了什么问题
这是在带有 link 的短信发送给用户后触发的代码。 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;
看起来你的 do/while 条件检查 get_status() 方法的 return 值与 un-prefixed 字符串“pending”和“failed”,而 [=第二个代码块中的 24=]() 方法大概是将订单状态的 class 变量设置为全部包含“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"
。
经过多次试验和错误后,我了解到 $loopOrder = wc_get_order($order_id);
不会从数据库中加载订单信息。因此,要获取更新的信息,请在获取当前信息后添加 $loopOrder->save();
解决问题。
我正在构建一个支付插件。它的工作方式是点击结帐页面上的支付选项,用户在他们的手机 phone 上获得一个 link ,他们可以在其中完成支付,然后触发到 WooCommerce 网站的网络钩子和状态获取根据 webhook 中收到的数据更新为 paid/failed。
要求是点击支付选项后显示的微调器保持打开状态,直到收到 webhook 数据或在 2 分钟后超时。现在 webhook 正在做它的工作,但微调器背后的逻辑失败了。不确定出了什么问题
这是在带有 link 的短信发送给用户后触发的代码。 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;
看起来你的 do/while 条件检查 get_status() 方法的 return 值与 un-prefixed 字符串“pending”和“failed”,而 [=第二个代码块中的 24=]() 方法大概是将订单状态的 class 变量设置为全部包含“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"
。
经过多次试验和错误后,我了解到 $loopOrder = wc_get_order($order_id);
不会从数据库中加载订单信息。因此,要获取更新的信息,请在获取当前信息后添加 $loopOrder->save();
解决问题。