1

I am receiving a payment Webhook that has a CallBackmetadata with Item as an array. This array has objects with Name and Value in them and I have never seen such a thing before. When I console.log(CallbackMetadata) I get this array

[
  { Name: 'Amount', Value: 1 },
  { Name: 'MpesaReceiptNumber', Value: 'QGB39WES55' },
  { Name: 'Balance' },
  { Name: 'TransactionDate', Value: 20220711124027 },
  { Name: 'PhoneNumber', Value: 254704407239 }
]

I have 4 vars, Amount, ReceiptNo, PhoneNumber and Transaction Date that I want to populate with the values in the array.

How do I go about it? My full Code

const express = require("express");
const prettyjson = require("prettyjson");
const Router = express.Router();

Router.post("/stk-webhook", async (req, res) => {
  let CallbackMetadata;
  let ResultCode;
  let Amount;
  let ReceiptNumber;
  let TransactionDate;
  let PhoneNumber;

  console.log("_____________RECEIVED_MPESA_WEBHOOK________");
  console.log(prettyjson.render(req.body));
  try {
    ResultCode = req.body.Body.stkCallback.ResultCode;
    CallbackMetadata = req.body.Body.stkCallback.CallbackMetadata.Item;
    if (ResultCode === 0) {
      //  populate vars with their values
    } else {
      console.log("You cancelled transaction");
      res.status(400).json({ message: "you cancelled transaction" });
    }
    console.log(mpesaResponseObject);
  } catch (error) {
    console.log(error);
  }
});
module.exports = Router;

1 Answer 1

1

I'd create a simple mapping function where you create an object from the array values. Then, you can simply use object destructering to access the desired properties. Something like this:

const callbackMetadata = [
  { Name: 'Amount', Value: 1 },
  { Name: 'MpesaReceiptNumber', Value: 'QGB39WES55' },
  { Name: 'Balance' },
  { Name: 'TransactionDate', Value: 20220711124027 },
  { Name: 'PhoneNumber', Value: 254704407239 }
]


function mapMetadata(metadata) {      
  return metadata.reduce((result, entry) => { 
      result[entry.Name] = entry.Value;
      return result;
  }, {});
}

const mappedResult = mapMetadata(callbackMetadata);
let {Amount, MpesaReceiptNumber, TransactionDate, PhoneNumber} = mappedResult;

console.log("Amount", Amount);
console.log("MpesaReceiptNumber", MpesaReceiptNumber);
console.log("TransactionDate", TransactionDate);
console.log("PhoneNumber", PhoneNumber);

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.