Utiliser des portefeuilles électroniques avec Issuing
Comment utiliser Issuing pour ajouter des cartes à des portefeuilles électroniques.
Issuing permet aux utilisateurs d’ajouter des cartes à des portefeuilles électroniques comme Apple Pay et Google Pay. Stripe prend en charge l’ajout de cartes via deux méthodes :
- Mise en service manuelle : les titulaires de carte saisissent les informations de leur carte dans l’application de portefeuille de leur téléphone pour l’ajouter à leur portefeuille électronique.
- Mise en service de type push : les applications mobiles permettent aux utilisateurs d’ajouter des cartes à leur portefeuille électronique directement depuis l’application.
Lorsqu’une carte est ajoutée à un portefeuille électronique, une représentation tokenisée de cette carte est créée. Les tokens de réseau sont gérés séparément des cartes. Pour en savoir plus sur les tokens de réseau et leur fonctionnement, veuillez consulter la page Gestion des tokens.
Mise en service manuelle
Les titulaires de cartes peuvent ajouter des cartes virtuelles et des cartes physiques Stripe Issuing à leurs portefeuilles Apple Pay, Google Pay et Samsung Pay par le biais d’une mise en service manuelle.
Pour ce faire, les titulaires de carte ouvrent l’application du portefeuille concerné sur leur téléphone et saisissent les informations de leur carte. Stripe envoie ensuite un code de vérification à 6 chiffres au phone_
ou email
du titulaire de la carte.
Un message d’erreur carte non prise en charge s’affiche si aucun de ces champs n’est renseigné pour le titulaire de la carte au moment où celle-ci est mise en service.
Aucun code n’est nécessaire pour mettre en œuvre la mise en service manuelle, mais le processus de configuration peut varier en fonction du fournisseur de portefeuille électronique et du pays dans lequel vous êtes établi :
États-Unis
Les portefeuilles Apple Pay nécessitent l’approbation d’Apple. Consultez vos paramètres de portefeuilles électroniques pour connaître l’état d’Apple Pay sur votre compte. Il est possible que vous deviez soumettre une demande avant d’utiliser Apple Pay.
Google Pay et Samsung Pay ne nécessitent aucune étape supplémentaire.
UE/Royaume-Uni
Les intégrations de portefeuilles électroniques nécessitent une approbation supplémentaire de la part de l’équipe de partenariat Stripe. Pour en savoir plus, contactez le représentant de votre compte ou contactez Stripe.
Les portefeuilles Apple Pay nécessitent une autorisation supplémentaire. Vérifiez vos paramètres de portefeuilles électroniques pour connaître l’état d’Apple Pay sur votre compte. Il est possible que vous deviez soumettre une demande avant de pouvoir utiliser Apple Pay.
Mise en service de type push
Avec la mise en service de type push, les titulaires de carte peuvent ajouter leurs cartes Stripe Issuing à leurs portefeuilles électroniques grâce à votre application, en appuyant sur un bouton « Ajouter au portefeuille » comme ceux illustrés ci-dessous.
Pour activer la mise en service de type push aux États-Unis, les utilisateurs doivent d’abord effectuer les étapes de mise en service manuelle. En plus de l’approbation de la mise en service manuelle, la mise en service de type push nécessite une intégration avec le SDK Stripe.
Cela nécessite à la fois des processus d’approbation via Stripe et une intégration de code avec le SDK Stripe pour chaque plateforme sur laquelle vous souhaitez prendre en charge la mise en service de type push. Les approbations de la plateforme se répercutent sur tous les comptes connectés.
La mise en service de type push de Samsung Pay n’est pas prise en charge par nos SDK.


Demander un accès
Demande d’accès pour iOS
Une mise en service de type push nécessite un droit Apple spécial appelé com.
. Vous pouvez demander ce droit par e-mail à l’adresse support-issuing@stripe.com. Dans votre e-mail, veillez à inclure les informations suivantes :
- Card network—Visa or MasterCard.
- Card name—This is the name of the card displayed in the wallet.
- Nom de l’application : le nom de votre application.
- ID de l’équipe de développeurs : disponible dans la section abonnement des paramètres de votre compte Apple Developer.
- ID ADAM : l’ID numérique unique de votre application, que vous trouverez sur l’App Store Connect ou dans le lien de l’App Store vers votre application (par exemple,
https://apps.
).apple. com/app/id123456789 - ID de groupe (bundle ID) : l’identifiant de groupe de votre application, également disponible sur l’App Store Connect (par exemple,
com.
).example. yourapp
Demande d’accès pour Android
Stripe fournit un wrapper SDK basé sur une bibliothèque Google privée pour la mise en service de type push. Pour publier votre application sur le Google Play Store via une mise en service de type push, vous devez demander un accès à cette bibliothèque :
- Demander un accès à Google Pay
- Téléchargez le SDK privé TapAndPay de Google (la version compatible actuelle est la 17.1.2)
- Demandez un accès à l’API de provisionnement push pour votre application. Vous devrez fournir votre ID d’application pour l’ajouter à la liste blanche de Google. Pour en savoir plus sur ce processus, consultez la documentation de Google.
- Provide the same application ID, your app name, card network, and card name to support-issuing@stripe.com.
Configurer votre applicationCôté client
Le SDK React Native est disponible en open source et fait l’objet d’une documentation complète. En interne, il utilise des SDK Android et iOS natifs. Pour installer le SDK React Native de Stripe, exécutez l’une des commandes suivantes dans le répertoire de votre projet (selon le gestionnaire de paquets que vous utilisez) :
Ensuite, installez les autres dépendances nécessaires :
- Pour iOS, accédez au répertoire ** ios** et exécutez
pod install
pour vous assurer d’installer également les dépendances natives requises. - Pour Android, il n’y a plus de dépendances à installer.
Initialisation de Stripe
Pour initialiser Stripe dans votre application React Native, wrappez votre écran de paiement avec le composant StripeProvider
ou utilisez la méthode d’initialisation initStripe
. Seule la clé publiable de l’API dans publishableKey
est nécessaire. L’exemple suivant montre comment initialiser Stripe à l’aide du composant StripeProvider
.
import { StripeProvider } from '@stripe/stripe-react-native'; function App() { const [publishableKey, setPublishableKey] = useState(''); const fetchPublishableKey = async () => { const key = await fetchKey(); // fetch key from your server here setPublishableKey(key); }; useEffect(() => { fetchPublishableKey(); }, []); return ( <StripeProvider publishableKey={publishableKey} merchantIdentifier="merchant.identifier" // required for Apple Pay urlScheme="your-url-scheme" // required for 3D Secure and bank redirects > // Your app code here </StripeProvider> ); }
Remarque
Configuration pour Android
Pour activer le provisionnement de type push sur Android après avoir obtenu l’accès au SDK TapAndPay (voir ci-dessus), vous devez l’intégrer à votre projet Android natif.
Ensuite, vous devez importer la bibliothèque de provisionnement de type push pour Android de Stripe en ajoutant ce qui suit à votre fichier android/app/build.
:
Configuration pour iOS
Pour activer le provisionnement de type push sur iOS une fois que Stripe a octroyé le droit d’accès, vous devez ajouter les fonctionnalité à votre profil de provisionnement dans l’App Store Connect.
Ensuite, vous devez ajouter le nouveau droit d’accès à votre fichier ios/app.
:
"entitlements": { "com.apple.developer.payment-pass-provisioning": true }
Mettre votre back-end à jourCôté serveur
L’implémentation de la mise en service de type push expose des méthodes qui requièrent que vous communiquiez avec votre back-end pour créer une clé éphémère Stripe et renvoyer un JSON de celle-ci à votre application. Cette clé est un identifiant éphémère de l’API que vous pouvez utiliser pour récupérer les informations de carte chiffrées d’une instance unique d’un objet Card.
Pour garantir que l’objet renvoyé par l’API Stripe est compatible avec la version du SDK que vous utilisez, vous devez explicitement transmettre la version d’API exportée par le SDK React Native à notre API lorsque vous créez la clé.
{ "id": "ephkey_1G4V6eEEs6YsaMZ2P1diLWdj", "object": "ephemeral_key", "associated_objects": [ { "id": "ic_1GWQp6EESaYspYZ9uSEZOcq9", "type": "issuing.card" } ], "created": 1586556828, "expires": 1586560428, "livemode": false, "secret": "ek_test_YWNjdF8xRmdlTjZFRHelWWxwWVo5LEtLWFk0amJ2N0JOa0htU1JzEZkd2RpYkpJdnM_00z2ftxCGG" }
Vous devez également créer un endpoint pour récupérer les informations de la carte émise, qu’il vous faudra transmettre au composant <AddToWalletButton />
:
Mettre votre application à jourCôté client
Tout d’abord, déterminez si l’appareil est admissible à l’approvisionnement push en vérifiant que la valeur de wallets.
dans la carte émise (récupérée à partir du deuxième endpoint que vous avez créé ci-dessus à l’étape 3) est true
. Si tel est le cas, enregistrez les informations de la carte pour les utiliser ultérieurement dans notre composant, puis continuez. Si wallets.
est défini sur false
, n’affichez pas le <AddToWalletButton />
sur iOS, car App Review pourrait rejeter votre application. Il en va de même pour wallets.
sur Android.
import React, {useEffect, useState} from 'react'; import {Constants} from '@stripe/stripe-react-native'; import {View} from 'react-native'; export default function MyScreen() { const [key, setKey] = useState(null); const [card, setCard] = useState(null); useEffect(() => { fetchEphemeralKey(); fetchIssuingCard(); }, []); const fetchIssuingCard = async () => { const response = await fetch(`${API_URL}/issuing-card`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ ISSUING_CARD_ID: '{{ISSUING_CARD_ID}}', }), }); const card = await response.json(); if (!card.wallets.apple_pay.eligible) { // Do not show <AddToWalletButton /> component on iOS. See card.wallets.apple_pay.ineligible_reason for details } else if (!card.wallets.google_pay.eligible) { // Do not show <AddToWalletButton /> component on Android. See card.wallets.google_pay.ineligible_reason for details } else { setCard(card); } }; const fetchEphemeralKey = async () => { // See above }; return <View />; }
Ensuite, récupérez votre clé éphémère auprès du premier endpoint que vous avez créé à l’étape 3 ci-dessus et enregistrez-la.
import React, {useEffect, useState} from 'react'; import {Constants} from '@stripe/stripe-react-native'; import {View} from 'react-native'; export default function MyScreen() { const [key, setKey] = useState(null); useEffect(() => { fetchEphemeralKey(); }, []); const fetchEphemeralKey = async () => { const response = await fetch(`${API_URL}/ephemeral-key`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ ISSUING_CARD_ID: '{{ISSUING_CARD_ID}}', API_VERSION: Constants.API_VERSIONS.ISSUING, }), }); const myKey = await response.json(); setKey(myKey); }; return <View />; }
Vous n’avez plus besoin de communiquer avec le serveur. Vous devez ensuite déterminer si la carte peut être ajoutée au portefeuille. Vous pouvez vérifier cela à l’aide de la méthode canAddCardToWallet
, qui renvoie un objet contenant un champ booléen canAddCard
. Si canAddCard
est défini sur false
, n’affichez pas le paramètre AddToWalletButton
, car votre application pourrait être rejetée par Apple.
Sur Android, il se peut que la carte soit déjà présente dans le portefeuille, mais que son état soit bloqué. Pour résoudre ce problème, vous pouvez ajouter une logique permettant de vérifier la réponse token
renvoyée par canAddCardToWallet
dans l’objet details
. Si cette réponse est non nulle et que token.
est "TOKEN_
, transmettez ce token
aux propriétés de <AddToWalletButton />
.
import React, {useEffect, useState} from 'react'; import {Constants, canAddCardToWallet, GooglePayCardToken} from '@stripe/stripe-react-native'; import {View} from 'react-native'; export default function MyScreen() { const [key, setKey] = useState(null); const [card, setCard] = useState(null); const [showAddToWalletButton, setShowAddToWalletButton] = useState(false); const [androidCardToken, setAndroidCardToken] = useState(null); useEffect(() => { fetchEphemeralKey(); fetchIssuingCard(); }, []); const checkIfCanAddCard = async () => { const { canAddCard, details, error } = await canAddCardToWallet({ primaryAccountIdentifier: card?.wallets?.primary_account_identifier, cardLastFour: card.last4, hasPairedAppleWatch: // Pass a boolean indicating whether or not the device has a paired Apple Watch. iOS only. }); if (error) { Alert.alert(error.code, error.message); } else { setShowAddToWalletButton(canAddCard); if (details?.token?.status === 'TOKEN_STATE_NEEDS_IDENTITY_VERIFICATION') { setAndroidCardToken(details.token); } } }; const fetchIssuingCard = async () => { // See above await checkIfCanAddCard(); }; const fetchEphemeralKey = async () => { // See above }; return <View />; }
Nous disposons désormais de toutes les informations nécessaires pour pouvoir afficher ce bouton :
import React, {useEffect, useState} from 'react'; import { Constants, canAddCardToWallet, AddToWalletButton, GooglePayCardToken, } from '@stripe/stripe-react-native'; import {View, Image, Alert, StyleSheet} from 'react-native'; import AddToGooglePayPNG from '../assets/Add-to-Google-Pay-Button-dark-no-shadow.png'; export default function MyScreen() { const [key, setKey] = useState(null); const [card, setCard] = useState(null); const [showAddToWalletButton, setShowAddToWalletButton] = useState(false); const [androidCardToken, setAndroidCardToken] = useState<null | GooglePayCardToken>(null); useEffect(() => { fetchEphemeralKey(); fetchIssuingCard(); }, []); const canAddCard = async () => { // See above }; const fetchIssuingCard = async () => { // See above }; const fetchEphemeralKey = async () => { // See above }; return ( <View> {showAddToWalletButton && ( <AddToWalletButton token={androidCardToken} androidAssetSource={Image.resolveAssetSource(AddToGooglePayPNG)} testEnv={true} style={styles.payButton} iOSButtonStyle="onLightBackground" cardDetails={{ name: card?.cardholder?.name, primaryAccountIdentifier: card?.wallets?.primary_account_identifier, // This can be null, but should still always be passed. Failing to pass the primaryAccountIdentifier can result in a failure to provision the card. lastFour: card?.last4, description: 'Added by Stripe', }} ephemeralKey={key} onComplete={({error}) => { Alert.alert( error ? error.code : 'Success', error ? error.message : 'Card was successfully added to the wallet.', ); }} /> )} </View> ); } const styles = StyleSheet.create({ payButton: { // You may add custom styles to your button, but make sure it complies // with the relevant platform guidelines: // iOS : https://developer.apple.com/wallet/add-to-apple-wallet-guidelines/ // Android : https://developers.google.com/pay/issuers/apis/push-provisioning/android/branding-guidelines }, });
Lorsqu’un utilisateur touche le bouton, il lance l’interface utilisateur permettant d’ajouter la carte au portefeuille. Implémentez ce rappel dans votre propriété onComplete
. Si le champ error
est non nul, une erreur se produit et la carte n’est pas ajoutée au portefeuille. Au contraire, si error
est nul, la carte peut être ajoutée.
Apparence du bouton
Sur iOS, l’apparence du bouton est déterminée par la propriété iOSButtonStyle
. Définissez-la sur :
onLightBackground
lorsque vous affichez le bouton sur un arrière-plan clair ou blanc.onDarkBackground
lorsque vous affichez le bouton sur un arrière-plan sombre ou noir.
Sur Android, vous devez transmettre la ressource d’image réelle à la propriété androidAssetSource
. Vous pouvez télécharger toutes les options d’actifs possibles directement depuis Google. Suivez les instructions de marque de Google lors du déploiement de votre bouton.
Pour transmettre le fichier PNG de votre choix au composant AddToWalletButton
, ajoutez-le à votre projet, importez-le de la même manière que n’importe quelle ressource et résolvez la source avec Image.
:
import {Image} from 'react-native'; import AddToGooglePayPNG from '../assets/Add-to-Google-Pay-Button-dark-no-shadow.png'; ... <AddToWalletButton ... androidAssetSource={Image.resolveAssetSource(AddToGooglePayPNG)} ... />
Tests
iOS
Sur iOS, vous pouvez tester le provisionnement push en développement sur des simulateurs ou à l’aide de cartes de test, du moment que vous transmettez le paramétrage testEnv={true}
au composant AddToWalletButton
. Cependant, notez que si la propriété testEnv
est définie sur true
, les cartes ne seront pas ajoutées au wallet de l’appareil. Dans les environnements de test, le droit d’accès com.
n’est pas nécessaire.
Android
Sur Android, la propriété testEnv
n’a aucun effet. Tous les tests doivent être réalisés en mode production, avec des cartes réelles et sur des appareils physiques.
Veillez à fournir votre ID d’application à Stripe avant de commencer les tests internes.