Sanwo Flutter
Sanwo payment SDK for Flutter — one interface for every payment provider.
Installation
Add sanwo_flutter and a provider package to your pubspec.yaml:
dependencies:
sanwo_flutter: ^0.1.0
sanwo_paystack: ^0.1.0 # or sanwo_flutterwave
Then run:
flutter pub get
Platform Setup
Android
Add internet permission to android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
Set the minimum SDK version in android/app/build.gradle:
android {
defaultConfig {
minSdkVersion 20
}
}
iOS
No additional setup required.
Quick Start
import 'package:sanwo_flutter/sanwo_flutter.dart';
import 'package:sanwo_paystack/sanwo_paystack.dart';
// Create an instance with your provider and public key
final sanwo = Sanwo(
provider: paystackProvider,
publicKey: 'pk_test_...',
);
// Listen for events (optional)
sanwo.on(SanwoEvent.success, (event) {
print('Success: ${event.reference}');
});
// Start checkout from a button handler
final result = await sanwo(
context: context,
options: CheckoutOptions(
amount: 500000, // 5000 NGN in kobo
currency: 'NGN',
customer: CheckoutCustomer(email: 'user@example.com'),
onLoad: () => print('Checkout loaded'),
onError: (error) => print('Error: $error'),
),
);
// Handle the result
if (result.status == CheckoutStatus.successful) {
print('Payment successful! Reference: ${result.reference}');
} else if (result.status == CheckoutStatus.cancelled) {
print('Payment cancelled');
} else if (result.status == CheckoutStatus.failed) {
print('Payment failed: ${result.message}');
}
Provider Packages
Provider templates are distributed as separate packages to keep the core SDK lightweight. Install only the providers you need.
| Package | Provider | Amount Unit |
|---|---|---|
sanwo_paystack |
Paystack | Minor (kobo) |
sanwo_flutterwave |
Flutterwave | Major (naira) -- auto-converted |
sanwo_razorpay |
Razorpay | Minor (paise) |
sanwo_monnify |
Monnify | Major (naira) -- auto-converted |
sanwo_interswitch |
Interswitch | Minor (kobo) |
Paystack
import 'package:sanwo_flutter/sanwo_flutter.dart';
import 'package:sanwo_paystack/sanwo_paystack.dart';
final sanwo = Sanwo(
provider: paystackProvider,
publicKey: 'pk_test_...',
);
final result = await sanwo(
context: context,
options: CheckoutOptions(
amount: 500000, // 5000 NGN in kobo
currency: 'NGN',
customer: CheckoutCustomer(
email: 'user@example.com',
firstName: 'John',
lastName: 'Doe',
),
channels: ['card', 'bank'],
metadata: {'order_id': '12345'},
),
);
Flutterwave
import 'package:sanwo_flutter/sanwo_flutter.dart';
import 'package:sanwo_flutterwave/sanwo_flutterwave.dart';
final sanwo = Sanwo(
provider: flutterwaveProvider,
publicKey: 'FLWPUBK_TEST-...',
);
final result = await sanwo(
context: context,
options: CheckoutOptions(
amount: 500000, // 5000 NGN in kobo -- auto-converted to 5000 naira
currency: 'NGN',
customer: CheckoutCustomer(
email: 'user@example.com',
firstName: 'John',
lastName: 'Doe',
phone: '08012345678',
),
customizations: {
'title': 'My Store',
'logo': 'https://example.com/logo.png',
},
),
);
Razorpay
import 'package:sanwo_flutter/sanwo_flutter.dart';
import 'package:sanwo_razorpay/sanwo_razorpay.dart';
final sanwo = Sanwo(
provider: razorpayProvider,
publicKey: 'rzp_test_...',
);
final result = await sanwo(
context: context,
options: CheckoutOptions(
amount: 50000, // 500 INR in paise
currency: 'INR',
customer: CheckoutCustomer(
email: 'user@example.com',
name: 'John Doe',
),
),
);
Monnify
import 'package:sanwo_flutter/sanwo_flutter.dart';
import 'package:sanwo_monnify/sanwo_monnify.dart';
final sanwo = Sanwo(
provider: monnifyProvider,
publicKey: 'MK_TEST_...',
);
final result = await sanwo(
context: context,
options: CheckoutOptions(
amount: 500000, // 5000 NGN in kobo -- auto-converted to 5000 naira
currency: 'NGN',
customer: CheckoutCustomer(
email: 'user@example.com',
firstName: 'John',
lastName: 'Doe',
),
contractCode: 'YOUR_CONTRACT_CODE',
),
);
Interswitch
import 'package:sanwo_flutter/sanwo_flutter.dart';
import 'package:sanwo_interswitch/sanwo_interswitch.dart';
final sanwo = Sanwo(
provider: interswitchProvider,
publicKey: 'YOUR_MERCHANT_CODE',
);
final result = await sanwo(
context: context,
options: CheckoutOptions(
amount: 500000, // 5000 NGN in kobo
currency: 'NGN',
customer: CheckoutCustomer(email: 'user@example.com'),
payItemId: 'Default_Payable_MX12345',
),
);
Amount Handling
All amounts are specified in minor units (e.g., kobo for NGN, cents for USD). The SDK automatically converts amounts for providers that expect major units.
| Currency Type | Divisor | Examples |
|---|---|---|
| 2-decimal | 100 | NGN, USD, EUR, GBP |
| 0-decimal | 1 | JPY, KRW, VND |
| 3-decimal | 1000 | BHD, KWD, OMR |
Events
You can listen for payment events using the on method:
sanwo.on(SanwoEvent.success, (data) => print('Success: $data'));
sanwo.on(SanwoEvent.cancelled, (data) => print('Cancelled'));
sanwo.on(SanwoEvent.failed, (data) => print('Failed: ${data.message}'));
sanwo.on(SanwoEvent.loaded, (data) => print('Loaded'));
sanwo.on(SanwoEvent.closed, (data) => print('Closed'));
CheckoutResult
Calling the Sanwo instance returns a CheckoutResult with:
| Property | Type | Description |
|---|---|---|
status |
CheckoutStatus |
successful, cancelled, or failed |
reference |
String? |
Payment reference |
transactionId |
String? |
Provider transaction ID |
message |
String? |
Status or error message |
data |
Map |
Raw provider response data |
License
Apache 2.0 — see LICENSE for details.
Libraries
- sanwo_flutter
- Sanwo payment SDK for Flutter.