Connect to a reader
Connect your application to a Stripe Terminal reader.
Note
If you haven’t chosen a reader yet, compare the available Terminal readers and choose one that best suits your needs.
Smart readers run Stripe reader software to communicate directly with Stripe over the internet. Connecting your app to a smart reader requires three steps:
- Register a reader to your Stripe account.
- Discover readers with the SDK.
- Connect to a reader with the SDK.
Register a readerServer-side
Before you can connect your application to a smart reader, you must register the reader to your account.
Register in the Dashboard
You can add your reader directly in the Dashboard.
- If you already created a Location, click it. Otherwise, create one by clicking + New.
- Under the Readers section, click + New.
- If you have a Verifone P400, enter the key sequence
0-7-1-3-9
to display a unique registration code. If you have a BBPOS WisePOS E or Stripe Reader S700, go to the reader settings and tap Generate pairing code. - Enter the code when prompted.
Register using the API
For larger deployments, enable users in the field to receive and set up new readers on their own. In your app, build a flow to register a reader with the Stripe API.
- If you have a Verifone P400, enter the key sequence
0-7-1-3-9
to display a unique registration code. If you have a BBPOS WisePOS E or Stripe Reader S700, go to the reader settings and tap Generate pairing code. - The user enters the code in your application.
- Your application sends the code to Stripe:
To confirm that you’ve registered a reader correctly, list all the readers you’ve registered at that location:
Discover readersClient-side
After registering the reader to your account, search for previously registered readers to connect to your point of sale application using the discoverReaders
method. You can scope your discovery using the location
you registered the reader to in the previous step.
Connect to a readerClient-side
To connect your point of sale application to a reader, call connectReader
with the selected reader.
Multiple connections
Only one instance of the Stripe Terminal SDK can connect to a reader at a given time. By default, when you call connectReader
from another application, the incoming connection replaces the existing SDK-to-reader connection, and the previously connected SDK disconnects from the reader. The connectReader
method takes a configuration object with a failIfInUse
property, whose default value is false
. When your application sets failIfInUse
to true, the connectReader
call has an alternate behavior where the incoming connection fails when the reader is in the middle of a collectPaymentMethod
or confirmPaymentIntent
call initiated by another SDK. If the reader is connected to another SDK but is idle (displaying the splash screen before collectPaymentMethod
is called), setting failIfInUse
has no change to the connection behavior, and the incoming connection request can always break the existing SDK-to-reader connection.
failIfInUse is false (default) | failIfInUse is true | |
---|---|---|
connectReader called from a new SDK when the reader is idle. | The existing SDK-to-reader connection breaks, and the new SDK connects to the reader. The next command from the previously-connected SDK fails with a reader error, and that app’s onDisconnect method is called. | The existing SDK-to-reader connection breaks, and the new SDK connects to the reader. The next command from the previously-connected SDK fails with a reader error, and that app’s onDisconnect method is called. |
connectReader called from a new SDK when the reader is mid-transaction. | The existing SDK-to-reader connection breaks, and the new SDK connects to the reader. The next command from the previously-connected SDK fails with a reader error, and that app’s onDisconnect method is called. | The incoming connection fails with a reader error. The existing SDK-to-reader connection does not break and the command in progress continues. |
For the least-disruptive connection experience in multi-reader environments, we recommend setting failIfInUse
to true
on your application’s initial connection attempt. Then, allow your users to retry the connection with failIfInUse
set to false
if the connection fails the first time.
With this setup, one of your users can’t accidentally interrupt a transaction by inadvertently connecting to an in-use reader, but can still connect if needed.
Handle disconnects
Your app must implement the onDisconnect
callback to handle when a reader disconnects. When you implement this callback, display a UI that notifies your user of the disconnected reader. You can call discoverReaders
to scan for readers and initiate reconnection.
Your app can attempt to automatically reconnect to the disconnected reader or display a UI that prompts your user to reconnect to a different reader.
The reader can disconnect from your app if it loses connection to the network. To simulate an unexpected disconnect, power off the reader.
Automatic reconnection
Stripe Terminal doesn’t automatically reconnect to a reader when your application starts. Instead, you can build a reconnection flow by storing reader IDs and attempting to connect to a known reader on startup.
- When you successfully connect to a reader, save its serial number in a persistent data storage location, such as the Shared Preferences API (Android).
- When your app launches, check that persistent store for a saved serial number. If one is found, call the
discoverReaders
method so your application can try to find that reader again. - If the saved serial number matches any of the discovered readers, try connecting to that reader with the matching reader object returned from the call to
discoverReaders
. If the previously connected reader isn’t found, stop the discovery process.
Display some UI during the discovery and connection process to indicate that an automatic reconnection is taking place.
Next steps
You’ve connected your application to the reader. Next, collect your first Stripe Terminal payment.
The BBPOS and Chipper™ name and logo are trademarks or registered trademarks of BBPOS Limited in the United States and/or other countries. The Verifone® name and logo are either trademarks or registered trademarks of Verifone in the United States and/or other countries. Use of the trademarks does not imply any endorsement by BBPOS or Verifone.