30 octobre 2024

L’in-app purchase se promet un grand avenir

J’ai adopté l’in-app Purchase (IAP) dans ma première app photo GhostCam pour proposer des collections de fantômes.

Pour commencer, je me suis basé sur les deux articles de Florian Rousselet et Rudy Huyn :

Et je souhaitais apporter ma pierre à l’édifice en vous montrant le b.a.-ba à savoir.

iap-fancyCamProposer des compléments à votre application par l’in-app purchase regroupe les avantages d’une application gratuite et payante à la fois. C’est à dire que vous allez avoir un nombre de téléchargement très important et des revenus !
En effet sur le store votre application est bien gratuite ! Et Attention, elle doit l’être ! Veillez bien à ce qu’elle soit utilisable sans que l’utilisateur n’est à payer car le revers de la médaille est que vous aurez toujours des utilisateurs qui vont râler du genre « Faut payer pour avoir des trucs en plus », je vous en passe des biens meilleurs.

Comment ajouter un produit


Un « produit » est ce que vous allez vendre dans votre application. Vous lui donnerez une référence qui vous créerez dans votre DevCenter. La première étape est donc d’ajouter votre produit :
iap1

Dans la capture suivante vous détaillez votre produit :
(1) le nom que vous souhaitez voir dans votre propre compte DevCenter
(2) la référence que vous utiliserez dans votre code source !
(3) le type d’achat proposer
(4) la langue par défaut de votre app !
(5) le prix : et là pas le choix c’est la liste déroulante commence 0.00, 0.99, 1.29, 1.49, 1.99 etc… vous ne pouvez pas imposer votre tarif :
iap2

Puis dans les options complémentaires des propriétés de votre produit, vous pourrez renseigner les mots clés pour le store mais surtout les langues disponibles : mettez celles de votre app :
iap3

Vous enregistrez vos choix et cliquez sur la partie Description :
iap4

Ici il vous suffit de saisir le nom, descriptif de votre produit, de lui attribuer une image comme il apparaitra dans le store. Répéter cela dans toutes les langues précédemment sélectionnées :
iap5

Et voilà, il vous suffit alors de soumettre à Microsoft votre nouveau produit. La validation prend moins de 6 heures et à l’instant où j’écris ces lignes, je suis persuadé que Microsoft va encore accélérer ce temps de validation.

Comment cela se passe coté code ?


Présentez vos produits comme vous le souhaitez, moi j’ai utiliser une liste ou lorsque l’utilisateur clic sur l’item, je vérifie si le produit est acheté ou pas.
Avec le code suivant je vérifie si l’utilisateur à acheté ou pas le produit et j’affiche sous mon produit « Acheter » ou « Utiliser » selon le booléen retourné :

public static bool IsPaid(string MaReferenceIAP)
{
    ProductLicense productLicense = null;
    return CurrentApp.LicenseInformation.ProductLicenses.TryGetValue(MaReferenceIAP, out productLicense)
           && productLicense.IsActive;
}

Pour acheter le produit je fais comme ceci lorsque l’utilisateur clique sur l’item: j’appelle une méthode BuyProductById à laquelle je lui passe la référence de mon produit. Si elle est déjà acheté (cas où mon user à réinstaller l’app car il a maintenant un Lumia 1520 par exemple), je remet « Utiliser » sinon si le store de Microsoft me retourne un problème (?) lors de l’achat, dans le cas où l’utilisateur revient en arrière par exemple, je laisse « Acheter »

//...
await BuyProductById(item.ProductId);
item.Label = IsPaid(item.ProductId) ? "Utiliser" :"Acheter";
//..
public static async System.Threading.Tasks.Task<string> BuyProductById(string MaReferenceIAP)
{
    try
    {
        if (!CurrentApp.LicenseInformation.ProductLicenses[MaReferenceIAP].IsActive)
        {
            var allProducts = await CurrentApp.LoadListingInformationAsync();

            ProductListing productListing = null;
            if (!allProducts.ProductListings.TryGetValue(MaReferenceIAP, out productListing))
            {
                MessageBox.Show("Aucun produit trouvé sur le store", "chti problème", MessageBoxButton.OK);
                return String.Empty;
            }

            var receipt = await CurrentApp.RequestProductPurchaseAsync(productListing.ProductId, false);
        }
        return String.Empty;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("Bug BuyProductById " + ex.Message);
        return String.Empty;
    }
}

Notez que tant que votre produit ne sera pas validé CurrentApp.LoadListingInformationAsyn() vous retournera une erreur

NOTA : dans l’émulateur Windows Phone tous vos produit seront gratuit pour tester 🙂