k2-connect-node
v2.0.0
Published
This is a Kopokopo module that allows you to consume our APIs
Readme
Kopokopo Node.js SDK
This is a module to assist developers in consuming Kopokopo's API
Installation
To install run the following command on your project's directory:
npm install --save k2-connect-nodeInitialisation
The package should be configured with your client id and client secret which you can get from your account on the kopokopo's app
//Having stored your credentials as environment variables
const options = {
clientId: process.env.K2_CLIENT_ID,
clientSecret: process.env.K2_CLIENT_SECRET,
baseUrl: process.env.K2_BASE_URL,
apiKey: process.env.K2_API_KEY
}
//Including the kopokopo module
var K2 = require("k2-connect-node")(options)Note: The baseUrl can be custom for testing purposes but we recommend using the sandbox base url during development.
After initialization, you can get instances of offered services as follows:
- Tokens :
var TokenService = K2.TokenService - Webhooks :
var Webhooks = K2.Webhooks - STK PUSH :
var StkService = K2.StkService - External Recipient :
var ExternalRecipientService = K2.ExternalRecipientService - SendMoney :
var SendMoneyService = K2.SendMoneyService - Transfer :
var TransferService = K2.TransferService - Polling :
var PollingService = K2.PollingService - Payment Links :
var PaymentLinkService = K2.PaymentLinkService - Reversals:
var ReversalService = K2.ReversalService
Usage
The package needs to be configured with your kopokopo's clientId and Secret Key, which you can get from the kopokopo application.
Tokens
To send any requests to Kopokopo's API you'll need an access token
const TokenService = K2.TokenService
TokenService
.getToken()
.then(response => {
//Developer can decide to store the token_details and track expiry
console.log("Access token is: " + response.access_token)
})
.catch( error => {
console.log(error)
})Webhooks
- Consuming
const Webhooks = K2.Webhooks
//Router or whatever server you are using
router.post('/customercreated', function(req, res, next){
// Send message and capture the response or error
Webhooks
.webhookHandler(req, res)
.then( response => {
console.log(response)
})
.catch( error => {
console.log(error)
})
})- Subscription
const subscribeOptions = {
eventType: 'buygoods_transaction_received',
url: 'https://my-valid-url.com/endpoint',
accessToken: 'my_access_token',
scope: 'till',
scopeReference: '123456'
}
Webhooks
.subscribe(subscribeOptions)
.then( response => {
console.log("The location url is: " + response)
})
.catch( error => {
console.log(error)
})- To get the status of the webhook subscription
const statusOptions = {
location: 'https://sandbox.kopokopo.com/webhook_subscriptions/c7f300c0-f1ef-4151-9bbe-005005aa3747',
accessToken: 'my_access_token'
}
Webhooks
.getStatus(statusOptions)
.then( response => {
console.log("The status is: " + response)
})
.catch( error => {
console.log(error)
})STK PUSH
const StkService = K2.StkService
var stkOptions = {
tillNumber: K000000,
firstName: 'Jane',
lastName: 'Doe',
phoneNumber: '+254712345678',
email: '[email protected]',
currency: 'KES',
amount: 20,
callbackUrl: 'https://my-valid-url.com/endpoint',
paymentChannel => 'M-PESA STK Push',
accessToken: 'my_access_token',
//A maximum of 5 key value pairs
metadata: {
customerId: '123456789',
reference: '123456',
notes: 'Payment for invoice 123456'
}
}
// Send message and capture the response or error
StkService
.initiateIncomingPayment(stkOptions)
.then( response => {
console.log(response)
})
.catch( error => {
console.log(error)
})For other usage examples check out the example app.
Services
The methods are asynchronous.
The only supported ISO currency code at the moment is: KES
TokenService
TokenService.getToken()to get an access token.- The response will contain:
token_type,expires_in,created_atandaccess_token
- The response will contain:
NB: The access token is required to send subsequent requests
TokenService.revokeToken({accessToken: 'my_access_token'})to revoke an access token.- The response will be an empty body
NB: A revoked access token cannot be used on subsequent requests
TokenService.introspectToken({accessToken: 'my_access_token'})to get introspect a token.- The response will contain:
token_type,client_id,scope,active,exp(Expiry time) andiat(created at time)
- The response will contain:
TokenService.infoToken({accessToken: 'my_access_token'})to get information on an access token.- The response will contain:
scope,expires_in,application.uid,created_at
- The response will contain:
StkService
StkService.initiateIncomingPayment({ stkOptions }):stkOptions: A hash of objects containing the following keys:tillNumber: Your online payments till number from Kopo Kopo's DashboardREQUIREDfirstName: Customer's first namelastName: Customer's last namephoneNumber: Phone number to pull money from.REQUIREDemail: Subscriber's email addresscurrency: 3-digit ISO format currency code.REQUIREDamount: Amount to charge.REQUIREDcallbackUrl: Url that the result will be posted toREQUIREDpaymentChannel: Payment channel. Default is:"M-PESA STK Push".REQUIREDaccessToken: Gotten from theTokenServiceresponseREQUIREDmetadata: It is a hash containing a maximum of 5 key value pairs
StkService.getStatus({ statusOpts }):statusOpts: A hash of objects containing the following keys:location: The location url you got from the requestREQUIREDaccessToken: Gotten from theTokenServiceresponseREQUIRED
This works the same for all requests that you get a location response.
For more information, please read https://api-docs.kopokopo.com/#receive-payments-from-m-pesa-users-via-stk-push
ExternalRecipientService
ExternalRecipientService.addExternalRecipient({ externalRecipientOptions }):externalRecipientOptions: A hash of objects containing the following keys:type: Recipient typeREQUIRED- Mobile Wallet Recipient(
mobile_wallet)firstName: Pay recipient's first nameREQUIREDlastName: Pay recipient's last nameREQUIREDphoneNumber: Pay recipient's phone numberREQUIREDemail: Pay recipient's email addressnetwork: Pay recipient's networkREQUIREDnickname: Pay recipient's nicknameOPTIONAL
- Bank Account Recipient(
bank_account)accountName: Pay recipient's account nameREQUIREDaccountNumber: Pay recipient's account numberREQUIREDbankBranchRef: Bank branch reference from the kopokopo dashboardREQUIREDnickname: Pay recipient's nicknameOPTIONALsettlementMethod: Settlement MethodREQUIRED
- External Till Recipient(
till)tillNumber: Pay recipient's till numberREQUIREDtillName: Pay recipient's till nameREQUIREDnickname: Pay recipient's nicknameOPTIONAL
- Paybill Recipient(
paybill)paybillName: Paybill nameREQUIREDpaybillNumber: Paybill numberREQUIREDpaybillAccountNumber: Paybill account numberREQUIREDnickname: Pay recipient's nicknameOPTIONAL
accessToken: Gotten from theTokenServiceresponseREQUIRED
For more information, please read https://api-docs.kopokopo.com/#send-money-pay
SendMoneyService
SendMoneyService.sendMoney({ sendMoneyOptions }):sendMoneyOptions: A hash of objects containing the following keys:sourceIdentifier: The source identifier.REQUIREDcurrency: 3-digit ISO format currency code. Default isKESdestinations: An array of destination objects representing one or more recipients.
Each destination must include atypeproperty indicating its category.
The structure of each destination object depends on thetype:- Mobile Wallet Destination (
mobile_wallet)phone_number: Recipient’s phone numberREQUIREDnetwork: Recipient’s mobile networkREQUIREDnickname: Nickname for the destinationamount: Amount to sendREQUIREDdescription: Transaction descriptionfavourite: Whether to mark this destination as favourite
- Bank Account Destination (
bank_account)bank_branch_ref: Bank branch referenceREQUIREDaccount_name: Account nameREQUIREDaccount_number: Account numberREQUIREDnickname: Nickname for the destinationamount: Amount to sendREQUIREDdescription: Transaction descriptionfavourite: Whether to mark this destination as favourite
- Till Destination (
till)till_number: Till numberREQUIREDamount: Amount to sendREQUIREDdescription: Transaction descriptionnickname: Nickname for the destinationfavourite: Whether to mark this destination as favourite
- Paybill Destination (
paybill)paybill_number: Paybill numberREQUIREDpaybill_account_number: Paybill account numberREQUIREDamount: Amount to sendREQUIREDdescription: Transaction descriptionnickname: Nickname for the destinationfavourite: Whether to mark this destination as favourite
- Merchant Wallet Destination (
merchant_wallet)reference: Merchant referenceREQUIREDamount: Amount to sendREQUIREDdescription: Transaction description
- Merchant Bank Account Destination (
merchant_bank_account)reference: Merchant referenceREQUIREDamount: Amount to sendREQUIREDdescription: Transaction description
- Mobile Wallet Destination (
callbackUrl: URL that the result will be posted to.REQUIREDaccessToken: Access token obtained from theTokenServiceresponse.REQUIREDmetadata: A hash containing up to 5 key–value pairs for additional information.
SendMoneyService.getStatus({ statusOpts }):statusOpts: A hash of objects containing the following keys:location: The location URL you got from the request.REQUIREDaccessToken: Access token obtained from theTokenServiceresponse.REQUIRED
This works the same for all requests that you get a location response.
For more information, please read https://api-docs.kopokopo.com/#send-money
TransferService
TransferService.createMerchantBankAccount({ accountOpts }):accountOpts: A hash of objects containing the following keys:accountName: Settlement Account NameREQUIREDsettlementMethod: Settlement MethodREQUIREDbankBranchRef: Settlement Bank Branch ReferenceREQUIREDaccountNumber: Settlement account numberREQUIREDaccessToken: Gotten from theTokenServiceresponseREQUIRED
TransferService.createMerchantWallet({ accountOpts }):accountOpts: A hash of objects containing the following keys:phoneNumber: Phone number to settle toREQUIREDnetwork: NetworkREQUIREDaccessToken: Gotten from theTokenServiceresponseREQUIRED
For more information, please read https://api-docs.kopokopo.com/#transfer-to-your-account-s
PollingService
PollingService.pollTransactions({ pollingOpts }):pollingOpts: A hash of objects containing the following keys:fromTime: The starting time of the polling requesttoTime: The end time of the polling requestscope: The scope of the polling requestscopeReference: The scope referenceREQUIRED for the 'Till' scopecallbackUrl: Url that the result will be posted toREQUIREDaccessToken: Gotten from theTokenServiceresponseREQUIRED
PollingService.getStatus({ statusOpts }):statusOpts: A hash of objects containing the following keys:location: The location url you got from the requestREQUIREDaccessToken: Gotten from theTokenServiceresponseREQUIRED
This works the same for all requests that you get a location response.
For more information, please read https://api-docs.kopokopo.com/#polling
PaymentLinkService
PaymentLinkService.createPaymentLink({ paymentLinkOptions }):paymentLinkOptions: A hash of objects containing the following keys:amount: The amount for the payment link.REQUIREDcurrency: 3-digit ISO format currency code (e.g., 'KES', 'USD').REQUIREDtill_number: The till number to receive the payment.REQUIREDpayment_reference: The payment reference.OPTIONALnote: A note for the payment link.OPTIONALcallback_url: The URL that the result will be posted to asynchronously.REQUIREDmetadata: A hash containing up to 5 key–value pairs for additional information.OPTIONALaccessToken: Access token obtained from theTokenServiceresponse.REQUIRED
Returns a Promise that resolves to the location URL of the created payment link.
PaymentLinkService.getStatus({ paymentLinkStatusOptions }):paymentLinkStatusOptions: A hash of objects containing the following keys:location: The payment link request location URL.REQUIREDaccessToken: Access token obtained from theTokenServiceresponse.REQUIRED
Returns a Promise that resolves to the payment link details object.
PaymentLinkService.cancelPaymentLink({ paymentLinkCancelOptions }):paymentLinkCancelOptions: A hash of objects containing the following keys:location: The payment link request location URL.REQUIREDaccessToken: Access token obtained from theTokenServiceresponse.REQUIRED
Returns a Promise that resolves to the cancellation response object.
For more information, please read https://api-docs.kopokopo.com/#payment-links
ReversalService
ReversalService.initiateReversal({ reversalOptions }):reversalOptions: A hash of objects containing the following keys:transactionReference: The reference of the transaction to be reversed.REQUIREDreason: The reason for the reversal.REQUIREDmetadata: A hash containing up to 5 key–value pairs for additional information.OPTIONALcallbackUrl: The URL that the result will be posted to asynchronously.REQUIREDaccessToken: Access token obtained from theTokenServiceresponse.REQUIRED
Returns a Promise that resolves to the location URL of the reversal request.
ReversalService.getStatus({ statusOptions }):statusOptions: A hash of objects containing the following keys:location: The location URL you got from the reversal request.REQUIREDaccessToken: Access token obtained from theTokenServiceresponse.REQUIRED
Returns a Promise that resolves to the reversal status details object.
This works the same for all requests that you get a location response.
For more information, please read https://api-docs.kopokopo.com/#reversals
Responses and Results
- All the post requests are asynchronous apart from
TokenService. This means that the result will be posted to your custom callback url when the request is complete. The immediate response of the post requests contain thelocationurl of the request you have sent which you can use to query the status.
Note: The asynchronous results are processed like webhooks.
Author
Contributions
We welcome those with open arms just make a pull request and we will review.
Development
Run all tests:
$ npm install
$ npm testGenerate Docs:
$ ./node_modules/.bin/jsdoc lib -d docsIssues
If you find a bug, please file an issue on our issue tracker on GitHub.
License
k2-connect-node is MIT licensed. See LICENSE for details.

