Gérer les erreurs dans le SDK Flutter
Chaque erreur retournée par le SDK est un AdaptyErrorCode. Voici un exemple :
Activez les logs verbeux avant de déboguer. La plupart des AdaptyError encapsulent une erreur sous-jacente de StoreKit, Play Billing, réseau ou backend. Avec les logs verbeux activés (await Adapty().setLogLevel(AdaptyLogLevel.verbose) — voir Logging), cette erreur encapsulée s’affiche dans la console, ce qui révèle généralement la cause réelle.
Si ces solutions ne résolvent pas votre problème, consultez Autres problèmes pour connaître les étapes à suivre avant de contacter le support, afin de nous aider à vous assister plus efficacement.
try {
final result = await adapty.makePurchase(product: product);
} on AdaptyError catch (adaptyError) {
if (adaptyError.code == AdaptyErrorCode.paymentCancelled) {
// Cancelled
}
} catch (e) {
}
Codes StoreKit système
| Erreur | Code | Solution |
|---|---|---|
| unknown | 0 | Code d’erreur indiquant qu’une erreur inconnue ou inattendue s’est produite. Réessayez ou consultez la section Autres problèmes. |
| clientInvalid | 1 | Ce code d’erreur indique que le client n’est pas autorisé à effectuer l’action demandée. |
| paymentCancelled | 2 | Ce code d’erreur indique que l’utilisateur a annulé une demande de paiement. Aucune action n’est requise, mais d’un point de vue logique métier, vous pouvez proposer une remise à votre utilisateur ou lui rappeler l’offre ultérieurement. |
| paymentInvalid | 3 | Cette erreur indique que l’un des paramètres de paiement n’a pas été reconnu par l’App Store. |
| paymentNotAllowed | 4 | Ce code d’erreur indique que l’utilisateur n’est pas autorisé à valider des paiements. |
| storeProductNotAvailable | 5 | Ce code d’erreur indique que le produit demandé n’est pas disponible dans le store. Essayez de réinstaller l’application. |
| cloudServicePermissionDenied | 6 | Ce code d’erreur indique que l’utilisateur n’a pas autorisé l’accès aux informations du service Cloud. |
| cloudServiceNetworkConnectionFailed | 7 | Ce code d’erreur indique que l’appareil n’a pas pu se connecter au réseau. |
| cloudServiceRevoked | 8 | Ce code d’erreur indique que l’utilisateur a révoqué l’autorisation d’utiliser ce service Cloud. |
| privacyAcknowledgementRequired | 9 | Ce code d’erreur indique que l’utilisateur n’a pas encore accepté la politique de confidentialité d’Apple. |
| unauthorizedRequestData | 10 | Ce code d’erreur indique que l’application tente d’utiliser une propriété pour laquelle elle ne dispose pas des droits requis. |
| invalidOfferIdentifier | 11 | L’ Assurez-vous de configurer les offres souhaitées dans AppStore Connect et de transmettre un identifiant d’offre valide. |
| invalidSignature | 12 | Ce code d’erreur indique que la signature d’une remise sur paiement n’est pas valide. |
| missingOfferParams | 13 | Ce code d’erreur indique que des paramètres sont manquants dans une remise sur paiement. |
| invalidOfferPrice | 14 | Ce code d’erreur indique que le prix que vous avez spécifié dans App Store Connect n’est plus valide. Les offres doivent toujours correspondre à un prix réduit. |
Codes Android personnalisés
| Erreur | Code | Solution |
|---|---|---|
| adaptyNotInitialized | 20 | Vous devez configurer le SDK Adapty correctement via la méthode Adapty.activate. Découvrez comment procéder pour Flutter. |
| productNotFound | 22 | Cette erreur indique que le produit demandé pour l’achat n’est pas disponible dans le store. |
| invalidJson | 23 | Le JSON du paywall n’est pas valide. Corrigez-le dans l’Adapty Dashboard. Consultez la rubrique Personnaliser le paywall avec Remote Config pour savoir comment le corriger. |
| currentSubscriptionToUpdateNotFoundInHistory | 24 | L’abonnement d’origine à renouveler est introuvable. |
| pendingPurchase | 25 | Cette erreur indique que l’achat est en attente plutôt que confirmé. Consultez la page Gestion des transactions en attente dans la documentation Android Developer pour plus de détails. |
| billingServiceTimeout | 97 | Cette erreur indique que la requête a atteint le délai d’expiration maximum avant que Google Play puisse répondre. Cela peut être causé, par exemple, par un délai dans l’exécution de l’action demandée par l’appel à la bibliothèque Play Billing. |
| featureNotSupported | 98 | La fonctionnalité demandée n’est pas prise en charge par le Play Store sur cet appareil. |
| billingServiceDisconnected | 99 | Cette erreur fatale indique que la connexion de l’application cliente au service Google Play Store via le BillingClient a été interrompue. |
| billingServiceUnavailable | 102 | Cette erreur temporaire indique que le service Google Play Billing est actuellement indisponible. Dans la plupart des cas, cela signifie qu’il y a un problème de connexion réseau entre l’appareil client et les services Google Play Billing. |
| billingUnavailable | 103 | Cette erreur indique qu’une erreur de facturation utilisateur s’est produite lors du processus d’achat. Voici quelques cas où cela peut survenir : 1. L’application Play Store sur l’appareil de l’utilisateur est obsolète. 2. L’utilisateur se trouve dans un pays non pris en charge. 3. L’utilisateur est un utilisateur d’entreprise dont l’administrateur a désactivé les achats. 4. Google Play ne peut pas débiter le moyen de paiement de l’utilisateur. Par exemple, la carte bancaire de l’utilisateur a peut-être expiré. 5. L’utilisateur n’est pas connecté à l’application Play Store. |
| developerError | 105 | Il s’agit d’une erreur fatale indiquant que vous utilisez une API de manière incorrecte. |
| billingError | 106 | Il s’agit d’une erreur fatale indiquant un problème interne à Google Play. |
| itemAlreadyOwned | 107 | Le produit consommable a déjà été acheté. |
| itemNotOwned | 108 | Cette erreur indique que l’action demandée sur l’article a échoué car l’utilisateur ne le possède pas. |
Codes StoreKit personnalisés
| Erreur | Code | Solution |
|---|---|---|
| noProductIDsFound | 1000 | Cette erreur indique qu’aucun des produits que vous avez demandés sur le paywall n’est disponible à l’achat dans l’App Store, même s’ils y sont répertoriés. Elle peut parfois s’accompagner d’un avertissement Si vous rencontrez cette erreur, suivez les étapes de la section Correction de l’erreur Code-1000 |
| productRequestFailed | 1002 | Impossible de récupérer les produits disponibles pour le moment. |
| cantMakePayments | 1003 | Les achats intégrés ne sont pas autorisés sur cet appareil. Consultez le guide de dépannage. |
| noPurchasesToRestore | 1004 | Obsolète depuis Adapty Flutter SDK 4.0.4 : restorePurchases() ne renvoie plus cette erreur. Lorsqu’il n’y a rien à restaurer, la méthode se termine avec succès en retournant le profil actuel — vérifiez le statut du niveau d’accès dans celui-ci. Dans les versions antérieures du SDK, cette erreur indique que Google Play n’a pas trouvé l’achat à restaurer. |
| cantReadReceipt | 1005 | Aucun reçu valide n’est disponible sur l’appareil. Cela peut poser problème lors des tests en sandbox. En sandbox, vous n’aurez pas de fichier de reçu valide tant que vous n’aurez pas effectué un achat — assurez-vous d’en faire un avant d’y accéder. Lors des tests en sandbox, vérifiez également que vous êtes connecté sur l’appareil avec un compte Apple sandbox valide. |
| productPurchaseFailed | 1006 | L’achat du produit a échoué. Cette erreur encapsule une erreur StoreKit sous-jacente — lisez l’erreur encapsulée (ou activez les logs détaillés pour la voir dans la console) pour connaître la raison réelle. L’erreur encapsulée est généralement l’un des codes StoreKit 0 à 14 du tableau ci-dessus — le plus souvent paymentCancelled, paymentInvalid, paymentNotAllowed ou invalidOfferPrice. Si vous ne parvenez pas à identifier une raison précise, essayez un nouveau profil sandbox ; si l’échec persiste, contactez le support Apple. |
| refreshReceiptFailed | 1010 | Cette erreur indique que le reçu n’a pas été reçu. Applicable à StoreKit 1 uniquement. |
| receiveRestoredTransactionsFailed | 1011 | La restauration des achats a échoué. |
Codes réseau personnalisés
| Erreur | Code | Solution |
|---|---|---|
| notActivated | 2002 | Le SDK Adapty n’est pas activé. Apparaît le plus souvent quand un écran de démarrage ou un hook d’interface appelé tôt invoque des méthodes Adapty avant que Adapty().activate ne se termine. Le symptôme est intermittent et peut ne pas se reproduire dans l’émulateur car le timing sur un vrai appareil est différent. Attendez (await) le Future activate avant de planifier tout autre appel au SDK. Voir Ordre des appels dans le SDK Flutter pour la séquence complète. |
| badRequest | 2003 | Requête invalide. Assurez-vous d’avoir bien suivi toutes les étapes nécessaires à l’intégration avec l’App Store. |
| serverError | 2004 | Erreur serveur. Réessayez après quelques instants. Si le problème persiste, contactez l’équipe support d’Adapty. |
| networkFailed | 2005 | Cette erreur indique des problèmes de connexion réseau sur l’appareil de l’utilisateur. Essayez de désactiver le VPN ou de passer du réseau cellulaire au Wi-Fi, ou inversement. |
| decodingFailed | 2006 | Cette erreur indique que le décodage de la réponse a échoué. Vérifiez votre code et assurez-vous que les paramètres envoyés sont valides. Par exemple, cette erreur peut indiquer que vous utilisez une clé API invalide. |
| encodingFailed | 2009 | Cette erreur indique que l’encodage de la requête a échoué. |
| analyticsDisabled | 3000 | Les événements d’analyse ne peuvent pas être traités, car vous avez désactivé cette option. |
| wrongParam | 3001 | Cette erreur indique que certains de vos paramètres sont incorrects. Si vous utilisez le Paywall Builder d’Adapty et ne pouvez pas afficher un paywall à cause de cette erreur, activez Show on device dans le Paywall Builder. Une autre cause possible est que la version du fichier paywall de secours local ne correspond pas à la version du SDK. Téléchargez un nouveau fichier depuis le tableau de bord. |
| activateOnceError | 3005 | Il n’est pas possible d’appeler la méthode .activate plus d’une fois. |
| profileWasChanged | 3006 | Le profil utilisateur a été modifié pendant l’opération. Cela se produit quand une méthode est appelée pendant qu’ Adapty().identify est encore en cours — l’appel en vol atterrit sur un profil sur le point d’être remplacé, et le SDK le rejette. Toujours attendre (await) identify avant tout appel déclenché par une action utilisateur. Voir Ordre des appels dans le SDK Flutter. |
| unsupportedData | 3007 | Cette erreur indique que le format de données n’est pas pris en charge par le SDK. |
| fetchTimeoutError | 3101 | Cette erreur indique que l’opération de récupération a expiré. |
Codes d’interface personnalisée et de plugin
| Erreur | Code | Solution |
|---|---|---|
| jsException | 4105 | Une exception a été levée depuis JavaScript pendant l’exécution d’un paywall ou d’un onboarding créé dans le builder. Activez la journalisation verbose pour voir l’erreur JavaScript sous-jacente. |
| operationInterrupted | 9000 | Cette opération a été interrompue par le système. Réessayez l’appel. |
| emptyResult | 10001 | Le plugin Flutter a reçu un résultat vide du SDK natif. Réessayez l’appel, puis consultez la section Autres problèmes. |
| internalPluginError | 10002 | Une erreur interne s’est produite dans le plugin Flutter. Consultez la section Autres problèmes. |
Autres problèmes
Si vous n’avez pas encore trouvé de solution, voici quelques pistes supplémentaires :
- Mettre à jour le SDK vers la dernière version : nous recommandons toujours de passer à la dernière version du SDK, car elle est plus stable et inclut des correctifs pour les problèmes connus.
- Contacter l’équipe de support ou obtenir de l’aide auprès d’autres développeurs sur le forum de support.
- Contacter l’équipe de support via support@adapty.io ou via le chat : si vous n’êtes pas prêt à mettre à jour le SDK ou que cela n’a pas résolu le problème, contactez notre équipe de support. Notez que votre problème sera résolu plus rapidement si vous activez la journalisation verbose et partagez les logs avec l’équipe. Vous pouvez également joindre des extraits de code pertinents.