Accepter un paiement par prélèvement SEPA
Découvrez comment accepter les paiements par prélèvement SEPA.
Mise en garde
Nous vous recommandons de suivre le guide Accepter un paiement, sauf si vous devez exécuter la confirmation manuelle côté serveur, ou si votre intégration requiert la présentation de moyens de paiement de manière distincte. Si vous avez déjà intégré Elements, consultez le Guide de migration du Payment Element.
Accepter un paiement par prélèvement SEPA sur votre site Web consiste à créer un objet afin de suivre un paiement, à recueillir les informations de moyen de paiement et la confirmation du mandat, puis à envoyer le paiement à Stripe pour traitement. Stripe utilise cet objet de paiement, le PaymentIntent, pour suivre et gérer les états successifs du paiement jusqu’à son exécution.
Vous pouvez également configurer le PaymentMethod d’un prélèvement automatique SEPA en demandant à votre client d’authentifier ses coordonnées bancaires à l’aide de Bancontact, d’iDEAL ou de Sofort.
Configurer StripeCôté serveurCôté client
Côté serveur
Pour cette intégration, votre serveur doit être doté d’endpoints qui communiquent avec l’API Stripe. Utilisez nos bibliothèques officielles pour accéder à l’API Stripe depuis votre serveur :
Cô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 directeur ios et exécutez
pod install
pour vous assurer que vous installez également les dépendances natives requises. - Pour Android, il n’y a plus de dépendances à installer.
Remarque
Nous vous recommandons de suivre le guide officiel de TypeScript pour ajouter la prise en charge de TypeScript.
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 { useState, useEffect } from 'react'; 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
Utilisez vos clés de test d’API lors de vos activités de test et de développement, et vos clés du mode production pour la publication de votre application.
Créer ou récupérer un clientCôté serveur
Pour réutiliser un compte de prélèvement automatique SEPA à l’occasion de paiements ultérieurs, le compte en question doit être associé à un objet Customer.
Vous devez créer un objet Customer lorsque votre client crée un compte auprès de votre entreprise. L’association de l’ID de l’objet Customer à votre propre représentation interne d’un client vous permettra de récupérer et d’utiliser ultérieurement les informations du moyen de paiement stockées.
Créez ou récupérez un client afin de l’associer à ce paiement. Ajoutez le code suivant à votre serveur pour créer le nouveau client.
Créer un PaymentIntentCôté serveurCôté client
Côté serveur
Un PaymentIntent est un objet qui représente votre intention collecter le paiement d’un client et qui filière le cycle de vie du processus de paiement à chaque étape. Tout d’abord, créez un PaymentIntent sur votre serveur et spécifiez le montant à collecter ainsi que la devise en euros
(le prélèvement automatique SEPA ne prendre en charge les autres devises). Si vous disposez déjà d’une intégration utilisant l’API Payment Intents, ajoutez sepa_
à la liste des types de moyens de paiement pour votre PaymentIntent. Spécifiez l’ID du {% glossary term= customers" %}client.
Pour enregistrer le compte de prélèvement automatique SEPA en vue de le réutiliser, définissez le paramètre setup_future_usage sur off_
. Le prélèvement automatique SEPA accepte uniquement la valeur off_
pour ce paramètre.
Côté client
Côté client, demandez un PaymentIntent auprès de votre serveur et sauvegardez la clé secrète du client qu’il contient.
const fetchPaymentIntentClientSecret = async () => { const response = await fetch(`${API_URL}/create-payment-intent`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, currency: 'eur', payment_method_types: ['sepa_debit'], }), }); const {clientSecret, error} = await response.json(); return {clientSecret, error}; };
Recueillir les informations du moyen de paiement et la confirmation du mandatCôté client
Recueillez l’IBAN du client dans votre formulaire de paiement et affichez le texte d’autorisation standard suivant afin que votre client puisse signer le mandat de manière tacite.
Affichez le texte d’autorisation standard suivant afin que votre client puisse signer le mandat de manière tacite.
Remplacez Rocket Rides par le nom de votre entreprise.
La configuration d’un moyen de paiement ou la confirmation d’un PaymentIntent vaut acceptation du mandat. Le client ayant tacitement signé le mandat, vous devez communiquer ces conditions dans votre formulaire ou par e-mail.
export default function SepaPaymentScreen() { const [email, setEmail] = useState(''); const [iban, setIban] = useState(''); return ( <Screen> <TextInput placeholder="E-mail" keyboardType="email-address" onChange={(value) => setEmail(value.nativeEvent.text)} style={styles.input} /> <TextInput placeholder="Iban" onChange={(value) => setIban(value.nativeEvent.text.toLowerCase())} style={styles.input} /> <Button variant="primary" onPress={handlePayPress} title="Save IBAN" loading={loading} /> </Screen> ); }
Envoyer le paiement à StripeCôté client
Récupérez la clé secrète du client auprès du PaymentIntent que vous avez créé, puis appelez le confirmPayment
.
La clé secrète du client doit être utilisée avec prudence, car elle peut servir à réaliser le paiement. Ne l’enregistrez pas, ne l’intégrez pas dans des URL et ne la dévoilez à personne d’autre que votre client.
Remarque
addressCountry
et addressLine1
doivent être renseignés dans les billingDetails
pour les IBAN avec les codes pays suivants : AD, PF, TF, GI, GB, GG, VA, IM, JE, MC, NC, BL, PM, SM, CH, WF. Reportez-vous à la documentation de référence du SDK React Native pour prendre connaissance de la liste complète des champs d’adresse.
export default function SepaPaymentScreen() { const [iban, setIban] = useState(''); const {confirmPayment, loading} = useConfirmPayment(); const handlePayPress = async () => { const { clientSecret, error: clientSecretError, } = await fetchPaymentIntentClientSecret(); if (clientSecretError) { Alert.alert(`Error`, clientSecretError); return; } const billingDetails: PaymentMethodCreateParams.BillingDetails = { name: 'Jenny Rosen', email: 'jenny.rosen@example.com', }; const {error, paymentIntent} = await confirmPayment(clientSecret, { paymentMethodType: 'SepaDebit', paymentMethodData: { billingDetails, iban, }, }); if (error) { Alert.alert(`Error code: ${error.code}`, error.message); } else if (paymentIntent) { if (paymentIntent.status === PaymentIntents.Status.Processing) { Alert.alert( 'Processing', `The debit has been successfully submitted and is now processing.`, ); } else if (paymentIntent.status === PaymentIntents.Status.Succeeded) { Alert.alert( 'Success', `The payment was confirmed successfully! currency: ${paymentIntent.currency}`, ); } else { Alert.alert('Payment status:', paymentIntent.status); } } }; return <Screen>{/* ... */}</Screen>; }
Confirmer la réussite du PaymentIntent
Le prélèvement automatique SEPA étant un moyen de paiement à notification différée, les fonds ne sont pas disponibles immédiatement. Une fois le paiement envoyé, l’état du PaymentIntent passe de requires_
à processing
. À la réussite du paiement, l’état du PaymentIntent passe de processing
à succeeded
.
Les événements suivants sont envoyés lorsque le PaymentIntent change d’état :
Événement | Description | Étapes suivantes |
---|---|---|
payment_ | Le paiement du client a bien été envoyé à Stripe. | Attendez que le paiement effectué réussisse ou échoue. |
payment_ | Le paiement du client a abouti. | Traitez la commande de biens ou de services de votre client. |
payment_ | Le paiement du client a été refusé. | Envoyez un e-mail ou une notification push au client pour lui demander d’utiliser un autre moyen de paiement. |
Nous vous recommandons d’utiliser des webhooks afin de confirmer que le paiement a abouti et pour signaler au client que le paiement a été effectué.
Veuillez noter que, les paramètres setup_future_usage et customer ayant été définis, le PaymentMethod sera associé à l’objet Customer dès lors que le paiement passera à l’état processing
. Cette association survient quelle que soit l’issue du paiement (succès ou échec).
Tester l'intégration
Pour tester votre formulaire, utilisez les numéros de compte de test pour les prélèvements automatiques SEPA dans votre requête confirmSepaDebitPayment request.
FacultatifPersonnaliser les références de mandat à l’aide d’un préfixe
Vous pouvez personnaliser les références des mandats de prélèvement automatique SEPA afin de simplifier l’identification des mandats. Pour ce faire, saisissez la valeur facultative payment_
. Nous ajoutons le reference_
au début d’une séquence unique pour nous assurer que l’ensemble de la référence reste unique.
Le reference_
doit répondre aux exigences suivantes :
- Longueur maximale : 12 caractères
- Doit commencer par un chiffre ou une lettre majuscule
- Caractères autorisés :
- Lettres majuscules
- Chiffres
- Espaces
- Caractères spéciaux :
.
,/
,&
,-
,_
- Ne peut pas commencer par
STRIPE
Ajoutez tout délimiteur souhaité dans le préfixe, car nous n’en ajoutons pas par défaut. Nous réduisons les espaces de fin à un espace maximum. Avec un préfixe valide, la référence résultante comporte toujours 24 caractères.
La référence générée ressemble à EX4MPL3-19CNCI920C2M02O3
.
Code d’erreur | Message |
---|---|
invalid_ | La valeur de reference_ ne doit pas comporter plus de 12 caractères et ne peut contenir que des lettres majuscules, des chiffres, des espaces ou les caractères spéciaux / , _ , - , & et . . Elle ne peut pas commencer par STRIPE . |