SCPTerminal
Objective-C
@interface SCPTerminal : NSObject
Swift
class Terminal : NSObject
The SCPTerminal
object that is made available by the Stripe Terminal SDK exposes
a generic interface for discovering readers, connecting to a reader, and
creating payments.
The SCPTerminal
object is a singleton, and you cannot create multiple
SCPTerminal
instances.
-
Sets the token provider for the shared (singleton)
SCPTerminal
instance.You must set a token provider before calling
shared
to initialize the Terminal singleton. We recommend callingsetTokenProvider:
in your AppDelegate’sapplication:didFinishLaunchingWithOptions:
method. Alternatively, you can wrap your call tosetTokenProvider:
with adispatch_once
in Objective-C, or use a static constructor in Swift.Note that you may only set a token provider before requesting the shared Terminal instance for the first time. In order to switch accounts in your app, e.g. to switch between live and test Stripe API keys on your backend, refer to the documentation for the
clearCachedCredentials
method on the shared Terminal instance.Declaration
Objective-C
+ (void)setTokenProvider:(nonnull id<SCPConnectionTokenProvider>)tokenProvider;
-
Returns true if a token provider has been set, through
setTokenProvider:
Declaration
Objective-C
+ (BOOL)hasTokenProvider;
Swift
class func hasTokenProvider() -> Bool
-
Sets a block to listen for logs from the shared Terminal instance (optional).
You can use this optional method to listen for logs from the Stripe Terminal SDK and incorporate them into your own remote logs. Note that these logs are subject to change, and provided for informational and debugging purposes only. You should not depend on them for behavior in your app. Also note that the block you provide may be called from any thread.
To print internal logs from the SDK to the console, you can set
logLevel
toSCPLogLevelVerbose
on the Terminal instance.Declaration
Objective-C
+ (void)setLogListener:(nonnull SCPLogListenerBlock)listener;
Swift
class func setLogListener(_ listener: @escaping LogListenerBlock)
-
Returns the shared (singleton) Terminal instance.
Before accessing the singleton for the first time, you must first call
setTokenProvider:
andsetDelegate:
.Declaration
Objective-C
@property (class, nonatomic, readonly) SCPTerminal *_Nonnull shared;
Swift
class var shared: Terminal { get }
-
The Terminal instance’s delegate (optional).
Set this to handle events from the Terminal instance.
Declaration
Objective-C
@property (nonatomic, nullable) id<SCPTerminalDelegate> delegate;
-
The Terminal instance’s current connection status.
Declaration
Objective-C
@property (nonatomic, readonly) SCPConnectionStatus connectionStatus;
Swift
var connectionStatus: ConnectionStatus { get }
-
The log level for the SDK. The default value is
.none
.Declaration
Objective-C
@property (nonatomic) SCPLogLevel logLevel;
Swift
var logLevel: LogLevel { get set }
-
The Terminal instance’s current payment status.
Declaration
Objective-C
@property (nonatomic, readonly) SCPPaymentStatus paymentStatus;
Swift
var paymentStatus: PaymentStatus { get }
-
Clears the current connection token, saved reader sessions, and any other cached credentials. You can use this method to switch accounts in your app, e.g. to switch between live and test Stripe API keys on your backend.
In order to switch accounts in your app:
- if a reader is connected, call
disconnectReader:
- configure the
tokenProvider
object to return connection tokens for the new account. ThetokenProvider
is implemented by your code, and you can do this however you want. - call
clearCachedCredentials
- call
discoverReaders
andconnectReader
to connect to a reader. Theconnect
call will request a new connection token from your backend server via the token provider.
An overview of the lifecycle of a connection token under the hood:
- When the Terminal singleton is initialized, the SDK attempts to proactively request a connection token from your backend server.
- When
connect
is called, the SDK uses the connection token and reader information to create a reader session. - Subsequent calls to
connect
will re-use the reader session if the SDK has successfully connected to the reader already. Otherwise, it will require a new connection token when you callconnect
again.
Declaration
Objective-C
- (void)clearCachedCredentials;
Swift
func clearCachedCredentials()
- if a reader is connected, call
-
Begins discovering readers matching the given configuration.
When
discoverReaders
is called, the terminal begins scanning for readers using the settings in the givenSCPDiscoveryConfiguration
. You must implementSCPDiscoveryDelegate
to handle displaying discovery results to your user and connecting to a selected reader.The discovery process will stop on its own when the terminal successfully connects to a reader, if the command is canceled, or if a discovery error occurs.
Note that if
discoverReaders
is canceled, the completion block will be called withnil
(rather than anSCPErrorCanceled
error).Declaration
Objective-C
- (nullable SCPCancelable *) discoverReaders:(nonnull SCPDiscoveryConfiguration *)configuration delegate:(nonnull id<SCPDiscoveryDelegate>)delegate completion:(nonnull SCPErrorCompletionBlock)completion;
Parameters
configuration
The configuration for reader discovery.
delegate
Your delegate for reader discovery.
completion
The completion block called when the command completes.
-
Attempts to connect to the given reader with a given connection configuration.
If the connect succeeds, the completion block will be called with the connected reader, and
SCPTerminal.connectionStatus
will change to.connected
.If the connect fails, the completion block will be called with an error.
The SDK must be actively discovering readers in order to connect to one. The discovery process will stop if this connection request succeeds, otherwise the SDK will continue discovering.
When this method is called, the SDK uses a connection token and the given reader information to create a reader session. If the SDK does not already have a connection token, it will call the `fetchConnectionToken method you defined to fetch one.
Currently the
connectionConfig
is only utilized byverifoneP400
and will be ignored if passed while attempting to connect to achipper2X
orwisePad3
. IfconnectionConfig
is set tonil
, the SDK will resort to default connection behavior; see theSCPConnectionConfiguration
header documentation for more details.Declaration
Objective-C
- (void)connectReader:(nonnull SCPReader *)reader connectionConfig:(nullable SCPConnectionConfiguration *)connectionConfig completion:(nonnull SCPReaderCompletionBlock)completion;
Swift
func connectReader(_ reader: SCPReader, connectionConfig: SCPConnectionConfiguration?, completion: @escaping ReaderCompletionBlock)
Parameters
reader
The reader to connect to. This should be a reader recently returned to the
didUpdateDiscoveredReaders:
method.connectionConfig
The connection configuration for options while connecting to a reader. See
SCPConnectionConfiguration
for more details.completion
The completion block called when the command completes.
-
Convenience method for connecting to a reader without connection configuration. Please see above docs for functionality.
Declaration
Objective-C
- (void)connectReader:(nonnull SCPReader *)reader completion:(nonnull SCPReaderCompletionBlock)completion;
Swift
func connectReader(_ reader: SCPReader, completion: @escaping ReaderCompletionBlock)
-
Attempts to disconnect from the currently connected reader.
If the disconnect succeeds, the completion block is called with
nil
. If the disconnect fails, the completion block is called with an error.Declaration
Objective-C
- (void)disconnectReader:(nonnull SCPErrorCompletionBlock)completion;
Swift
func disconnectReader(_ completion: @escaping ErrorCompletionBlock)
Parameters
completion
The completion block called when the command completes.
-
Creates a new
SCPPaymentIntent
with the given parameters.Note: If the information required to create a PaymentIntent isn’t readily available in your app, you can create the PaymentIntent on your server and use the
retrievePaymentIntent
method to retrieve the PaymentIntent in your app.- - note: This cannot be used with the Verifone P400 reader. If used with the Verifone P400, the completion handler will be called with an SCPErrorFeatureNotAvailableWithConnectedReader error.
Declaration
Objective-C
- (void)createPaymentIntent:(nonnull SCPPaymentIntentParameters *)parameters completion:(nonnull SCPPaymentIntentCompletionBlock)completion;
Swift
func createPaymentIntent(_ parameters: SCPPaymentIntentParameters, completion: @escaping PaymentIntentCompletionBlock)
Parameters
parameters
The parameters for the PaymentIntent to be created.
completion
The completion block called when the command completes.
-
Retrieves a
SCPPaymentIntent
with a client secret.If the information required to create a PaymentIntent isn’t readily available in your app, you can create the PaymentIntent on your server and use this method to retrieve the PaymentIntent in your app.
Declaration
Objective-C
- (void)retrievePaymentIntent:(nonnull NSString *)clientSecret completion: (nonnull SCPPaymentIntentCompletionBlock)completion;
Swift
func retrievePaymentIntent(clientSecret: String, completion: @escaping PaymentIntentCompletionBlock)
Parameters
clientSecret
The client secret of the PaymentIntent to be retrieved.
completion
The completion block called when the command completes.
-
Collects a payment method for the given
SCPPaymentIntent
.Note:
collectPaymentMethod
does not apply any changes to the PaymentIntent API object. Updates to the PaymentIntent are local to the SDK, and persisted in-memory.If collecting a payment method fails, the completion block will be called with an error. After resolving the error, you may call
collectPaymentMethod
again to either try the same card again, or try a different card.If collecting a payment method succeeds, the completion block will be called with a PaymentIntent with status
.requiresConfirmation
, indicating that you should callprocessPayment:completion:
to finish the payment.Note that if
collectPaymentMethod
is canceled, the completion block will be called with aCanceled
error.Declaration
Objective-C
- (nullable SCPCancelable *) collectPaymentMethod:(nonnull SCPPaymentIntent *)paymentIntent delegate:(nullable id<SCPReaderDisplayDelegate>)delegate completion:(nonnull SCPPaymentIntentCompletionBlock)completion;
Swift
func collectPaymentMethod(_ paymentIntent: PaymentIntent, delegate: ReaderDisplayDelegate?, completion: @escaping PaymentIntentCompletionBlock) -> SCPCancelable?
Parameters
paymentIntent
The PaymentIntent to collect a payment method for.
delegate
Your delegate for handling reader input events. Providing an
SCPReaderDisplayDelegate
is required when the connected reader doesn’t have a built-in display (e.g., the BBPOS Chipper 2X BT). These readers will request that your app display messages during thecollectPaymentMethod
process (e.g., “Remove card”) via this delegate.completion
The completion block called when the command completes.
-
Processes a payment after collecting a payment method succeeds.
Synchronous capture
Stripe Terminal uses two-step card payments to prevent unintended and duplicate payments. When
processPayment
completes successfully, a charge has been authorized on the customer’s card, but not yet been “captured”. Your app must synchronously notify your backend to capture the PaymentIntent in order to settle the funds to your account.Handling failures
When
processPayment
fails, the SDK returns an error that includes the updatedSCPPaymentIntent
. Your app should inspect the updated PaymentIntent to decide how to retry the payment.If the updated PaymentIntent is
nil
, the request to Stripe’s servers timed out and the PaymentIntent’s status is unknown. We recommend that you retryprocessPayment
with the original PaymentIntent. If you instead choose to abandon the original PaymentIntent and create a new one, do not capture the original PaymentIntent. If you do, you might charge your customer twice.If the updated PaymentIntent’s status is still
.requiresConfirmation
(e.g., the request failed because your app is not connected to the internet), you can callprocessPayment
again with the updated PaymentIntent to retry the request.If the updated PaymentIntent’s status changes to
.requiresPaymentMethod
(e.g., the request failed because the card was declined), callcollectPaymentMethod
with the updated PaymentIntent to try charging another card.
Declaration
Objective-C
- (void)processPayment:(nonnull SCPPaymentIntent *)paymentIntent completion:(nonnull SCPProcessPaymentCompletionBlock)completion;
Swift
func processPayment(_ paymentIntent: PaymentIntent, completion: @escaping ProcessPaymentCompletionBlock)
Parameters
paymentIntent
The PaymentIntent to confirm.
completion
The completion block called when the confirm completes.
-
Cancels an
SCPPaymentIntent
.If the cancel request succeeds, the completion block will be called with the updated PaymentIntent object with status Canceled. If the cancel request fails, the completion block will be called with an error.
Note
This cannot be used with the Verifone P400 reader. If used with the Verifone P400, the completion handler will be called with an SCPErrorFeatureNotAvailableWithConnectedReader error.
Declaration
Objective-C
- (void)cancelPaymentIntent:(nonnull SCPPaymentIntent *)paymentIntent completion:(nonnull SCPPaymentIntentCompletionBlock)completion;
Swift
func cancelPaymentIntent(_ paymentIntent: PaymentIntent, completion: @escaping PaymentIntentCompletionBlock)
Parameters
paymentIntent
The PaymentIntent to cancel.
completion
The completion block called when the cancel completes.
-
Reads a card with the given parameters and returns a PaymentMethod.
NOTE: Most integrations should not use
readReusableCard
.You should create a
SCPPaymentIntent
and use the associatedcollectPaymentMethod
andprocessPayment
methods if you are simply collecting a payment from a customer.You can use
readReusableCard
to read payment details and defer payment for later. The PaymentMethod created by this method will have typecard
, suitable for use with online payments.Note that if you use this method to defer a payment, the transaction will not receive the beneficial rates and liability shift associated with card present transactions.
If reading a card fails, the completion block will be called with an error containing details about the failure. If reading a card succeeds, the completion block will be called with a
PaymentMethod
. You should send the ID of the payment method to your backend for further processing. For example, you can use the fingerprint to look up charges created using the same card.Note
This cannot be used with the Verifone P400 or WisePad 3 readers. This method will assert if called while the SDK is connected to a device of type
verifoneP400
orwisePad3
.Declaration
Objective-C
- (nullable SCPCancelable *) readReusableCard:(nonnull SCPReadReusableCardParameters *)parameters delegate:(nonnull id<SCPReaderDisplayDelegate>)delegate completion:(nonnull SCPPaymentMethodCompletionBlock)completion;
Swift
func readReusableCard(_ parameters: SCPReadReusableCardParameters, delegate: ReaderDisplayDelegate, completion: @escaping PaymentMethodCompletionBlock) -> SCPCancelable?
Parameters
parameters
The parameters for reading the card.
delegate
Your delegate for handling reader input events.
completion
The completion block called when the command completes.
-
Initiates an in-person refund with a given set of
SCPRefundParameters
by collecting the payment method that is to be refunded.Some payment methods, like Interac Debit payments, require that in-person payments also be refunded while the cardholder is present. The cardholder must present the Interac card to the card reader; these payments cannot be refunded via the dashboard or the API.
For payment methods that don’t require the cardholder be present, see https://stripe.com/docs/terminal/payments/refunds
This method, along with
processRefund
, allow you to design an in-person refund flow into your app.If collecting a payment method fails, the completion block will be called with an error. After resolving the error, you may call
collectRefundPaymentMethod
again to either try the same card again, or try a different card.If collecting a payment method succeeds, the completion block will be called with an
nil
error. At that point, you can callprocessRefund
to finish refunding the payment method.Calling any other SDK methods between
collectRefundPaymentMethod
andprocessRefund
will result in undefined behavior.Note that if
collectRefundPaymentMethod
is canceled, the completion block will be called with aCanceled
error.Declaration
Objective-C
- (nullable SCPCancelable *) collectRefundPaymentMethod:(nonnull SCPRefundParameters *)refundParams completion:(nonnull SCPErrorCompletionBlock)completion;
Swift
func collectRefundPaymentMethod(_ refundParams: RefundParameters, completion: @escaping ErrorCompletionBlock) -> SCPCancelable?
Parameters
refundParams
The SCPRefundParameters object that describes how the refund will be created.
completion
The completion block called when the command completes.
-
Processes an in-person refund after the refund payment method has been collected.
The completion block will either be called with the successful
SCPRefund
or with anSCPProcessRefundError
.When
processRefund
fails, the SDK returns an error that either includes the failedSCPRefund
or theSCPRefundParameters
that led to a failure. Your app should inspect theSCPProcessRefundError
to decide how to proceed.If the refund property is
nil
, the request to Stripe’s servers timed out and the refund’s status is unknown. We recommend that you retryprocessRefund
with the originalSCPRefundParameters
.If the
SCPProcessRefundError
has afailure_reason
, the refund was declined. We recommend that you take action based on the decline code you received.
Note
collectRefundPaymentMethod:completion
andprocessRefund
are only available for payment methods that require in-person refunds. For all other refunds, use the Stripe Dashboard or the Stripe API.Declaration
Objective-C
- (void)processRefund:(nonnull SCPProcessRefundCompletionBlock)completion;
Swift
func processRefund(completion: @escaping ProcessRefundCompletionBlock)
Parameters
completion
The completion block called when the command completes.
-
Checks for a reader software update, and returns an update object if an update is available.
If an update is available, the completion block will be called with an
SCPReaderSoftwareUpdate
object, indicating that a software update is available. The update object contains information about the update that you can display to the user, such as the estimated installation time.If an error occurs while checking for an update, the completion block will be called with an error. If there are no updates available and no errors occur, the completion block will be called with
(nil, nil)
.Note
This method will never return an update if it is called when the SDK is connected to the Verifone P400.
Declaration
Objective-C
- (nullable SCPCancelable *)checkForUpdate: (nonnull SCPReaderSoftwareUpdateCompletionBlock)completion;
Swift
func checkForUpdate(_ completion: @escaping ReaderSoftwareUpdateCompletionBlock) -> SCPCancelable?
Parameters
completion
The completion block called when checking for an update completes.
-
Clears the reader display and resets it to the splash screen.
Note
Only available for the Verifone P400
Declaration
Objective-C
- (void)clearReaderDisplay:(nonnull SCPErrorCompletionBlock)completion;
Swift
func clearReaderDisplay(_ completion: @escaping ErrorCompletionBlock)
Parameters
completion
The completion block called when the command completes.
-
Updates the reader display with cart information. This method is for display purposes only and has no correlation with what the customer is actually charged. Tax and total are also not automatically calculated and must be set in SCPCart.
Note
Only available for the Verifone P400
Declaration
Objective-C
- (void)setReaderDisplay:(nonnull SCPCart *)cart completion:(nonnull SCPErrorCompletionBlock)completion;
Swift
func setReaderDisplay(_ cart: SCPCart, completion: @escaping ErrorCompletionBlock)
Parameters
cart
The cart containing the information that will be displayed.
completion
The completion block called when the command completes.
-
Installs the provided update, and calls the completion block when the installation has completed.
If an error occurs while installing the update (e.g. because the update was interrupted), the completion block will be called with an error. If the update completed successfully, the completion block will be called with
nil
. You must pass a delegate to handle events as the update proceeds. In your app, you should display the progress of the update to the user. You should also instruct the user to wait for the update to complete: “Do not leave this page, and keep the reader in range and powered on until the update is complete.”You must implement the ability to update your reader’s software in your app. Though we expect required software updates to be very rare, by using Stripe Terminal, you are obligated to include this functionality.
Note
It is an error to call this method when the SDK is connected to the Verifone P400 reader.
Declaration
Objective-C
- (nullable SCPCancelable *) installUpdate:(nonnull SCPReaderSoftwareUpdate *)update delegate:(nonnull id<SCPReaderSoftwareUpdateDelegate>)delegate completion:(nonnull SCPErrorCompletionBlock)completion;
Parameters
update
The reader update.
delegate
Your delegate for handling update events.
completion
The completion block called when the update completes.
-
Returns an unlocalized string for the given reader input options, e.g. “Swipe / Insert”
Declaration
Objective-C
+ (nonnull NSString *)stringFromReaderInputOptions: (SCPReaderInputOptions)options;
Swift
class func stringFromReaderInputOptions(_ options: ReaderInputOptions = []) -> String
-
Returns an unlocalized string for the given reader display message, e.g. “Retry Card”
Declaration
Objective-C
+ (nonnull NSString *)stringFromReaderDisplayMessage: (SCPReaderDisplayMessage)message;
Swift
class func stringFromReaderDisplayMessage(_ message: ReaderDisplayMessage) -> String
-
Returns an unlocalized string for the given reader event, e.g. “Card Inserted”
Declaration
Objective-C
+ (nonnull NSString *)stringFromReaderEvent:(SCPReaderEvent)event;
Swift
class func stringFromReaderEvent(_ event: ReaderEvent) -> String
-
Returns an unlocalized string for the given connection status, e.g. “Connecting”
Declaration
Objective-C
+ (nonnull NSString *)stringFromConnectionStatus:(SCPConnectionStatus)status;
Swift
class func stringFromConnectionStatus(_ status: ConnectionStatus) -> String
-
Returns an unlocalized string for the given payment status, e.g. “Not Ready”
Declaration
Objective-C
+ (nonnull NSString *)stringFromPaymentStatus:(SCPPaymentStatus)status;
Swift
class func stringFromPaymentStatus(_ status: PaymentStatus) -> String
-
Returns an unlocalized string for the given device type.
Declaration
Objective-C
+ (nonnull NSString *)stringFromDeviceType:(SCPDeviceType)deviceType;
Swift
class func stringFromDeviceType(_ deviceType: DeviceType) -> String
-
Returns an unlocalized string for the given discovery method.
Declaration
Objective-C
+ (nonnull NSString *)stringFromDiscoveryMethod:(SCPDiscoveryMethod)method;
Swift
class func stringFromDiscoveryMethod(_ method: DiscoveryMethod) -> String
-
Unavailable
Use
initWithConfiguration:tokenProvider:delegate:
Declaration
Objective-C
- (nonnull instancetype)init;
-
Unavailable
Use
initWithConfiguration:tokenProvider:delegate:
Declaration
Objective-C
+ (nonnull instancetype)new;