stripe_terminal
A flutter plugin to scan stripe readers and connect to the them and get the payment methods.
Installation
Android
No Configuration needed, workes out of the box.
iOS
You need to provide permission request strings to your Info.plist
file. A sample content can be
<key>NSLocationWhenInUseUsageDescription</key>
<string>Location access is required in order to accept payments.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Bluetooth access is required in order to connect to supported bluetooth card readers.</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>This app uses Bluetooth to connect to supported card readers.</string>
You also need to authorize backround modes authorization for bluetooth-central
. Paste the following to your Info.plist
file
<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
</array>
Usage
- First initilize the SDK
stripeTerminal = StripeTerminal(
fetchToken: () async {
// Call your backend to get the connection token and return to this function
// Example token can be.
const token = "pst_test_XXXXXXXXXX....";
return token;
},
);
- Example backend code to get the connection token written on node.js:
import Stripe from "stripe";
import express from "express"
const stripe = new Stripe("sk_test_XXXXXXXXXXXXXXXXXX", {
apiVersion: "2020-08-27"
})
const app = express();
app.get("/connectionToken", async (req, res) => {
const token = await stripe.terminal.connectionTokens.create();
res.send({
success: true,
data: token.secret
});
});
app.post("/createPaymentIntent", async (req, res) => {
const pi = await stripe.paymentIntents.create({
amount: 1000,
currency: "USD",
capture_method: "manual",
payment_method_types: ["card_present"]
})
res.send({
success: true,
paymentIntent: pi
})
})
app.listen(8000, () => {
console.log("Server started")
});
- Discover the devices nearby and show it to the user
stripeTerminal
.discoverReaders(simulated: true)
.listen((List<StripeReader> readers) {
setState(() {
this.readers = readers;
});
});
- Connect to a bluetooth reader
bool connected = await stripeTerminal.connectBluetoothReader(readers[0].serialNumber);
if(connected) {
print("Connected to a device");
}
- Scan a card from the reader
stripeTerminal
.readReusableCardDetail()
.then((StripePaymentMethod paymentMethod) {
print("A card was read, the last four digit is ${paymentMethod.card?.last4}");
});
- Scan payment method from the reader using tap, swipe, insert method
// Get this from your backend by creating a new payment intent
Future<String> createPaymentIntent() async {
Response invoice = await _dio.post("/createPaymentIntent");
return invoice.data["paymentIntent"]["client_secret"];
}
String payment_intent_client_secret = await createPaymentIntent();
stripeTerminal
.collectPaymentMethod(payment_intent_client_secret)
.then((StripePaymentIntent paymentIntent) {
print("A payment intent has captured a payment method, send this payment intent to you backend to capture the payment");
});
And you are done!!!!
Currently supported features:
- Initializing terminal SDK
- Scanning the readers
- Connecting to a device (Only bluetooth devices on android)
- Checking connection status
- Checking connected device
- Read payment method from the device
Missing Features
- Create payment intent
- Process payment
- Capture payment
Future Plan
Please feel free to send a PR for further feature as you need or just create an issue on the repo with the feature request.
I have no plans to maintain this package in the long future thus the package will be deprecated as soon as flutter_stripe adds support to their SDK as mentioned here
Support the creator
Creating software for free takes time and effort thus please consider buying me a cup of coffee. This we definitely put a smile on my face and motivate me to contribute more.