首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存MPesa回调数据

保存MPesa回调数据
EN

Stack Overflow用户
提问于 2021-12-21 07:46:54
回答 1查看 98关注 0票数 0

我试图保存Mpesa回调数据,当用户用Lipa付费,ineed用令牌解码用户名保存CheckoutRequestID时,如果付款成功,cllback URL需要用mysql的金额更新相关的CheckoutRequestID,从那里需要用新值更新用户的钱包。目前,代码运行良好,但我无法保存,当我试图访问用户名或任何值时,回调不会返回任何数据。这是LipaNaMpesa代码和STK回调代码。

LipaNaMpesa代码

代码语言:javascript
复制
router.get('/stk', middleware.access, middleware.checkToken, (req, res) => {
    let endpoint = "https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest"
    let auth = "Bearer " + req.access_token


    let datenow = new Date()
    //console.log(datenow.getUTCDate())
    const timestamp = datenow.getFullYear() +"" + addZero((datenow.getMonth()+1))+"" +addZero(datenow.getUTCDate())+ ""+ addZero(datenow.getHours())+"" +  addZero(datenow.getMinutes())+"" +  addZero(datenow.getSeconds())
   // console.log(timestamp)
    const password = (new Buffer.from('174379' + 'bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919' + timestamp).toString('base64'))

    request(
        {
            url: endpoint,
            method: "POST",
            headers: {
                "Authorization": auth
            },
            json: {

                "BusinessShortCode": 174379,
                "Password": password,
                //"MTc0Mzc5YmZiMjc5ZjlhYTliZGJjZjE1OGU5N2RkNzFhNDY3Y2QyZTBjODkzMDU5YjEwZjc4ZTZiNzJhZGExZWQyYzkxOTIwMjExMjExMDcyODAw"
                "Timestamp": timestamp,
                "TransactionType": "CustomerPayBillOnline",
                "Amount": 1,
                "PartyA": 254792482180,//254792482180,
                "PartyB": 174379,
                "PhoneNumber": 254792482180,//254704148972,
                "CallBackURL": "https://9b68-41-80-113-243.ngrok.io/mrequests/stk_confirm",
                "AccountReference": "GoChama",
                "TransactionDesc": "Wallet Deposit"
            }
        },
        function (error, response, body) {
            if (error) {
                console.log(error)
            }
            else {
             // console.log(body.CheckoutRequestID)
               //console.log(req.decoded.username) 
              res.status(200).json(body)
            }
        }
    )
})

STK CallBAck码

代码语言:javascript
复制
router.post('/stk_confirm', (req, res) => {
    console.log('....................... stk_confirm .............')
    console.log("Payload Received", req.body.Body.stkCallback)
   /* const callbackData = req.body.Body.stkCallback
    console.log("Payload Received", callbackData)
    var resultCode = callbackData.ResultCode;
    var checkoutId = callbackData.CheckoutRequestID
    var username = req.decoded.username
    if(resultCode === 0){
        const details = callbackData.CallbackMetadata.Item

        var mReceipt;
        var mPhoneNumber;
        var mAmount;

        await details.forEach(entry =>{
            switch (entry.Name){
                case "MpesaReceiptNumber":
                mReceipt = entry.Value
                break;

                case "PhoneNumber":
                mPhoneNumber = entry.Value
                break;

                case "Amount":
                mAmount = entry.Value
                break;

                default:
                    break;
            }
        })
        

    }*/
    res.status(200).json(req.body)
    
})

代码的注释部分在添加时不返回任何值。我做错什么了吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-21 09:27:13

这就是Daraja API将如何针对您的问题工作。当您调用LipaNaMpesa代码并执行它时,将返回以下响应。

代码语言:javascript
复制
{
 "MerchantRequestID": "7758-32589747-1",
 "CheckoutRequestID": "ws_CO_21072022121325565708374149",
 "ResponseCode": "0",
 "ResponseDescription": "Success. Request accepted for processing",
 "CustomerMessage": "Success. Request accepted for processing"
}

此时,您将将CheckoutRequestID与令牌中的解码用户名以及您想要保存的任何其他内容一起保存到数据库中。LipaNaMpesa代码向客户的电话发送提示并返回上述响应。

如果客户没有输入他们的PIN,或者没有足够的余额,或者由于任何原因,事务不会通过,回调URL不会返回任何东西。

如果客户输入PIN并付费,回调URL将返回以下响应

代码语言:javascript
复制
{
"Body": 
{
    "stkCallback": 
    {
        "MerchantRequestID": "21605-295434-4",
        "CheckoutRequestID": "ws_CO_04112017184930742",
        "ResultCode": 0,
        "ResultDesc": "The service request is processed successfully.",
        "CallbackMetadata": 
        {
            "Item": 
            [
                {
                    "Name": "Amount",
                    "Value": 1
                },
                {
                    "Name": "MpesaReceiptNumber",
                    "Value": "LK451H35OP"
                },
                {
                    "Name": "Balance"
                },
                {
                    "Name": "TransactionDate",
                    "Value": 20171104184944
                },
                {
                    "Name": "PhoneNumber",
                    "Value": 254706506361
                }
            ]
        }
    }
}
}

此时,您可以更新从CheckoutRequestID代码响应插入LipaNaMpesa的DB行。来自这两个响应的CheckoutRequestID是相同的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70432070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档