Загрузить другое окно Sweet Alert по истечении таймера

Я делаю модуль оплаты на opencart. Проблема в том, что платежному шлюзу требуется URL-адрес обратного вызова, который может только обновить историю заказов, но трудно обновить браузер. Что я сделал, так это то, что после отправки данных платежа через форму загружается окно SweetAlert, которое показывает обработку в течение примерно 40 секунд. Я предполагаю, что этого времени достаточно для того, чтобы пользователь произвел платеж из подсказки, которую он получил по телефону для подтверждения.

После совершения платежа платежный шлюз связывается с моей системой, чтобы подтвердить, был ли платеж успешным или неудачным, путем обновления статуса заказа в случае успеха.

У меня проблема в том, что через 40 секунд SweetAlert закрывается, а последующие вызовы ajax не выполняются. Вот мой код:

<script>
    $(document).ready(function(){

    $(document).on('click', '#mpesaPay', function(e){

     var telephone = document.getElementById("lipanampesa_phone").value;

     SwalConfirm(telephone);
     e.preventDefault();
    });

   });

   function SwalConfirm(telephone){

      var telephone = telephone;
      var message = 'Proceed to make payment with ' + telephone + '?';
      swal({
       title: 'Confirm Mobile Number',
       text: message,
       type: 'warning',
       showCancelButton: true,
       confirmButtonColor: '#3085d6',
       cancelButtonColor: '#d33',
       confirmButtonText: 'Continue',
       showLoaderOnConfirm: true,

       preConfirm: function() {
         return new Promise(function(resolve) {

            $.ajax({
              url: 'index.php?route=extension/payment/mpesa/simulation',
              type: 'POST',
              data: $('#lipa-na-mpesa :input'),
              dataType: 'json',
              cache: false,
            })
            .done(function(response){
              swal({
                title: "Processing, Please Wait",
                text: "Check your phone NOW and enter your M-Pesa PIN to complete payment.",
                showConfirmButton: false,
                allowOutsideClick: false,
                timer: 40000,
                onOpen: function () {
                  swal.showLoading()
                }
              })
              .then(function(json){
                  $.ajax({
                          type: "post",
                          url: "index.php?route=extension/payment/mpesa/confirm",
                          data: $('#lipa-na-mpesa :input'),
                          dataType: 'json',
                          cache: false,
                      })
                      .done(function(json) {
                      if (json['success']) {
                        location = json['success'];
                      }
                      if (json['error']['warning']) {
                          swal({
                              type: 'warning',
                              title: 'Payment Failed',
                              text: 'Please restart the checkout process again or contact us if there is a problem'
                          })
                      }
                    });
                })
            })
            .fail(function(){
              swal('Oops...', 'Something went wrong with ajax !', 'error');
            });
         });
          },
       allowOutsideClick: false     
      }); 
   } 
</script>

Бэкенд-код успешно работает до момента обновления статуса заказа при успешной оплате. Мне нужен только способ перенаправить пользователя на действие checkout/success после подтверждения оплаты заказа.

Это функция, которая должна вызываться по истечении 40 секунд, чтобы проверить статус заказа и предоставить ссылку для перенаправления в случае успеха.

public function confirm() {

    $this->load->model('checkout/order');

    if (isset($this->request->post['order_id'])) {

        $order_info = $this->model_checkout_order->getOrder($this->request->post['order_id']);

        $order_status_id = $order_info['order_status_id'];

        if ($order_status_id == $this->config->get('payment_mpesa_order_status_id')) {
            $json['success'] = $this->url->link('checkout/success', '', true);
        } else {
            $json['error']['warning'] = 'Payment not received yet.';
        }
    } else {
        $json['error']['warning'] = 'Payment not received yet.';
    }
    return json_encode($json);
}

person japheth    schedule 19.01.2018    source источник


Ответы (1)


Я знаю, что это поздний ответ, но... Если я правильно понял вашу проблему, проблема заключается в получении статуса сервера, чтобы вы могли обновить загруженную веб-страницу. Это обычная проблема, с которой сталкиваются веб-разработчики. Проблема заключается в том, что http является протоколом ответа на запрос, что означает, что сервер должен ждать, пока клиент сделает запрос, и ответить на этот запрос, после чего соединение закрывается, и сервер продолжает бездействовать в ожидании следующего запроса. В результате сервер не может отправлять обновления клиентам, если они этого не попросят.

В основном это означает, что вы должны использовать либо непрерывный опрос, чтобы проверить статус операции, либо использовать веб-сокеты на стороне клиента и промежуточное программное обеспечение подписчика издателя, такое как mqtt (или AMQP?) на стороне сервера, чтобы сервер может отправить изменение статуса на канал, на который подпишется клиент.

Извините за многословный ответ и отсутствие примера кода быстрого исправления. На мой взгляд, самый быстрый способ — использовать опрос сервера непрерывно, пока вы не получите ответ, однако это будет ресурсоемким как для клиентов, так и для сервера по сравнению с моделью издатель/подписчик.

person Japheth Ongeri - inkalimeva    schedule 22.02.2018