#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 с действительным идентификатором сеанса.