Accepter les paiements pour les produits numériques sur iOS avec Stripe comme marchand attitréVersion bêta publique
Ouvrez Stripe Checkout avec Managed Payments dans un navigateur pour vendre des produits ou des abonnements numériques intégrés à une application.
Conditions d'utilisation du service requises
You must accept the Managed Payments terms of service in the Dashboard before you can use Managed Payments.
Dans certains pays, vous pouvez créer un lien vers un site web externe pour accepter des paiements en utilisant Managed Payments sur iOS. Vous utilisez Stripe Checkout pour rediriger vos clients vers une page de paiement hébergée par Stripe. À titre d’exemple, ce guide décrit comment vendre des crédits numériques à utiliser dans votre application. Vous pouvez accepter à la fois des paiements uniques et des paiements par abonnement.

L’interface utilisateur que les clients voient pour les paiements uniques avec Managed Payments

L’interface utilisateur que les clients voient pour les paiements d’abonnement avec Managed Payments
Limitations
Ce guide ne couvre pas :
- L’authentification de l’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).
- Les achats intégrés à l’application. Pour implémenter des achats dans l’application avec StoreKit, consultez le guide d’Apple sur les achats intégrés à l’application.
Ce guide ne décrit que le processus de vente de produits numériques intégrés à une application qui respectent ces critères d’éligibilité. Si vos produits numériques ne correspondent pas à ces critères, consultez la section Accepter les paiements pour les biens numériques sur iOS. Si vous vendez des produits physiques, consultez la section Paiements Stripe intégrés à une application.
Avant de commencer
- Assurez-vous que vos produits respectent les critères d’éligibilité pour Managed Payments. Pour traiter un paiement avec Managed Payments, tous les produits que le client achète doivent être éligibles.
- Activez Managed Payments dans votre Dashboard
- Configurez votre environnement de développement.
- Assurez-vous d’utiliser la version de l’API
2025-03-31.ou une version ultérieure.basil
Créer des produits et tarifs
Créez vos produits et leurs tarifs dans le Dashboard ou avec la CLI de Stripe. Vous pouvez ajouter des produits numériques avec des tarifs uniques et des abonnements avec des tarifs récurrents. Vous pouvez également laisser votre client payer ce qu’il veut (par exemple, pour décider du nombre de crédits à acheter), en sélectionnant Les clients choisissent ce qu’ils paient. Lorsque vous créez votre produit, le code de taxe que vous sélectionnez doit être éligible à Managed Payments. Les codes de taxe éligibles sont libellés « Éligible à Managed Payments ».
Cet exemple utilise un seul produit et un seul tarif pour représenter un lot de 100 pièces qui coûte 10 USD.
Créer des clientsCôté serveur
Chaque fois que vous créez une session Checkout, créez un objet Customer pour votre utilisateur si celui-ci n’existe pas encore.
Avertissement
Veillez à conserver sur votre serveur l’association entre le compte d’utilisateur et l’ID de client Stripe. Sans cela, vous ne pourrez pas associer vos clients à des achats et vos clients ne pourront donc pas récupérer leurs achats.
Si votre application ne dispose pas de fournisseur d’authentification, vous pouvez utiliser l’option Se connecter avec Apple.
Utilisez l’argument customer pour passer son ID client lors de la création d’une session Checkout. Cela garantit que tous les objets créés pendant la session s’associent au bon objet Customer.
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 une autorisation de domaines associés à 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 client
- L’ID du produit (soit un paiement unique, soit un abonnement)
- Un
origin_défini surcontext mobile_pour opter pour une interface utilisateur optimisée pour les achats de type application vers web.app - Le paramètre
managed_surpayments[enabled] true - L’en-tête de version avec
;managed_payments_ preview=v1 - Une URL
success_, à savoir un lien universel vers lequel rediriger votre client après avoir finalisé le paiement.url
Erreur fréquente
Créez la session Checkout avec managed_, l’en-tête de version avec managed_ et origin_ pour opter pour une interface utilisateur spécifique aux paiements gérée et optimisée pour les achats de type application vers web.
Si vous utilisez TypeScript, vous pouvez rencontrer des erreurs de type lors de cette opération, car Managed Payments est en version bêta privée. Vous pouvez ignorer ces erreurs en toute sécurité en ajoutant le paramètre // @ts-expect-error.
Après avoir créé une session Checkout, renvoyez l’URL contenue dans la réponse vers votre application.
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.
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.
Détails du paiement
Aperçu du reçu
- Sous Récapitulatif du paiement, cliquez sur Facture.
- Cliquez sur Envoyer reçu pour avoir un aperçu du reçu envoyé par e-mail à votre client. Vous pouvez également télécharger le reçu.
Remarque
Dans l’environnement de test, vous ne recevez pas automatiquement les reçus par e-mail après un achat. Envoyez-les manuellement en suivant les instructions de la section précédente.
Link
Link agit en tant que marchand officiel lors du paiement et fournit la gestion des abonnements et la prise en charge des transactions sur Link.com .
Pour tester Link :
- Ouvrez votre page de paiement
- Cliquez sur le bouton de règlement.
- Saisissez la même adresse e-mail que celle que vous avez utilisée pour tester votre page de paiement.
- Dans la fenêtre modale contextuelle, utilisez le code d’accès
000000pour vous identifier.
Si vous avez coché la case Enregistrer mes informations pour accélérer le paiement lors du premier paiement, vous verrez également la carte bancaire test 4242 enregistrée sur votre compte Link.
FacultatifRessources de test supplémentaires
Stripe met à votre disposition plusieurs cartes de test que vous pouvez utiliser pour vous assurer que votre intégration est prête à passer en production. Utilisez-les avec n’importe quels code CVC, code postal et date d’expiration future.
| Numéro | Description |
|---|---|
| Fait aboutir le paiement et le traite immédiatement. | |
| Effectue une authentification 3D Secure 2 pour que le paiement aboutisse. | |
Échec systématique avec le code de refus de paiement insufficient_. |
Pour obtenir la liste complète des cartes de test, consultez notre guide consacré aux tests.
Tester des liens universels
Si votre lien universel ne vous renvoie pas vers votre application depuis Checkout, vérifiez que les logs SharedWebCredentials ne contiennent pas d’erreurs.
Ajouter un paramètre de débogage au droit de domaine associé
- Ouvrez le volet Signatures et fonctionnalités de la cible de votre application.
- Ajoutez le flag
?mode=developerdans votre saisie pour votre domaine associé. (Exemple :applinks:example.)com?mode=developer
Passez l’appareil en mode développeur.
- Exécutez une application de Xcode sur votre appareil pour activer le menu développeur.
- Sur votre iPhone, ouvrez le volet Réglages, touchez Développeur, puis activez Développement des domaines associés.
Supprimez et désinstallez votre application. De cette manière, iOS récupérera à nouveau le fichier apple-app-site-association.
Finalisez le tunnel de paiement dans votre application.
Checkout vous redirige vers votre application. Si ce n’est pas le cas, lancez un diagnostic système.
Appuyez simultanément sur les boutons d’augmentation du volume, de réduction du volume et de marche/arrêt pendant 1 seconde, puis relâchez-les. Vous sentirez une courte vibration, mais aucun élément visuel ne s’affichera.
Patientez 5 minutes, puis accédez à Paramètres > Confidentialité > Analyses et Amélioration > Données d’analyse. Ensuite, faites défilez la page jusqu’au dernier fichier de diagnostic système de la liste.
Touchez le bouton de partage pour envoyer le fichier avec AirDrop sur votre ordinateur.
Ouvrez l’archive du diagnostic système, puis le fichier
swcutil_show. txt Recherchez l’ID de votre application dans ce fichier. Vous verrez une section contenant des informations de débogage pour votre application, dont un message d’erreur, le cas échéant.
Service: applinks App ID: Y28TH9SHX7.com.stripe.FruitStore App Version: 1.0 App PI: <LSPersistentIdentifier 0x115e1a390> { v = 0, t = 0x8, u = 0xc98, db = E335D78F-D49E-4F19-A150-F657E50DEDAE, {length = 8, bytes = 0x980c000000000000} } Domain: example.com?mode=developer User Approval: unspecified Site/Fmwk Approval: unspecified Flags: developer Last Checked: 2021-09-23 18:16:58 +0000 Next Check: 2021-09-23 21:21:34 +0000 Error: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set. around line 1, column 0." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set. around line 1, column 0., NSJSONSerializationErrorIndex=0} Retries: 1