android在app结算购买验证失败

时间:2013-11-01 17:29:25

标签: android in-app-purchase in-app-billing billing android-billing

我无法在我的Android应用中实现应用结算。 我收到购买签名验证失败。 在第一次我很难,它是base64键,但我检查了很多次,我仍然得到错误,然后我看了一下Security.java文件,我发现这个方法,我编辑得到一些信息关于什么是错的:

    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);
}

我得到“签名是空的”。 即使我按照以下步骤操作: - 用我的释放键签名apk - 将其作为草稿加载 - 使用“adb -d install app.apk”

在设备上安装它

我正在测试真实购买。 感谢。

编辑购买流程没问题,我在拨打queryInventoryAsync时收到错误

4 个答案:

答案 0 :(得分:40)

您可以使用测试SKU进行测试as explained here。这些是:

  • android.test.purchased
  • android.test.canceled
  • android.test.refunded
  • android.test.item_unavailable

即使在测试和调试方案中,这些购买也会成功(至少是android.test.purchased),而无需取消购买。

在验证购买中,我将return false更改为:

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

但你应该知道只在测试场景中使用它。

如果您有调试版本,则返回true,并且缺少签名数据。由于BuildConfig.DEBUG在生产版本中将为false,因此应该没问题。但更好的是在调试完所有内容后删除此代码。

答案 1 :(得分:39)

将您的verifyPurchase()方法替换为以下方法。使用下面给出的旧代码,谷歌开发人员试图在不久的将来解决此错误,但在他们更新代码之前,您应该更喜欢下面的代码。

 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;
        }

查看此链接以获取更多信息:

In App billing not working after update - Google Store

使用try替换项目中的OLD CODE方法verifyPurchase()方法。但它应该只在您尝试购买测试产品时才会发生。使用此代码后,请告知我购买的实际产品。

修改

为什么会发生因为我们在使用" android.test.purchased"等虚拟产品时不会获得任何签名。所以在旧代码中,它运行良好,因为即使没有给出签名我们也返回true,而对于新代码我们返回false。

有关签名数据的更多信息null或来自link1和link2的空白

因此,我建议您只使用旧代码方法verifyPurchase()代替新代码方法。

我认为新代码可能适用于真实产品,但不适用于虚拟产品。但是我还没有测试过真正的产品。

使用GvS的答案进行测试购买它也是新代码的良好解决方案。

希望它能解决你的问题。

答案 2 :(得分:1)

确保您使用手机上的合适用户登录,或者在开发者控制台中将您的手机的Google帐户添加为测试用户。

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

  

在某些情况下,保留的项目可能会返回签名的静态响应,这使您可以在应用程序中测试签名验证。如果运行应用程序的用户具有开发人员或测试帐户,则保留项仅返回已签名的响应。

答案 3 :(得分:0)

将返回值设置为true在

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

测试后撤消更改