在连接到支付网关时延迟 PHP 代码一段时间
Delaying PHP code for some time when reaching out to a Payment Gateway
我正在做一个 Laravel PHP 项目,如果用户已经付款,我会联系付款 API 检查状态,并将用户重定向到付款-确认页面。
默认情况下,支付网关的支付状态为0。当用户支付状态变为1。用户点击网站上的支付按钮后,我需要延迟执行PHP代码(让用户有时间通过 his/her phone 进行支付)。
15 秒后,我联系支付网关检查状态是否更改为 1,如果为真,则将用户重定向到支付确认页面。
我试过使用 sleep,但它不起作用...我也测试过在支付时使用沙盒帐户,但它在 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 代码正在使用 post 数据到控制器
<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 控制器正在 post 从上面 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
接下来,您想根据代码 return 的状态做一些事情。为此,您需要将 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;
同时将 return 类型从字符串更改为布尔值:
if($payStat->status == 1){
return response()->json(true); // Sends back a JSON response to your AJAX
}
那应该会做你想做的事。
现在,对您的代码提出一些建议:
- 您可能想要为更多情况做出规定,而不仅仅是
成功 AJAX 案例
- 确保在用户使用时禁用该按钮
单击付款按钮,否则每次按下它都会
开始一个新的 15 秒间隔
- 尝试将您的 PHP 代码包装在 try-catch 块中以允许优雅的错误处理
- 不仅要为成功案例做好准备
我正在做一个 Laravel PHP 项目,如果用户已经付款,我会联系付款 API 检查状态,并将用户重定向到付款-确认页面。
默认情况下,支付网关的支付状态为0。当用户支付状态变为1。用户点击网站上的支付按钮后,我需要延迟执行PHP代码(让用户有时间通过 his/her phone 进行支付)。
15 秒后,我联系支付网关检查状态是否更改为 1,如果为真,则将用户重定向到支付确认页面。
我试过使用 sleep,但它不起作用...我也测试过在支付时使用沙盒帐户,但它在 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 代码正在使用 post 数据到控制器
<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 控制器正在 post 从上面 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
接下来,您想根据代码 return 的状态做一些事情。为此,您需要将 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;
同时将 return 类型从字符串更改为布尔值:
if($payStat->status == 1){
return response()->json(true); // Sends back a JSON response to your AJAX
}
那应该会做你想做的事。
现在,对您的代码提出一些建议:
- 您可能想要为更多情况做出规定,而不仅仅是 成功 AJAX 案例
- 确保在用户使用时禁用该按钮 单击付款按钮,否则每次按下它都会 开始一个新的 15 秒间隔
- 尝试将您的 PHP 代码包装在 try-catch 块中以允许优雅的错误处理
- 不仅要为成功案例做好准备