Accepter des paiements pour des biens numériques sur iOS à l'aide d'une page de paiement préconfigurée
Ouvrez Stripe Checkout dans un navigateur pour vendre des biens numériques ou des abonnements dans l'application.
Remarque
Apprenez à construire une intégration similaire utilisant Managed Payments, la solution de marchand officiel de Stripe.
Pour les applications iOS vendant des produits, contenus et abonnements numériques aux États-Unis, vous pouvez rediriger les clients vers une page de paiement externe pour accepter des paiements utilisant Stripe Checkout. Utilisez la propriété StoreKit Storefront pour détecter la vitrine à partir de laquelle votre application a été téléchargée. Ce guide décrit comment accepter des paiements pour l’achat de crédits dans votre application iOS en redirigeant les clients vers une page de paiement hébergée par Stripe.
Pour les développeurs Android aux États-Unis, vous pouvez traiter les paiements intégrés directement à l’application à l’aide d’un prestataire de services de paiement tiers. Pour accepter les paiements intégrés directement à l’application avec Stripe, consultez la section Paiements intégrés à l’application.
Ce guide décrit uniquement le processus destiné aux développeurs iOS qui vendent des biens numériques intégrés à leurs applications. Utilisez le guide sur les paiements dans les applications natives, si vous vendez :
- Produits physiques
- Biens et services destinés à la consommation en dehors de votre application
- Services en temps réel de personne à personne entre deux individus
Ce guide explique comment :
- Collectez des informations de paiement avec Checkout.
- Modélisez vos forfaits de crédit avec des Produits, des Tarifs et soit des Clients soit des Comptes configurés par le client.
- Utilisez les liens universels pour rediriger directement vers votre application depuis Checkout.
- Surveillez des webhooks pour mettre à jour le solde de la devise du client dans l’application.
Utiliser l’API Accounts v2 pour représenter les clients
L’API Accounts v2 est généralement disponible pour les utilisateurs de Connect et en aperçu public pour les autres utilisateurs de Stripe. Si vous avez accès à l’aperçu Accounts v2, vous devez spécifier une version d’aperçu dans votre code.
Pour accéder à l’aperçu Accounts v2, rendez-vous sur aperçus et fonctionnalités de Account dans votre Dashboard et activez Moyens de paiement réutilisables pour les virements internationaux.
Dans la plupart des cas d’usage, nous vous recommandons de modéliser vos clients en tant qu’objets Account configurés par le client, plutôt que d’utiliser des objets Customer.

Lien vers un site externe pour les paiements ponctuels

Lien vers un site externe pour les paiements récurrents ou par abonnement
Mode de fonctionnement
Le diagramme suivant illustre le tunnel de paiement complet d’une application au web à un niveau élevé :
Ce qui n’est pas couvert
Ce guide vous explique comment ajouter Stripe Checkout à côté de votre système d’achat actuel dans l’application. Il ne couvre pas les points suivants :
- Authentification d’utilisateur. Si vous ne disposez pas encore d’un fournisseur d’authentification, vous pouvez faire appel à un tiers (par exemple, avec l’option Se connecter avec Apple ou Authentification Firebase).
- Achats dans l’application native. Pour implémenter des achats dans l’application avec StoreKit, consultez le guide d’Apple sur les achats intégrés à l’application.
Configurer StripeCôté serveur
Tout d’abord, inscrivez-vous pour créer un Compte Stripe.
Ajoutez ensuite la bibliothèque d’API Stripe à votre back-end :
Installez ensuite l’interface de ligne de commande Stripe. Cette dernière vous permet d’exécuter les tests webhook dont vous aurez besoin et vous pouvez l’utiliser pour créer vos produits et vos tarifs.
# Install Homebrew to run this command: https://brew.sh/ brew install stripe/stripe-cli/stripe # Connect the CLI to your dashboard stripe login
Pour davantage d’options d’installation, consultez la page consacrée à l’interface de ligne de commande Stripe.
Créer des produits et des tarifs
Créez vos produits et leurs tarifs dans le Dashboard ou via l’interface de ligne de commande Stripe. Vous pouvez modéliser les biens numériques à l’aide de tarifs ponctuels et les abonnements à l’aide de tarifs récurrents. Vous pouvez également laisser votre client payer le montant de son choix (par exemple, pour décider du nombre de crédits à acheter), en sélectionnant Les clients indiquent le montant à payer.
Cet exemple utilise un seul produit et un tarif pour représenter un lot de 100 coins.
Accédez à la page Ajouter un produit et créez un pack de coins. Ajoutez un tarif ponctuel de 10 USD.
- 100 coins : pack de 100 coins dans l’application
- Tarif : modèle standard | 10 USD | Ponctuel
Après avoir créé votre tarif, enregistrez son ID afin de pouvoir l’utiliser par la suite. L’ID de tarif se présente sous la forme suivante : price_.
Lorsque vous le souhaitez, cliquez sur le bouton Copier en mode production en haut à droite de la page pour dupliquer votre produit de l’environnement de test en mode production.
Créer des clientsCôté serveur
Chaque fois que vous créez une Checkout Session, créez un objet Account configurés par le client et représentant votre client, si vous n’en avez pas déjà.
// Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. // Find your keys at https://dashboard.stripe.com/apikeys. const stripe = require('stripe')(); // This assumes your app has an existing customer database, which we'll call `myUserDB`. const user = myUserDB.getUser("jennyrosen"); if (!user.stripeCustomerAccountID) { const customer_account = await stripe.v2.core.accounts.create({ display_name: user.name, contact_email: user.email, }); // Set the user's Stripe customer Account ID for later retrieval. Associating the user with the Stripe object ID lets your customers recover their purchases. user.stripeCustomerAccountID = customer_account.id; }'sk_test_VePHdqKTYQjKNInc7u56JBrQ'
Si votre application ne dispose pas de fournisseur d’authentification, vous pouvez utiliser l’option Se connecter avec Apple.
Vous pouvez enregistrer les informations du moyen de paiement pour que Checkout associe automatiquement ce moyen de paiement à l’objet Account afin de pouvoir le réutiliser.
Configurer des liens universelsCôté clientCôté serveur
Les liens universels autorisent Checkout à vous renvoyer directement vers votre application. Pour configurer un lien universel :
- Ajoutez un fichier
apple-app-site-associationà votre domaine. - Ajoutez un droit de domaine associé à votre application.
- Ajoutez une page de renvoi pour vos URL de redirection Checkout.
Définissez les domaines associés
Ajoutez un fichier à votre domaine sur .well-known/apple-app-site-association pour définir les URL que votre application peut gérer. Ajoutez l’ID d’application avec votre ID d’équipe que vous pourrez trouver sur la page d’abonnement du portail développeur d’Apple.
{ "applinks": { "apps": [], "details": [ { "appIDs": [ "A28BC3DEF9.com.example.MyApp1", "A28BC3DEF9.com.example.MyApp1-Debug" ], "components": [ { "/": "/checkout_redirect*", "comment": "Matches any URL whose path starts with /checkout_redirect" } ] } ] } }
Vous devez traiter le fichier avec le type MIME application/json. Utilisez curl -I pour confirmer le type de contenu.
curl -I https://example.com/.well-known/apple-app-site-association
Pour en savoir plus, consultez la page d’Apple relative aux domaines associés pris en charge.
Ajouter un droit de domaine associé à votre application
- Ouvrez le volet Signatures et fonctionnalités de la cible de votre application.
- Cliquez sur + Fonctionnalité, puis sélectionnez Domaines associés.
- Ajoutez une entrée pour
applinks:example.à la liste Domaines associés.com
Pour en savoir plus sur les liens universels, consultez la page d’Apple sur les liens universels pour les développeurs.
Bien qu’iOS intercepte les liens vers les URL définies dans votre fichier apple-app-site-association, il se peut que la redirection ne parvienne pas à ouvrir votre application.
Assurez-vous de créer une page de repli à votre success_. Par exemple, vous pouvez définir un schéma d’URL personnalisé pour votre application et l’utiliser pour créer un lien de retour en cas d’échec du lien universel.
Créer une session CheckoutCôté serveur
Une session Checkout est la représentation programmatique de ce que votre client voit lorsqu’il est redirigé vers le formulaire de paiement. Les sessions Checkout expirent 24 heures après leur création. Configurez-le à l’aide des éléments suivants :
- ID du
Accountconfiguré pour le client - L’ID du
Product(soit un paiement ponctuel, soit un abonnement) - Un
origin_défini surcontext mobile_(pour utiliser une interface utilisateur optimisée pour les achats de l’application vers le web)app - Une
success_(à savoir un lien universel pour rediriger votre client vers votre application après avoir finalisé le paiement)url
Après avoir créé une session Checkout, renvoyez l’URL contenue dans la réponse vers votre application.
// This example sets up an endpoint using the Express framework. const express = require('express'); const app = express(); const stripe = require('stripe')(); app.post('/create-checkout-session', async (req, res) => { // Fetch the Stripe customer Account ID for the customer associated with this request. // This assumes your app has an existing user database, which we'll call `myUserDB`. const user = myUserDB.getUserFromToken(req.query.token); const customerAccountId = user.stripeCustomerAccountID; // The price ID from the previous step const priceId = '{{PRICE_ID}}'; const session = await stripe.checkout.sessions.create({ line_items: [ { price: priceId, quantity: 1, }, ], mode: 'payment', origin_context: 'mobile_app', customer_account: customerAccountId, success_url: 'https://example.com/checkout_redirect/success', }); res.json({url: session.url}); }); app.post('/login', async (req, res) => { const token = myUserDB.login(req.body.login_details) res.json({token: token}) }); app.listen(4242, () => console.log(`Listening on port ${4242}!`));'sk_test_VePHdqKTYQjKNInc7u56JBrQ'
Remarque
Apple Pay est activé par défaut et s’affiche automatiquement dans Checkout lorsqu’un client utilise un appareil pris en charge. Vous pouvez accepter des moyens de paiement supplémentaires à l’aide de moyens de paiement dynamiques.
Ouvrir Checkout dans SafariCôté client
Ajoutez un bouton de paiement à votre application. Ce bouton :
- Appelez un endpoint côté serveur pour créer une session Checkout.
- Renvoie la session Checkout au client.
- Ouvre l’URL de la session dans Safari.
import Foundation import SwiftUI import StoreKit struct BuyCoinsView: View { @EnvironmentObject var myBackend: MyServer @State var paymentComplete = false var body: some View { // Check if payments are blocked by Parental Controls on this device. if !SKPaymentQueue.canMakePayments() { Text("Payments are disabled on this device.") } else { if paymentComplete { Text("Payment complete!") } else { Button { myBackend.createCheckoutSession { url in UIApplication.shared.open(url, options: [:], completionHandler: nil) } } label: { Text("Buy 100 coins") }.onOpenURL { url in // Handle the universal link from Checkout. if url.absoluteString.contains("success") { // The payment was completed. Show a success // page and fetch the latest customer entitlements // from your server. paymentComplete = true } } } } } }
Récupérer l’URL Checkout côté client
Utilisez votre endpoint serveur pour récupérer la session de paiement.
class MyServer: ObservableObject { // The cached login token var token: String? func createCheckoutSession(completion: @escaping (URL) -> Void) { // Send the login token to the `/create_checkout_session` endpoint let request = URLRequest(url: URL(string: "https://example.com/create-checkout-session?token=\(self.token)")!) let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in guard let unwrappedData = data, let json = try? JSONSerialization.jsonObject(with: unwrappedData, options: []) as? [String : Any], let urlString = json["url"] as? String, let url = URL(string: urlString) else { // Handle error return } DispatchQueue.main.async { // Call the completion block with the Checkout session URL returned from the backend completion(url) } }) task.resume() } func login() { // Login using the server and set the login token. let request = URLRequest(url: URL(string: "https://example.com/login")!) let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in guard let unwrappedData = data, let json = try? JSONSerialization.jsonObject(with: unwrappedData, options: []) as? [String : Any], let token = json["token"] as? String else { // Handle error return } self.token = token }) task.resume() } }
Gérer le traitement des commandesCôté serveur
Une fois l’achat effectué, Stripe vous envoie un webhook checkout.. Lorsque vous l’avez reçu, vous pouvez ajouter les coins au client sur votre serveur.
Checkout redirige votre client vers l’URL success_ lorsque vous confirmez avoir reçu l’événement. Si votre endpoint est hors service ou si l’événement n’est pas confirmé correctement, Checkout redirige le client vers l’URL success_ 10 secondes après la finalisation du paiement.
Pour les tests, vous pouvez surveiller les événements dans le Dashboard ou utiliser l’interface de ligne de commande Stripe. Pour le mode production, configurez un endpoint de webhook et abonnez-vous aux types d’événement appropriés. Si vous ne connaissez pas votre clé STRIPE_, cliquez sur le webhook dans le Dashboard pour l’afficher.
// Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. // Find your keys at https://dashboard.stripe.com/apikeys. const stripe = require('stripe')(); app.post("/webhook", async (req, res) => { let data; let eventType; // Check if webhook signing is configured. const webhookSecret ='sk_test_VePHdqKTYQjKNInc7u56JBrQ'if (webhookSecret) { // Retrieve the event by verifying the signature using the raw body and secret. let event; let signature = req.headers["stripe-signature"]; try { event = stripe.webhooks.constructEvent( req.body, signature, webhookSecret ); } catch (err) { console.log(`⚠️ Webhook signature verification failed.`); return res.sendStatus(400); } // Extract the object from the event. data = event.data; eventType = event.type; } else { // Webhook signing is recommended, but if the secret is not configured in `config.js`, // retrieve the event data directly from the request body. data = req.body.data; eventType = req.body.type; } switch (eventType) { case 'checkout.session.completed': const session = event.data.object; // Payment is successful. // Update the customer in your database to reflect this purchase. const user = myUserDB.userForStripeCustomerID(session.customer); user.addCoinsTransaction(100, session.id); break; default: // Unhandled event type } res.sendStatus(200); });"{{STRIPE_WEBHOOK_SECRET}}"
Tests
Testez votre bouton de paiement qui redirige votre client vers Stripe Checkout.
- Cliquez sur le bouton de paiement qui vous redirige vers le formulaire de paiement Stripe Checkout.
- Saisissez le numéro de carte de test , un code CVC à trois chiffres, une date d’expiration et un code postal valide.
- Appuyez sur Payer.
- Le webhook
checkout.s’active et Stripe notifie votre serveur de la transaction.session. completed - Vous êtes redirigé(e) vers votre application.
Si votre intégration ne fonctionne pas, consultez la section Ressources de test supplémentaires ci-dessous.