在连接到支付网关时延迟 PHP 代码一段时间

Delaying PHP code for some time when reaching out to a Payment Gateway

我正在做一个 Laravel PHP 项目,如果用户已经付款,我会联系付款 API 检查状态,并将用户重定向到付款-确认页面。

默认情况下,支付网关的支付状态为0。当用户支付状态变为1。用户点击网站上的支付按钮后,我需要延迟执行PHP代码(让用户有时间通过​​ his/her phone 进行支付)。

15 秒后,我联系支付网关检查状态是否更改为 1,如果为真,则将用户重定向到支付确认页面。

我试过使用 sleep,但它不起作用...我也测试过在支付时使用沙盒帐户,但它在 15 秒后没有按预期重定向。

示例 JSON 我根据付款状态从 API 获得的对象

//When not paid
{
    status: 0,
    message: 'Not Paid',
    amount: 20
}

//When paid
{
    status: 1,
    message: 'Paid',
    amount: 20
}

//When cancelled
{
    status: 2,
    message: 'Cancelled',
    amount: 20
}

AJAX 代码正在使用 post 数据到控制器

<script type="text/javascript">
  //Mpesa Payment code
$('.mpesa').on('click', function () {

    //Gets the MPESA type
    var type = $('.mpesa').prop('id');
    var quote = $('#quote').val();
    var phone = $('#phone').val();
    //Converts to a JSON object
    var type ={
      'type': type,
      'quote' : quote,
      'phone' : phone,
    };

    console.log(type);

    $.ajax({
        //Contains controller of payment
        type: 'POST',
        url: 'paymentFinal',
        data: JSON.stringify(type),
        contentType: 'application/json',
        dataType: "json",
        success: function success(response) {
            window.location.href="success" ;
        },
        error: function error(data) {
            console.log(data);
        }
    });
});
//End Payment API

Laravel 控制器正在 post 从上面 AJAX 代码

发送数据
 public
    function payFinal(Request $request)
    {
        // dd($request->all());

         //Convert to a JSON object the request 
        $data =(object)$request->all();

        //Session get of some data fetched from another controller
        $quote = $request->session()->get('quoteID');

        //Store all the data in an array
         $all = array(
            'phone' => $data->phone,
            'quote_id' => $quote,
            'payment_type' => $data->type,
        );

        //Posts data to Payment Checkout using curl
        $response = $this->global_Curl($all, 'api/payment/checkout');
        //dd($response);

        //Get checkoutresponseId from response
        $checkID = $response->data->CheckoutRequestID;

        //Payment type
        $type = $data->type;

        $data = array(
            'payment_reference' => $checkID,
            'payment_type' => $type
        );

        //1st call to the Payment API before sleep
        $paySt = $this->global_Curl($data, 'api/payment/status')->data;

        sleep(15);

        //Second call to the API after sleep to check if status has changed
        $payStat = $this->global_Curl($data, 'api/payment/status')->data;

        if($payStat->status == '1'){
            return 'true';   
        }
    }

正在使用新的 AJAX 代码

$('.mpesa').on('click', function () {
    setInterval(function() {
       alert('clicked');
      //Gets the MPESA type
       var type = $('.mpesa').prop('id');
      var quote = $('#quote').val();
      var phone = $('#phone').val();
      //Converts to a JSON object
      var type ={
        'type': type,
        'quote' : quote,
        'phone' : phone,
      };

    console.log(type);
    $.ajax({
        //Contains controller of payment
        type: 'POST',
        url: 'paymentFinal',
        data: JSON.stringify(type),
        contentType: 'application/json',
        dataType: "json",
        success: function success(response) {
          if(response) {
              window.location.href="success";
          }
        },
        error: function error(data) {
            console.log(data);
        }
    });
}, 15000); // Execute every 15 seconds
});

好的,让我们分解您的问题。首先,您想延迟 AJAX 代码每 15 秒执行一次。为此,您将 AJAX 包装在 setInterval() javascript 方法中。所以它最终应该看起来像这样:

setInterval(function() {
    $.ajax({
        //Contains controller of payment
        type: 'POST',
        url: 'paymentFinal',
        data: JSON.stringify(type),
        contentType: 'application/json',
        dataType: "json",
        success: function success(response) {
            window.location.href="success" ;
        },
        error: function error(data) {
            console.log(data);
        }
    });
}, 15000); // Execute every 15 seconds

接下来,您想根据代码 return 的状态做一些事情。为此,您需要将 AJAX 方法的成功案例更改为如下内容:

    success: function success(response) {
        if(response) {
            window.location.href="success"
        }
    }

javascript 方面就这些了。对于 PHP 端,您可以删除它,因为您现在正在前端处理间隔:

    sleep(15);

    //Second call to the API after sleep to check if status has changed
    $payStat = $this->global_Curl($data, 'api/payment/status')->data;

同时将 return 类型从字符串更改为布尔值:

if($payStat->status == 1){
        return response()->json(true);   // Sends back a JSON response to your AJAX
    }

那应该会做你想做的事。

现在,对您的代码提出一些建议:

  • 您可能想要为更多情况做出规定,而不仅仅是 成功 AJAX 案例
  • 确保在用户使用时禁用该按钮 单击付款按钮,否则每次按下它都会 开始一个新的 15 秒间隔
  • 尝试将您的 PHP 代码包装在 try-catch 块中以允许优雅的错误处理
  • 不仅要为成功案例做好准备