Я делаю модуль оплаты на 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);
}