stripe_terminal 1.4.1 stripe_terminal: ^1.4.1 copied to clipboard
A flutter plugin to scan stripe readers and connect to the them and get the payment methods.
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.