---
title: "Effectuer des achats dans une application mobile avec le SDK React Native"
description: "Guide sur la gestion des achats intégrés et des abonnements avec Adapty."
---

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 ces paywalls suffit uniquement si vous utilisez le [Paywall Builder](adapty-paywall-builder) pour les personnaliser.

Si vous n'utilisez pas le Paywall Builder, vous devez utiliser une méthode distincte appelée `.makePurchase()` pour finaliser un achat et déverrouiller le contenu souhaité. Cette méthode constitue la passerelle permettant aux utilisateurs d'interagir avec les paywalls et de procéder aux transactions souhaitées.

Si votre paywall dispose d'une offre promotionnelle active pour le produit qu'un utilisateur souhaite acheter, Adapty l'appliquera automatiquement au moment de l'achat.

:::warning
Gardez à l'esprit que l'offre de lancement ne sera appliquée automatiquement que si vous utilisez des paywalls configurés via le Paywall Builder.

Dans les autres cas, vous devrez [vérifier l'éligibilité de l'utilisateur à une offre de lancement sur iOS](fetch-paywalls-and-products#check-intro-offer-eligibility-on-ios). Ignorer cette étape peut entraîner le rejet de votre application lors de la publication. De plus, cela pourrait conduire à facturer le plein tarif à des utilisateurs éligibles à une offre de lancement.
:::

Assurez-vous d'avoir [effectué la configuration initiale](quickstart) sans sauter une seule étape. Sans cela, nous ne pouvons pas valider les achats.

## Effectuer un achat \{#make-purchase\}

:::note
**Vous utilisez le [Paywall Builder](adapty-paywall-builder) ?** Les achats sont traités automatiquement — vous pouvez ignorer cette étape.

**Vous cherchez des instructions pas à pas ?** Consultez le [guide de démarrage rapide](react-native-implement-paywalls-manually) pour des instructions d'implémentation complètes avec tout le contexte nécessaire.
:::

```typescript showLineNumbers
try {
    const purchaseResult = await adapty.makePurchase(product);
    switch (purchaseResult.type) {
      case 'success':
        const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;

        if (isSubscribed) {
          // Grant access to the paid features
        }
        break;
      case 'user_cancelled':
        // Handle the case where the user canceled the purchase
        break;
      case 'pending':
        // Handle deferred purchases (e.g., the user will pay offline with cash)
        break;
    }
} catch (error) {
    // Handle the error
}
```

Paramètres de la requête :

| Paramètre   | Présence  | Description                                                                                                                    |
| :---------- | :-------- |:-------------------------------------------------------------------------------------------------------------------------------|
| **Product** | requis    | Un objet [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) récupéré depuis le paywall. |

Paramètres de la réponse :

| Paramètre   | Description                                                                                                                                                                                                                                                                                                                                                                      |
|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Profile** | <p>Si la requête a réussi, la réponse contient cet objet. Un objet [AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile) fournit des informations complètes sur les niveaux d'accès, les abonnements et les achats uniques d'un utilisateur dans l'application.</p><p>Vérifiez le statut du niveau d'accès pour déterminer si l'utilisateur dispose de l'accès requis à l'application.</p> |

:::warning
**Remarque :** si vous utilisez encore la version StoreKit d'Apple inférieure à v2.0 et une version du SDK Adapty inférieure à v2.9.0, vous devez fournir le [secret partagé de l'App Store Apple](app-store-connection-configuration#step-5-enter-app-store-shared-secret) à la place. Cette méthode est actuellement dépréciée par Apple.
:::

## Changer d'abonnement lors d'un achat \{#change-subscription-when-making-a-purchase\}

Lorsqu'un utilisateur choisit un nouvel abonnement plutôt que de renouveler l'abonnement actuel, 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 achète un abonnement d'un groupe alors qu'il a déjà un abonnement d'un autre groupe, les deux abonnements seront actifs simultanément.
- Pour Google Play, l'abonnement n'est pas automatiquement mis à jour. Vous devrez gérer le changement dans le code de votre application mobile comme décrit ci-dessous.

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

```typescript showLineNumbers
try {
    const purchaseResult = await adapty.makePurchase(product, params);
    switch (purchaseResult.type) {
      case 'success':
        const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;

        if (isSubscribed) {
          // Grant access to the paid features
        }
        break;
      case 'user_cancelled':
        // Handle the case where the user canceled the purchase
        break;
      case 'pending':
        // Handle deferred purchases (e.g., the user will pay offline with cash)
        break;
    }
} catch (error) {
    // Handle the error
}
```
Paramètre de requête supplémentaire :

| Paramètre  | Présence | Description                                                  |
| :--------- | :------- | :----------------------------------------------------------- |
| **params** | requis   | un objet de type [`MakePurchaseParamsInput`](https://react-native.adapty.io/types/makepurchaseparamsinput). |

:::info
**Version 3.8.2+** : La structure `MakePurchaseParamsInput` a été mise à jour. `oldSubVendorProductId` et `prorationMode` sont désormais imbriqués sous `subscriptionUpdateParams`, et `isOfferPersonalized` est déplacé au niveau supérieur.

Exemple :
```javascript
makePurchase(product, {
    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 :

- [À propos des modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-modes)
- [Recommandations de Google pour les modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations)
- Mode de remplacement [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Remarque : cette méthode est disponible uniquement pour les mises à niveau d'abonnement. Les rétrogradations ne sont pas prises en charge.
- Mode de remplacement [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Remarque : le changement d'abonnement réel n'aura lieu qu'à la fin de la période de facturation de l'abonnement actuel.

## Utiliser des codes promotionnels sur iOS \{#redeem-offer-codes-in-ios\}

<Details>
<summary>À propos des codes d'offre</summary>

Les codes d'offre vous permettent d'accorder des réductions ou des périodes d'essai gratuites à 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 activent en saisissant le code dans l'App Store, en suivant une URL de validation 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](https://developer.apple.com/help/app-store-connect/manage-subscriptions/set-up-subscription-offer-codes) de codes d'offre :

- **Free** — l'abonnement est gratuit pendant une durée définie, puis le renouvellement suivant se fait au plein tarif.
- **Pay as you go** — l'utilisateur paie un tarif 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 unique réduit pour toute la durée de l'offre, puis l'abonnement se renouvelle au plein tarif.

Vous n'avez pas besoin d'ajouter les codes d'offre à Adapty. Apple marque chaque transaction pendant la période d'offre avec la catégorie du code d'offre. Cela inclut la première activation et tous les renouvellements à tarif réduit qui suivent. Adapty détecte ce marquage 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 marquage disparaît. Vous pouvez filtrer les analyses par le type d'offre **Offer Code** dans l'[Adapty Dashboard](controls-filters-grouping-compare-proceeds).

#### Résolution des écarts de revenus \{#revenue-discrepancy-troubleshooting\}

Si vous constatez qu'une transaction avec code d'offre apparaît dans Adapty au prix plein du produit plutôt qu'au prix réduit de l'offre, vérifiez les points suivants dans App Store Connect :

- Le code d'offre dispose bien d'une tarification correcte configurée pour toutes les régions où les utilisateurs peuvent l'activer.
- 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 avec code d'offre dans l'[Adapty Dashboard](controls-filters-grouping-compare-proceeds) à l'aide des filtres de type d'offre **Offer Code** et **Offer Discount Type**.

#### Anciens codes promo (obsolètes) \{#legacy-promo-codes-deprecated\}

:::warning
Apple a supprimé les codes promo pour les achats intégrés en mars 2026. Les codes d'offre les remplacent avec davantage de fonctionnalités : éligibilité configurable, 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) donnaient un accès gratuit à un abonnement. Contrairement aux codes d'offre, Apple n'incluait pas les informations de réduction dans les transactions avec code promo — il envoyait le prix plein du produit dans le reçu. En conséquence, Adapty enregistrait ces transactions au prix plein, ce qui entraînait des écarts de revenus entre les analyses Adapty et App Store Connect.

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

</Details>

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

```typescript showLineNumbers
adapty.presentCodeRedemptionSheet();
```

:::danger
D'après nos observations, la feuille de saisie de code promotionnel peut ne pas fonctionner de manière fiable dans certaines applications. Nous recommandons de rediriger l'utilisateur directement 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}`
:::

## Gérer les plans prépayés (Android) \{#manage-prepaid-plans-android\}

Si les utilisateurs de votre application peuvent acheter des [plans prépayés](https://developer.android.com/google/play/billing/subscriptions#prepaid-plans) (par exemple, acheter un abonnement non renouvelable pour plusieurs mois), vous pouvez activer les [transactions en attente](https://developer.android.com/google/play/billing/subscriptions#pending) pour les plans prépayés.

```typescript showLineNumbers
adapty.activate("PUBLIC_SDK_KEY", {
    android: { pendingPrepaidPlansEnabled: true }
});
```