# Terminal-SDK V4-Migrationsleitfaden Erfahren Sie, wie Sie zur Version 4.0.0 des Stripe-Terminal-SDK migrieren. Die iOS und Android SDKs für Stripe Terminal wurden mit einer Reihe wichtiger Änderungen an APIs und Verhalten aktualisiert, von denen einige erfordern, dass Sie Ihre Integration mit dem Stripe Terminal SDK aktualisieren. Um die Konsistenz zwischen unseren SDKs zu verbessern und Ihre Anwendungslogik und Integration zu vereinfachen, nehmen wir im Rahmen wichtiger Versionsaktualisierungen Änderungen vor, die sich auf die Funktionsweise oder das Verhalten Ihrer Integration auswirken können. In diesem Leitfaden werden die neuesten Änderungen erläutert, um Sie bei der Aktualisierung Ihrer Integration zu unterstützen. > Wenn Sie eine neue Stripe-Terminal-Integration erstellen, finden Sie weitere Informationen unter [Integration entwerfen](https://docs.stripe.com/terminal/designing-integration.md). Erfahren Sie, wie Sie starten. ## Migration zu Version 4.0.0 Hier erfahren Sie, was Sie über die SDKs für das 4.0.0 Stripe Terminal iOS und Android wissen müssen: - [Zahlungsdetails nach Zahlung weltweit speichern](https://docs.stripe.com/terminal/features/saving-payment-details/save-after-payment.md) - Nutzer/innen können jetzt Zahlungsdaten nach der Zahlung außerhalb der USA speichern, indem sie den Prozess zur Erfassung der Kundenzustimmung aktualisieren, um Zahlungsdaten auf Point of Sale-Geräten zu speichern. - Support für Zahlungen für [Bestellungen per Post und telefonische Bestellungen](https://docs.stripe.com/terminal/features/mail-telephone-orders/overview.md) (MOTO) auf intelligenten Lesegeräten (Vorschau) - Diese Funktion befindet sich in der Vorschau. Um Zugriff anzufordern, senden Sie eine E-Mail an [Stripe-Datenterminal-betas@stripe.com](mailto:stripe-terminal-betas@stripe.com). - Aktualisierungen der unterstützten Mindestversionen der iOS-Plattformen - Ermöglicht standardmäßig die [automatische Wiederverbindung des Lesegeräts bei unerwarteten Verbindungsabbrüchen](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=ios&reader-type=tap-to-pay#automatically-attempt-reconnection) für mobile und Tap-to-Pay-Lesegeräte - Konsolidiert die Funktionalität der Lesegerätverbindung und trennt Rückrufe für alle Gerätetypen # iOS > This is a iOS for when terminal-sdk-platform is ios. View the full page at https://docs.stripe.com/terminal/references/sdk-v4-migration-guide?terminal-sdk-platform=ios. Wenn Ihre Anwendung derzeit eine Terminal iOS-SDK-Version vor 4.0.0 verwendet, müssen Sie einige Änderungen vornehmen, um ein Upgrade vorzunehmen und weltweite Zahlungen mit vorliegender Karte zu akzeptieren. Eine detaillierte Liste der Änderungen von Version 3.9.1 auf 4.0.0 finden Sie im [SDK-Änderungsprotokoll](https://github.com/stripe/stripe-terminal-ios/blob/master/CHANGELOG.md). ## Aktualisieren Sie Ihre unterstützte Mindestversion auf iOS 14 oder höher Wir aktualisieren regelmäßig die unterstützte Mindestversion unserer SDKs, um unseren Entwicklerinnen und Entwicklern die bestmögliche Erfahrung zu bieten. Vorhandene 3.X-Versionen des Terminal-iOS-SDK unterstützen weiterhin Geräte mit *iOS 13* und höher. ## Speichern von Karten nach der Integration von PaymentIntents aktualisieren Wenn Sie [eine Zahlungsmethode nach einem erfolgreichen persönlichen PaymentIntent ](https://docs.stripe.com/terminal/features/saving-payment-details/save-after-payment.md) speichern, müssen Sie die folgenden Aktualisierungen an Ihrer Integration vornehmen: - Übergeben Sie beim Erstellen von Terminal-PaymentIntents den Parameter [setup_future_usage](https://stripe.dev/stripe-terminal-ios/docs/4.0.0/Classes/SCPPaymentIntent.html#/c:objc\(cs\)SCPPaymentIntent\(py\)setupFutureUsage), der Stripe darüber informiert, dass Sie zukünftige Zahlungen mit derselben Karte durchführen möchten. - Sie müssen auch [allow_redisplay](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPCollectConfiguration.html#/c:objc\(cs\)SCPCollectConfiguration\(py\)allowRedisplay) als `always` oder `limited` in `SCPCollectConfiguration` übergeben. Übergeben Sie `always`, wenn Sie möchten, dass die gespeicherte Karte des Kunden/der Kundin in allen zukünftigen Bezahlvorgängen angezeigt wird, und `limited`, wenn sie nur im Kontext der anfänglich festgelegten Nutzung verwendet werden kann, zum Beispiel bei einem Abonnement. Erfahren Sie mehr über das [Speichern von Zahlungsdaten nach einer Zahlung](https://docs.stripe.com/terminal/features/saving-payment-details/save-after-payment.md). ## Speichern von Karten ohne Zahlung mit der SetupIntents-Integration aktualisieren Um ein konsistentes Integrationsmuster zwischen SetupIntents und PaymentIntents sowie Vor-Ort- und Online-Transaktionen zu gewährleisten, haben wir in der `collectSetupIntentPaymentMethod` von `SCPTerminal` den Parameter `customerConsentCollected` entfernt, der zuvor für alle SetupIntent-Transaktionen erforderlich war, und durch den Parameter `allowRedisplay` ersetzt. Erfahren Sie mehr über das [direkte Speichern ohne Zahlung](https://docs.stripe.com/terminal/features/saving-payment-details/save-directly.md). ## Aktualisieren Sie die Nutzung Ihrer discoverReaders - Wir haben den neuen Enumerations-Wert `discovering` zum [SCPConnectionStatus](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPConnectionStatus.html) hinzugefügt, um darzustellen, wann Reader Discovery ausgeführt wird. Stellen Sie sicher, dass Ihre Integration diesen neuen Zustand verarbeiten und Ihren Kundinnen und Kunden relevante Informationen bereitstellen kann. - Wir haben die Verarbeitung mehrerer gleichzeitiger Lesegerät-Erkennungsvorgänge verbessert. Bisher wurden die Vorgänge durch mehrfachen Aufruf von [discoverReaders](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)discoverReaders:delegate:completion:) in die Warteschlange gestellt. Wenn nun ein neuer [discoverReaders](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)discoverReaders:delegate:completion:) aufgerufen wird, während ein bestehender bereits ausgeführt wird, bricht das SDK den laufenden Vorgang ab und gibt einen [SCPErrorCanceledDueToIntegrationError](https://stripe.dev/stripe-terminal-ios/docs/Errors.html#/c:@SCPErrorNewDiscoveryRequested)-Fehler zurück. Der neue DiscoverReaders-Vorgang beginnt dann sofort. - Das Entdecken von Smart- und Tap-to-Pay-Lesegeräten ruft jetzt den Abschlussblock `discoverReaders` auf, wenn der Vorgang endet. Diese Änderung spiegelt die Tatsache wider, dass die Entdeckung von Lesegeräten für diese Lesegerätetypen kein langwieriger Vorgang ist. - Wir haben einen Fehler behoben, der einen starken Verweis auf den [SCPDiscoveryDelegate](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPDiscoveryDelegate.html) im SDK enthielt. Stellen Sie sicher, dass Ihre Anwendung einen starken Verweis auf Ihren Delegierten enthält, um die Erkennungsereignisse zu empfangen. ## Aktualisieren Sie die Nutzung Ihrer Lesegerätverbindung - Um ein konsistentes Integrationsmuster für die Erkennung und Verbindung von Lesegeräten zu gewährleisten, haben wir alle vorherigen Verbindungsmethoden für Lesegeräte (`connectBluetoothReader`, `connectInternetReader`, `connectLocalMobileReader`) in [connectReader](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)connectReader:delegate:connectionConfig:completion:) konsolidiert. Der genaue Verbindungstyp wird weiterhin durch die übergebene Verbindungskonfiguration bestimmt. - Für mobile Lesegeräte und Tap-to-Pay-Geräte wurde der Parameter`ReaderDelegate` aus der Methode `connectReader` entfernt und stattdessen in `connectionConfig` verschoben, um `SCPReconnectionDelegate` zu ersetzen. In Übereinstimmung mit anderen Lesegerättypen erwartet die `InternetConnectionConfiguration` nun auch einen `InternetReaderDelegate`, der übergeben wird, der Ihre Integration über Ereignisse benachrichtigt, auch wenn ein Lesegerät die Verbindung trennt. | Typ des Lesegeräts | Verbindungskonfiguration | Delegieren von Lesegeräten | | ----------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | | Mobiles Lesegerät | SCPBluetoothConnectionConfiguration | [SCPMobileReaderDelegate](https://stripe.dev/stripe-terminal-ios/docs/4.0.0/Protocols/SCPMobileReaderDelegate.html) | | Intelligentes Lesegerät | SCPInternetConnectionConfiguration | [SCPInternetReaderDelegate](https://stripe.dev/stripe-terminal-ios/docs/4.0.0/Reader.html#/c:objc\(pl\)SCPInternetReaderDelegate) | | Tap to Pay | SCPTapToPayConnectionConfiguration | [SCPTapToPayReaderDelegate](https://stripe.dev/stripe-terminal-ios/docs/4.0.0/Protocols/SCPTapToPayReaderDelegate.html) | ### Vorher #### Swift ```swift // Call `connectBluetoothReader` with the selected reader and a connection config // to register to a location as set by your app. let connectionConfig: BluetoothConnectionConfiguration do { connectionConfig = try BluetoothConnectionConfigurationBuilder(locationId: ""{{LOCATION_ID}}"").build() } catch { // Handle the error building the connection configuration return } Terminal.shared.connectBluetoothReader(selectedReader, delegate: readerDelegate, connectionConfig: connectionConfig) { reader, error in if let reader = reader { print("Successfully connected to reader: \(reader)") } else if let error = error { print("connectBluetoothReader failed: \(error)") } } ``` ### Nachher #### Swift ```swift // Call `connectReader` with the selected reader and a connection config // to register to a location as set by your app. var connectionConfig: BluetoothConnectionConfiguration do { connectionConfig = try BluetoothConnectionConfigurationBuilder(delegate: yourMobileReaderDelegate, locationId: ""{{LOCATION_ID}}"") .build() } catch { // Handle the error building the connection configuration return } Terminal.shared.connectReader(selectedReader, connectionConfig: connectionConfig) { reader, error in if let reader = reader { print("Successfully connected to reader: \(reader)") } else if let error = error { print("connectReader failed: \(error)") } } ``` Weitere Informationen finden Sie in unserer Dokumentation zum [Anschließen an ein Lesegerät](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=ios&reader-type=bluetooth#connect-reader). ## Die automatische Wiederverbindung ist jetzt standardmäßig für mobile und Tap-to-Pay-Lesegeräte aktiviert - Um die Widerstandsfähigkeit Ihrer Terminal-Integration mit mobilen und Tap-to-Pay-Lesegeräten zu erhöhen, haben wir standardmäßig die [automatische Wiederverbindung](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=ios&reader-type=bluetooth#handle-disconnects) aktiviert, wenn ein Lesegerät unerwartet getrennt wird. - Wir empfehlen, Benachrichtigungen in Ihrer App anzuzeigen, um die Nutzer/innen während des gesamten Wiederverbindungsvorgangs über den Lesegerätstatus zu informieren. Für die Handhabung von Wiederverbindungsmethoden für Lesegeräte haben wir `SCPReconnectionDelegate` entfernt. Ihre Zuständigkeiten wurden in die jeweiligen ReaderDelegates integriert. Verwenden Sie `MobileReaderDelegate` for mobile Lesegeräte und `TapToPayReaderDelegate` für Tap-to-Pay-Lesegeräte, um Wiederverbindungsereignisse zu verarbeiten. - Wenn Sie Ihre eigene Logik zur Wiederverbindung des Lesegeräts implementiert haben und dieses Verhalten beibehalten möchten, können Sie die automatische Wiederverbindung deaktivieren, indem Sie [setAutoReconnectOnUnexpectedDisconnect](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPBluetoothConnectionConfigurationBuilder.html#/c:objc\(cs\)SCPBluetoothConnectionConfigurationBuilder\(im\)setAutoReconnectOnUnexpectedDisconnect:) auf `false` setzen. ### Vorher #### Swift ```swift import StripeTerminal extension ReaderViewController: ReconnectionDelegate { // MARK: ReconnectionDelegate func terminal(_ terminal: Terminal, didStartReaderReconnect cancelable: Cancelable) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } func terminalDidSucceedReaderReconnect(_ terminal: Terminal) { // 2. Notified when reader reconnection succeeds // App is now connected } func terminalDidFailReaderReconnect(_ terminal: Terminal) { // 3. Notified when reader reconnection fails // App is now disconnected } } ``` ### Nachher #### Swift ```swift import StripeTerminal extension ReaderViewController: MobileReaderDelegate { // MARK: MobileReaderDelegate func reader(_ reader: Reader, didStartReconnect cancelable: Cancelable, disconnectReason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } func readerDidSucceedReconnect(_ reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } func readerDidFailReconnect(_ reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } } ``` Weitere Details und Codeausschnitte finden Sie unter [Automatischer Verbindungsversuch](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=ios&reader-type=tap-to-pay#automatically-attempt-reconnection). ## Aktualisieren Ihrer Handhabung der Verbindungstrennung des Lesegeräts - Um informiert zu werden, wenn ein Lesegerät die Verbindung trennt, haben wir die Rückrufe zur getrennten Lesegerät-Verbindung für alle Lesegerätetypen konsolidiert, indem wir `terminal:didReportUnexpectedReaderDisconnect:`` aus dem`SCPTerminalDelegate`entfernt haben. Verwenden Sie`reader:didDisconnect:` als Teil von ReaderDelegates, um benachrichtigt zu werden, wenn ein Lesegerät getrennt wird. Bei mobilen Lesegeräten kann der [SCPDisconnectReason](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPDisconnectReason.html) helfen, den Grund für die Trennung zu identifizieren. Wenn die automatische Wiederverbindung aktiviert ist, werden sowohl die Methoden [`-readerDidFailReconnect:`](https://stripe.dev/stripe-terminal-ios/docs/4.0.0/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)readerDidFailReconnect:) als auch [`reader:didDisconnect:`](https://stripe.dev/stripe-terminal-ios/docs/4.0.0/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)reader:didDisconnect:) aufgerufen, wenn das SDK keine erneute Verbindung zum Lesegerät herstellen kann und die Verbindung getrennt wird. ### Vorher #### Swift ```swift import StripeTerminal class ReaderViewController: UIViewController, TerminalDelegate { override func viewDidLoad() { super.viewDidLoad() Terminal.shared.delegate = self } // ... // MARK: TerminalDelegate func terminal(_ terminal: Terminal, didReportUnexpectedReaderDisconnect reader: Reader) { // Consider displaying a UI to notify the user and start rediscovering readers } } ``` ### Nachher #### Swift ```swift import StripeTerminal class ReaderViewController: UIViewController, MobileReaderDelegate { override func viewDidLoad() { super.viewDidLoad() // Set the reader delegate when connecting to a reader } // ... func reader(_ reader: Reader, didDisconnect reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } } ``` Weitere Informationen finden Sie in unserer Dokumentation zum [manuellen Umgang mit Verbindungstrennungen](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=ios&reader-type=tap-to-pay#handle-the-disconnect-manually). ## Aktualisieren Sie Ihre Integration für die Zahlungsannahme - Sie können `confirmPaymentIntent` jetzt mit dem zurückgegebenen Objekt `Cancelable` stornieren. Dies ist nützlich für QR-Code-Zahlungen, die einen asynchronen Bestätigungsprozess haben. Auch `confirmSetupIntent` und `confirmRefund` können jetzt storniert werden. - Wir haben die Typensicherheit und Konsistenz zwischen den mobilen SDKs verbessert, indem wir die Art und Weise aktualisiert haben, wie `paymentMethodTypes` in `SCPPaymentIntentParameters` und `SCPSetupIntentParameters`. angegeben werden. Zuvor wurde dieser Parameter als ein Array von Zeichenfolgen dargestellt (zum Beispiel [„card_present“]). Es verwendet jetzt Enumerationswerte von`SCPPaymentMethodType`. - Um den Stornierungsablauf für PaymentIntents und SetupIntents zu verbessern, werden mit dem Aufruf von `Terminal::cancelPaymentIntent` oder `Terminal::cancelSetupIntent` nun auch alle laufenden Zahlungsvorgänge abgebrochen. Sie müssen Zahlungsvorgänge wie `.collectPaymentMethod` nicht mehr separat stornieren, bevor Sie den PaymentIntent stornieren. - `SCPSetupIntent.stripeId` kann nun auf Null gesetzt werden, um mit `SCPPaymentIntent.stripeId` konsistent zu sein. Obwohl der Wert `stripeId` weiterhin existiert, stellen Sie sicher, dass Ihr Code den Fall, in dem `SCPSetupIntent.stripeId` möglicherweise `null` ist, sicher verarbeitet, um Compiler-Fehler zu vermeiden. ## Nutzung für Umbenennung und Deprecation aktualisieren - [`BluetoothReaderDelegate`](https://stripe.dev/stripe-terminal-ios/3.9.0/Protocols/SCPBluetoothReaderDelegate.html) wurde in [`MobileReaderDelegate`](https://stripe.dev/stripe-terminal-ios/Protocols/SCPMobileReaderDelegate.html) umbenannt. - In `SCPReaderSoftwareUpdate,` haben wir `SCPUpdateTimeEstimate` in `SCPUpdateDurationEstimate` und `estimatedUpdateTime` in `durationEstimate` umbenannt, um ihre Absicht besser darzustellen. - In `SCPOfflineDetails`, das Zahlungsdetails darstellt, die verfügbar sind, wenn eine Zahlung offline erstellt oder bestätigt wird, haben wir die Zeit, zu der die Offline-Zahlung stattgefunden hat, von `collectedAt` auf `storedAt` umbenannt, wobei wir uns an den Namenskonventionen im Terminal-Android-SDK orientieren. - Wir haben in allen SDK-Funktionsnamen und Fehlercodes „local mobile“ und „apple built in“ in „Tap to Pay“ umbenannt. # Android > This is a Android for when terminal-sdk-platform is android. View the full page at https://docs.stripe.com/terminal/references/sdk-v4-migration-guide?terminal-sdk-platform=android. Wenn Ihre Anwendung derzeit eine Terminal-Android-SDK-Version vor 4.0.0 verwendet, müssen Sie einige Änderungen vornehmen, um ein Upgrade vorzunehmen und weltweit Card-Present-Zahlungen zu akzeptieren. Eine detaillierte Liste der Änderungen von Version 3.10.0 auf 4.0.0 finden Sie im [SDK-Änderungsprotokoll](https://github.com/stripe/stripe-terminal-android/blob/master/CHANGELOG.md). ## Speichern von Karten nach der Integration von PaymentIntents aktualisieren Wenn Sie [eine Zahlungsmethode nach einem erfolgreichen persönlichen PaymentIntent ](https://docs.stripe.com/terminal/features/saving-payment-details/save-after-payment.md) speichern, müssen Sie die folgenden Aktualisierungen an Ihrer Integration vornehmen: - Übergeben Sie beim Erstellen von Terminal-PaymentIntents den Parameter [setup_future_usage](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-payment-intent/index.html#-745150436%2FProperties%2F-1219334616), der Stripe darüber informiert, dass Sie zukünftige Zahlungen mit derselben Karte durchführen möchten. - Sie müssen [allow_redisplay](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-collect-configuration/index.html#-74877977%2FProperties%2F-1219334616) als `ALWAYS` oder `LIMITED` in `CollectConfiguration` übergeben. Übergeben Sie `ALWAYS`, wenn Sie die gespeicherte Karte der Kundin/des Kunden in allen zukünftigen Bezahlvorgängen vorlegen möchten, und `LIMITED`, wenn sie/er sie nur im Rahmen der ursprünglich vorgesehenen Verwendung, wie z. B. einem Abo, verwenden kann. Erfahren Sie mehr über das [Speichern von Karten nach einer Zahlung](https://docs.stripe.com/terminal/features/saving-payment-details/save-after-payment.md). ## Speichern von Karten ohne Zahlung mit SetupIntents-Integration aktualisieren Um ein konsistentes Integrationsmuster zwischen SetupIntents und PaymentIntents sowie Vor-Ort- und Online-Transaktionen zu gewährleisten, haben wir in der [`collectSetupIntentPaymentMethod`](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/index.html#915185703%2FFunctions%2F-1814817128) von `Terminal` den Parameter `customerConsentCollected` entfernt, der zuvor für alle SetupIntent-Transaktionen erforderlich war, und durch den Parameter `allowRedisplay` ersetzt. Erfahren Sie mehr über das [direkte Speichern ohne Zahlung](https://docs.stripe.com/terminal/features/saving-payment-details/save-directly.md). ## Aktualisieren Sie die Nutzung Ihrer discoverReaders - Wir haben den neuen Enumerations-Wert `DISCOVERING` zu [ConnectionStatus](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-status/index.html) hinzugefügt, um darzustellen, wann die Erkennung von Lesegeräten ausgeführt wird. Stellen Sie sicher, dass Ihre Integration diesen neuen Status verarbeiten kann und Ihren Kundinnen und Kunden relevante Informationen zur Verfügung stellt. - Wir haben die Verarbeitung mehrerer gleichzeitiger Erkennungsvorgänge von Lesegeräten verbessert. Zuvor wurden die Vorgänge durch mehrfaches Aufrufen von [Terminal::discoverReaders](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/index.html#-307737612%2FFunctions%2F-1814817128) in die Warteschlange gestellt, was wir als unerwünscht erkannt haben. Wenn nun ein neues `Terminal::discoverReaders` aufgerufen wird, während ein bestehendes bereits in Bearbeitung ist, bricht das SD[CANCELED_DUE_TO_INTEGRATION_ERROR](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-terminal-error-code/-c-a-n-c-e-l-e-d_-d-u-e_-t-o_-i-n-t-e-g-r-a-t-i-o-n_-e-r-r-o-r/index.html) zurück. Der neue DiscoverReaders-Vorgang beginnt dann sofort. - Das Entdecken von intelligenten und Tap-to-Pay-Lesegeräten ruft jetzt den Abschlussrückruf `Terminal::discoverReaders` auf, wenn der Vorgang endet. Diese Änderung spiegelt die Tatsache wider, dass die Entdeckung von Lesegeräten für diese Lesegerättypen kein langwieriger Vorgang ist. ## Aktualisieren Sie die Nutzung Ihrer Lesegerätverbindung - Um ein konsistentes Integrationsmuster für die Erkennung und Verbindung von Lesegeräten zu gewährleisten, haben wir alle Verbindungsmethoden für Lesegeräte (`connectBluetoothReader`, `connectUsbReader`, `connectInternetReader`, `connectLocalMobileReader`, `connectHandoffReader`) in [Terminal::connectReader](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/index.html#1656325082%2FFunctions%2F-1814817128) zusammengefasst. Der spezifische Verbindungstyp wird weiterhin durch die bereitgestellte Verbindungskonfiguration bestimmt. - Bei mobilen Lesegeräten wurde der `readerListener`-Parameter aus den alten `connectBluetoothReader`, `connectUsbReader`-Methoden entfernt und in das jeweilige `ConnectionConfiguration`-Objekt verschoben, wodurch `ReaderReconnectionListener` ersetzt wurde. Bei Tap-to-Pay-Lesegeräten nimmt die `TapToPayConnectionConfiguration` jetzt einen Parameter `TapToPayReaderListener` auf, wodurch `ReaderReconnectionListener` ersetzt wird. - Übereinstimmend mit anderen Lesegeräten erwartet die `InternetConnectionConfiguration` intelligenter Lesegeräte jetzt auch die Übergabe eines [`InternetReaderListeners`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-internet-reader-listener/index.html), der Ihre Integration über Ereignisse einschließlich Verbindungsabbrüchen von Lesegeräten informiert. - Für [Apps auf Geräten](https://docs.stripe.com/terminal/features/apps-on-devices/overview.md#pos-stripe-device) im Handoff-Modus wurde [`HandoffReaderListener`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-handoff-reader-listener/index.html) aus der alten `connectHandoffReader`-Methode als Parameter entfernt und in das `HandoffConnectionConfiguration`-Objekt verschoben. | Typ des Lesegeräts | Verbindungskonfiguration | Lesegerät-Listener | | ----------------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Mobiles Lesegerät | `BluetoothConnectionConfiguration` | [MobileReaderListener](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) | | Intelligentes Lesegerät | `InternetConnectionConfiguration` | [InternetReaderListener](https://stripe.dev/stripe-terminal-android/com.stripe.stripeterminal.external.callable/-internet-reader-listener/index.html) | | Tap to Pay | `TapToPayConnectionConfiguration` | [TapToPayReaderListener](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-tap-to-pay-reader-listener/index.html) | | Apps auf Geräten | `HandoffConnectionConfiguration` | [HandoffReaderListener](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-handoff-reader-listener/index.html) | ### Vorher #### Kotlin ```kotlin val connectionConfig = ConnectionConfiguration.BluetoothConnectionConfiguration( ""{{LOCATION_ID}}"" ) Terminal.getInstance().connectBluetoothReader( selectedReader, connectionConfig, readerListener, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` ### Nachher #### Kotlin ```kotlin // Implement your MobileReaderListener val mobileReaderListener = yourMobileReaderListener val autoReconnectOnUnexpectedDisconnect = true val connectionConfig = BluetoothConnectionConfiguration( ""{{LOCATION_ID}}"", autoReconnectOnUnexpectedDisconnect, mobileReaderListener ) Terminal.getInstance().connectReader( selectedReader, connectionConfig, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` Weitere Informationen finden Sie unter [Anschließen an ein Lesegerät](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=bluetooth#connect-reader). ## Die automatische Wiederverbindung ist jetzt standardmäßig für mobile und Tap-to-Pay-Lesegeräte aktiviert - Um die Widerstandsfähigkeit Ihrer Terminal-Integration mit mobilen und Tap-to-Pay-Lesegeräten zu erhöhen, haben wir standardmäßig die [automatische Wiederverbindung](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=bluetooth#handle-disconnects) aktiviert, wenn das Lesegerät unerwartet getrennt wird. - Wir empfehlen, Benachrichtigungen in Ihrer App anzuzeigen, um die Nutzer/innen während des gesamten Wiederverbindungsvorgangs über den Lesegerätstatus zu informieren. Für die Handhabung von Wiederverbindungsmethoden für Lesegeräte wurde der `ReaderReconnectionListener` von den jeweiligen ReaderListenern übernommen. Verwenden Sie `MobileReaderListener` für mobile Lesegeräte und `TapToPayReaderListener` für Tap-to-Pay-Lesegeräte, um Wiederverbindungsereignisse zu verarbeiten. - Wir haben den Parameter `ReaderReconnectionListener` aus den Verbindungskonfigurationen entfernt: `LocalMobileConnectionConfiguration`, `BluetoothConnectionConfiguration` und `UsbConnectionConfiguration`, und haben ihn durch den geeigneten `ReaderListener` ersetzt. Wenn Sie Ihre eigene Logik zur Wiederverbindung des Lesegeräts implementiert haben und dieses Verhalten beibehalten möchten, können Sie die automatische Wiederverbindung deaktivieren, indem Sie [autoReconnectOnUnexpectedDisconnect](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-bluetooth-connection-configuration/index.html#1748469061%2FProperties%2F-1219334616) auf `false` setzen. ### Vorher #### Kotlin ```kotlin class CustomReaderReconnectionListener : ReaderReconnectionListener { override fun onReaderReconnectStarted(reader: Reader, cancelReconnect: Cancelable, reason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } override fun onReaderReconnectSucceeded(reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } override fun onReaderReconnectFailed(reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } } ``` ### Nachher #### Kotlin ```kotlin class CustomMobileReaderListener : MobileReaderListener { // ... override fun onReaderReconnectStarted(reader: Reader, cancelReconnect: Cancelable, reason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } override fun onReaderReconnectSucceeded(reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } override fun onReaderReconnectFailed(reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } // ... } ``` Weitere Informationen finden Sie unter [Automatischer Verbindungsversuch](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=tap-to-pay#automatically-attempt-reconnection). ## Aktualisieren Ihrer Handhabung der Verbindungstrennung des Lesegeräts - Um informiert zu werden, wenn ein Lesegerät die Verbindung trennt, haben wir die Rückrufe der Lesegerät für alle Lesegeräte konsolidiert, indem wir `TerminalListener::onUnexpectedReaderDisconnect` entfernt haben. Implementieren Sie in Zukunft `onDisconnect` auf einem der folgenden Listener, um über die Trennung des entsprechenden Lesegeräts informiert zu werden: `InternetReaderListener`, `MobileReaderListener`, `TapToPayReaderListener` oder `HandoffReaderListener``. Bei mobilen Lesegeräten kann der [`DisconnectReason`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-disconnect-reason/index.html) helfen, den Grund für die Trennung zu ermitteln. Wenn die automatische Wiederverbindung aktiviert ist, werden sowohl die Methoden `onDisconnect` als auch [`onReaderReconnectFailed`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-failed.html) aufgerufen, wenn das SDK keine erneute Verbindung zum Lesegerät herstellen kann und die Verbindung getrennt wird. ### Vorher #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), TerminalListener { // ... Terminal.getInstance().setTerminalListener(this) // ... override fun onUnexpectedReaderDisconnect(reader: Reader) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` ### Nachher #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onDisconnect(reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` Weitere Informationen finden Sie unter [Handhabung manueller Verbindungsabbrüche](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=tap-to-pay#handle-the-disconnect-manually). ## Aktualisieren Sie Ihre Integration für die Zahlungsannahme - Sie können `Terminal::confirmPaymentIntent` jetzt mit dem zurückgegebenen Objekt `Cancelable` abbrechen. Dies ist nützlich für QR-Code-Zahlungen, die einen asynchronen Bestätigungsprozess haben. Auch `Terminal::confirmSetupIntent` und `Terminal::confirmRefund` können jetzt storniert werden. - Um den Stornierungsfluss für PaymentIntents und SetupIntents zu verbessern, werden mit dem Aufruf von `Terminal::cancelPaymentIntent` oder `Terminal::cancelSetupIntent` nun auch alle laufenden Zahlungsvorgänge abgebrochen. Sie müssen Zahlungsvorgänge wie `Terminal::collectPaymentMethod` nicht mehr separat stornieren, bevor Sie den PaymentIntent stornieren. - `SetupIntent.id` kann nun auf Null gesetzt werden, um mit `PaymentIntent.id` konsistent zu sein. Obwohl der Wert `id` weiterhin existiert, stellen Sie sicher, dass Ihr Code den Fall, in dem `SetupIntent.id` möglicherweise `Null` ist, sicher verarbeitet, um Compiler-Fehler zu vermeiden. ## Fehlerbehebung aktualisieren - Wir haben `TerminalException.TerminalErrorCode` in eine eigenständige Enumeration, `TerminalErrorCode`, verschoben. Achten Sie darauf, die Importanweisungen und die Terminal-Fehlercode-Definition zu aktualisieren, um die Funktionalität aufrechtzuerhalten. - Wir haben den neuen Terminal-Fehlercode `TerminalErrorCode.GENERIC_READER_ERROR` hinzugefügt. Dieser Fehler kann auftreten, wenn das SDK nicht mehr aktuell ist, und kann den vom intelligenten Lesegerät zurückgegebenen Fehler nicht erkennen. Aktualisieren Sie Ihr Terminal-SDK, um diesen Fehler zu beheben. - Für Tap-to-Pay auf Android kommt es bei `Terminal::collectPaymentMethod` und `Terminal::collectSetupIntentPaymentMethod` jetzt nach 60 Sekunden zu einer Zeitüberschreitung für Tap-to-Pay-Transaktionen auf Android. Es wird eine `TerminalException` mit dem Fehlercode `TerminalErrorCode.CARD_READ_TIMED_OUT` ausgelöst. - Bei Tap to Pay auf Android wird, wenn die PIN-Erfassung für eine Zahlung angefordert wird, eine `TerminalException` mit dem Fehlercode`FEATURE_NOT_ENABLED_ON_ACCOUNT` anstelle von `DECLINED_BY_STRIPE_API` mit einem `ONLINE_OR_OFFLINE_PIN_REQUIRED` `ApiError` ausgelöst. ## Nutzung für Umbenennung und Refactoring aktualisieren - `ReaderListener` wurde in [`MobileReaderListener`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) umbenannt. - Wir haben den Parameter `allowedPaymentMethodTypes` in `paymentMethodTypes` in den Konstruktoren `PaymentIntentParameters.Builder` und `SetupIntentParameter.Builder` umbenannt. - In `ReaderSoftwareUpdate,` haben wir `UpdateTimeEstimate` in `UpdateDurationEstimate` und `estimatedUpdateTime` in `durationEstimate`umbenannt, um ihre Absicht besser darzustellen. - Für die folgenden Felder haben wir `java.util.Date`-Referenzen in Millisekunden-Zeitstempel konvertiert: `ReaderSoftwareUpdate::requiredAt`, `OfflineDetails::storedAt` und `OfflineSetupIntentDetails::storedAt`. Stellen Sie sicher, dass Ihre Anwendung diese Zeitstempel korrekt interpretiert. - Felder auf dem `Location`-Objekt können nicht mehr geändert werden. ## Aktualisieren Sie Ihre Integration von Tap to Pay auf Android - Die Maven-Koordinaten für die Funktion „Tap to Pay“ auf Android wurden in `com.stripe:stripeterminal-taptopay:4.0.0` geändert. Aktualisieren Sie Ihre Build-Abhängigkeiten, um auf den neuen Artefaktnamen zu verweisen. Die alte wird nicht mehr aktualisiert. - Wir haben alle `LocalMobile`-Funktionen und -Feldnamen in `TapToPay` umbenannt. Beispielsweise wurde `LocalMobileDiscoveryConfiguration` in `TapToPayDiscoveryConfiguration` umbenannt. - `TapToPayConnectionConfiguration` verwendet jetzt einen `TapToPayReaderListener``. Dieser Listener übernimmt Ereignisse sowohl von`ReaderReconnectionListener`als auch von`ReaderDisconnectionListener` und bietet einen einheitlichen Mechanismus für die Verarbeitung von Lesegerätereignissen. - Wir haben den Hintergrundanwendungsprozess für das Erfassen von Tap-to-Pay-Transaktionen umbenannt, um die ID Ihrer Anwendung mit dem Suffix `:stripetaptopay` zu verwenden.