web-dev-qa-db-fra.com

android a échoué dans la vérification de l'achat de facturation

j'ai du mal à mettre en œuvre la facturation par application dans mon application Android . Je reçois une vérification de signature d'achat a échoué . Dans un premier temps, c'était difficile la clé base64 mais je l'ai vérifiée plusieurs fois et je suis toujours avoir l'erreur, puis après avoir jeté un coup d'oeil au fichier Security.Java et j'ai trouvé cette méthode que j'ai édité pour obtenir quelques informations sur ce qui n'allait pas:

    public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
    if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||
            TextUtils.isEmpty(signature)) {
        if(TextUtils.isEmpty(signedData)) Log.d(TAG, "SIGNED DATA EMPTY");
        if(TextUtils.isEmpty(base64PublicKey)) Log.d(TAG, "KEY IS EMPTY");
        if(TextUtils.isEmpty(signature)) Log.d(TAG, "SIGNATURE IS EMPTY");
        Log.e(TAG, "Purchase verification failed: missing data.");
        return false;
    }

    PublicKey key = Security.generatePublicKey(base64PublicKey);
    return Security.verify(key, signedData, signature);
}

Et je reçois "la signature est vide" . Même après avoir suivi les étapes ci-dessous: - Signer l'apk avec ma clé de libération - le télécharger en tant que brouillon - l'installer sur un appareil avec "adb -d install app.apk"

Je teste avec de vrais achats ... Merci.

Modifier Le flux d’achat est bon, j’obtiens l’erreur lorsque j’appelle queryInventoryAsync

23
TheRedFox

Remplacez votre méthode verifyPurchase() par la suivante. Utilisez l’ancien code indiqué ci-dessous, les développeurs Google essayant de résoudre cette erreur dans un avenir proche, mais avant de mettre à jour leur code, vous devriez préférer le code ci-dessous. 

 public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
              if (signedData == null) {
                Log.e(TAG, "data is null");
                return false;
            }

            boolean verified = false;
            if (!TextUtils.isEmpty(signature)) {
                PublicKey key = Security.generatePublicKey(base64PublicKey);
                verified = Security.verify(key, signedData, signature);
                if (!verified) {
                    Log.w(TAG, "signature does not match data.");
                    return false;
                }
            }
            return true;
        }

consultez ce lien pour plus d'informations: 

La facturation dans les applications ne fonctionne pas après la mise à jour - Google Store

Utilisez essayez de remplacer la méthode verifyPurchase() de la méthode OLD CODE dans votre projet. Mais cela ne devrait se produire que lorsque vous essayez d'acheter des produits testés. Faites-moi savoir pour l'achat de produits réels également après l'utilisation de ce code.

Modifier:

Pourquoi cela arrive car nous n'obtiendrons aucune signature si nous utilisons un produit factice tel que "Android.test.purchased". Ainsi, dans l’ancien code, cela fonctionnait bien car nous retournions la valeur true même si la signature n’était pas donnée et pour le nouveau code, nous renvoyions la valeur false.

plus d'informations sur les données de signature nulles ou vierges de link1 et link2

Je vous suggère donc de remplacer l'ancienne méthode de code verifyPurchase() au lieu de la méthode New Code.

Je pense que peut-être que New Code fonctionnera correctement pour le produit réel mais pas pour le produit factice. Mais je n'ai pas encore testé le vrai produit.

ou 

utilisez la réponse de GvS pour le test d’achat, qui constitue également la bonne solution pour le nouveau code.

J'espère que cela résoudra votre problème.

39
Maulik

Vous pouvez utiliser les SKU de test pour effectuer des tests, comme expliqué ici . Ceux-ci sont:

  • Android.test.purchased
  • Android.test.canceled
  • Android.test.refunded
  • Android.test.item_unavailable

Ces achats aboutiront (du moins sur Android.test.purchased) même dans des scénarios de test et de débogage, sans qu'il soit nécessaire d'annuler l'achat.

Dans le verifyPurchase j'ai changé return false en:

    Log.e(TAG, "Purchase verification failed: missing data.");
    if (BuildConfig.DEBUG) {
            return true;
    }
    return false;           

mais vous devez savoir utiliser ceci uniquement dans les scénarios de test.

Cela retournera true si vous avez une version de débogage et que les données de signature sont manquantes. Comme BuildConfig.DEBUG sera faux dans une version de production, cela devrait être OK. Mais il est préférable de supprimer ce code une fois que tout est débogué.

40
GvS

Assurez-vous que vous êtes connecté avec le bon utilisateur sur votre téléphone ou par exemple. Ajoutez le compte Google de votre téléphone en tant qu'utilisateur test dans la console du développeur.

http://developer.Android.com/google/play/billing/billing_testing.html#billing-testing-static :

Dans certains cas, les éléments réservés peuvent renvoyer des réponses statiques signées, ce qui vous permet de tester la vérification de la signature dans votre application. Les éléments réservés ne renvoient des réponses signées que si l'utilisateur qui exécute l'application dispose d'un compte de développeur ou d'un compte de test.

1
Till

définir la valeur de retour sur true dans 

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
    return true;
}

après avoir annulé le changement

0
Dayanand Waghmare