Идентификатор сеанса на странице обратного вызова продолжает меняться

#javascript #php #mysql #database #api

Вопрос:

Я отправляю запрос в API, который отправляет ответ на страницу/URL (response.php). Сведения из этого ответа хранятся в таблице базы данных, а также идентификатор сеанса страницы. Получение данных, хранящихся в бд, с идентификатором сеанса в качестве эталонного значения, возвращается null , потому что я заметил, что идентификатор сеанса, отправляемый в бд вместе с телом ответа, каждый раз меняется, что делает его отличным от идентификаторов сеанса со всех других страниц в папке (процессор.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 и предоставляет обратный вызов, на который отправляется ответ:

 lt;!-- processor.php --gt; lt;?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-gt;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' =gt;$BusinessShortCode,  'Password' =gt; $Password,  'Timestamp' =gt; $Timestamp,  'TransactionType' =gt; 'CustomerPayBillOnline',  'Amount' =gt; $Amount,  'PartyA' =gt; $PartyA,  'PartyB' =gt; $BusinessShortCode,  'PhoneNumber' =gt; $PartyA,  'CallBackURL' =gt; $callBackURL,  'AccountReference' =gt; $AccountReference,  'TransactionDesc' =gt; $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);  // }  

The callbackurl page where response is sent and inserted into db:

 lt;!-- callbackurl: response.php, page where response body is sent to the db alongside its session id--gt; lt;?php  include_once "db.te.php"; session_start(); $sess_id = session_id();   $homepage = file_get_contents('php://input');  $nowNow = json_decode($homepage);   if ($nowNow-gt;Body-gt;stkCallback-gt;ResultCode==0) {  $Items = $nowNow-gt;Body-gt;stkCallback-gt;CallbackMetadata-gt;Item;  foreach($Items as $Item) {  if ($Item-gt;Name =='MpesaReceiptNumber') {  $MpesaReceiptNumber = $Item-gt;Value;  }  }  }else{  $ResultCode = $nowNow-gt;Body-gt;stkCallback-gt;ResultCode;  $MerchantRequestID = $nowNow-gt;Body-gt;stkCallback-gt;MerchantRequestID;  $CheckoutRequestID = $nowNow-gt;Body-gt;stkCallback-gt;CheckoutRequestID;  $ResultDesc = $nowNow-gt;Body-gt;stkCallback-gt;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);  }  }   }  

Выбор данных из БД и отправка их на страницу js для регистрации:

 lt;!-- fromdb.php --gt; lt;?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 gt; 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);  

Комментарии:

1. Вы не можете ожидать, что ваш сеанс пользователя будет работать внутри такого сценария URL — адреса обратного вызова-это запрашивается их серверами, а не браузером вашего пользователя. Таким образом, в этом запросе не будет файла cookie с действительным идентификатором сеанса.