我试图保存Mpesa回调数据,当用户用Lipa付费,ineed用令牌解码用户名保存CheckoutRequestID时,如果付款成功,cllback URL需要用mysql的金额更新相关的CheckoutRequestID,从那里需要用新值更新用户的钱包。目前,代码运行良好,但我无法保存,当我试图访问用户名或任何值时,回调不会返回任何数据。这是LipaNaMpesa代码和STK回调代码。
LipaNaMpesa代码
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码
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)
})代码的注释部分在添加时不返回任何值。我做错什么了吗?
发布于 2022-07-21 09:27:13
这就是Daraja API将如何针对您的问题工作。当您调用LipaNaMpesa代码并执行它时,将返回以下响应。
{
"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将返回以下响应
{
"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是相同的。
https://stackoverflow.com/questions/70432070
复制相似问题