Задержка PHP-кода на некоторое время при обращении к платежному шлюзу - PullRequest
0 голосов
/ 23 октября 2018

Я работаю над проектом Laravel PHP, в результате чего я обращаюсь к API оплаты, чтобы проверить статус, если пользователь заплатил, и перенаправить пользователя на страницу подтверждения оплаты.

По умолчанию статус платежа через платежный шлюз равен 0. Когда пользователь платит, статус меняется на 1. После того, как пользователь нажимает кнопку оплаты на веб-сайте, мне нужно отложить выполнение кода PHP (чтобы разрешитьпользователь некоторое время совершает платеж через свой телефон).

Через 15 секунд я обращаюсь к платежному шлюзу, чтобы проверить, не изменился ли статус на 1, если true, перенаправить пользователя на страницу подтверждения платежа.

Я пытался использовать режим снано это не работает ... Я также протестировал использование учетной записи песочницы во время оплаты, но она не перенаправляет, как ожидалось, через 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-код, который используется для отправки данных на контроллер

<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 отправляет данные насверху код 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
});

1 Ответ

0 голосов
/ 23 октября 2018

Хорошо, давайте разберем вашу проблему.Прежде всего, вы хотите отложить выполнение кода 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

Далее вы хотите сделать что-то, основываясь на состоянии, которое возвращает ваш код.Для этого вам нужно изменить пример успеха вашего 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
    }

И это должно делать то, что вы хотите.

Теперь несколько советов по вашему коду:

  • Возможно, вы захотите предусмотреть больше случаев, чем просто успех AJAXcase
  • Убедитесь, что вы отключили кнопку, когда пользователь нажимает кнопку оплаты, или каждый раз, когда они нажимают ее, запускается новый 15-секундный интервал
  • Попробуйте обернуть ваш PHP-код в попытке-catch блок, чтобы учесть изящную обработку ошибок
  • Обеспечить не только случай успеха
...