4/ Know your payload before writing the view. The fields Amount, MpesaReceiptNumber, and PhoneNumber aren't top-level keys. They're buried inside a list of dicts under CallbackMetadata.Item.
Success
{
"Body": {
"stkCallback": {
"MerchantRequestID": "29115-34620561-1",
"CheckoutRequestID": "ws_CO_191220191020363925",
"ResultCode": 0,
"ResultDesc": "The service request is processed successfully.",
"CallbackMetadata": {
"Item": [
{ "Name": "Amount", "Value": 1500.00 },
{ "Name": "MpesaReceiptNumber", "Value": "NLJ7RT61SV" },
{ "Name": "TransactionDate", "Value": 20191219102115 },
{ "Name": "PhoneNumber", "Value": 254712345678 }
]
}
}
}
}
Error
{
"Body": {
"stkCallback": {
"MerchantRequestID": "29115-34620561-1",
"CheckoutRequestID": "ws_CO_191220191020363925",
"ResultCode": 1,
"ResultDesc": "The balance is insufficient for the transaction."
}
}
}