【问题标题】:How to reload checkout page if payment failed in Woocommerce如果在 Woocommerce 中付款失败,如何重新加载结帐页面
【发布时间】:2021-01-26 18:27:47
【问题描述】:

我有一个自定义支付网关,如果支付失败,我需要重新加载结帐页面。

原因:

当提交卡详细信息时,支付网关会生成一个卡令牌,我需要它来处理付款,但我们只能在请求中使用卡令牌一次。

我需要什么:

目前,我只是在付款失败时显示错误消息和退货。

if($payment_status['status']){
    
    $order->update_status( 'on-hold', __( "ABC Payment Done\n", 'stackoverflow' ) );
    
    wc_reduce_stock_levels($order_id);

    WC()->cart->empty_cart();

    return array(
        'result'    => 'success',
        'redirect'  => $this->get_return_url( $order )
    );
  
}else{
    
    wc_add_notice( $payment_status['message'] , 'error' );
    return;
}

如果付款失败,我如何重新加载/刷新页面? S用户可以再次输入卡详细信息,我们可以处理付款。 还是有其他建议?

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

    这取决于您希望它同步还是异步。 同步方式:
    header("刷新:0");

    它刷新您当前的页面。你也可以指定你想要的页面:

    header("Refresh:0; url=another_page.php");

    异步方式: 动态生成内容,清除所有更改和令牌。

    【讨论】:

      【解决方案2】:

      Fksjii 是真的。

      但是,有一个生成令牌代码的指定页面可能会更干净。

      您可以通过 XHR 请求获取它,然后使用 XHR 提交每个数据并等待回调。

      但是,如果你不能编辑 JS 代码,你可能会这样做

      if ($failed) {
         unset($_REQUEST);
         Header("Refresh: 0");
         exit;
      }
      

      在重新加载页面之前不要忘记清理 $_GET 或 $_POST 数据。

      即使在标头中发送了重定向之后,退出也始终非常重要。确实,标头已发送,但代码会继续执行,这可能会产生一些错误。

      【讨论】:

        【解决方案3】:

        您需要返回array,例如:

        if ( $payment_status['status'] ) {
            $order->update_status( 'on-hold', __( "ABC Payment Done\n", 'stackoverflow' ) );
            wc_reduce_stock_levels($order_id);
            WC()->cart->empty_cart();
            return array(
                'result'    => 'success',
                'redirect'  => $this->get_return_url( $order )
            );
        
        } else {
            $order->update_status( 'failed', __( 'Payment error:', 'woocommerce' ) . $this->get_option( 'error_message' ) );
            wc_add_notice( $payment_status['message'] , 'error' );
            WC()->cart->empty_cart();
            return array(
                'result'   => 'failure',
                'redirect' => WC()->cart->get_checkout_url()
            );
        }
        

        该代码将重定向到checkout 页面。希望能帮到你。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-19
          • 1970-01-01
          • 2017-08-13
          • 2015-04-22
          • 2015-11-05
          • 1970-01-01
          • 2017-04-24
          • 2018-03-05
          相关资源
          最近更新 更多