React-native-iap: Impossible d'obtenir la gamme de produits / abonnements

Créé le 19 août 2019  ·  31Commentaires  ·  Source: dooboolab/react-native-iap

Version de react-native-iap

3.3.9

Version de react-native

0,59,9

Plateformes sur lesquelles vous avez rencontré l'erreur (IOS ou Android ou les deux?)

iOS et Android

Comportement attendu

Je m'attends à pouvoir obtenir une gamme de produits et d'abonnements créés dans la console Play et l'Appstore.

Comportement réel

Les fonctions RNIap.getProducts et RNIap.getSubscriptions renvoient toujours des tableaux vides.

Environnement testé (émulateur? Real Device?)

Simulateur iOS, émulateur Android et appareil réel Android

Étapes pour reproduire le comportement

  1. Ajouter des produits dans Google Play Console et Apple Appstore Connect
  2. J'ai utilisé le code du dossier d'exemple
  3. J'ai changé les identifiants des produits / abonnements

J'ai attendu plus de 24 heures. J'ai également créé la version interne et alpha dans Google Play Console, mais je ne récupère toujours que des tableaux vides.

Je suppose que je ne sais pas exactement quand dois-je m'attendre à ce qu'il commence à fonctionner. Par exemple, lorsque mon déploiement de test Alpha est toujours en attente de publication dans la console Google Play, cela signifie-t-il que react-native-iap ne fonctionnera pas? Dois-je attendre la publication de l'application pour l'essayer?

Je sais également que je ne pourrai même pas faire d'achats de test sur simulateur / émulateur, mais est-ce que getProducts / getSubscriptions fonctionner sur des émulateurs ou ai-je besoin d'un appareil réel pour le tester?

const itemSkus = Platform.select({
    ios: ['product_1'],
    android: ['1', '2']
});

const itemSubs = Platform.select({
    ios: ['subscription_1'],
    android: ['subscription_1', 'subscription_2']
});

let purchaseUpdateSubscription;
let purchaseErrorSubscription;

class App extends Component {
    constructor(props) {
        super(props);

        this.state = {
            productList: [],
            receipt: '',
            availableItemsMessage: ''
        };
    }

    async componentDidMount() {
        SplashScreen.hide();
        try {
            const result = await RNIap.initConnection();
            await RNIap.consumeAllItemsAndroid();
            console.log('result', result);
        } catch (err) {
            console.warn(err.code, err.message);
        }

        purchaseUpdateSubscription = purchaseUpdatedListener(async purchase => {
            console.log('purchaseUpdatedListener', purchase);
            if (purchase.purchaseStateAndroid === 1 && !purchase.isAcknowledgedAndroid) {
                try {
                    const ackResult = await acknowledgePurchaseAndroid(purchase.purchaseToken);
                    console.log('ackResult', ackResult);
                } catch (ackErr) {
                    console.warn('ackErr', ackErr);
                }
            }
            this.setState({ receipt: purchase.transactionReceipt }, () => this.goNext());
        });

        purchaseErrorSubscription = purchaseErrorListener(error => {
            console.log('purchaseErrorListener', error);
            Alert.alert('purchase error', JSON.stringify(error));
        });
    }

    componentWillMount() {
        if (purchaseUpdateSubscription) {
            purchaseUpdateSubscription.remove();
            purchaseUpdateSubscription = null;
        }
        if (purchaseErrorSubscription) {
            purchaseErrorSubscription.remove();
            purchaseErrorSubscription = null;
        }
    }

    goNext = () => {
        Alert.alert('Receipt', this.state.receipt);
    };

    getItems = async () => {
        try {
            const products = await RNIap.getProducts(itemSkus);            
            console.log('Products', products);
            this.setState({ productList: products });
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    getSubscriptions = async () => {
        try {
            const products = await RNIap.getSubscriptions(itemSubs);
            console.log('Products', products);
            this.setState({ productList: products });
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    getAvailablePurchases = async () => {
        try {
            console.info('Get available purchases (non-consumable or unconsumed consumable)');
            const purchases = await RNIap.getAvailablePurchases();
            console.info('Available purchases :: ', purchases);
            if (purchases && purchases.length > 0) {
                this.setState({
                    availableItemsMessage: `Got ${purchases.length} items.`,
                    receipt: purchases[0].transactionReceipt
                });
            }
        } catch (err) {
            console.warn(err.code, err.message);
            Alert.alert(err.message);
        }
    };

    requestPurchase = async sku => {
        try {
            RNIap.requestPurchase(sku);
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    requestSubscription = async sku => {
        try {
            RNIap.requestSubscription(sku);
        } catch (err) {
            Alert.alert(err.message);
        }
    };

    render() {
        const { productList, receipt, availableItemsMessage } = this.state;
        const receipt100 = receipt.substring(0, 100);

        return (
            <View style={styles.container}>
                <View style={styles.header}>
                    <Text style={styles.headerTxt}>react-native-iap V3</Text>
                </View>
                <View style={styles.content}>
                    <ScrollView style={{ alignSelf: 'stretch' }}>
                        <View style={{ height: 50 }} />
                        <NativeButton
                            onPress={this.getAvailablePurchases}
                            activeOpacity={0.5}
                            style={styles.btn}
                            textStyle={styles.txt}
                        >
                            Get available purchases
                        </NativeButton>

                        <Text style={{ margin: 5, fontSize: 15, alignSelf: 'center' }}>
                            {availableItemsMessage}
                        </Text>

                        <Text style={{ margin: 5, fontSize: 9, alignSelf: 'center' }}>
                            {receipt100}
                        </Text>

                        <NativeButton
                            onPress={() => this.getItems()}
                            activeOpacity={0.5}
                            style={styles.btn}
                            textStyle={styles.txt}
                        >
                            Get Products ({productList.length})
                        </NativeButton>
                        {productList.map((product, i) => {
                            return (
                                <View
                                    key={i}
                                    style={{
                                        flexDirection: 'column'
                                    }}
                                >
                                    <Text
                                        style={{
                                            marginTop: 20,
                                            fontSize: 12,
                                            color: 'black',
                                            minHeight: 100,
                                            alignSelf: 'center',
                                            paddingHorizontal: 20
                                        }}
                                    >
                                        {JSON.stringify(product)}
                                    </Text>
                                    <NativeButton
                                        // onPress={() => this.requestPurchase(product.productId)}
                                        onPress={() => this.requestSubscription(product.productId)}
                                        // onPress={() => this.buyItem(product.productId)}
                                        // onPress={() => this.buySubscribeItem(product.productId)}
                                        activeOpacity={0.5}
                                        style={styles.btn}
                                        textStyle={styles.txt}
                                    >
                                        Request purchase for above product
                                    </NativeButton>
                                </View>
                            );
                        })}
                    </ScrollView>
                </View>
            </View>
        );
    }
}
📱 iOS 🙏 help wanted 🚶🏻 stale 🤖 android

Commentaire le plus utile

Bien sûr, après publication par Google Play Store, je confirmerai ici

MISE À JOUR

Une fois mon application publiée sur Google Play Store, les achats ont été effectués et ont fonctionné. L'approbation prend 3 jours. Merci à @jvandenaardweg

MISE À JOUR 2

react-native-iap peut fonctionner sur l'émulateur Android, si l'émulateur prend en charge Google Play Store.

Tous les 31 commentaires

Vous n'avez pas besoin de real device pour tester dans ios pour getProducts / getSubscription mais pas dans android . Pour android vous devez avoir un appareil réel pour acheter.

Pour Google, veuillez consulter mon guide pour résoudre votre problème.
Vous n'avez pas vraiment besoin de publier l'application sur Playstore pour la tester, mais vous devez télécharger l'apk signé.

J'ai aussi ce problème, j'ai déjà créé un produit sous apple et je n'arrive pas à y accéder.

const itemSkus = Platform.select({
  ios: [
    'product1'
  ],
  android: []
});

RNIap.getProducts(itemSkus).then((products) => {
      console.log(products);  //<< returns empty array
}).catch((error) => console.log(error))

Le produit prend-il du temps à se refléter dans votre expérience?

Les accords, la fiscalité et la banque sont tous actifs
"react-native-iap": "^ 3.4.0",
Et l'application intégrée est déjà à l'état "Prêt à envoyer"

@nateblog quel genre de produit avez-vous créé? Un abonnement ou autre chose?

De plus, avez-vous ajouté une localisation dans App Store Connect pour votre produit / abonnement? Si tel est le cas, essayez d'ajouter la localisation que vous avez active sur votre appareil ou simulateur. Je me souviens que j'avais eu des problèmes avec ça avant. Mon simulateur et les paramètres régionaux de mon appareil sont en anglais, je n'ai donc ajouté que la localisation "English (US)" pour mes abonnements.

@jvandenaardweg - merci pour la réponse, oui j'ai déjà ajouté la localisation car le statut de l'application ne sera pas défini sur "Prêt à soumettre" si j'ignore la localisation. J'ai défini la localisation sur «Anglais (États-Unis)» car l'appareil que j'utilise utilise l'anglais et oui, le produit est un abonnement.

METTRE À JOUR

Je m'assure déjà d'avoir activé les fonctionnalités intégrées dans l'application et rétrogradé le package à 2.4.0 mais toujours le même résultat. . Je ne parviens pas à obtenir les produits, il renvoie simplement un tableau vide.

J'ai également lié le package manuellement car d'autres messages suggéraient de ne pas utiliser le lien react-native mais toujours le même résultat. J'utilise à la fois un simulateur et un appareil réel.

Désolé, c'est réglé maintenant, le problème était l'identifiant du bundle dans mon xcode, j'utilise le mauvais identifiant de bundle, tout fonctionne maintenant

J'avais un similaire, et j'avais juste besoin de faire le processus de liaison de la bibliothèque manuellement. (ios)

J'ai le même problème, je ne charge aucun produit à partir d'Itunes Connect et je ne sais pas par où commencer à rechercher un problème. L'application utilise une ancienne version de RN: 0.43.4. J'ai essayé les versions 3.3.7 et 2.5.5 de RN-IAP. Dois-je utiliser une ancienne version de la bibliothèque parce que je suis sur une ancienne version de React-Native?

Cela semble être un problème difficile à résoudre car il n'y a pas de messages d'erreur, juste pas de données.

Désolé, c'est réglé maintenant, le problème était l'identifiant du bundle dans mon xcode, j'utilise le mauvais identifiant de bundle, tout fonctionne maintenant

Hé, @nateblog! Je suis confronté à un problème similaire: je reçois des tableaux vides pour les produits et les abonnements et j'ai créé 2 éléments d'abonnement dans App Store Connect. Pourriez-vous s'il vous plaît expliquer ce qui n'allait pas avec votre identifiant de bundle? Je ne pense pas que je soumette les bons SKU d'article, car je n'ai trouvé aucune référence sur la façon dont ils sont construits ou ce qu'ils sont - s'agit-il de [Bundle Identifier]. [ProductId of the purchase item] ou simplement [ProductId de l'article acheté]?

De plus, j'aimerais ajouter que j'ai des identificateurs de bundle légèrement différents pour mes schémas de version et de débogage:

  • Libération - 'domain.appName';
  • Débogage - 'domain.appName.dev';
    Les articles d'achat in-app que j'ai créés sont liés à la version de production (c.-à-d. La version finale) de l'application. Cela signifie-t-il que je n'ai pas pu accéder à ces éléments à partir de la version de développement de l'application?

Tout avis serait grandement apprécié.

J'avais un similaire, et j'avais juste besoin de faire le processus de liaison de la bibliothèque manuellement. (ios)

Tu as sauvé ma journée!

J'ai intégré le react-native-iap et téléchargé mon apk signé vers la version bêta sur le Play Store et également ajouté un plan d'abonnement. J'essaie d'obtenir la liste des abonnements par ID d'abonnement en mode débogage qui renvoie toujours un tableau vide. Puis-je réellement tester l'abonnement en mode débogage?

@ShridharCodewave Je suis confronté au même problème. s'il vous plaît laissez-moi savoir si vous pouvez résoudre le problème :(

react-native-iap: 3.3.2

Je suis confronté au même problème sur l'émulateur Android. J'ai téléchargé un apk sur Google Play Store sur la chaîne bêta et ajouté des produits.

image

Tout d'abord, connexion init puis j'essaie de récupérer des produits mais rien ne s'affiche sur console.warn
Aucun résultat ici
Aucune erreur ici

@ismetsezer l'ensemble de la facturation In App pour Android ne fonctionnera pas dans l'émulateur:

Vous ne pouvez pas utiliser l'émulateur pour tester la facturation Google Play. vous devez installer votre application sur un appareil pour tester la facturation Google Play.
https://developer.android.com/google/play/billing/billing_testing

Vous avez besoin d'un véritable appareil pour cela.

Dans iOS, vous pouvez récupérer les données d'abonnement dans le simulateur. Mais vous ne pouvez pas l'acheter, pour cela vous avez également besoin d'un vrai appareil.

Pour les autres commentaires ci-dessus: assurez-vous également que les versionName et versionCode dans android/app/build.gradle sont identiques ou supérieurs à ceux téléchargés dans Google Play Console.

Vous avez également besoin d'une application validée active dans une piste hors production, en raison de la nouvelle politique de révision d'Android:

Auparavant, vous pouviez tester une application en téléversant une version "brouillon" non publiée. Cette fonctionnalité n'est plus prise en charge. Au lieu de cela, vous devez publier votre application sur la piste de test fermée ou ouverte. Pour plus d'informations, consultez Les brouillons d'applications ne sont plus pris en charge.
https://developer.android.com/google/play/billing/billing_testing

"Publier" dans une piste de test fermée / ouverte signifie qu'il doit passer par le nouveau processus d'examen de Google Play. Ce qui pourrait prendre quelques jours pour les nouvelles applications et quelques heures seulement pour les applications existantes.

Je ne connais pas les étapes exactes que j'ai faites, mais pour moi, cela fonctionne localement avec un appareil Android. Ce n'est donc probablement pas un problème de package react-native-iap, mais plutôt une question de configuration.

Si quelqu'un peut confirmer ce qui précède, il serait peut-être bon de mettre à jour le README à propos de ce changement. Comme c'est quelque chose de nouveau depuis le mois dernier.

Merci @jvandenaardweg quand je suis passé à un appareil réel, Oui, cela fonctionne et la connexion est réussie, mais comme vous l'avez dit et selon le lien, je dois attendre que l'application de test soit publiée sur Beta Channel car la gamme de produits est vide

C'est bon d'entendre @ismetsezer . Pouvez-vous confirmer si cela commence à fonctionner pour vous avec une application de test révisée / publiée? Parce qu'alors nous pouvons mettre à jour le readme avec ces nouvelles informations :-)

Bien sûr, après publication par Google Play Store, je confirmerai ici

MISE À JOUR

Une fois mon application publiée sur Google Play Store, les achats ont été effectués et ont fonctionné. L'approbation prend 3 jours. Merci à @jvandenaardweg

MISE À JOUR 2

react-native-iap peut fonctionner sur l'émulateur Android, si l'émulateur prend en charge Google Play Store.

@kesepara J'ai dû attendre quelques heures après avoir ajouté le nouveau plan d'abonnement sur le Play Store pour qu'il apparaisse sur l'appareil.

Salut @ismetsezer et @kesepara ,
J'apprécierais vraiment votre contribution sur votre flux de développement car quelque chose n'est toujours pas clair pour moi.
J'ai configuré RN IAP pour iOS et cela fonctionne bien maintenant.
Je commence maintenant à faire la partie Android, et j'ai trouvé ici que nous devons utiliser l'APK signé téléchargé sur la piste fermée (au moins) pour pouvoir tester les fonctionnalités de paiement.
Mais dans vos commentaires, vous dites que vous avez pu le tester sur l'émulateur Android, est-ce exact?
De plus, si nous devons utiliser un APK signé sur la boutique, comment pouvons-nous déboguer?
Votre aide serait très appréciée.

Salut @beeremy merci pour vos bonnes opinions. Vous devez tester iap sur un appareil réel ou un émulateur prenant en charge Google Play pour récupérer des produits. IAP a fonctionné après la publication de l'application sur Google Play Store, cela pourrait changer, mais au moins vous devez télécharger ou donner un brouillon sur le magasin pour tester cette fonctionnalité. Mais cela prend 2 à 3 heures pour travailler.

Salut @ismetsezer , merci pour vos commentaires.

Pour quiconque cela peut être utile, j'ai pu faire une configuration de débogage en cours d'exécution après avoir suivi cette recommandation: https://stackoverflow.com/questions/36113347/is-it-possible-to-debug-locally-google-plays -en-application-facturation-dans-android-studio

Je peux confirmer en tant que @ismetsezer que les abonnements et les produits fonctionneront sous Android après la publication de l'application dans la console Google Play. Essayer d'obtenir des abonnements / produits lorsque l'application n'est pas encore publiée ne fonctionnera pas pour Android.

Sur iOS, les abonnements et les produits fonctionnent sans que l'application soit publié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 résolu si aucune autre activité ne se produit. Vous pouvez également étiqueter ce problème comme "Pour discussion" ou "Bon premier numéro" et je le laisserai ouvert. Merci pour vos contributions.

RN 0.59.1 sur Android dev ici et j'utilise la version 4.4.1 iap

Ma version est actuellement sur la piste Alpha. Ensuite , j'ai reconstruit comme d'habitude sur ma machine en mode débogage, dans Platform.select ({}) j'ai spécifié l'ID d'abonnement tel qu'il est sur la Play Console, et j'ai appelé getSubscriptions () mais je reçois un tableau vide. Est-ce parce que c'est en Alpha? Des idées?

@edgaralienfoe avez-vous activé votre abonnement dans la console Google Play?

@acostalima il devrait être activé. J'ai supposé que cela prend peut-être quelques jours, mais toujours pas de chance.

@edgaralienfoe Je demande parce que je me souviens qu'il existe une option pour activer explicitement un abonnement sur Google Play Console et, s'il n'est pas actif, l'abonnement n'apparaîtra pas dans votre application. Mais, si vous le dites, il pourrait y avoir un autre problème alors.

@edgaralienfoe Avez-vous trouvé la solution? Peut-être que la version de votre application doit être supérieure à celle de la piste Alpha

@edgaralienfoe Avez-vous trouvé la solution? Peut-être que la version de votre application doit être supérieure à celle de la piste Alpha

La piste Alpha fonctionne très bien. Je teste les IAP depuis un certain temps maintenant avec des versions déployées sur Alpha sans problèmes. La piste interne, en revanche, ne fonctionne pas.

Pour tous ceux qui pourraient rencontrer des problèmes ici, ce qui a fonctionné sur iOS pour moi a été de lier le projet manuellement comme suggéré par @ Kuhne1 - cela a fonctionné après le nettoyage du dossier de construction et l'installation manuelle des

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 résolu si aucune autre activité ne se produit. Vous pouvez également étiqueter ce problème comme "Pour discussion" ou "Bon premier numéro" et je le laisserai ouvert. Merci pour vos contributions.

Clôture de ce numéro après une période d'inactivité prolongée. Si ce problème est toujours présent dans la dernière version, n'hésitez pas à créer un nouveau problème avec des informations à jour.

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