UNPKG

monnify-nodejs

Version:

A simple wrapper to leverage monnify's payment gateway for businesses to accept payments from customers, either on a recurring or one-time basis. It offers an easier and faster way for integration with monnify API on you web and mobile applications from w

337 lines (299 loc) 11.4 kB
const https = require('https'); const { promisify } = require('util') const sleep = promisify(setTimeout) class Monnify { constructor(secretKey, apiKey, baseUrl) { this.secretKey = secretKey; this.apiKey = apiKey; this.baseUrl = baseUrl; } async makeRequest(method, path, headers, requestBody) { try { const options = { hostname: this.baseUrl, port: 443, path: path, method: method, headers: headers }; let p = new Promise((resolve, reject) => { const req = https.request(options, (res) => { let data = ''; res.on('data', (d) => { data += d; }); res.on('end', () => { resolve(JSON.parse(data)); }); }).on('error', (error) => { reject(error); }); if (typeof (requestBody) !== 'undefined') { req.write(JSON.stringify(requestBody)); } req.end(); }); return await p } catch (error) { console.log(error) return error } } // to generate token async genToken() { const key = Buffer.from(this.apiKey + ':' + this.secretKey).toString('base64') let path = '/api/v1/auth/login' const headers = { 'Authorization': `Basic ${key}` } const data = await this.makeRequest('POST', path, headers) // this.accessToken = data.responseBody.accessToken return data } // to reserve an account async reserveAccount(requestBody, accessToken) { let path = '/api/v2/bank-transfer/reserved-accounts' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data; } // to get list of all banks async getBanks(accessToken) { let path = '/api/v1/banks' let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } // to make single outbound transfer async singleOutboundTransfer(requestBody, accessToken) { let path = '/api/v2/disbursements/single' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } // to make bulk outbound transfer async bulkOutboundTransfer(requestBody, accessToken) { let path = '/api/v2/disbursements/batch' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } // to authorize single outbound transfer async authorizeSingleTransfer(requestBody, accessToken) { let path = '/api/v2/disbursements/single/validate-otp' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody); return data; } // to authorize bulk outbound transfer async authorizeBulkTransfer(requestBody, accessToken) { let path = '/api/v2/disbursements/batch/validate-otp' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } // resend OTP async resendOtpSingle(requestBody, accessToken) { let path = '/api/v2/disbursements/single/resend-otp' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async resendOtpBulk(requestBody, accessToken) { let path = '/api/v2/disbursements/batch/resend-otp' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } // to get single outbound transfer status async getSingleTransferStatus(reference, accessToken) { let path = `/api/v2/disbursements/single/summary?reference=${reference}` let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } // to get bulk outbound transfer status async getBulkTransferStatus(reference, accessToken) { let path = `/api/v2/disbursements/batch/summary?reference=${reference}` let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } // to get merchant account wallet balance async getWalletBalance(accountNumber, accessToken) { let path = `/api/v2/disbursements/wallet-balance?accountNumber=${accountNumber}` let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } // to get reserved account details async getAccountDetails(reference, accessToken) { let path = `/api/v2/bank-transfer/reserved-accounts/${reference}` let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } // for merchant to receive payments async initiatePayment(requestBody, accessToken) { let path = '/api/v1/merchant/transactions/init-transaction' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async payWithBankTransfer(requestBody, accessToken) { let path = '/api/v1/merchant/bank-transfer/init-payment' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async payWithCard(requestBody, accessToken) { let path = '/api/v1/merchant/cards/charge' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async authorizeOtpForCard(requestBody, accessToken) { let path = '/api/v1/merchant/cards/otp/authorize' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async chargeCardToken(requestBody, accessToken) { let path = '/api/v1/merchant/cards/charge-card-token' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async deleteReservedAccount(accountReference, accessToken) { let path = `/api/v1/bank-transfer/reserved-accounts/reference/${accountReference}` let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('DELETE', path, headers) return data } async createLimitProfile(requestBody, accessToken) { let path = '/api/v1/limit-profile/' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async updateLimitProfile(limitProfileCode, requestBody, accessToken) { let path = `/api/v1/limit-profile/${limitProfileCode}` let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('PUT', path, headers, requestBody) return data } async getLimitProfiles(accessToken) { let path = '/api/v1/limit-profile/' let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } async reserveAccountWithLimit(requestBody, accessToken) { let path = '/api/v1/bank-transfer/reserved-accounts/limit' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async updateReserveAccountLimit(requestBody, accessToken) { let path = '/api/v1/bank-transfer/reserved-accounts/limit' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('PUT', path, headers, requestBody) return data } async initiateRefund(requestBody, accessToken) { let path = '/api/v1/refunds/initiate-refund' let headers = { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': "application/json" } const data = await this.makeRequest('POST', path, headers, requestBody) return data } async getAllRefunds(page, size, accessToken) { let path = `/api/v1/refunds?page=${page}&size=${size}` let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } async getRefundStatus(refundReference, accessToken) { let path = `/api/v1/refunds/${refundReference}` let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } async validateBankAccount(accountNumber, bankCode, accessToken) { let path = `/api/v1/disbursements/account/validate?accountNumber=${accountNumber}&bankCode=${bankCode}` let headers = { 'Authorization': `Bearer ${accessToken}` } const data = await this.makeRequest('GET', path, headers) return data } } module.exports = Monnify