通过 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(); 解决问题。