首页 > 解决方案 > 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);

标签: javascriptphpmysqldatabaseapi

解决方案


推荐阅读