我正在开发一个 Laravel PHP 项目,通过该项目,我可以访问付款 API 来检查用户是否已付款并将用户重定向到付款确认页面。
默认情况下,支付网关的支付状态为0。当用户支付时,状态更改为1。用户点击网站上的支付按钮后,我需要延迟执行PHP代码(以允许用户有一些时间通过他/她的手机进行付款)。
15秒后,我联系支付网关检查状态是否更改为1,如果为true,则将用户重定向到付款确认页面。
我尝试过使用睡眠功能,但它不起作用...我还在付款时使用沙盒帐户进行了测试,但在 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 控制器正在将数据发布到上面的 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
});
好的,让我们来分解你的问题。首先,您希望延迟 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
}
这应该可以做你想做的事。
现在,对您的代码提出一些建议:
用这个 睡眠(5); 在 Laravel 控制器中