Проблема с использованием setTimeout в AJAX и PHP curl - PullRequest
0 голосов
/ 31 октября 2018

Я работаю над приложением Laravel, в котором я вызываю платежный шлюз, чтобы получить статус платежа от пользователя. Согласно документации шлюза, если я получу ответ 500, я должен продолжить использовать API максимум 5 раз, если ответ не изменится на 200, чтобы остановить транзакцию.

Я написал PHP-функцию curl, которая используется для доступа к шлюзу и получения ответа вместе со статусом (500 или 200). Я также написал код AJAX для отправки данных на внутренний контроллер

Как написать логику JS в коде AJAX, чтобы продолжать работать с API, если статус 500 максимум 6 раз?

AJAX-код, отправляющий данные на контроллер

<script type="text/javascript">

  $('.mpesa').on('click', function () {

    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,
    };

    $.ajax({
      type:"POST",
      url:"checkStat",
      data:JSON.stringify(type),
      contentType: "application/json",
      cache:false,
      success: function(data)
      {
          alert(data)
      }
      error: function error(data) {
          alert('Error');
      }
     });   
    });
</script>

Файл маршрутов

Route::any( '/checkStat', 'B2CController@checkStat')->name('b2c.checkStat');

Контроллер

public function checkStat(Request $request){
        //dd($request->all);

        //convert to JSON string
        $data =(object)$request->all();
        //dd($data);

        $ref = $data->payment_reference;

        $type = $data->payment_type;

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

        //dd($data);

         //Set maximum execution time
        ini_set('max_execution_time ', 75);
        set_time_limit(75);
        //Loop through the code 3 times
        for($try=1; $try<=3; $try++) {
            sleep(10);
            $payStat = $this->global_Curl_payStat($data, 'api/payment/status')->data;
        }
        var_dump($payStat);
        dd($payStat);
    }

Функция Curl для вызова API, который вызывается в контроллере выше

public function global_Curl_payStat($data, $url, $try = 1)
    {
        //dd($_ENV['API_ENDPOINT_NGINX_IP'] . '/' . $url);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, ($_ENV['API_ENDPOINT_NGINX_IP'] . '/' . $url));
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        //Prevents URL cache
        curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE);
        //Fetch response
        $response = curl_exec($ch);
        //Get HTTP header status code
        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        //dd($statusCode, $response);

        curl_close($ch);

        return $response;
}
...