Pesepay helps businesses in Africa get paid by anyone, anywhere in the world
This is still WIP! Try out and contribute where you can.
❗ In order to start using Pesepay you must have the Dart SDK installed on your machine.
Add pesepay
to your pubspec.yaml
:
dependencies:
pesepay:
Install it:
dart pub get
import 'package:pesepay/pesepay.dart';
final pesepay = Pesepay(
integrationKey: '',
encryptionKey: '',
resultUrl: '',
returnUrl: '',
);
final List<Currency> currencies = await Pesepay.getActiveCurrencies();
Sample Currency
Currency(
name: Zimbabwe Dollar,
description: Zimbabwe Dollar,
code: ZWL,
defaultCurrency: false,
rateToDefault: 604.25,
active: true
)
final List<PaymentMethod> methods = await Pesepay.getPaymentMethodsByCurrency(currency);
Sample PaymentMethod
PaymentMethod(
active: true,
code: PZW201,
currencies: [ZWL],
description: Make payment directly from your mobile phone.,
id: 1,
maximumAmount: 50000.0,
minimumAmount: 2.0,
name: Ecocash,
processingPaymentMessage: Please enter PIN on the phone that is making the payment.,
redirectRequired: false,
redirectURL: null,
requiredFields: [
RequiredField(
displayName: Phone Number,
fieldType: TEXT,
name: customerPhoneNumber,
optional: false
)
]
)
This relies on the returned web redirectUrl
that customers can use to complete the transaction
First step would be to create the transaction:
final Transaction transaction = pesepay.createTransaction(
amount: 1,
currencyCode: 'ZWL',
transactionDescription: 'Bag of potatoes',
transactionReference: '111-222-333'
)
Then process the transaction:
final TransactionResponse response = await pesepay.initiateWebTransaction(transaction);
If the above execution results in any error either within the package itself or from the Pesepay server side you should except a PesepayException
. So it would be helpful to handle that.
First step here would be to create the transaction:
final SeamlessTransaction seamlessTransaction = pesepay.createSeamlessTransaction(
customerName: 'Cool Name',
customerEmail: 'yourmail@email.com',
customerPhone: '0777111111',
amount: 1,
currencyCode: 'ZWL',
transactionDescription: 'Banana Peel',
transactionReference: '111-222-333',
paymentMethodCode: paymentMethodCode,
);
Process the seamless transaction:
final TransactionResponse response = await pesepay.initiateSeamlessTransaction(transaction);
final TransactionResponse response = await pesepay.checkTransactionStatus(pollUrl);
Instead of using delays to check transaction status you can also stream
the TransactionResponse
using the poll url.
pesepay.streamTransactionResponse(..)
takes a requiredpollUrl
string and optionalstreamInterval
in seconds which is the interval to poll the url, default to20
sec- You can stream status and show current transaction status on UI to user with a
StreamBuilder(..)
like below:
final String pollUrl = response.pollUrl;
// in Widget build(..) method
// you can do something like
StreamBuilder(
stream: pesepay.streamTransactionResponse(pollUrl),
builder: (context, AsyncSnapshot<TransactionResponse> snapshot) {
if(snapshot.hasData) {
final TransactionResponse response = snapshot.data!;
return response.paid ? SuccessWidget() : OtherWidgetsForErrorOrWaiting();
} else {
return CircularProgressIndicator();
}
}
)
void main() async {
try {
final pesepay = Pesepay(
integrationKey: '',
encryptionKey: '',
resultUrl: '',
returnUrl: '',
);
final Transaction transaction = pesepay.createTransaction(
amount: 1,
currencyCode: 'ZWL',
transactionDescription: 'Bag of potatoes',
transactionReference: '111-222-333'
);
final TransactionResponse response = await pesepay.initiateWebTransaction(transaction);
// Add a delay before checking status, maybe 20-30 seconds
await Future.delayed(const Duration(seconds: 30))
// Check status
final TransactionResponse pollResponse = await pesepay.checkTransactionStatus(response.pollUrl);
if (pollResponse.paid) {
// well you've done it
print('I deserve drinks 🍻');
} else {
// not yet pal
print('👎🏿')
}
} on PesepayException catch (e) {
print(e.message);
} catch (e) {
// hell
}
}