Activer les achats avec Flow & Paywall Builder dans le SDK Unity

Ce guide utilise les APIs du SDK Adapty Unity v4 (bêta). Si vous utilisez la v3, consultez le guide de migration pour les noms de méthodes correspondants.

Pour activer les achats intégrés, vous devez comprendre trois concepts clés :

  • Produits – tout ce que les utilisateurs peuvent acheter (abonnements, consommables, accès à vie)
  • Flows & paywalls – les écrans qui présentent les produits aux utilisateurs, créés dans le Flow & Paywall Builder no-code. Le SDK les récupère via GetFlow. Si vous préférez créer l’interface dans votre propre code, consultez Implémenter des paywalls personnalisés.
  • Placements – où et quand vous affichez les flows & paywalls dans votre app (par exemple main, onboarding, settings). Vous les associez à des placements dans le tableau de bord, puis vous les demandez par ID de placement dans votre code. Cela facilite les tests A/B et l’affichage de contenus différents selon les utilisateurs.

Adapty vous propose trois façons d’activer les achats dans votre application. Choisissez celle qui correspond à vos besoins :

ImplémentationComplexitéQuand l’utiliser
Adapty Flow & Paywall Builder✅ FacileVous créez un flow ou un paywall complet et prêt à l’achat dans le builder no-code. Adapty l’affiche automatiquement et gère toute la logique d’achat complexe, la validation des reçus et la gestion des abonnements en coulisses.
Paywalls personnalisés🟡 MoyenVous implémentez l’UI de votre paywall dans le code de votre application, mais récupérez tout de même l’objet flow depuis Adapty pour garder de la flexibilité sur les offres de produits. Consultez le guide.
Mode observateur🔴 DifficileVous disposez déjà de votre propre infrastructure de gestion des achats et souhaitez continuer à l’utiliser. Notez que le mode observateur présente certaines limitations dans Adapty. Consultez l’article.
Important

Les étapes ci-dessous montrent comment implémenter un flow ou un paywall créé dans l’Adapty Flow & Paywall Builder.

Si vous préférez créer l’interface du paywall vous-même, consultez Implémenter des paywalls personnalisés.

Pour afficher un flow ou un paywall créé dans l’Adapty Flow & Paywall Builder, dans le code de votre application, vous devez seulement :

  1. Récupérez le flow ou le paywall : Récupérez-le depuis Adapty.
  2. Affichez-le et laissez Adapty gérer les achats : Affichez la vue dans votre application.
  3. Gérez les actions des boutons : Associez les interactions utilisateur aux réponses de votre application. Par exemple, ouvrez des liens ou fermez le paywall lorsque les utilisateurs cliquent sur des boutons.

Avant de commencer

Avant de commencer, effectuez ces étapes :

  1. Connectez votre application à l’App Store et/ou Google Play dans l’Adapty Dashboard.
  2. Créez vos produits dans Adapty.
  3. Créez un flow ou un paywall et ajoutez-y des produits.
  4. Créez un placement et ajoutez-y votre flow ou paywall.
  5. Installez et activez le SDK Adapty dans le code de votre application.
Tip

Le moyen le plus rapide d’effectuer ces étapes est de suivre le guide de démarrage rapide ou de créer des flows et des placements à l’aide du CLI développeur.

1. Récupérer le flow ou le paywall

Vos flows et paywalls sont associés à des placements configurés dans le tableau de bord. Les placements vous permettent d’afficher différents flows ou paywalls selon les audiences ou de lancer des tests A/B.

Pour récupérer un flow ou un paywall créé dans Adapty Flow & Paywall Builder, vous devez :

  1. Récupérer l’objet flow par l’ID de placement à l’aide de la méthode GetFlow.

  2. Créez la vue du flow avec la méthode CreateFlowView. La vue contient les éléments d’interface et les styles nécessaires à son affichage. Si aucune vue n’est configurée pour le flow, CreateFlowView renvoie une erreur — gérez-la dans le callback.

Important

Pour obtenir la vue, publiez le flow ou le paywall. Un flow ou un paywall avec des modifications non publiées a le statut Dirty, et son placement continue à servir la dernière version publiée.

Adapty.GetFlow("YOUR_PLACEMENT_ID", (flow, error) => {
    if (error != null) {
        // handle the error
        return;
    }

    // Create the flow view
    AdaptyUI.CreateFlowView(flow, (view, error) => {
        if (error != null) {
            // the flow has no view configured, or view creation failed
            return;
        }

        // view - the flow view ready to be presented
    });
});
Info

Ce quickstart fournit la configuration minimale requise pour afficher un flow ou un paywall. Pour les détails de configuration avancés, consultez notre guide sur l’obtention des flows et paywalls.

2. Afficher le flow ou le paywall

Maintenant que vous avez la vue du flow, il suffit d’ajouter quelques lignes pour l’afficher.

Pour afficher le flow, utilisez la méthode view.Present() sur la view créée par la méthode CreateFlowView. Chaque view ne peut être utilisée qu’une seule fois : après l’avoir fermée, appelez à nouveau CreateFlowView pour afficher le flow une fois de plus.

view.Present((error) => {
    // handle the error
});
Info

Pour plus de détails sur l’affichage d’un flow ou d’un paywall, consultez notre guide.

3. Gérer les actions des boutons

Lorsque les utilisateurs cliquent sur des boutons dans le flow ou le paywall, le SDK Unity gère automatiquement les achats et les restaurations. En revanche, les autres boutons ont des identifiants personnalisés ou prédéfinis qui nécessitent une gestion dans votre code.

Par exemple, votre paywall comporte probablement un bouton de fermeture et des URL à ouvrir (par ex., conditions d’utilisation et politique de confidentialité). Pour gérer ces actions, votre classe doit implémenter l’interface IAdaptyFlowsEventsListener et s’enregistrer en tant qu’écouteur.

Notez que le flow reste ouvert après un achat réussi. Si vous souhaitez le fermer une fois l’achat terminé, fermez la vue dans le callback FlowViewDidFinishPurchase.

Tip

Consultez nos guides sur la gestion des actions et des événements de bouton.

public class YourClass : MonoBehaviour, IAdaptyFlowsEventsListener
{
    void Start()
    {
        // Register this class as the flows events listener
        Adapty.SetFlowsEventsListener(this);
    }

    // IAdaptyFlowsEventsListener method - handles button actions
    public void FlowViewDidPerformAction(
        AdaptyUIFlowView view,
        AdaptyUIUserAction action
    ) {
        switch (action.Type) {
            case AdaptyUIUserActionType.Close:
                view.Dismiss(null);
                break;
            case AdaptyUIUserActionType.OpenUrl:
                AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
                break;
            default:
                break;
        }
    }

    // IAdaptyFlowsEventsListener method - dismiss the flow after a purchase
    public void FlowViewDidFinishPurchase(
        AdaptyUIFlowView view,
        AdaptyPaywallProduct product,
        AdaptyPurchaseResult purchasedResult
    ) {
        if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
            view.Dismiss(null);
        }
    }
}

Prochaines étapes

Tip

Des questions ou des problèmes ? Consultez notre forum d’assistance où vous trouverez des réponses aux questions fréquentes ou pourrez poser les vôtres. Notre équipe et notre communauté sont là pour vous aider !

Votre flow ou paywall est prêt à être affiché dans l’application. Testez vos achats dans le sandbox App Store ou dans le Google Play Store pour vous assurer de pouvoir effectuer un achat test depuis le flow.

Vous devez maintenant vérifier le niveau d’accès des utilisateurs pour vous assurer d’afficher un paywall ou d’accorder l’accès aux fonctionnalités payantes aux bons utilisateurs.

Exemple complet

Voici comment intégrer toutes ces étapes dans votre application.

using System;
using System.Collections.Generic;
using UnityEngine;
using AdaptySDK;

public class FlowManager : MonoBehaviour, IAdaptyFlowsEventsListener
{
    [SerializeField] private string placementId = "YOUR_PLACEMENT_ID";

    void Start()
    {
        // Register for flow events
        Adapty.SetFlowsEventsListener(this);
        GetAndDisplayFlow();
    }

    private void GetAndDisplayFlow()
    {
        Adapty.GetFlow(placementId, (flow, error) => {
            if (error != null) {
                Debug.LogError("Error getting flow: " + error.Message);
                return;
            }

            CreateAndPresentFlowView(flow);
        });
    }

    private void CreateAndPresentFlowView(AdaptyFlow flow)
    {
        AdaptyUI.CreateFlowView(flow, (view, error) => {
            if (error != null) {
                // the flow has no view configured — use custom logic
                Debug.LogError("Error creating flow view: " + error.Message);
                return;
            }

            view.Present((presentError) => {
                if (presentError != null) {
                    Debug.LogError("Error presenting flow: " + presentError.Message);
                    return;
                }

                Debug.Log("Flow presented successfully");
            });
        });
    }

    // IAdaptyFlowsEventsListener implementation
    public void FlowViewDidPerformAction(
        AdaptyUIFlowView view,
        AdaptyUIUserAction action
    ) {
        switch (action.Type) {
            case AdaptyUIUserActionType.Close:
                Debug.Log("Close button pressed");
                view.Dismiss(null);
                break;
            case AdaptyUIUserActionType.OpenUrl:
                AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
                break;
            default:
                break;
        }
    }

    public void FlowViewDidFinishPurchase(
        AdaptyUIFlowView view,
        AdaptyPaywallProduct product,
        AdaptyPurchaseResult purchasedResult
    ) {
        if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
            view.Dismiss(null);
        }
    }

    // Required interface methods (implement as needed)
    public void FlowViewDidAppear(AdaptyUIFlowView view) { }
    public void FlowViewDidDisappear(AdaptyUIFlowView view) { }
    public void FlowViewDidSelectProduct(AdaptyUIFlowView view, string productId) { }
    public void FlowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) { }
    public void FlowViewDidFailPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
    public void FlowViewDidStartRestore(AdaptyUIFlowView view) { }
    public void FlowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) { }
    public void FlowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
    public void FlowViewDidReceiveAnalyticEvent(AdaptyUIFlowView view, string name, IDictionary<string, object> @params) { }

    public void ShowFlow()
    {
        GetAndDisplayFlow();
    }
}