Billpocket Plugin
Introducing Billpocket: Simplifying Mobile Card Payments and Terminal Integration for Flutter
Show some ❤️ and star the repo to support the project
Getting Started
Android
You need to add the following permissions in android to request bluetooth access
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
Dart
Set your Billpocket token and development environment.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Billpocket.config(
isProduction: true,
token: '{YOUR_TOKEN}');
runApp(const MyAppPage());
}
Documentation
SDK status
You can check the status of the SDK initialization by calling the following line of code:
await Billpocket.getStatusSDK();
Which will return a bool
value.
Terminal list
You can get the list of all the terminals that have been paired via bluetooth with the following method:
await Billpocket.getReaders();
Which will return a List<Reader>
value.
Connect terminal
Once you have chosen a terminal you must call the following method sending the parameters obtained in Reader
:
await Billpocket.connectReader(
readerType: readerType,
readerMacAddress: readerMacAddress,
name: name);
Which will return a bool
value.
Start a transaction
await Billpocket.doTransaction(
amount: "10",
tip: "0",
latitude: 19.42691938620286,
longitude: -99.16780320031096,
description: "description");
Running this method will trigger a stream of events.
Billpocket.transactionStream().listen((event) {
final eventName = event['event'];
final message = event['message'];
switch (eventName) {
case 'onTransactionAborted':
// Handle the onTransactionAborted event
print('Transaction aborted: $message');
break;
case 'onBeforeTransaction':
// Handle the onBeforeTransaction event
print('Transaction before: $message');
break;
case 'onCardRead':
// Handle the onCardRead event
print('Transaction card read: $message');
break;
case 'getSignature':
// Handle the getSignature event
print('Transaction get signature: $message');
break;
case 'onReaderWaitingForCard':
// Handle the onReaderWaitingForCard event
print('Transaction reader waiting for card: $message');
break;
case 'onMsiDefined':
// Handle the onMsiDefined event
final list = event['list'];
print('Transaction msi defined: $message');
print('MSI list: $list');
showMSI(list);
break;
case 'onGetPin':
// Handle the onGetPin event
print('Transaction get pin: $message');
break;
case 'onMagneticCardFound':
// Handle the onMagneticCardFound event
print('Transaction magnetic card found: $message');
break;
case 'onTransactionFinished':
// Handle the onTransactionFinished event
print('Transaction finished: $message');
break;
case 'onTransactionSuccessful':
// Handle the onTransactionSuccessful event
print('Transaction successful: $message');
break;
case 'resultStartTransaction':
// Handle the resultStartTransaction event
print('Transaction result start: $message');
break;
case 'resultStartTransactionSuccess':
// Handle the resultStartTransactionSuccess event
print('Transaction result start success: $message');
break;
case 'resultStartTransactionError':
// Handle the resultStartTransactionError event
print('Transaction result start error: $message');
break;
// Handle other events similarly
default:
print('Unknown event received: $eventName');
break;
}
Explanation of events
-
onGetPin and getSignature: These methods will open native screens so there is no need to handle the response.
-
onMsiDefined: This method will return a string that must be parsed to get a
List<Installment>
. Please review the example. -
other methods: These methods are transactional so it depends on the use case.
Months without interest
If the amount you have entered in doTransaction
exceeds the limit of months without interest, the onMsiDefined event explained above will be triggered. As a list will be obtained and an interest-free months option must be chosen to continue with the transaction, you must call the following method sending the chosen parameters in Installment:
Billpocket.continueWithMsi(
commission: installment[pos].commission!,
installments: installment[pos].value!,
minAmount: installment[pos].minAmount!,
);
Calling that method will continue the flow in the stream explained above.
Issues
Please file any issues, bugs, or feature requests in the GitHub repo.
Contributing
If you wish to contribute a change to this repo, please send a pull request.
Acknowledgments
This package was originally created by Abel Tarazona and Jared González.