This document details changes made to the SDK by version. The current status of each release can be found in the Support Lifecycle.
If you are using CocoaPods, update your Podfile:
pod 'StripeTerminal', '~> 4.0'
- Built with Xcode 16.0 Swift version 6.0.
- Update: Added field
dynamicCurrencyConversion
toSCPCardPresentDetails
.- If you are interested in joining this preview, please email stripe-terminal-betas@stripe.com.
- New: Affirm support for smart readers is now available in private preview.
- If you are interested in joining this preview, please email stripe-terminal-betas@stripe.com.
- New: Added an
returnUrl
parameter toSCPConfirmConfiguration
to specify desired return_url to redirect to upon completion of a Redirect Payment Method.
4.0.0 includes breaking changes in both symbols and behavior. See the migration guide for more details.
- Built with Xcode 16.0, Swift version 6.0.
- Update: Minimum deployment target updated from iOS 13.0 to iOS 14.0.
-
Mail order / telephone order (MOTO) payment support for smart readers.
- Contact Stripe support to enable this feature on your account.
-
Global card saving after payment support by updating customer consent capture. The following breaking changes are required:
- A valid
allowRedisplay
value is now required to be set incollectConfiguration
when usingsetupFutureUsage
forSCPTerminal
'scollectPaymentMethod
. - Removed the
customerConsentCollected
parameter fromSCPTerminal
'scollectSetupIntentPaymentMethod
and replaced it withallowRedisplay
.
- A valid
- New: Added a new enum value
discovering
toSCPConnectionStatus
to represent when discovery is running. - Update: Subsequent calls to
SCPTerminal
'sdiscoverReaders:delegate:completion:
cancel all previously queued discovery operations. Only one discovery operation can run at any given time; all other discovery attempts will fail withSCPErrorCanceledDueToIntegrationError
. - Update: Internet and Tap to Pay discovery will now call the
discoverReaders
completion block when the operation completes since these are not long running discovery operations.
-
Update: There is now a single
connectReader
call used for all connection methods. This replaces the previous methods:connectBluetoothReader
,connectInternetReader
, andconnectLocalMobileReader
.- For mobile readers and Tap to Pay readers, the
ReaderDelegate
has been removed from theconnectReader
method as a parameter, and moved into theconnectionConfig
, replacingautoReconnectionDelegate
. - For smart readers, theInternetConnectionConfiguration
now also expects anInternetReaderDelegate
to be passed in, which will alert your integration of reader disconnects.
- For mobile readers and Tap to Pay readers, the
-
Update: Auto reconnect on unexpected disconnect is now enabled by default for mobile and Tap to Pay readers.
- The
SCPReconnectionDelegate
has been removed and the methods have been moved to the commonReaderDelegate
.
- The
-
Update: The method for handling reader disconnects has changed.
- Removed
terminal:didReportUnexpectedReaderDisconnect:
from theSCPTerminalDelegate
. Usereader:didDisconnect:
to be informed of reader disconnects. - When auto-reconnect on unexpected disconnect is enabled, both
-readerDidFailReconnect:
andreader:didDisconnect:
methods will be called if the SDK fails to reconnect to the reader and it becomes disconnected.
- Removed
- New: Added a new enum value
SCPCardPresentCaptureMethodManual
toSCPCardPresentCaptureMethod
for simplifying manual card capture without affecting automatic non-card payment capture.- If you are interested in joining this private preview, please email stripe-terminal-betas@stripe.com.
- Update:
SCPTerminal
'sconfirmPaymentIntent:completion
,confirmSetupIntent:completion
, andconfirmRefund:completion
operations now returnSCPCancelable
's that allow you to cancel the operation in certain scenarios. - Update: Calls to
SCPTerminal
'scancelPaymentIntent:completion
orcancelSetupIntent:completion
will now cancel ongoing operations related to the specified intent. - Update:
SCPOfflineDelegate
now conforms toNSObject
. - Update:
SCPPaymentIntentParameters
andSCPSetupIntentParameters
now keep payment method types as values of theSCPPaymentMethodType
enum rather than strings. - Update:
SCPSetupIntent.stripeId
is nownullable
to be consistent withSCPPaymentintent.stripeId
. TheSCPSetupIntent.stripeId
will continue to be present.
- Update:
BluetoothReaderDelegate
has been renamed toMobileReaderDelegate
. - Update: In
SCPReaderSoftwareUpdate
, renamedestimatedUpdateTime
todurationEstimate
. - Update: Renamed
SCPUpdateTimeEstimate
toSCPUpdateDurationEstimate
. - Update: Renamed "local mobile" and "apple built in" to "Tap To Pay" in all SDK types, function names, and error codes to align with Stripe branding for this functionality.
- Update: The
SCPInternetDiscoveryConfiguration
now supports an optionaltimeout
value, specifying the timeout in seconds for the discover readers request. If the online discovery attempt fails, the operation will automatically fall back to offline discovery if offline mode is enabled. - Update: Improved accuracy of smart reader errors that are reported as
SCPError
. Errors that were previously reported as aSCPErrorGenericReaderError
are now mapped to a more specificSCPError
type.
- Built with Xcode 15.2, Swift version 5.9.
- Fix #325: Corrects the status of
Terminal.shared.paymentStatus
andTerminal.shared.connectionStatus
after automatically reconnecting to mobile readers during unexpected disconnects.
- Built with Xcode 15.2, Swift version 5.9.
- Beta: WeChat Pay support for smart readers is now available in private beta.
- If you are interested in joining this beta, please email stripe-terminal-betas@stripe.com.
- New: Adds support for Interac refunds on the Tap to Pay simulated reader.
- Update: For mobile readers with
auto reconnection
enabled, the SDK now installs required updates upon reconnection after a reboot. Your application will continue to receive notifications about updates via theBluetoothReaderDelegate
and should handle updating its UI to inform the user of the update accordingly. - Update: Improved handling of
SCPErrorReaderMissingEncryptionKeys
error for mobile readers with auto-reconnection enabled. Previously, the SDK would disconnect from the reader without auto-reconnecting when this error occurred. Now, if auto-reconnection is enabled, the SDK will automatically reconnect and recover from this error. - Fix #595: Addresses the issue where backgrounding the app while the Tap to Pay PIN collection screen is displayed causes the SDK to become unresponsive until the app is relaunched.
- Fix: Resolves a race condition that occurs when a card is inserted simultaneously as
collectPaymentMethod
is being canceled. Previously, this resulted in aSCPErrorReaderBusy
error. Now, the collection will complete by returning aSCPErrorCanceled
error instead.
- Fix the root cause of the deadlocks, further reducing the risk of SDK crashes.
- Fix another path that could result in a logger deadlock, further reducing the risk of SDK crashes.
- Fix a deadlock in the logger that can cause the SDK to crash
- Built with Xcode 15.2, Swift version 5.9.
- Fix an issue running on iOS 18 where the SDK fails
collectPaymentMethod
withSCPErrorUnexpectedSdkError
when collecting amounts greater than 99999. - Fix an issue where the SDK can report a reader as connected if it had disconnected while installing a required update.
- Fix a rare race condition where
confirmPaymentIntent
could incorrectly fail withSCPErrorReaderBusy
. - Fix
supportsReadersOfType
returningtrue
forSCPDeviceTypeAppleBuiltIn
on iOS versions below 16.7 (minimum supported version).
- Built with Xcode 15.2, Swift version 5.9.
- Beta: Surcharging is now available in private beta.
- added a
surchargeNotice
parameter toSCPCollectConfiguration
to display a surcharge notice on the payment collection screen. - added a
SCPSurcharge
field to theSCPCardPresentParameters
object. - added a
SCPConfirmConfiguration
class to allow per-transaction overrides forconfirmPaymentIntent
. - added an
amountSurcharge
parameter toSCPConfirmConfiguration
to surcharge when confirming a payment. - If you are interested in joining this beta, please email stripe-terminal-betas@stripe.com.
- added a
- Beta: Added a
collectData
method to collect eligible magstripe data, such as gift cards.- If you are interested in joining this beta, please email stripe-terminal-betas@stripe.com.
- Update: Added
SCPSimulateReaderUpdateLowBatterySucceedConnect
to simulate an error scenario where a required update fails on a mobile reader due to low battery, but the SDK still successfully connects to the reader.- see Simulated reader updates for details.
- Update: if a mobile reader receives the
SCPErrorReaderMissingEncryptionKeys
error during payment collection, the SDK will disconnect from the reader. Note that auto reconnection will not work in this scenario. The error will automatically recover once the reader is reconnected. - Fix: Fixed a crash that occurred when canceling
collectPaymentMethod
afterconfirmPaymentIntent
had already been called on thePaymentIntent
.
- Built with Xcode 15.2, Swift version 5.9.
- Update: Using
SCPOfflineBehaviorRequireOnline
will attempt online network calls regardless of the current network status. This may cause requests while the network is offline to take longer as requests will always be attempted online first. - Update: Tapping or inserting an unsupported card will now report
SCPReaderDisplayMessageTryAnotherCard
instead ofSCPReaderDisplayMessageTryAnotherReadMethod
. - Update:
paymentStatus
now staysready
while API-only commands are in-progress. This includescreatePaymentIntent
,createSetupIntent
,cancelPaymentIntent
, andcancelSetupIntent
. - Update:
paymentStatus
now updates towaitingForInput
whilecollectInputs
is running. - Update: If a reader receives the
SCPErrorReaderMissingEncryptionKeys
error when collecting a payment the SDK now also reboots the reader in addition to the existing behavior of disconnecting from the reader. Reconnecting to the reader should re-install the keys and allow the reader to collect payments again.
- Built with Xcode 15.2, Swift version 5.9.
- Beta:
CollectInputs
can now display optionaltoggles
in each input type.- If you are interested in joining this beta, please email stripe-terminal-betas@stripe.com.
- New: Support for connecting to mPOS readers over USB-C on iPads with M-series chips.
- This feature is in private beta. Please contact us if you are interested in joining this beta.
- New: Added an xcprivacy file to the framework listing our data use and required reason API usage.
- Update: Added
SetupIntentParameters.paymentMethodTypes
.- Note for internet reader integrations, this feature requires reader software version
2.22
or later to be installed on your internet reader.
- Note for internet reader integrations, this feature requires reader software version
- Update:
supportsReadersOfType
now returns NO with errorSCPErrorInvalidDiscoveryConfiguration
if the device type and discovery method are incompatible. - Update: When a Bluetooth reader has an error installing a required update the SDK will allow connecting to the reader if the reader is running a recent version. The error installing the update will still be communicated in the
reader:didFinishInstallingUpdate:error:
callback. The update will be available to be retried usinginstallAvailableUpdate
. If the update isn't installed withinstallAvailableUpdate
the installation will be retried the next time connecting to the reader. - Fixes #291: Fixes a bug where the cancelable returned by
collectPaymentMethod
was not responsive in certain conditions when a card was left in the reader or inserted before callingcollectPaymentMethod
. - Fixes a bug where
rebootReader
would returnSCPErrorUnexpectedSdkError
if called after the reader received a firmware update.
- Built with Xcode 15.2, Swift version 5.9.
- New: For Tap to Pay on iPhone, added
autoReconnectOnUnexpectedDisconnect
andautoReconnectionDelegate
to theSCPLocalMobileConnectionConfiguration
. WhenautoReconnectOnUnexpectedDisconnect
is enabled, the SDK will attempt to restore connection upon any unexpected disconnect to your local mobile reader. See Stripe documentation for details. - Update: Formatting on certain fields exposed in
SCPOfflineCardPresentDetails
is now consistent withSCPCardPresentDetails
expYear
is a four-digit numberreceiptDetails.accountType
is no longer a number, and is one ofdefault
,savings
,checking
, orcredit
- Update: The SDK now requires that a
NSBluetoothAlwaysUsageDescription
key be present in your app's Info.plist instead of aNSBluetoothPeripheralUsageDescription
key. - Update: Allow
SCPCollectConfiguration.updatePaymentIntent
to be true for offline enabled readers whenSCPCreateConfiguration
hasofflineBehavior
set toSCPOfflineBehaviorRequireOnline
. - Update: Added new
SCPErrorReaderMissingEncryptionKeys
. Returned in a rare condition where the reader is missing the required keys to encrypt payment method data. The reader will disconnect if this error is hit. Reconnecting to the reader should re-install the keys. - Update: More descriptive error messages in
SCPErrorKeyMessage
for operations that fail due to network-related errors. - Fixes a bug where
SCPPaymentIntent.stripeId
was notnil
in the response toconfirmPaymentIntent
when operating offline with a smart reader. - Fixes a rare bug where Bluetooth readers could get into a state where they would no longer accept payments and needed to be replaced.
- Built with Xcode 15.2, Swift version 5.9.
- Fixes #282: Fixes a crash when connecting to Stripe Reader M2 or BBPOS Chipper 2X devices that are running older configs.
- Fixes a race condition that could result in a crash when an internet reader unexpectedly disconnects.
- Built with Xcode 15.2, Swift version 5.9.
- New:
rebootReader
method to reboot Bluetooth readers. - New: An optional
reader:didDisconnect:
method was added toSCPBluetoothReaderDelegate
which provides a newSCPDisconnectReason
to communicate known reasons why a Bluetooth reader disconnected. - New: Support refunding payments with the
SCPPaymentIntent.stripeId
.- Note for internet reader integrations, this feature requires reader software version
2.19
or later to be installed on your internet reader.
- Note for internet reader integrations, this feature requires reader software version
- New: Added support for retrieving and updating reader settings on WisePOS E and Stripe S700 by calling
retrieveReaderSettings
andsetReaderSettings
onSCPTerminal
.- Beta: Accessibility settings are provided at this time, allowing text-to-speech via speakers to be turned on and off as needed.
- Please contact us if you are interested in joining this beta.
- Beta: Added a
collectInputs
method to display forms and collect information from customers.- If you are interested in joining this beta, please email stripe-terminal-betas@stripe.com.
- Fixes a bug where collected offline payments using a reader that wasn't connected to online first would fail to be forwarded.
- Fixes #272: Removed old note about
discoverReaders
not returning an error when canceled. In 3.x SDKs cancelingdiscoverReaders
reportsSCPErrorCanceled
. - Fixes #251: Allow acceptance of Discover cards stored in Apple Pay.
- Fixes #279: Canceling collectPaymentMethod no longer hangs if card was removed early and the reader went back to the tipping input screen.
- Built with Xcode 14.3, Swift version 5.8.
- Fixes #276: Fixes a regression introduced in 3.2.0 where reconnecting to a Bluetooth reader can timeout after disabling and re-enabling Bluetooth on the iOS device.
- Built with Xcode 14.3, Swift version 5.8.
- Update:
retrievePaymentIntent
andretrieveSetupIntent
no longer require a connected reader. - Update: Adds
SCPCharge.authorizationCode
to the sdk'sSCPCharge
model when it is available.- Note for internet reader integrations, this feature requires reader software version
2.18
or later to be installed on your internet reader.
- Note for internet reader integrations, this feature requires reader software version
- Update: Added
network
andwallet
toSCPCardPresentDetails
. - Update: Added
paymentMethodId
toSCPPaymentIntent
. - Update: The amount of time a reader can be used offline before needing to be activated online has been reduced to 30 days.
- Update:
SCPReaderNetworkStatus
has a new case (SCPReaderStatusUnknown
) that represents the network status of an internet reader that was discovered while the SDK is operating in offline mode. - Fix:
SCPSetupIntent.status
is nowSCPSetupIntentStatusRequiresConfirmation
after the payment has been collected. - Fixes a rare crash when connecting to a Bluetooth reader with a critically low battery.
- Fixes a rare crash when installing a Bluetooth reader update.
- Fixes a bug where cancelPaymentIntent, createSetupIntent, and cancelSetupIntent were not being queued and could error with an unexpected SDK error if called while another command was in progress.
- Fixes merchant choice routing not updating upon switching reader regions.
- Fixes #262: Initial Bluetooth reader battery level is reported immediately after connecting to the reader.
- Fixes error messaging to not return an unexpected SDK error in some situations when connected to a smart reader.
- Fixes an issue where integrations could hit
SCPErrorSessionExpired
when the SDK comes back online while using offline mode.
- Built with Xcode 14.3, Swift version 5.8.
- New: Public beta support for offline payments.
- See Collect payments while offline for details.
- Beta: Allow customer-initiated cancellation for PaymentIntent, SetupIntent, and Refund payment method collection with internet readers. See
setEnableCustomerCancellation:
onSCPCollectConfigurationBuilder
,SCPSetupIntentConfigurationBuilder
, andSCPRefundConfigurationBuilder
.- Note: This feature requires reader software version
2.17
or later to be installed on your internet reader. - Please contact us if you want to support customer-initiated cancellation.
- Note: This feature requires reader software version
- Update: When connecting to internet readers, the SDK no longer relies on DNS. This resolves an error experienced by users of some DNS providers.
- Fixes an issue where tipping and offline configs may not be fetched when connecting to an mPOS reader. Tipping and offline mode users should upgrade their SDK.
- Fixes an issue where the SDK wouldn't announce an unexpected disconnect if an internet reader receives an invalid session error. This can happen after the reader reboots while the SDK is in the background.
- Fixes an issue where the SDK would error with
SCPErrorFeatureNotAvailableWithConnectedReader
instead ofSCPErrorNotConnectedToReader
when calling certain commands without being connected to a reader. - Fixes a bug where the SDK could deadlock if attempting to connect to the same reader twice.
- Fixes a crash running
Terminal.shared.supportsReaders
on M1 Mac. - Improved
confirmPaymentIntent
performance when location is not available.
3.0.0 includes breaking changes in both symbols and behavior. See the migration guide for more details.
- Built with Xcode 14.3, Swift version 5.8.
- New: Private beta support for offline payments.
- See Collect payments while offline for details.
- Update: Minimum deployment target updated from iOS 11.0 to iOS 13.0.
- Update:
SCPPaymentIntent.stripeId
is now nullable to support offline payments. - Update:
Terminal.processPayment
has been renamed toTerminal.confirmPaymentIntent
. - Update:
Terminal.processRefund
has been renamed toTerminal.confirmRefund
. - Update:
ReconnectionDelegate
methods now provide the instance of theReader
that is being reconnected to instead of theTerminal
instance. - Update: Removed the
SCPErrorBusy
error. The SDK will now queue incoming commands if another command is already running. - Update: Removed
SCPErrorCannotConnectToUndiscoveredReader
andSCPErrorMustBeDiscoveringToConnect
errors. The SDK now supports connecting to anSCPReader
instance that was previously discovered without needing to restart discovery. - Update: Removed
Terminal.readReusableCard
. This functionality is replaced by SetupIntents. - Update:
discoverReaders
is now completed whenconnectReader
is called. This is a behavior change from 2.x wherediscoverReaders
would continue running until connect succeeded. If connect fails you can retry connecting to a previously discoveredSCPReader
or restartdiscoverReaders
. - Update: Canceling
discoverReaders
now completes with anSCPErrorCanceled
error. Previously no error was provided when canceled. - Update:
DiscoveryConfiguration
is now a protocol with concrete classes for each discovery method:BluetoothScanDiscoveryConfiguration
,BluetoothProximityDiscoveryConfiguration
,InternetDiscoveryConfiguration
, andLocalMobileDiscoveryConfiguration
. Each class has aBuilder
exposing only the configuration values that apply to that discovery method. - Update: Configuration and parameter classes are now immutable and need to be built with builders. Example: To create
SCPPaymentIntentParameters
useSCPPaymentIntentParametersBuilder
which has setters for all the parameters and abuild:
method to create theSCPPaymentIntentParameters
instance. - Update: Removed
CardDetails.fingerprint
andCardPresentDetails.fingerprint
. You will still be able to access the fingerprint server-side using Stripe server-side SDKs. - Fixes #240:
SCPDiscoveryConfiguration.timeout
is now respected when using simulated Bluetooth scan.
- Built with Xcode 15.2, Swift version 5.9.
- Minimum deployment target changed from iOS 11.0 to iOS 12.0 as required by Xcode 15.
- Fix an issue running on iOS 18 where the SDK fails
collectPaymentMethod
withSCPErrorUnexpectedSdkError
when collecting amounts greater than 99999. - Fix an issue where the
SCPCardPresentDetails
object would be null for aSCPPaymentIntent
.
- Built with Xcode 14.3, Swift version 5.8.
- Fixes an issue where the SDK wouldn't announce an unexpected disconnect if an internet reader receives an invalid session error. This can happen after the reader reboots while the SDK is in the background.
- Fixes #252:
SCPLocalMobileConnectionConfiguration
- initWithLocationId:merchantDisplayName:onBehalfOf:tosAcceptancePermitted:
now correctly sets thetosAcceptancePermitted
value in the retuned configuration.
- Built with Xcode 14.3, Swift version 5.8.
- Fixes a regression in 2.21.0 where the SDK could get stuck running
discoverReaders
ifconnectBluetoothReader
failed and the discovery cancelable was canceled in the connect completion block.
- Built with Xcode 14.3, Swift version 5.8.
- Support for CVM PIN transactions when using Tap to Pay on iPhone. See Tap to Pay on iPhone docs for specifics on supported countries and payment methods.
- Fixes a bug where connecting to an internet reader after being connected to a Bluetooth reader could error with "ConnectionToken has already been redeemed".
- Provides additional debugging information when an Apple Built-In reader fails to prepare. See the new
SCPErrorKeyPrepareFailedReason
error key. - Fixes a regression where
SCPErrorUnexpectedSdkError
would be returned when connecting to a reader withoutdiscoverReaders
running. Now returns a specific error,SCPErrorMustBeDiscoveringToConnect
.
- Built with Xcode 14.3, Swift version 5.8.
- Tap to Pay on iPhone now returns card read results immediately by default on iOS 16.4+ to reduce transaction time.
- Fixes #229:
connectedReader
andconnectionStatus
is now correctly set when thedisconnectReader
completion block is run when using the simulated Bluetooth reader. - Fixes #232:
didReportBatteryLevel
now correctly reportsbatteryLevel
as a float between 0 and 1 as documented.
- Built with Xcode 14.1, Swift version 5.7.1.
- Fixes a bug where
collectPaymentMethod
could have failed with "Transaction is cancelled by the user" shortly after callingcollectPaymentMethod
. - Reduces the latency of subsequent attempts to connect to an Apple Built-In reader.
- Fixes a crash if the
discoverReaders
cancelable was canceled indidUpdateDiscoveredReaders
afterconnectReader
failed connecting to the reader. - Added a new simulated test card
.visaUsCommonDebit
SCPSimulatedCardType
. - Fixes a bug where
processPayment
could result in an error stating "This PaymentIntent could not be updated because it has a status of succeeded" on slow networks. - Fixes a crash if the reader disconnects during the
/confirm
API request as part ofprocessPayment
.
- Fixes a regression in 2.20.0 where
retrieveSetupIntent
would fail with an API error stating "The provided key 'pss_test_*****************' does not have the required permissions for this endpoint"
- Fixes a latent bug where closing and reopening the app several times leads to increased CPU usage.
- Fixes a possible crash if a Bluetooth reader disconnects while
connectBluetoothReader
is running. - Fixes a bug where a
PaymentIntent
created withcaptureMethod
set toautomatic
may, under poor network conditions, have astatus
ofrequires_capture
, when it should have had astatus
ofsucceeded
. - Added error
SCPErrorConnectionTokenProviderTimedOut
. Returned when theSCPConnectionTokenProvider
does not call the provided completion block within 60 seconds. - Throws an error when attempting to use the simulated
.eftposAuDebit
card with an unsupported PaymentIntent capture method. Use this card with the capture method set toSCPCaptureMethodAutomatic
orSCPCardPresentCaptureMethodManualPreferred
. - Added
SCPReaderDisplayMessageCardRemovedTooEarly
sent when a card is removed too early during a contact payment. - Fixes a bug where the SDK would fail
processPayment
withSCPErrorDeclinedByStripeAPI
if the WisePad 3 timed out in betweencollectPaymentMethod
andprocessPayment
. This will now error withSCPErrorCardReadTimedOut
. - Fixes a bug where
SCPReaderEventCardInserted
could be announced multiple times for a single card insert.
- Fixes an issue where the SDK could get stuck in an "AlreadyConnectedToReader" state when using Tap to Pay on iPhone.
- New: Cancel
PaymentIntent
andSetupIntent
via the SDK when connected to an internet reader by callingcancelPaymentIntent
orcancelSetupIntent
instead of using your backend.- Note: This feature requires version
2.11.0.24
or later to be installed on your internet reader.
- Note: This feature requires version
- Added
authorizationCode
toSCPReceiptDetails
. - Added support for simulating an on-reader tip amount to the
SCPSimulatorConfiguration
when collecting and processing a payment using a simulated reader. - Add two new simulated test cards:
.eftposAuVisaDebit
&.eftposAuDebitMastercard
toSCPSimulatedCardType
- Added
captureMethod
property toSCPPaymentIntent
.
- Fixes an issue where the SDK may report a failure during
processPayment
when using a WisePad 3 and the reader times out waiting for the /confirm response from the Stripe API. The SDK will now will report success if the PaymentIntent status moved torequires_capture
orsucceeded
.
- New: Create
PaymentIntent
andSetupIntent
via the SDK when connected to an internet reader by callingcreatePaymentIntent
orcreateSetupIntent
instead of using your backend.- Note: This feature requires version
2.10.1.0
or later to be installed on your internet reader.
- Note: This feature requires version
- Fixed bug where the SDK may have not called
reader:didReportReaderEvent:info:
orreader:didRequestReaderInput:
when it should have. - Fixed an issue where faulty readers may fail
processPayment
with "You passed an empty string for 'payment_method_data[card_present][emv_data]'". These readers will now failcollectPaymentMethod
with error codeSCPErrorMissingEMVData
.
- Fixes an issue where the SDK may report a failure during
processPayment
if a reader error or disconnect is received while process is in-progress but the /confirm request was successful. The SDK will now wait for the /confirm API response and will report success if the PaymentIntent status moved torequires_capture
orsucceeded
.
- Added
amountTip
toPaymentIntent
that represents the on-reader tip amount, if any, in the Payment Intent returned aftercollectPaymentMethod
when usingupdatePaymentIntent
. - Added missing type annotations of
<NSString *, NSString *>
to allmetadata
dictionaries. - Added support for creating Payment Intents with a requested routing priority (
SCPCardPresentRouting
) set on theSCPCardPresentParameters
. - Added
CardPresentDetails.incrementalAuthorizationStatus
which indicates whether incremental authorizations are supported or not after thePaymentIntent
has been confirmed. - Added Statement descriptor suffix field added to
PaymentIntentParameters
,PaymentIntent
, andCharge
. - Added calculated statement descriptor field to
Charge
. - Added more supported currency symbols when collecting payments with a WisePad 3.
- Fixes #145: Tip amounts are now accessible through the
PaymentIntent.amountDetails
object. - Fixes #119:
metadata
onRefundParameters
is now correctly set when collecting a refund with a WisePOS E. - Fixes #184:
SCPAppleBuiltInReaderErrorCodeNotAllowed
is now returned more consistently when attempting to discover Tap to Pay on iPhone readers on apps with a missing entitlement. - Fixes #199:
deviceSoftwareVersion
onReader
could start returningfw-config-ksid
instead of the reader's correct software version.
- Fixes an on-reader tipping issue when collecting tips using WisePad 3 readers. If a cardholder selected a tip, they presented their card contactlessly, and the transaction was soft declined due to Strong Customer Authentication (SCA), the tip amount was not included in the authorization amount.
- Added
-no-serialize-debugging-options
to Swift flags to fix lldb "couldn't IRGen expression" issue when trying to do anything in lldb. - Fixed an issue where the SDK could stop responding or incorrectly report
CardLeftInReader
if an unsupported card was inserted during the previous transaction.
- Added support for creating Payment Intents with
SCPCardPresentCaptureMethodManualPreferred
capture method set on theSCPCardPresentParameters
. - Fixes an issue where
processRefund
andconfirmSetupIntent
were returning errorSCPErrorUnexpectedSdkError
instead ofSCPErrorBusy
orSCPErrorNotConnectedToReader
for those error cases.
- Minimum deployment target changed from iOS 10.0 to iOS 11.0
- Added support for Tap to Pay on iPhone.
- Added new
SCPTippingConfiguration
property onSCPCollectConfiguration
, which allows for per-transaction tip-eligible amounts to be set on the BBPOS WisePos E. See Stripe documentation for details. - Fixes Issue #176: Fixed warning from the SDK umbrella header, StripeTerminal.h, missing an import.
- Added new
updatePaymentIntent
toSCPCollectConfiguration
which will attach a PaymentMethod to the server-side PaymentIntent and provide thatSCPPaymentMethod
on theSCPPaymentIntent
returned duringcollectPaymentMethod
. See Stripe documentation for details. - Added new
networks
toSCPCardPresentDetails
. The networks property will only be present in the PaymentIntent returned during collect when usingupdatePaymentIntent
set to true. - Fixed an issue where
CardLeftInReader
could incorrectly be returned duringcollectPaymentMethod
if the card was inserted prior to the collect call.
- Bug fix: Attempting to connect to a smart reader after an unexpected disconnect no longer errors with "The Stripe Terminal ConnectionToken has already been redeemed".
- Added support for new currency: Czech koruna ( CZK ) in the Example Terminal app.
- Added better handling for intermittent network connectivity during payment confirmation.
- Fixes Issue #166: Removed asserts for missing Info.plist keys if running in a test environment.
- Bug fix:
platform_api_key_expired
API errors now get reported asSCPErrorSessionExpired
instead ofSCPErrorStripeAPIError
. - Increased the collectPaymentMethod timeout from 5 minutes to 60 minutes.
- WisePad 3 only: Increased account type selection timeout from 60 seconds to 90 seconds to match application selection timeout of 90 seconds.
- Added an automatic capture toggle to example app on the collect card payment view controller.
- Added
autoReconnectOnUnexpectedDisconnect
andautoReconnectionDelegate
to theSCPBluetoothConnectionConfiguration
. WhenautoReconnectOnUnexpectedDisconnect
is enabled, the SDK will attempt to restore connection upon any unexpected disconnect to a reader. See Stripe documentation for details.
- Added
[SCPPaymentIntentParameters initWithAmount:currency:paymentMethodTypes:captureMethod:]
and[SCPPaymentIntentParameters initWithAmount:currency:captureMethod:]
. Allows users to opt-in to automatically capturing payments. Existing integrations are unaffected as they will continue to default to manual capture,SCPCaptureMethodManual
.
- Fixes Issue #155: Bluetooth readers would not correctly identify the
SCPErrorCardLeftInReader
error if the previous transactions card was left in the reader when callingcollectPaymentMethod
.
- Added compatibility work to support our upcoming React Native SDK.
- Added error,
SCPErrorInvalidRequiredParameter
, reported when a required parameter was invalid or missing. This does not replace more specific errors likeSCPErrorNilPaymentIntent
andSCPErrorProcessInvalidPaymentIntent
, but will be returned when other unexpected inputs were invalid, such as passing a nil or empty string as the client secret intoretrievePaymentIntent:completion:
. - Bug fix: Previously,
SCPErrorUnexpectedSdkError
was returned when retryingprocessPaymentIntent:
after a previousprocessPaymentIntent:
completed with an error. Now, this behavior should not fail. - Bug fix: Location requests no longer time out if Terminal is initialized on a background thread. Previously, even if the device had an accurate location a location request could time out and cause a 5 second delay during
processPayment
. This was reported in #143.
- Bug fix: In certain conditions, after connecting to a reader that had previously been connected to a different device, operations would erroneously fail with an error indicating an API key had expired.
- Updated the Bluetooth proximity discovery method error reported when Bluetooth permission is unauthorized from generic BluetoothError to the more specific BluetoothAccessDenied.
- Updated internal dependencies.
- Beta: Incremental or extended authorization can be requested with
CardPresentParameters
andPaymentMethodOptionsParameters
objects. See extended authorizations and incremental authorizations
- Adds support for using SimulatedCard with simulated Internet readers. Note the
SimulatedCard
is still not supported when performing a card-present refund with a simulated Internet reader. - Simulated Bluetooth Proximity discovery will now return a simulated Stripe Reader M2 device instead of a BBPOS Chipper 2X BT.
- Addressses Issue #133: Fixes a bug where connecting to an internet reader then calling
cancel()
on the discovery cancelable would cause the SCPTerminal singleton to not reset state properly if that connection fails. As a result, the SCPTerminal singleton would prevent you from restarting discovery. - Adds
CollectConfiguration
object to provide an option to skip tipping duringcollectPaymentMethod
. See Collect on-reader tips for details. Note that on-reader tips is in beta. - Adds
CollectConfiguration
as a parameter oncollectPaymentMethod
to suppress on-reader tipping on the BBPOS WisePOS E
- Adds a new error code,
SCPErrorBluetoothConnectionFailedBatteryLow
, that is passed into theconnectBluetoothReader
completion handler when connection failed due to the reader's battery being critically low. - Fixes Issue #124: Crash when Bluetooth reader reports low battery but BluetoothReaderDelegate was released.
- Fixes Issue #121:
SCPReader
isCharging
andbatteryLevel
weren't being updated if theSCPBluetoothReaderDelegate
didReportBatteryLevel:
wasn't implemented.
- Add 4 new simulated test cards:
.onlinePinCvm
,.onlinePinScaRetry
,.offlinePinCvm
, &.offlinePinScaRetry
toSCPSimulatedCardType
- Fixes Issue #119: Refund metadata not being set. The fix only applies to Bluetooth readers for now. Internet readers will still be missing the metadata.
- Update: WisePad 3 processing timeout increased from 15 seconds to 30 seconds.
- Update: Added a simulated Stripe M2 device during simulated Bluetooth scan discovery.
- Bug fix: Fixed
SCPSimulateReaderUpdateLowBattery
so it more closely matches a real update and announcesdidStartInstallingUpdate
anddidFinishInstallingUpdate
. - Issue #115: Fixed requests to cancel
collectPaymentMethod
with a WisePad 3 during application, PIN, or account selection now cancel immediately. - Issue #104: Fixed missing call to
didUpdateDiscoveredReaders:
with an empty array if the last Bluetooth reader was turned off or goes out of range. - Issue #114: Fixed possible missing calls to
didReportReaderEvent:
when removing a card duringcollectPaymentMethod
. - Updated internal dependencies.
- Bug fix: Fixed a possible deadlock when calling
readReusableCard
andprocessPayment
from background threads. - Issue #111: Replaced
__IPHONE_OS_VERSION_MIN_REQUIRED
that was causing some trouble withAPI_AVAILABLE(ios(10.0))
. - Updated internal dependencies.
- Added public convenience methods
stringFromCardBrand:
andstringFromPaymentIntentStatus:
.
- Bug fix: Fixed a crash if a Bluetooth reader disconnected during
processPayment
.
- Added
SCPSimulateReaderUpdateLowBattery
which can be used to simulate an update that fails due to a reader's low battery level. - Added
setupFutureUsage
toSCPPaymentIntentParameters
. - Invite only: Added support for
SetupIntents
with the WisePos E, Chipper 2X BT, and Stripe Reader M2 (SetupIntents was previously only supported with the WisePad 3). - Updated example app to show both Read Reusable Card and Create Setup Intent (beta) workflows.
- Updated example app with more currencies in the payment flow and more countries when creating locations from the app.
- Bug fix: Calling
discoverReaders
via.bluetoothScan
early in application startup should now always discover nearby readers fixing a bug where the discover call may not return the nearby readers. - Bug fix: Calling
processPayment
after the WisePad 3 has timed out now correctly returns a declined error instead ofUnexpectedSDKError
. - Bug fix: When connecting to a simulated Bluetooth reader and simulating a required update, canceling the update now correctly restarts the simulated discovery process and re-discovers simulated readers.
- Updated internal dependencies.
- Bug fix: When using the WisePad 3, not calling
processPayment
after a successfulcollectPaymentMethod
could cause the SDK to become unresponsive. This is now fixed. - Bug fix: When disconnected from an Internet reader the
connectionStatus
is now correctly.notConnected
when thedisconnectReader
completion block is called.
This changelog includes a more detailed list of all the API and behavior changes since version 1.4.0 of the Stripe Terminal iOS SDK. In addition to this changelog, we've prepared a migration guide that will help you upgrade your integration and explain the differences between the two SDKs.
The 2.0.0 Stripe Terminal iOS SDK requires iOS 10 and above.
connectReader
is now split into two separate methods: connectBluetoothReader
and connectInternetReader
.
connectBluetoothReader
should be used to connect to any Bluetooth reader like the BBPOS WisePad 3 and BBPOS Chipper 2X BT.
connectBluetoothReader
requires providing a newBluetoothReaderDelegate
which is used to report all reader events.- The
terminal:didReportReaderEvent:info:
andterminalDidReportLowBatteryWarning:
events have been moved from theTerminalDelegate
into theBluetoothReaderDelegate
. - The
ReaderDisplayDelegate
has been removed and thedidRequestReaderInput:
anddidRequestReaderDisplayMessage:
have moved to theBluetoothReaderDelegate
. - The
ReaderSoftwareUpdateDelegate
has been removed and theBluetoothReaderDelegate
is used for communicating to your app about updates for the reader.
See Updating reader software: Required updates for more details.
connectInternetReader
should be used to connect to Internet connected countertop readers like the Verifone P400 and the BBPOS WisePOS E. There are no changes required between connectReader
and connectInternetReader
for your countertop reader integration.
The checkForUpdate
method has been removed. The Stripe Terminal SDK now checks for required and optional updates during reader connection.
Required update installation is reported to the new BluetoothReaderDelegate
with the didStartInstallingUpdate
method. Progress will be reported to that same delegate with didReportReaderSoftwareUpdateProgress
. When the installation of the required update finishes the delegate will receive the didFinishInstallingUpdate
.
For more information about implementing reader updates, see Updating reader software and Testing Bluetooth reader updates.
collectPaymentMethod
and readReusableCard
no longer require a ReaderDisplayDelegate
. Instead, the BluetoothReaderDelegate
, provided during connectBluetoothReader
, is used to communicate the didRequestReaderInput:
and didRequestReaderDisplayMessage:
methods. These methods are only needed when using a Bluetooth connected reader and do not apply when using connectInternetReader
.
Like Internet readers, Bluetooth readers must now be registered to Locations. Registering your Bluetooth readers to a location ensures that the readers install the proper regional configurations and are properly grouped on your account.
To register the reader to a location, create and use a BluetoothConnectionConfiguration
object with the locationId
set accordingly, and pass that object in when calling Terminal.shared.connectBluetoothReader()
.
When discovering readers that have already been registered to a location, those reader objects will have a valid locationId
property during discovery. If it makes sense for your application, you can pass that locationId
from the discovered Reader
object into the BluetoothConnectionConfiguration
initializer to keep that reader registered to the same location. This is the pattern we recommend when discovering and connecting to simulated Bluetooth readers, which are now automatically registered to a mock location.
When connecting to a reader, you may want to display a list of Locations in your app. To enable this, the SDK provides the Terminal.shared.listLocations(:completion:)
method that takes the same parameters as the List all Locations API endpoint. You may want to adjust your connection flow to allow users to pick a location before they select a reader, should they want to switch that reader's location manually.
SCPReaderSoftwareUpdate
now has acomponents
property that can be used to determine the changes that will be applied with this update.deviceSoftwareVersion
can still be used to identify the specific firmware, config, and keys that will be installed with the update.- Adds support for setting a
SCPSimulatedCard
on theSCPSimulatorConfiguration
object, allowing simulation of different card brands and decline types. See Simulated Test Cards for more details. - Added optional delegate method,
reader:didReportBatteryLevel:status:isCharging
, to announce battery updates from Bluetooth readers. - Adds error codes:
- Added error
SCPErrorBluetoothAccessDenied
returned when Bluetooth is enabled on the device but access for your application has been denied. SCPErrorBluetoothPeerRemovedPairingInformation
andSCPErrorBluetoothAlreadyPairedWithAnotherDevice
to increase clarity when discovery or connection fails unexpectedly.SCPErrorFeatureNotAvailable
, which will get returned when the initiated operation is not available for your account.
- Added error
- Added
SCPDeviceTypeStripeM2
toSCPDeviceType
. This reader is in beta testing and not yet generally available. - Renames
SCPErrorPaymentDeclinedByStripeAPI
toSCPErrorDeclinedByStripeAPI
, referencing the fact that this error will be returned if Stripe rejects the SetupIntent or Refund as well as the payment. - Bug fix: If your reader battery was low (around 15 percent or less), we did not invoke
readerDidReportLowBatteryWarning
until an action (such as a transaction) was taken. NowreaderDidReportLowBatteryWarning
is also announced upon connection to the reader. - Bug fix:
requestError
on theSCPProcessingPaymentError
is now being properly populated in the case server has responded with an error and causesprocessPayment
to fail. - Bug fix: The very first
discoverReaders
call using Bluetooth with iOS 13.4 or later no longer results with a "Generic Bluetooth Error" and should now successfully start discovery.
- Added support for Swift Package Manager.
- Added support for running with iOS Simulator on Macs with M1 processors.
- The SDK's card-present refund functionality now works with the BBPOS WisePad 3 reader.
- Invite only: Stripe Terminal now supports creating SetupIntents to save card information outside the United States. When saving card information in the United States, please continue to use readReusableCard.
- Added
accountType
toSCPReceiptDetails
. - Added
SCPDeviceTypeWisePosE
toSCPDeviceType
. - Deprecated the
SCPDiscoveryConfiguration
initializers that require that you specify the device type to discover and replaced them with initializers that only require that you specify the discovery method. More specifically, if you use any of theseSCPDiscoveryConfiguration
initializers, you should replace them with the corresponding versions:initWithDeviceType:simulated:
→initWithDiscoveryMethod:simulated:
initWithDeviceType:discoveryMethod:simulated:
→initWithDiscoveryMethod:simulated:
initWithDeviceType:discoveryMethod:locationId:simulated:
→initWithDiscoveryMethod:locationId:simulated:
- Added a new interface in the example app to grant easy access to receipts
This update adds Verifone P400 support for the following methods in StripeTerminal
:
setReaderDisplay
andclearReaderDisplay
allow you to set the Verifone P400’s cart details interfacereadReusableCard
(only available for US merchants)
This update also introduces a cosmetic change to SCPReader.deviceSoftwareVersion
. The Key Identifier number was previously displayed as the five-character string 30000
. This and future updates will display the identifier as a six-character string: 300001
. The key itself has not changed.
Not every Stripe Terminal reader supports all the functionality in the SDK. If you call a function that is not supported by the currently connected reader you will receive a SCPErrorFeatureNotAvailableWithConnectedReader
error.
- Sample app improvements:
- Hide certain actions, like card-present refunds and reader updates, when the currently connected reader does not support them
- Add interface to register a Verifone P400
- Improve the resiliency of Verifone P400 connections
- Throw an error if
collectRefundPaymentMethod
is called with an invalid charge ID in the RefundParameters object
This update introduces support for Stripe Terminal in Canada using the Verifone P400 reader. To get started with Stripe Terminal in Canada, read our Canada documentation.
Stripe Terminal supports Interac Debit payments and refunds. Interac in-person payments must be refunded while the cardholder is present. The Stripe Terminal iOS SDK includes a new card-present refunds API to support in-person refunds:
collectRefundPaymentMethod
processRefund
To support the card-present refunds API, we also introduce:
- the
SCPRefundParameters
object, which you pass intocollectRefundPaymentMethod
- the
SCPProcessRefundError
class
- Example app is now compiled with Swift 5.2 by default
- Fixes issue where example app was preventing operation cancellation where it should be possible, and where example app was allowing cancellation where it shouldn't be possible.
- Fixes example app UI bugs
- Fixes bug where the SDK doesn't cancel outstanding cancelables when a reader disconnects
- Updates internal dependencies
This update introduces support for the new cardholderName
field in SCPCardPresentDetails.h
, which is currently in beta.
This update introduces support for connecting to and making payments with the Verifone P400 countertop reader.
iOS connectivity to the Verifone P400 reader is currently in public beta. Not all capabilities of the iOS SDK are available when connected to the Verifone P400, and some features available in the JavaScript SDK are not yet available in the iOS SDK. Future versions of the Stripe Terminal iOS SDK will add these additional Verifone P400 capabilities. Make sure to watch our Github Releases page (RSS link) to get notified about these new updates.
The following iOS methods are not available when connected to a Verifone P400:
The following JavaScript SDK methods, which offer additional Verifone P400 functionality, are not available in the iOS SDK:
- The
verifoneP400
is a newSCPDeviceType
enum value. To discover Verifone P400 devices you’ve registered to your Stripe account, you’ll need to specify both theverifoneP400
device type and theinternet
discovery method in yourDiscoveryConfiguration
. - We recommend using locations when working with the Verifone P400. Locations filter the readers registered to your account. When registering a reader, you can associate the reader with a specific location.
DiscoveryConfiguration
has a newlocationId
parameter, which can be used to filter readers by location ID. - The SDK’s
Reader
object now contains additional properties that match those on the Reader API object. Many of these new properties only apply to the Verifone P400 reader:ipAddress
: The IP address of the reader, used for establishing a connection on the local network.locationId
: The Location ID associated with the reader.status
: The network connectivity status of the reader, i.e. offline or online. Check that the reader’s status isonline
before attempting to connect.label
: A custom label that can be optionally be associated with the reader.stripeID
: A unique identifier for the reader.
discoverReaders
returns all registered readers, including those that areoffline
. We recommend that you displayoffline
readers in your app’s UX for discovering readers so your users know which readers are already registered.- We have added a new
ConnectionConfiguration
class (similar toDiscoveryConfiguration
), which supports thefailIfInUse
option when connecting to the Verifone P400. - The
TerminalDelegate.didReportUnexpectedReaderDisconnect
method will be called when the SDK notices it has been disconnected from the Verifone P400 (for example, if the reader loses its connection or power for over a minute). You can test this in your app by turning off the reader. Refer to handling disconnects for more information. - Since the Verifone P400 has a built-in display, your application doesn’t need to display events from the payment method collection process to users. You can pass
delegate: nil
tocollectPaymentMethod
because theReaderDisplayDelegate
methods will not be called. - We introduced three new errors specific to connections with the Verifone P400:
SCPErrorUnknownReaderIpAddress
: Returned when connecting to a reader that does not have an IP address on theReader
object.SCPErrorInternetConnectTimeOut
:connectReader
completes with this error when connecting to an internet-enabled reader times out (for example, when connecting to a reader that isoffline
).SCPErrorConnectFailedReaderIsInUse
: Returned when the chosen reader is currently collecting a payment andfailIfInUse
is set totrue
. See the Connecting to the Verifone P400 section for more details.
- Updated internal dependencies
- Fixed an unexpected discovery failure when using the
bluetoothScan
discovery method - Updated the example app for better iOS 13 support
- Updated CoreLocation usage to make
processPayment
andreadReusableCard
more likely to succeed. - Removed the need to include
NSMicrophoneUsageDescription
in your app'sInfo.plist
file.
- Removed entries in
SCPDeprecations.h
from pre v1.0 beta releases. If you still need to update your app from a beta release, we recommend updating using v1.0.0 first, and then updating to the latest. - Fixed
paymentMethodDetails.cardPresent.brand
to return the correct values for.amex
and.dinersClub
. In v1.0.0, these brands were incorrectly being returned as.unknown
.
- First generally available release.
- Changelog details for previous releases (our betas) can be found in the release notes for each release: [https://github.com/stripe/stripe-terminal-ios/releases]