- Initialize Transaction
- Split Payment
- Verify Payment
- Get Banks
- Create Subaccount
- Generate Transaction Reference (Utiltiy Function)
- Full TypeScript Support
NPM
$ npm i -s chapa-nestjs
Yarn
$ yarn add chapa-nestjs
Once the installation process is complete, we can import the module either synchronously or asynchronosly into the root AppModule
or any other module.
import { Module } from '@nestjs/common';
import { ChapaModule } from 'chapa-nestjs';
@Module({
imports: [
ChapaModule.register({
secretKey: 'your-chapa-secret-key',
}),
],
})
export class AppModule {}
In this example, the module integrates with the awesome @nestjs/config package.
useFactory
should return an object with ChapaOptions
.
import { Module } from '@nestjs/common';
import { ChapaModule } from 'chapa-nestjs';
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
imports: [
ChapaModule.registerAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => ({
secretKey: configService.get('SECRET_KEY'),
}),
}),
],
})
export class AppModule {}
Note: You can import this module from not only the root module of your app but also from other feature modules where you want to use it.
This utility method ChapaService
allows you to generating a customizable random alpha numberic transaction reference.
const tx_ref = await this.chapaService.generateTransactionReference(); // result: TX-JHBUVLM7HYMSWDA
// Or with options
const tx_ref = await this.chapaService.generateTransactionReference({
prefix: 'tx', // defaults to `tx`
size: 20, // defaults to `15`
});
To initialize a transaction, we have two possilbe ways. The first one is for web payment, simply call the initialize
method from ChapaService
instance, and pass to it InitializeOptions
options. For mobile payment use mobileInitialize
, it accepts and returns the same format as the initialize
method.
// Generate transaction reference using our utility method or provide your own
const tx_ref = await this.chapaService.generateTransactionReference();
const response = await this.chapaService.initialize({
first_name: 'John',
last_name: 'Doe',
email: '[email protected]',
currency: 'ETB',
amount: '200',
tx_ref: tx_ref,
callback_url: 'https://example.com/',
return_url: 'https://example.com/',
customization: {
title: 'Test Title',
description: 'Test Description',
},
});
// Generate transaction reference using our utility method or provide your own
const tx_ref = await this.chapaService.generateTransactionReference();
const response = await this.chapaService.mobileInitialize({
first_name: 'John',
last_name: 'Doe',
email: '[email protected]',
currency: 'ETB',
amount: '200',
tx_ref: tx_ref,
callback_url: 'https://example.com/',
return_url: 'https://example.com/',
customization: {
title: 'Test Title',
description: 'Test Description',
},
});
enum SplitType {
PERCENTAGE = 'percentage',
FLAT = 'flat',
}
interface Subaccount {
id: string;
split_type?: SplitType;
transaction_charge?: number;
}
interface InitializeOptions {
first_name: string;
last_name: string;
email: string;
currency: string;
amount: string;
tx_ref: string;
callback_url?: string;
return_url?: string;
customization?: {
title?: string;
description?: string;
logo?: string;
};
subaccounts?: Subaccount[];
}
interface InitializeResponse {
message: string;
status: string;
data: {
checkout_url: string;
};
}
To verify payment, simply call the verify
method from ChapaService
instance, and pass to it VerifyOptions
options.
const response = await this.chapaService.verify({
tx_ref: 'TX-JHBUVLM7HYMSWDA',
});
interface VerifyOptions {
tx_ref: string;
}
interface VerifyResponse {
message: string;
status: string;
data: {
first_name: string;
last_name: string;
email: string;
currency: string;
amount: string;
charge: string;
mode: string;
method: string;
type: string;
status: string;
reference: string;
tx_ref: string;
customization: {
title: string;
description: string;
logo: string;
};
meta: any;
created_at: Date;
updated_at: Date;
};
}
This section describes how to get bank details for all supported banks Chapa
is working with. getBanks
method of ChapaService
instance returns all the Banks information for all currencies. The method does not accept any options.
const response = await this.chapaService.getBanks();
type Currency = 'ETB' | 'USD';
interface Data {
id: string;
swift: string;
name: string;
acct_length: number;
country_id: number;
created_at: Date;
updated_at: Date;
is_rtgs: boolean | null;
is_mobilemoney: boolean | null;
currency: Currency;
}
interface GetBanksResponse {
message: string;
data: Data[];
}
To create subaccounts, simply call the createSubaccount
method from ChapaService
instance, and pass to it CreateSubaccountOptions
options.
const response = await this.chapaService.createSubaccount({
business_name: 'Test Business',
account_name: 'John Doe',
bank_code: '80a510ea-7497-4499-8b49-ac13a3ab7d07', // Get this from the `getBanks()` method
account_number: '0123456789',
split_type: SplitType.PERCENTAGE,
split_value: 0.02,
});
interface CreateSubaccountOptions {
business_name: string;
account_name: string;
bank_code: string;
account_number: string;
split_type: SplitType;
split_value: number;
}
interface CreateSubaccountResponse {
message: string;
status: string;
data: string;
}
Split payments are carried out by first creating a subaccount, then initializing the split payment. The process of implementing split payment is the same as initialize a transaction, with additional options( i.e subaccounts
) to the initialize
method of ChapaService
.
// Generate transaction reference using our utility method or provide your own
const tx_ref = await this.chapaService.generateTransactionReference();
const response = this.chapaService.initialize({
first_name: 'John',
last_name: 'Doe',
email: '[email protected]',
currency: 'ETB',
amount: '200',
tx_ref: tx_ref,
callback_url: 'https://example.com/',
return_url: 'https://example.com/',
customization: {
title: 'Test Title',
description: 'Test Description',
},
// Add this for split payment
subaccounts: [
{
id: '80a510ea-7497-4499-8b49-ac13a3ab7d07',
},
],
});
When collecting a payment, you can override the default split_type
and split_value
you set when creating the subaccount, by specifying these fields in the subaccounts item.
subaccounts: [
{
id: '80a510ea-7497-4499-8b49-ac13a3ab7d07',
split_type: SplitType.FLAT,
transaction_charge: 25
},
],
- Author - Fireayehu Zekarias
- Github - https://github.com/fireayehu
- Twitter - https://twitter.com/Fireayehu
- LinkedIn - https://www.linkedin.com/in/fireayehu/
chapa-nestjs is MIT licensed.