React-native-iap: RNIap ne fonctionne pas sur Android mais fonctionne sur iOS avec le même code

Créé le 7 juil. 2020  ·  33Commentaires  ·  Source: dooboolab/react-native-iap

Version de react-native-iap
4.4.7

Version de react-native
0.60.6

Les plates-formes sur lesquelles vous avez rencontré l'erreur (IOS ou Android ou les deux ?)
Android

Comportement prévisible

     async componentDidMount() {
        try {
            const result = await RNIap.initConnection();
            await RNIap.consumeAllItemsAndroid();
            console.log('result', result);
            const products: Product[] = await RNIap.getProducts(itemSkus);
            this.setState({ products }, () => {console.log(this.state.products)});
        } catch (err) {
            console.warn(err.code, err.message);
        }

Le comportement attendu est une liste de produits extraits de la console de jeu par .getProducts() imprimée dans le terminal

Comportement réel
La promesse n'est pas retournée. Erreur « la facturation n'est pas disponible »

Environnement testé (émulateur ? appareil réel ?)
Appareil réel (l'application est actuellement en production)

Étapes pour reproduire le comportement
const itemSkus = Platform.select({ ios: [ 'com.example.1' ], android: [ 'com.example.1' ] });

     async componentDidMount() {
        try {
            const result = await RNIap.initConnection();
            await RNIap.consumeAllItemsAndroid();
            console.log('result', result);
            const products: Product[] = await RNIap.getProducts(itemSkus);
            this.setState({ products }, () => {console.log(this.state.products)});
        } catch (err) {
            console.warn(err.code, err.message);
        }
    this.purchaseUpdateSubscription = purchaseUpdatedListener(async (purchase: InAppPurchase | SubscriptionPurchase | ProductPurchase) => {
        console.log('purchaseUpdatedListener', purchase);
        const receipt = purchase.transactionReceipt;
        if (receipt) {
            try {
                // if (Platform.OS === 'ios') {
                //   finishTransactionIOS(purchase.transactionId);
                // } else if (Platform.OS === 'android') {
                //   // If consumable (can be purchased again)
                //   consumePurchaseAndroid(purchase.purchaseToken);
                //   // If not consumable
                //   acknowledgePurchaseAndroid(purchase.purchaseToken);
                // }
                const ackResult = await finishTransaction(purchase);
            } catch (ackErr) {
                console.warn('ackErr', ackErr);
            }

            this.setState({ receipt }, () => this.goNext());
        }
    },
    );

    this.purchaseErrorSubscription = purchaseErrorListener(
        (error: PurchaseError) => {
            console.log('purchaseErrorListener', error);
        },
    );
}
componentWillUnmount() {
    if (this.purchaseUpdateSubscription) {
        this.purchaseUpdateSubscription.remove();
        this.purchaseUpdateSubscription = null;
    }
    if (this.purchaseErrorSubscription) {
        this.purchaseErrorSubscription.remove();
        this.purchaseErrorSubscription = null;
    }
}

Je n'arrive pas à comprendre pourquoi. J'utilise ce code exact pour iOS et il fonctionne parfaitement. J'ai configuré tous les produits dans la console de jeu, ajouté l'autorisation de facturation au fichier manifeste et lié le package IAP (j'utilise AndroidX, le package est donc automatiquement lié). Je suis connecté au Play Store et j'ai la dernière version du Play Store, mais initConnection() ne fonctionne toujours pas. Je ne sais pas quoi faire d'autre. Toute aide est grandement appréciée! Merci pour la lecture.

🙏 help wanted 🤖 android

Tous les 33 commentaires

Est- ce que

Est- ce que

Malheureusement, cela n'a pas aidé :(. Cela aurait-il quelque chose à voir avec la migration AndroidX ? Pour une raison quelconque, initConnection() ne fonctionne pas et je ne sais pas pourquoi.

@damialahogun Avez-vous découvert ce qui n'allait pas ? J'ai exactement la même erreur et je ne comprends pas d'où cela vient... initConnection() n'est pas défini.

@hyochan Vous avez une idée ?

@damialahogun Avez-vous découvert ce qui n'allait pas ? J'ai exactement la même erreur et je ne comprends pas d'où cela vient... initConnection() n'est pas défini.

Hé, non je n'ai pas encore compris :(

Avez-vous ajouté <uses-permission android:name="com.android.vending.BILLING" /> à votre fichier AndroidManifest.xml ?

@hakkikonu Oui j'ai

Dans mon journal d'erreurs, je peux voir la même erreur se produire pour une petite partie de mes utilisateurs dans plusieurs pays comme les États-Unis et la Nouvelle-Zélande. Cela semble se produire de manière très incohérente. Avez-vous une idée de ce que cela peut être causé?

@joris1995 J'ai également ce problème, une petite partie des utilisateurs ne peut pas effectuer d'achats dans l'application, l'erreur est "Le sku n'a pas été trouvé. Veuillez d'abord récupérer les produits en appelant getItems", mais le sku est présent car dans la fenêtre contextuelle d'achat, je afficher le prix de l'objet pris de getProducts, getItems n'est même pas dans l'API

est la dernière version de votre application Google Play Store ? Ce problème ne se produit-il que sur votre téléphone ou sur tous les utilisateurs.

pouvez-vous également essayer de vous connecter à Google Play Store avec un compte Gmail différent.

assurez-vous de nettoyer vos services google play et les fichiers de cache de l'application google play store à partir des paramètres / applications / google play sur votre appareil.

Tous les utilisateurs/comptes/téléphones...

Pour moi, ce n'est qu'une partie de mes utilisateurs. Il ne semble pas y avoir de facteur cohérent comme le pays, la version du système d'exploitation ou le fabricant de l'appareil. Dans BugSnag, il affiche l'erreur 'La facturation n'est pas disponible. Cela peut être un problème avec votre appareil, ou le Play Store peut être en panne ». Par quoi cela peut-il être causé ?

Vous devez soumettre une version bêta avant de pouvoir charger les achats intégrés et vous ne pouvez la déboguer qu'à l'aide d'une version de version.

bêta n'est pas un must. aussi l'alpha fermé est ok

J'ai aussi le même problème, j'ai même soumis une version bêta et j'ai été approuvé il y a 4 jours

Si je comprends ce que vous dites, c'est que initConnection() ne fonctionne pas en test mais en bêta ?

@Kamsou Oui, bien que ce soit principalement "getProducts()" qui ne fonctionne pas dans une version de débogage.

Plus d'informations : https://medium.com/bleeding-edge/testing-in-app-purchases-on-android-a6de74f78878

Ce qui se passe avec moi c'est que, c'est que quand je veux voir si l'achat a été fait, je fais :
RNIap.getPurchaseHistory()
Sur iOS, tout fonctionne normalement.
Mais sur Android, j'ai cette erreur : "Erreur : E_IAP_NOT_AVAILABLE"
_Je suis sur mon émulateur local_

``` const initilizeIAPConnection = async () => { await initConnection() .then(async (connection) => { consumeAllItemsAndroid(); await getItems(); console.log('IAP result', connection); }) .catch((error) => { console.warn( ERREUR IAP ${error.code}`, error.message);
});
} ;

const getItems = async () => {
essayer {
const subscriptions = wait getSubscriptions(itemSkus);
console.log('Produits', abonnements);
setAbonnements(abonnements);
} attraper (err) {
console.warn(err.code, err.message);
}
} ;
useEffect(() => {
initilizeIAPConnection();
}, []);

``` I just removed await for consumerAllItemsAndroid(); ` et il a commencé à fonctionner

@rizshivalli Heureux d'apprendre que cela fonctionne pour vous. Malheureusement, cela ne fonctionne toujours pas pour moi lorsque je supprime wait for consumeAllItemsAndroid() . Mon problème est que initConnection() ne fonctionne pas. Comment pouvez-vous faire fonctionner cette partie?

@damialajogun J'ai supprimé try catch et ajouté .then et .catch

@rizshivalli J'ai essayé cela et cela ne fonctionne toujours pas pour moi :(. Désolé pour toutes les questions, mais êtes-vous capable de voir les "produits" d'en bas imprimés dans le terminal? Je pense que le problème avec le mien est qu'il ne tire pas tous mes produits configurés dans la console de jeu même si je les ai configurés et qu'ils sont actifs.
const getItems = async () => { try { const subscriptions = await getSubscriptions(itemSkus); console.log('Products', subscriptions);

@damialahogun Oui, cela fonctionne. Je peux également tester les paiements sur Android. Avez-vous publié la version alpha ou bêta sur Android ?

@rizshivalli Pas alpha ou bêta mais je l'ai sorti en production donc il est en direct dans le Play Store. Je pense que tant que c'est sur un vrai appareil (pas un émulateur) ça devrait fonctionner, malheureusement ce n'est pas pour moi...

Bonjour @rizshivalli, question rapide : votre application est-elle répertoriée comme gratuite ou payante sur Google Play ? Le mien est gratuit mais avec des achats intégrés (les utilisateurs peuvent télécharger l'application gratuitement et choisir d'acheter des non-consommables dans l'application) mais maintenant je me demande s'il doit être répertorié comme payant pour que l'IAP fonctionne ?

@damialajogun il est répertorié comme gratuit car les utilisateurs n'ont pas besoin de payer pour installer l'application

Bonjour, tout le monde,
L'un d'entre vous a-t-il son application Android qui fonctionne bien avec le paiement ?
Parce qu'avec moi, l'initConnection ne fonctionne pas.

Je le fais, en utilisant la dernière version. Je ne pense pas que initConnection fasse quoi que ce soit en fait, il démarre simplement la connexion, puis vous devez récupérer les produits

Une solution pour cela ?
Pour moi, Android plante avant de lancer l'application. Mais Ios fonctionne comme prévu.
S'il vous plaît aider

Je rencontre (probablement) le même problème.

J'ai ajouté deux autres abonnements à mon application, mais seul l'ancien fonctionne.
Lorsque j'essaie d'attendre RNIap.getSubscriptions(), j'obtiens "google indique que nous avons un problème de connexion au paiement"

Lorsque j'essaie de RNIap.requestSubscription(subId, true), j'obtiens "Le sku n'a pas été trouvé".

Les Skus sont enregistrés dans Google Play et les identifiants sont corrects, vérifiez cela. Testé sur un émulateur et un appareil réel, en utilisant les modes de débogage et de publication.

Une idée?

Salut, il semble qu'il n'y ait eu aucune activité sur ce problème récemment. Le problème a-t-il été résolu ou nécessite-t-il toujours l'attention de la communauté ? Ce problème peut être fermé si aucune autre activité ne se produit. Vous pouvez également étiqueter ce numéro comme « Pour discussion » ou « Bon premier numéro » et je le laisserai ouvert. Merci pour vos contributions.

Salut, il semble qu'il n'y ait eu aucune activité sur ce problème récemment. Le problème a-t-il été résolu ou nécessite-t-il toujours l'attention de la communauté ? Ce problème peut être fermé si aucune autre activité ne se produit. Vous pouvez également étiqueter ce numéro comme « Pour discussion » ou « Bon premier numéro » et je le laisserai ouvert. Merci pour vos contributions.

demande encore de l'attention

On peut fermer !

Le sam. 19 déc. 2020 à 11:03, damialajogun [email protected] a
écrit :

Salut, il semble qu'il n'y ait eu aucune activité sur ce problème
récemment. Le problème a-t-il été résolu ou nécessite-t-il toujours le
l'attention de la communauté ? Ce problème peut être fermé si aucune autre activité
se produit. Vous pouvez également étiqueter ce problème comme « Pour discussion » ou « Bon d'abord
problème" et je le laisserai ouvert. Merci pour vos contributions.

demande encore de l'attention

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/dooboolab/react-native-iap/issues/1040#issuecomment-748451922 ,
ou se désinscrire
https://github.com/notifications/unsubscribe-auth/AJ2B2AUIRMGWIHZSFYL6SWTSVR3AXANCNFSM4OSLGZSQ
.

Cette page vous a été utile?
0 / 5 - 0 notes