当到达支付网关时,延迟PHP代码一段时间

50pmv0ei  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(120)

我正在做一个Laravel PHP项目,通过这个项目,我接触到一个支付API来检查用户是否支付了,并将用户重定向到一个支付确认页面。
默认情况下,支付网关的支付状态为0。当用户付款时,状态变为1。用户点击网站上的付款按钮后,我需要延迟PHP代码的执行(让用户有时间通过他/她的手机进行交易付款)。
15秒后,我联系支付网关检查状态是否更改为1,如果是,则将用户重定向到支付确认页面。
我试着睡觉,但它不起作用...我还测试了使用沙盒帐户,而支付,但它不是重定向后,预期的15秒。

根据支付状态从API获取的JSON对象示例

//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代码用于将数据发送到控制器

<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 Controller am posting data to from above AJAX code

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
});
ddarikpa

ddarikpa1#

好吧,让我们把你的问题分解一下。首先,你想延迟你的AJAX代码每15秒执行一次。为此,您将AJAX Package 在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

接下来,您需要根据代码返回的状态执行一些操作。为此,您需要将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;

并将返回类型从字符串更改为布尔值:

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

你想让它做什么就做什么。
现在,给你的代码一些建议:

  • 您可能希望为更多的情况做好准备,而不仅仅是成功的AJAX情况
  • 请确保您禁用按钮时,用户点击支付按钮,否则每次他们按下它将开始一个新的15秒的间隔
  • 尝试将PHP代码 Package 在一个try-catch块中,以允许优雅的错误处理
  • 不仅仅为成功案例做好准备
6tdlim6h

6tdlim6h2#

使用此睡眠(5);在Laravel控制器中

相关问题