# Se connecter à un lecteur Associez votre application à un lecteur Stripe Terminal. > Si vous n’avez pas encore choisi de lecteur, comparez les [lecteurs Terminal](https://docs.stripe.com/terminal/payments/setup-reader.md) et sélectionnez celui qui répond le mieux à vos besoins. # Lecteurs USB Utilisez le Stripe Terminal Android SDK 3.0.0 (ou une version ultérieure) afin de prendre en charge les connexions USB pour les lecteurs [Stripe M2](https://docs.stripe.com/terminal/payments/setup-reader/stripe-m2.md) et le [BBPOS WisePad 3](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepad3.md). Vous devez utiliser un câble USB qui prend en charge à la fois le transfert de données et la charge, comme le câble USB 2.0 qui est inclus avec le lecteur Stripe M2 et le BBPOS WisePad 3. Si le câble fourni avec votre lecteur Terminal ne permet que la charge, utilisez un câble USB 2.0 tiers qui peut transférer des données. Pour connecter votre application à un lecteur Terminal à l’aide d’un câble USB : 1. [Détecter des lecteurs](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers). 2. [Se connecter à un lecteur](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader). ## Détecter les lecteurs [Côté client] - [discoverReaders (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) - [UsbDiscoveryConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-usb-discovery-configuration/index.html) Assurez-vous que le lecteur est sous tension et connecté avec un câble USB 2.0 à l’appareil exécutant votre application, et que l’accès au lecteur connecté en USB a été autorisé. Si vous branchez le lecteur pour la première fois, une invite du système Android s’affiche pour vous demander de vous connecter au lecteur. Vous pouvez cocher la case « Toujours ouvert » pour ouvrir votre application sans demande lorsqu’elle est connectée à un lecteur. Puis, à partir de votre application, recherchez le lecteur connecté avec la méthode `discoverReaders`, à l’aide de `UsbDiscoveryConfiguration`. #### Kotlin ```kotlin class DiscoverReadersActivity : AppCompatActivity(), DiscoveryListener { // ... var discoverCancelable: Cancelable? = null // Action for a "Discover Readers" button fun discoverReadersAction() { val timeout = 0 val isSimulated = false val config = UsbDiscoveryConfiguration( timeout = timeout, isSimulated = isSimulated ) Terminal.getInstance().discoverReaders( config, this, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } override fun onUpdateDiscoveredReaders(readers: List) { // In your app, display the discovered readers to the user. // Call `connectReader` after the user selects a reader to connect to. } // ... } ``` ## Se connecter à un lecteur [Côté client] - [connectReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) - [UsbConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-usb-connection-configuration/index.html) Pour vous connecter à un lecteur détecté, appelez la méthode `connectReader` depuis votre application. Il n’est pas nécessaire d’enregistrer au préalable les lecteurs mobiles dans le Dashboard ou l’API. Vous devez plutôt associer votre lecteur mobile à un [emplacement](https://docs.stripe.com/api/terminal/locations.md) au moment de la connexion. Pour ce faire, créez et utilisez une `UsbConnectionConfiguration` avec le `locationId` défini sur l’identifiant d’emplacement pertinent lors de la connexion. #### Kotlin ```kotlin // Implement your MobileReaderListener val mobileReaderListener = yourMobileReaderListener val autoReconnectOnUnexpectedDisconnect = true val connectionConfig = UsbConnectionConfiguration( ""{{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 } } ) ``` > #### Utiliser le mode veille > > Ne programmez pas votre application pour appeler `disconnectReader` afin d’économiser de l’énergie. Le lecteur assure une gestion efficace de l’alimentation à l’aide de son mode veille. ## Gérer les déconnexions du lecteur - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) - [DisconnectReason (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-disconnect-reason/index.html) Des déconnexions du lecteur peuvent parfois se produire entre votre application et le lecteur. Par exemple, le lecteur peut se déconnecter de votre application si le câble USB qui le connecte à votre appareil est déconnecté. Vous pouvez simuler une connexion inattendue lors d’un test en éteignant le lecteur. Le `MobileReaderListener` comprend un rappel `onDisconnect` qui fournit à votre application le `DisconnectReason` pour permettre d’identifier la raison pour laquelle le lecteur s’est déconnecté. Pour gérer vous-même les déconnexions du lecteur, vous pouvez procéder comme suit : 1. Réglez `autoReconnectOnUnexpectedDisconnect` sur `false` pendant la connexion. 2. Traitez le rappel de déconnexion pour afficher dans l’application un message avertissant l’utilisateur que le lecteur s’est déconnecté de manière inattendue et lancer la détection et la connexion du lecteur. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onDisconnect(reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` ### Redémarrer le lecteur associé - [rebootReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/reboot-reader.html) Le lecteur M2 de Stripe et BBPOS WisePad 3 redémarrent automatiquement après 24 heures de fonctionnement. Cependant, vous pouvez forcer le lecteur à redémarrer et réinitialiser la minuterie de 24 heures à l’aide de l’API `rebootReader`. Après avoir effectué cette opération, le lecteur se déconnecte de la trousse SDK, puis redémarre. Si vous utilisez la reconnexion automatique, la trousse SDK tentera de rétablir la connexion avec le lecteur. #### Kotlin ```kotlin Terminal.getInstance().rebootReader( object : Callback { override fun onSuccess() { // Reboot succeeded and the reader will disconnect. // If your app is using automatic reconnect the reconnect will begin. } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` #### Tenter automatiquement de se reconnecter Lorsqu’un lecteur se déconnecte, nous tentons automatiquement une reconnexion par défaut et vous recommandons d’afficher dans votre application des notifications qui indiquent l’état du lecteur tout au long du processus. Pour afficher des notifications dans votre application lors de la reconnexion automatique, procédez comme suit : 1. Mettez en œuvre les rappels de reconnexion du lecteur dans le `MobileReaderListener`. 2. Transmettez le `MobileReaderListener` à votre `UsbConnectionConfiguration`. 3. Lorsque la trousse SDK envoie [onReaderReconnectStarted](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-started.html) à votre application, affichez un message indiquant que le lecteur a perdu la connexion et que la reconnexion est en cours. - Vous pouvez utiliser l’objet `Cancelable` pour arrêter la tentative de reconnexion à tout moment. 4. Lorsque la trousse SDK indique que la reconnexion a réussi en envoyant [`onReaderReconnectSucceeded`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-succeeded.html), affichez un message indiquant que la connexion a été rétablie et que le lecteur fonctionne normalement. 5. Si la trousse SDK ne peut pas se reconnecter au lecteur et envoie [`onReaderReconnectFailed`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-failed.html) et `onDisconnect`, affichez un message indiquant qu’une déconnexion inattendue s’est produite. #### 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 } // ... } ``` #### Reconnexion automatique au démarrage de l’application Stripe Terminal ne se reconnecte pas automatiquement à un lecteur au démarrage de votre application. Vous pouvez créer un flux de reconnexion en enregistrant les ID de lecteur et en essayant de vous connecter à un lecteur connu au démarrage. 1. Lorsque vous vous connectez à un lecteur, enregistrez son numéro de série dans un emplacement de stockage persistant, comme l’[API Shared Preferences](https://developer.android.com/training/data-storage/shared-preferences) (Android). 1. Au lancement de votre application, recherchez un numéro de série enregistré dans l’emplacement de stockage persistant des données. Si vous en trouvez un, appelez la méthode `discoverReaders` afin que votre application puisse essayer de retrouver le lecteur. 2. Si le numéro de série enregistré correspond à l’un des lecteurs détectés, essayez de vous connecter à ce lecteur à l’aide de l’objet Reader correspondant renvoyé par l’appel à `discoverReaders`. Si le lecteur en question est introuvable, mettez fin au processus de recherche. Affichez une interface utilisateur pendant le processus de détection et de connexion pour indiquer qu’une reconnexion automatique est en cours. ## Mettre à jour le logiciel du lecteur [Côté client] - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) Votre application doit mettre à jour les lecteurs mobiles pour appliquer les éléments suivants : - Les configurations régionales qui vous permettent de rester en règle avec les exigences des réseaux de cartes et des émetteurs - Mises à jour de sécurité L’installation des mises à jour obligatoires commence lors de la connexion au lecteur. Vous ne pouvez pas utiliser le lecteur tant que la mise à jour n’est pas terminée. > Pour installer les mises à jour, le niveau de la batterie du lecteur doit être supérieur à 50 %. ### Mises à jour requises Lorsque des mises à jour devant être effectuées immédiatement sont disponibles pour le lecteur, le `MobileReaderListener` de l’intégration reçoit `onStartInstallingUpdate` avec un `ReaderSoftwareUpdate`. Le `ReaderSoftwareUpdate` fournit les détails nécessaires de la mise à jour, y compris une estimation du temps d’installation requis, indiqué par `durationEstimate`. Au cours du processus d’installation de la mise à jour sur le lecteur, le `connectionStatus` de Terminal passe à l’état `ConnectionStatus.CONNECTING`. Votre application doit avertir les utilisateurs qu’une mise à jour est en cours d’installation et en afficher sa progression dans votre interface utilisateur. Expliquez clairement pourquoi la connexion peut prendre plus de temps que d’habitude. Si le processus de mise à jour requis échoue, Stripe communique l’erreur au `MobileReaderListener` avec `onFinishInstallingUpdate`. Vous ne pouvez pas vous reconnecter au lecteur après l’échec d’une mise à jour requise, sauf si les conditions suivantes sont remplies : - Le lecteur exécute la dernière version du logiciel pour le lieu au cours des 30 derniers jours. - La version de la trousse SDK Android est supérieure ou égale à `3.5.0`. Si les conditions sont remplies, le processus de connexion aboutit, bien que la mise à jour soit incomplète. Lors de la prochaine connexion à ce lecteur, Stripe tente à nouveau d’effectuer la mise à jour requise jusqu’à ce qu’elle soit installée avec succès. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onStartInstallingUpdate(update: ReaderSoftwareUpdate, cancelable: Cancelable) { // Show UI communicating that a required update has started installing } override fun onReportReaderSoftwareUpdateProgress(progress: Float) { // Update the progress of the installation } override fun onFinishInstallingUpdate(update: ReaderSoftwareUpdate?, e: TerminalException?) { // Report success or failure of the update } // ... } ``` Vous pouvez annuler les mises à jour requises à l’aide de l’objet `Cancelable`, ce qui entraîne également un échec de la connexion au lecteur. Vous ne pouvez pas annuler les mises à jour incrémentielles en cours. ### Mises à jour facultatives Vous pouvez reporter les mises à jour facultatives jusqu’à la date spécifiée, après quoi elles deviennent obligatoires. La trousse SDK vous informe des mises à jour facultatives par l’intermédiaire du `MobileReaderListener` chaque fois que le lecteur est connecté, mais n’effectue pas de transaction. Si une mise à jour facultative est disponible, le `MobileReaderListener` de votre application reçoit le rappel `onReportAvailableUpdate` avec l’objet `ReaderSoftwareUpdate` contenant les détails de la mise à jour, y compris : - Temps estimé de la mise à jour (`durationEstimate`) - Date après laquelle la mise à jour devient obligatoire (`requiredAt`) Dans votre application, informez les utilisateurs qu’une mise à jour est disponible et affichez une invite pour poursuivre la mise à jour. Pour procéder à la mise à jour précédemment signalée avec `onReportAvailableUpdate`, appelez `Terminal.getInstance().installAvailableUpdate`. La mise à jour est également enregistrée dans l’objet Reader sous la forme `reader.availableUpdate`. Pendant la durée de la mise à jour, empêchez l’utilisateur de quitter la page de votre application et invitez-le à garder le lecteur sous la main et sous tension jusqu’au terme de l’installation. Nous vous recommandons également d’afficher un indicateur visuel de la progression de la mise à jour. Le `MobileReaderListener` fait état de la progression de la mise à jour dans la méthode `onReportReaderSoftwareUpdateProgress`. Lorsque la date `requiredAt` d’une mise à jour facultative est dépassée, celle-ci est installée lors de la prochaine connexion du lecteur. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onReportAvailableUpdate(update: ReaderSoftwareUpdate) { // An update is available for the connected reader. Show this update in your application. // Install this update using `Terminal.getInstance().installAvailableUpdate`. } // ... } ``` Pour découvrir comment vérifier si votre application gère les différents types de mises à jour possibles pour un lecteur, consultez la section [Test des mises à jour d’un lecteur](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates). ## Prochaines étapes Vous avez associé votre application au lecteur. Vous pouvez maintenant [encaisser votre premier paiement avec Stripe Terminal](https://docs.stripe.com/terminal/payments/collect-card-payment.md). BBPOS et Chipper™ et leur logo sont des marques commerciales ou des marques déposées de BBPOS Limited aux États-Unis ou dans d’autres pays. Verifone® et son logo sont des marques commerciales ou des marques déposées de Verifone aux États-Unis et/ou dans d’autres pays. L’utilisation de ces marques commerciales n’implique en rien une approbation de la part de BBPOS ou de Verifone.