Effectuer des achats dans une application mobile avec le SDK Capacitor

Afficher des paywalls dans votre application mobile est une étape essentielle pour offrir aux utilisateurs l’accès à des contenus ou services premium. Cependant, afficher un paywall ne suffit à lui seul à traiter les achats que lorsqu’Adapty affiche l’écran — c’est-à-dire un flow, ou un paywall issu de l’ancien Paywall Builder.

Si vous affichez l’écran dans votre propre code, vous devez utiliser une méthode distincte appelée .makePurchase() pour finaliser un achat et débloquer le contenu souhaité. Cette méthode constitue le point d’entrée permettant aux utilisateurs d’interagir avec les paywalls et de procéder à leurs transactions.

Si votre paywall comporte une offre promotionnelle active pour le produit qu’un utilisateur souhaite acheter, Adapty l’applique automatiquement au moment de l’achat.

Assurez-vous d’avoir effectué la configuration initiale sans passer aucune étape. Sans elle, nous ne pouvons pas valider les achats.

Effectuer un achat

Note

Adapty affiche-t-il votre écran ? Pour un flow ou un paywall Paywall Builder, les achats sont traités automatiquement — vous pouvez ignorer cette étape.

Vous cherchez un guide pas à pas ? Consultez le guide de démarrage rapide pour des instructions d’implémentation complètes avec tout le contexte nécessaire.


try {
  const result = await adapty.makePurchase({ product });
  
  if (result.type === 'success') {
    const isSubscribed = result.profile?.accessLevels?.['YOUR_ACCESS_LEVEL']?.isActive;
    
    if (isSubscribed) {
      // Grant access to the paid features
      console.log('User is now subscribed!');
    }
  } else if (result.type === 'user_cancelled') {
    console.log('Purchase cancelled by user');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  console.error('Purchase failed:', error);
}
ParamètrePrésenceDescription
productrequiredUn objet AdaptyPaywallProduct récupéré depuis le flow via getPaywallProducts.

Paramètres de réponse :

ParamètreDescription
resultUn objet AdaptyPurchaseResult avec un champ type indiquant le résultat de l’achat ('success', 'user_cancelled', ou 'pending') et un champ profile contenant le AdaptyProfile mis à jour en cas d’achat réussi.

Changer d’abonnement lors d’un achat

Lorsqu’un utilisateur choisit un nouvel abonnement plutôt que de renouveler l’abonnement en cours, le comportement dépend du store :

  • Pour l’App Store, l’abonnement est automatiquement mis à jour au sein du groupe d’abonnements. Si un utilisateur souscrit à un abonnement appartenant à un groupe alors qu’il possède déjà un abonnement d’un autre groupe, les deux abonnements seront actifs simultanément.
  • Pour Google Play, l’abonnement n’est pas mis à jour automatiquement. Vous devrez gérer le changement dans le code de votre application, comme décrit ci-dessous.

Pour remplacer un abonnement par un autre sur Android, appelez la méthode .makePurchase() avec le paramètre supplémentaire :


try {
  const result = await adapty.makePurchase({ 
    product,
    params: {
      android: {
        subscriptionUpdateParams: {
          oldSubVendorProductId: 'old_product_id',
          prorationMode: 'charge_prorated_price'
        },
        isOfferPersonalized: true
      }
    }
  });
  
  if (result.type === 'success') {
    const isSubscribed = result.profile?.accessLevels?.['YOUR_ACCESS_LEVEL']?.isActive;
    
    if (isSubscribed) {
      // Grant access to the paid features
      console.log('Subscription updated successfully!');
    }
  } else if (result.type === 'user_cancelled') {
    console.log('Purchase cancelled by user');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  console.error('Purchase failed:', error);
}

Paramètre de requête supplémentaire :

ParamètrePrésenceDescription
paramsoptionnelUn objet de type MakePurchaseParamsInput contenant les paramètres d’achat spécifiques à la plateforme.

La structure MakePurchaseParamsInput comprend :

{
  android: {
    subscriptionUpdateParams: {
      oldSubVendorProductId: 'old_product_id',
      prorationMode: 'charge_prorated_price'
    },
    isOfferPersonalized: true
  }
}

Vous pouvez en savoir plus sur les abonnements et les modes de remplacement dans la documentation Google Developer :

Gérer les offres prépayées (Android)

Si vos utilisateurs peuvent acheter des offres prépayées (par exemple, acheter un abonnement non renouvelable pour plusieurs mois), vous pouvez activer les transactions en attente pour ces offres.

await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    android: {
        pendingPrepaidPlansEnabled: true,
    },
  }
});

Utiliser les codes de réduction sous iOS

À propos des codes d’offre

Les codes d’offre vous permettent d’accorder des remises ou des essais gratuits à des utilisateurs spécifiques. Contrairement aux offres classiques appliquées automatiquement, les codes d’offre sont distribués en dehors de l’application — par e-mail, réseaux sociaux ou supports imprimés. Les utilisateurs les échangent en saisissant le code dans l’App Store, en suivant une URL de remboursement ou via une boîte de dialogue intégrée à l’application.

Pour configurer des codes d’offre, ouvrez un abonnement dans App Store Connect et accédez à sa section Offer Codes. Vous pouvez créer trois types de codes d’offre :

  • Free — l’abonnement est gratuit pendant une durée définie, puis le renouvellement suivant s’effectue au plein tarif.
  • Pay as you go — l’utilisateur paie un prix réduit à chaque cycle de facturation pendant une durée définie, puis l’abonnement se renouvelle au plein tarif.
  • Pay up front — l’utilisateur paie un prix réduit unique pour toute la durée de l’offre, puis l’abonnement se renouvelle au plein tarif.

Il n’est pas nécessaire d’ajouter des codes d’offre à Adapty. Apple associe chaque transaction pendant la période d’offre à la catégorie du code d’offre. Cela inclut l’échange initial et tous les renouvellements à prix réduit qui suivent. Adapty détecte ce marqueur et enregistre chaque transaction avec la catégorie d’offre offer_code. Une fois la période d’offre terminée et l’abonnement renouvelé au plein tarif, le marqueur n’est plus présent. Vous pouvez filtrer les analytics par le type d’offre Offer Code dans l’Adapty Dashboard.

Résolution des écarts de revenus

Si vous constatez qu’une transaction liée à un code d’offre apparaît dans Adapty au prix plein du produit au lieu du prix réduit, vérifiez les points suivants dans App Store Connect :

  • Le code d’offre dispose d’une tarification correctement configurée pour toutes les régions où les utilisateurs peuvent l’échanger.
  • Le prix de l’offre est défini pour le pays ou la région spécifique de l’utilisateur. Apple envoie le prix régional dans la transaction. Si aucun prix régional n’est configuré pour l’offre, Apple peut envoyer le prix plein du produit à la place.

Vous pouvez filtrer et vérifier les transactions liées aux codes d’offre dans l’Adapty Dashboard grâce aux filtres Offer Code et Offer Discount Type.

Anciens codes promo (obsolètes)

Warning

Apple a abandonné les codes promo pour les achats intégrés en mars 2026. Les codes d’offre les remplacent avec davantage de fonctionnalités : critères d’éligibilité configurables, dates d’expiration et jusqu’à 1 million de codes par trimestre. Si vous utilisiez auparavant des codes promo pour les achats intégrés, passez aux codes d’offre dans App Store Connect.

Les anciens codes promo (limités à 100 par application et par version) accordaient un accès gratuit à un abonnement. Contrairement aux codes d’offre, Apple n’incluait pas les informations de remise dans les transactions de codes promo — il envoyait le prix plein du produit dans le reçu. Par conséquent, Adapty enregistrait ces transactions au prix plein, ce qui provoquait des écarts de revenus entre les analytics Adapty et App Store Connect.

Si vous constatez des transactions historiques au prix plein qui auraient dû être gratuites, il s’agit probablement d’anciens codes promo. Ces codes étant désormais obsolètes, passez aux codes d’offre pour un suivi précis des revenus.

Pour afficher la feuille de saisie de code dans votre application :


try {
  await adapty.presentCodeRedemptionSheet();
} catch (error) {
  console.error('Failed to present code redemption sheet:', error);
}
Danger

D’après nos observations, la feuille de saisie des codes de réduction peut ne pas fonctionner de manière fiable dans certaines applications. Nous vous recommandons de rediriger directement l’utilisateur vers l’App Store.

Pour ce faire, vous devez ouvrir l’URL au format suivant : https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}

Achats intégrés promus depuis l’App Store

Info

Votre application peut intercepter les achats intégrés promus à partir de la version 4.1.1 du SDK, sur iOS 16.4 ou ultérieur. En dessous d’iOS 16.4, l’événement ne se déclenche jamais et les achats promus se terminent d’eux-mêmes. L’événement ne se déclenche pas non plus sur Android.

Lorsqu’un utilisateur lance un achat depuis la page produit de votre App Store et que la transaction est transmise à votre app, le SDK la finalise automatiquement — l’écran d’achat Apple s’affiche immédiatement, et Adapty traite la transaction comme n’importe quel autre achat. Aucun code n’est nécessaire de votre côté.

Si le produit mis en avant est associé à une offre d’abonnement, le SDK l’applique automatiquement lors de l’achat. L’offre est lue depuis l’intention d’achat App Store, qui l’expose à partir d’iOS 18.0. Sur iOS 16.4–17.x, l’achat s’effectue au prix de base.

Pour prendre en charge la finalisation vous-même — par exemple pour afficher votre propre écran en premier — écoutez l’événement 'onPromotedPurchaseReceived' et passez le produit à makePromotedPurchase :


const listener = await adapty.addListener('onPromotedPurchaseReceived', async ({ product }) => {
  const result = await adapty.makePromotedPurchase({ product });
  // process the purchase result
});
Warning

Tant que votre listener est enregistré, le SDK cesse de finaliser les achats promus à votre place. Si votre handler n’appelle jamais makePromotedPurchase, l’achat n’a pas lieu : l’App Store transmet le produit à votre application et attend.

makePromotedPurchase ne prend aucun paramètre d’achat — un produit promu provient de l’App Store plutôt que d’un paywall, il ne porte donc aucun contexte de paywall. Elle retourne le même AdaptyPurchaseResult que makePurchase.

L’appel à adapty.removeAllListeners() supprime votre écouteur d’achats promus avec tous les autres, et la complétion automatique du SDK reprend à la place. Réenregistrez l’écouteur si votre application doit toujours gérer la complétion.