0.1.0 • Published 4 years ago

@axis-llc/mpesa v0.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
4 years ago

M-Pesa TypeScript SDK

This is a simple wrapper for Mpesa Daraja API using typescript

Installation

Via npm

npm install --save @axis-llc/mpesa

Or yarn

yarn add @axis-llc/mpesa

Usage

Terms definitions

Import what you need

import { Mpesa, useMpesa } from '@axis-llc/mpesa';

or

const { Mpesa, useMpesa } = require('@axis-llc/mpesa');

Instantiation

const mpesa = new Mpesa(
    {
        env //"sandbox",
        type //4,
        shortcode //174379,
        store //174379,
        key // Your app consumer key,
        secret // Your app consumer secret,
        username // Your M-Pesa org username,
        password // Your M-Pesa org pass,
        passkey // Your online passkey "bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919",
        validationUrl //"/lipwa/validate",
        confirmationUrl //"/lipwa/confirm",
        callbackUrl //"/lipwa/reconcile",
        timeoutUrl //"/lipwa/timeout",
        resultUrl //"/lipwa/results",
    }
)

Or, individual APIs

const { stkPush, registerUrls } = useMpesa(
    {
        env //"sandbox",
        type //4,
        shortcode //174379,
        store //174379,
        key // Your app consumer key,
        secret // Your app consumer secret,
        username // Your M-Pesa org username,
        password // Your M-Pesa org pass,
        passkey // Your online passkey "bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919",
        validationUrl //"/lipwa/validate",
        confirmationUrl //"/lipwa/confirm",
        callbackUrl //"/lipwa/reconcile",
        timeoutUrl //"/lipwa/timeout",
        resultUrl //"/lipwa/results",
    }
)

Send an STK push request

mpesa
  .stkPush(
    254705459494,
    10,
    'ACCOUNT', // You can ignore this, the code will generate a unique string
    'Transaction Description', // Optional
    'Remark', // optional
  )
  .then(({ error, data }) => {
    if (data) {
      const {
        MerchantRequestID,
        CheckoutRequestID,
        ResponseCode,
        ResponseDescription,
        CustomerMessage,
      } = data;
      console.log(MerchantRequestID);
    }

    if (error) {
      const { errorCode, errorMessage } = error;
      console.log(errorCode, errorMessage);
    }
  });

// Or use the API directly

stkPush(
  254705459494,
  10,
  'ACCOUNT', // You can ignore this, the code will generate a unique string
  'Transaction Description', // Optional
  'Remark', // optional
).then(({ error, data }) => {
  if (data) {
    const {
      MerchantRequestID,
      CheckoutRequestID,
      ResponseCode,
      ResponseDescription,
      CustomerMessage,
    } = data;
    console.log(MerchantRequestID);
  }

  if (error) {
    const { errorCode, errorMessage } = error;
    console.log(errorCode, errorMessage);
  }
});

Or, if inside an async function

async () => {
  const {
    error: { errorCode, errorMessage },
    data: {
      MerchantRequestID,
      CheckoutRequestID,
      ResponseCode,
      ResponseDescription,
      CustomerMessage,
    },
  } = await mpesa.stkPush(
    254705459494,
    10,
    'ACCOUNT',
    'Transaction Description',
    'Remark',
  );

  console.log(MerchantRequestID);

  // TIP: Save MerchantRequestID and update when you receive the IPN
};

C2B register callback URLs

mpesa.registerUrls('Completed' | 'Cancelled').then(({ error, data }) => {
  if (data) {
    const { ResponseCode, ResponseDescription } = data;
    console.log(ResponseDescription);
  }

  if (error) {
    const { errorCode, errorMessage } = error;
    console.log(errorCode, errorMessage);
  }
});

Send B2C

mpesa
  .sendB2C(
    phone,
    amount,
    'BusinessPayment' | 'SalaryPayment' | 'PromotionPayment',
    'Some remark',
    'Some occasion',
  )
  .then(({ error, data }) => {
    if (data) {
      const {
        ConversationID,
        OriginatorConversationID,
        ResponseCode,
        ResponseDescription,
      } = data;
      console.log(OriginatorConversationID);

      // TIP: Save `OriginatorConversationID` in the database, and use it as a key once you receive the IPN
    }

    if (error) {
      const { errorCode, errorMessage } = error;
      console.log(errorCode, errorMessage);
    }
  });

Send B2B

mpesa
  .sendB2B(
    phone,
    amount,
    'BusinessPayBill' |
      'BusinessBuyGoods' |
      'DisburseFundsToBusiness' |
      'BusinessToBusinessTransfer' |
      'MerchantToMerchantTransfer',
    'Some remark',
    'Some occasion',
  )
  .then(({ error, data }) => {
    if (data) {
      const {
        ConversationID,
        OriginatorConversationID,
        ResponseCode,
        ResponseDescription,
      } = data;
      console.log(OriginatorConversationID);

      // TIP: Save `OriginatorConversationID` in the database, and use it as a key for update
    }

    if (error) {
      const { errorCode, errorMessage } = error;
      console.log(errorCode, errorMessage);
    }
  });