javascript - CallBackUrl 页面上的会话 id 不断变化
问题描述
我正在向 API 发送请求,该 API 向页面/url (response.php) 发送回响应。此响应的详细信息存储在 db 表中以及页面的会话 ID 中。使用会话 ID 作为参考值获取存储在数据库中的数据返回null
,因为我注意到发送到数据库的会话 ID 与响应正文一起每次都会更改,使其与文件夹中所有其他页面的会话 ID 不同(processor.php , app.js, fromdb.php),它们彼此相似。我如何处理这个问题,因为我需要单击启动该过程的按钮的设备,以便能够根据保存到数据库的数据接收带有一些详细信息的警报,关于他们的付款是否成功。
点击按钮时发起动作的js页面:
if (document.readyState == 'loading') {
document.addEventListener('DOMContentLoaded',ready);
}else{
ready()
}
function ready() {
var btn = document.getElementById('sub')
btn.addEventListener('click',btnClicked)
console.log("ready")
}
function btnClicked() {
let amount = document.getElementById('Amt').value;
let phone = document.getElementById('Number').value;
let name = document.getElementById('Name').value;
//using ajax post data
$.ajax({
url: "http://localhost/textEditor/processor.php",
method: "POST",
data: {
amount: amount,
phone: phone,
name: name
},
});
getResult();
}
async function getResult() {
//using ajx Get method to obtain data from db echoed on fromdb.php page
return await setTimeout($.ajax({
url: "http://localhost/textEditor/fromdb.php",
method: "GET",
success: function(data) {
console.log("The data is:", data)
}
}), 5000)
}
下面是向 API 发出请求并提供发送响应的回调 URL 的页面:
<!-- processor.php -->
<?php
session_start();
$sess_id = session_id();
include_once "db.te.php";
// if (isset($_POST['submit'])) {
date_default_timezone_set('Africa/Nairobi');
$Passkey = 'bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919';
$Amount= $_POST['amount'];
$BusinessShortCode = '174379';
$PartyA =$_POST['phone'];
$AccountReference =$_POST['name'];
$TransactionDesc = 'test';
$Timestamp =date('YmdHis');
$Password = base64_encode($BusinessShortCode.$Passkey.$Timestamp);
$headers=['Content-Type:application/json; charset=utf8'];
$initiate_url='https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
$callBackURL ='https://c28d-197-231-178-65.ngrok.io/textEditor/response.php';
// ------------------------------
function newAccessToken() {
$ConsumerKey = 'uhsjjsjbVGatHuJKK';
$ConsumerSecret = 'Yh29KHAY17LKjahh';
$credentials = base64_encode($ConsumerKey.":".$ConsumerSecret);
$url = "https://sandbox.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: Basic ".$credentials,"Content-Type:application/json"));
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$curl_response = curl_exec($curl);
$access_token=json_decode($curl_response);
curl_close($curl);
return $access_token->access_token;
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $initiate_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json','Authorization:Bearer '.newAccessToken()));
$curl_post_data = array(
'BusinessShortCode' =>$BusinessShortCode,
'Password' => $Password,
'Timestamp' => $Timestamp,
'TransactionType' => 'CustomerPayBillOnline',
'Amount' => $Amount,
'PartyA' => $PartyA,
'PartyB' => $BusinessShortCode,
'PhoneNumber' => $PartyA,
'CallBackURL' => $callBackURL,
'AccountReference' => $AccountReference,
'TransactionDesc' => $TransactionDesc
);
$data_string = json_encode($curl_post_data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
$curl_response = curl_exec($curl);
curl_close($curl);
// }
发送响应并将其插入数据库的 callbackurl 页面:
<!-- callbackurl: response.php, page where response body is sent to the db alongside its session id-->
<?php
include_once "db.te.php";
session_start();
$sess_id = session_id();
$homepage = file_get_contents('php://input');
$nowNow = json_decode($homepage);
if ($nowNow->Body->stkCallback->ResultCode==0) {
$Items = $nowNow->Body->stkCallback->CallbackMetadata->Item;
foreach($Items as $Item) {
if ($Item->Name =='MpesaReceiptNumber') {
$MpesaReceiptNumber = $Item->Value;
}
}
}else{
$ResultCode = $nowNow->Body->stkCallback->ResultCode;
$MerchantRequestID = $nowNow->Body->stkCallback->MerchantRequestID;
$CheckoutRequestID = $nowNow->Body->stkCallback->CheckoutRequestID;
$ResultDesc = $nowNow->Body->stkCallback->ResultDesc;
$sql = "SELECT * FROM duka;";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
echo "SQL statement failed 1!";
}else{
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$rowCount = mysqli_num_rows($result);
$sql = "INSERT INTO duka(ResultCode, MerchantReqID, CheckoutReqID, ResultDesc, SessionId) VALUES (?,?,?,?,?);";
if (!mysqli_stmt_prepare($stmt, $sql)) {
echo "SQL statement failed 2!";
}else{
mysqli_stmt_bind_param($stmt,"sssss", $ResultCode, $MerchantRequestID,$CheckoutRequestID,$ResultDesc,$sess_id);
mysqli_stmt_execute($stmt);
}
}
}
从 db 中选择数据并发送到要记录的 js 页面:
<!-- fromdb.php -->
<?php
include_once "db.te.php";
session_start();
$sess_id = session_id();
//retrieving data from db where Session ID is equal to this page's session ID
$sql="SELECT * FROM duka WHERE SessionId = $sess_id;";
$result = mysqli_query($conn, $sql);
$resultCheck=mysqli_num_rows($result);
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$data = $row["CheckoutReqID"];
}
}
//value to be printed using console.log following an ajax get method
echo json_encode($data);
解决方案
推荐阅读
- python - 使用 Python Pandas 中前一行的数据在列中创建行值
- javascript - express and fetch: TypeError: NetworkError 尝试获取资源时
- python - 使用提示时出现“ModuleNotFoundError”
- powershell - 如果 -match 不区分大小写,为什么我们需要 -imatch?
- c++ - 如何为 SDL2 装箱不同的“资源”指针?
- python - 打印列表时如何同时使用逗号和方括号?(Python)
- singularity-container - 未能添加为会话目录:路径。不是奇点中的绝对路径
- python - 在应用程序之间传递数据 otree
- python - 相关字段的查找无效
- python - 随机选择每种类型的数据值并返回所选的索引