{"id":137856,"date":"2021-09-29T00:00:00","date_gmt":"2021-09-29T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/fr-android-in-app-purchases-part-4-billing-library-error-codes-and-how-not-to-fail-testing\/"},"modified":"2021-09-29T00:00:00","modified_gmt":"2021-09-29T00:00:00","slug":"android-in-app-purchases-part-4-billing-library-error-codes-and-how-not-to-fail-testing","status":"publish","type":"post","link":"https:\/\/adapty.io\/fr\/blog\/android-in-app-purchases-part-4-billing-library-error-codes-and-how-not-to-fail-testing\/","title":{"rendered":"Achats int\u00e9gr\u00e9s sous Android, partie 4 : facturation des codes d’erreur de la biblioth\u00e8que et comment ne pas se planter lors des tests"},"content":{"rendered":"\n

Aujourd’hui, nous allons parler des codes d’erreur<\/a>  nous pouvons obtenir du service de facturation dans la m\u00e9thode getResponseCode()<\/a>.<\/p>\n\n\n\n

Un exemple de la fa\u00e7on dont nous avons transmis les erreurs \u00e0 nos fonctions de rappel peut \u00eatre trouv\u00e9 dans cet article<\/a>. Nous avons d\u00e9j\u00e0 examin\u00e9 l’une des erreurs dans les articles pr\u00e9c\u00e9dents – il s’agit de USER_CANCELED<\/strong><\/a> lorsqu’un utilisateur ferme la bo\u00eete de dialogue d’achat sans rien acheter. Faisons connaissance avec les autres.<\/p>\n\n\n\n\n\n

ERROR and DEVELOPER_ERROR<\/h2>\n\n\n\n

Commen\u00e7ons par les erreurs appel\u00e9es ERROR<\/strong><\/a> (responseCode 6) et DEVELOPER_ERROR<\/strong><\/a> (responseCode 5). Pour le premier cas, Google \u00e9crit dans la documentation \u00ab\u00a0Erreur fatale pendant l’action de l’API\u00a0\u00bb, pour le second – \u00ab\u00a0Arguments invalides fournis \u00e0 l’API\u00a0\u00bb. Par exemple, j’ai pu obtenir un DEVELOPER_ERROR lorsque j’ai pass\u00e9 une cha\u00eene vide au constructeur dans setType()<\/a> pour la requ\u00eate  querySkuDetailsAsync()<\/a>.<\/p>\n\n\n\n

Mais ce n’est pas si simple. Je suis all\u00e9 plus loin et dans la m\u00e9thode launchBillingFlow()<\/a> j’ai utilis\u00e9 le SkuDetails<\/a> modifi\u00e9 (j’ai tir\u00e9 le json du SkuDetails du produit r\u00e9el, chang\u00e9 le productID dedans et l’ai pass\u00e9 au nouveau constructeur SkuDetails). En fait, c’est un argument invalide, et je m’attendais \u00e0 obtenir un DEVELOPER_ERROR, mais … J’ai eu un ERROR.<\/p>\n\n\n\n

Il s’agissait, bien s\u00fbr, d’un exemple artificiel. Le cas o\u00f9 Google a rejet\u00e9 le paiement est beaucoup plus proche de la r\u00e9alit\u00e9. Si vous s\u00e9lectionnez \u00ab\u00a0carte de test, toujours refus\u00e9e\u00a0\u00bb dans la bo\u00eete de dialogue d’achat lorsque vous testez des achats \u00e0 partir d’une carte de test, ce dont nous vous parlerons \u00e0 la fin de l’article, le ERROR reviendra \u00e9galement, mais avec un texte appropri\u00e9.<\/p>\n\n\n\n

Dans le troisi\u00e8me article<\/a>, o\u00f9 la modification de l’abonnement \u00e9tait d\u00e9crite, nous avons augment\u00e9 le prix d’un abonnement annuel presque 3 fois pour l’un des modes de r\u00e9partition, mais nous n’avons pas dit quelle erreur aurait d\u00fb \u00eatre pr\u00e9sente si nous n’avions pas fait cela. Nous faisons amende honorable.<\/p>\n\n\n\n

Puisqu’il s’av\u00e8re que le mauvais mode de proratisation est sp\u00e9cifi\u00e9 \u00e0 cet endroit, nous devrions logiquement obtenir le m\u00eame DEVELOPER_ERROR. Au lieu de cela, nous obtenons  SERVICE_UNAVAILABLE<\/strong><\/a> (responseCode 2). Nous l’obtenons \u00e9galement si nous entrons un nombre inappropri\u00e9 comme mode de r\u00e9partition (il s’agit d’un int, pas d’un enum, personne ne nous arr\u00eatera), et si nous sp\u00e9cifions le mauvais purchaseToken. Nous examinons la documentation sur SERVICE_UNAVAILABLE et\u2026 attendez, quoi?! Nous constatons que la \u00ab\u00a0Connexion r\u00e9seau est en panne.\u00a0\u00bb.<\/p>\n\n\n\n

En m\u00eame temps, nous constatons \u00e9galement un dialogue \u00e9trange :<\/p>\n\n\n\n

\"\"<\/figure>\n\n\n\n

Une autre chose int\u00e9ressante dans le cas de ERROR est que lorsque l’on ferme le dialogue PAS par le bouton \u00ab\u00a0OK\u00a0\u00bb (c’est-\u00e0-dire par des moyens qui sont interpr\u00e9t\u00e9s comme \u00ab\u00a0retourner \u00e0\u00a0\u00bb), le ERROR vient \u00e0 onPurchasesUpdated()<\/a>, et dans le cas de SERVICE_UNAVAILABLE dans une situation similaire vient USER_CANCELED (mais si vous cliquez sur \u00ab\u00a0OK\u00a0\u00bb dans le dialogue, nous recevrons SERVICE_UNAVAILABLE, comme pr\u00e9vu).<\/p>\n\n\n\n

Et dans le cas d’une rupture de la connexion Internet, il y a effectivement SERVICE_UNAVAILABLE.<\/p>\n\n\n\n

Codes d’erreur<\/h2>\n\n\n\n

Voici d’autres codes d’erreur accompagn\u00e9s de petits commentaires, pour ainsi dire des mentions honorables.<\/p>\n\n\n\n