momo-api
Version:
This is a package to help easily integrate momo-api into your javascript project
241 lines (207 loc) • 7.83 kB
Markdown
# Momo API
This is a package to help easily integrate Momo API into your JavaScript project. It currently supports the following services:
- Collection API
- Disbursement API
- Remittance API
## Installation
To install Momo API, use npm:
```bash
npm install momo-api
```
## Avaible Module for you
```javascript
const { createApiUser } = require("momo-api")
const { createApiKey } = require("momo-api")
const { colAccessToken } = require("momo-api")
const { requestToPay } = require("momo-api")
const { disAccessToken } = require("momo-api")
const { disburseTransfer } = require("momo-api")
const { remittAccessToken } = require("momo-api")
const { remittTransfer } = require("momo-api")
const { uuidv4 } = require("momo-api");
```
## Usage
To use Momo API in your project you frist have to create a Api User , ApiKey and require the product you want
We use Express.js for this tutorial but feel free to use what ever framework please you
also our product for this tutorial is Collection
Import the required modules from express and momo-api.
```javascript
require('dotenv').config();
const express = require("express");
const { createApiUser } = require("momo-api")
const { createApiKey } = require("momo-api")
//Product Details here
const { colAccessToken } = require("momo-api")
const { requestToPay } = require("momo-api")
```
Create an instance of Express and assign it to the app variable.
```javascript
const app = express();
app.use(express.json());
```
Define some constants that are required to create an API user and an API key. In this case, the `xReferenceId` is a unique identifier for the transaction, the `subscriptionKey` is a subscription key provided by the API provider, the `targetEnvironment` is the environment (either sandbox or production), and the `providerCallbackHost` is the URL that the provider will send callbacks to.
```javascript
const xReferenceId = uuidv4();
const subscriptionKey = process.env.COLLECTION_SUBCRIPTION_KEY;
const targetEnvironment = "sandbox";
const providerCallbackHost = "Your-call-back-Host";
const port = 3000;
```
Define a route for creating an API user. When a POST request is sent to this endpoint, the createApiUser function from the momo-api library is called with the necessary parameters. If the API request is successful, the response data is sent back to the client. If there is an error, a 500 status code is returned with an error message.
```javascript
app.post("/api", async (req, res) => {
try {
const response = await createApiUser(
url,
xReferenceId,
subscriptionKey,
targetEnvironment,
providerCallbackHost
);
res.json(response.data);
} catch (error) {
console.error("There was a problem with the API request:", error);
res
.status(500)
.send({ error: "An error occurred while making the API request" });
}
});
```
Define a route for creating an API key. When a POST request is sent to this endpoint, the `createApiKey` function from the `momo-api` library is called with the necessary parameters. If the API request is successful, the generated API key is stored in the `apiKey` variable and sent back to the client. If there is an error, a 500 status code is returned with an error message.
```javascript
let apiKey;
app.post("/api-key", async (req, res) => {
try {
const response = await createApiKey(
apiKeyUrl,
subscriptionKey,
targetEnvironment,
xReferenceId,
providerCallbackHost
);
apiKey = response.apiKey;
res.json(apiKey);
} catch (error) {
console.error("There was a problem with the API request:", error);
res
.status(500)
.send({ error: "An error occurred while making the API request" });
}
});
```
## Collection API
Getting Access Token
Use the `colAccessToken` function to generate an access token for the Collection API:
```javascript
app.post("/api-token", async (req, res) => {
try {
// Call the createAccessToken function and store the result in the accessToken variable
accessToken = await colAccessToken(
apiKey,
momohost,
subscriptionKey,
xReferenceId
);
res.json(accessToken);
} catch (error) {
console.error("There was a problem with the API request:", error);
res
.status(500)
.send({ error: "An error occurred while making the API request" });
}
});
```
`requestToPay`
This function sends a request to pay to a specified mobile money user.
```javascript
app.post("/request-to-pay", async (req, res) => {
try {
// You will need to get the relevant data from the request body
const { payer, payee, amount, currency, externalId, payerNote, payeeNote } = req.body;
let callbackUrl = null; //I don't have a call back Url
// Make the request-to-pay API call using the requestToPay function
const momoResponse = await requestToPay(
momohost,
subscriptionKey,
callbackUrl,
targetEnvironment,
payer,
payee,
amount,
currency,
externalId,
payeeNote,
payerNote,
accessToken.access_token
);
// Handle the response appropriately
console.log("MoMo response:", momoResponse);
res.json(momoResponse);
} catch (error) {
console.error("Error making request-to-pay API request:", error);
res.status(500).send({ error: "An error occurred while making the request-to-pay API request" });
}
});
```
Here is the rest of the `server.js` code just if you need it we set the app to listen at port 3000
```javascript
app.listen(port, () => {
console.log(`Server is listening on port ${port}`);
});
```
Also Here is the Client.js Just if you need it have fun code
```javascript
const axios = require("axios");
const { v4: uuidv4 } = require("uuid");
const headers = {
"Content-Type": "application/json"
};
const body = JSON.stringify({
providerCallbackHost: "https://webhook.site/7c6c8e50-bc68-41f1-9199-e7da5dac7ff3"
});
const requestToPayData = {
amount: "500",
currency: "EUR",
externalId: uuidv4(),
payer: {
partyIdType: "MSISDN",
partyId: "256782181480"
},
payerMessage: "Test payment",
payeeNote: "Payment for testing purposes",
payee: {
partyIdType: "MSISDN",
partyId: "256782181481"
}
};
const transferData = {
amount: "200",
currency: "EUR",
externalId: uuidv4(),
payee: {
partyIdType: "MSISDN",
partyId: "256782181481"
},
payerMessage: "Test transfer",
payeeNote: "Test transfer",
};
(async () => {
try {
const response1 = await axios.post("http://localhost:3000/api", body, { headers });
console.log(response1.status + "api user created ");
const response2 = await axios.post("http://localhost:3000/api-key", body, { headers });
console.log(response2.status + "Api Key created");
const response3 = await axios.post("http://localhost:3000/api-token", body, { headers });
console.log(response3.status + "Api Token Generated");
// const response5 = await axios.post("http://localhost:3000/transfer", transferData, { headers });
// console.log(response5.status + "Transfer sent");
const response4 = await axios.post("http://localhost:3000/request-to-pay", requestToPayData);
console.log(response4.status + "Request to pay sent");
} catch (error) {
console.error("There was a problem with the axios operation:", error.response.status);
}
})();
```
Don't forget to start the server run `node server.js` to test the client.js run `node client.js`
## License
This package is licensed under the MIT License.