java - Android 计费 - 在 production/alpha/beta 中使用 android.test.purchased 测试购买

标签 java android testing in-app-purchase in-app-billing

我正在使用 Google Play 计费 API (v3),并且正在使用 sku=android.test.purchased 测试应用内购买。为此,我修改了辅助类中的方法 Security.verifyPurchase,如下所示:

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature, String sku) {
    if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) || TextUtils.isEmpty(signature)) {
        Log.e(TAG, "Purchase verification failed: missing data.");
        if ("android.test.purchased".equals(sku) || BuildConfig.DEBUG) {
            Log.e(TAG, "This was a test purchase");
            return true;
        }
        return false;
    }

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

我的代码与我发现的教程中的代码略有不同:我添加了这个:

"android.test.purchased".equals(sku)

最初,只添加了BuildConfig.DEBUG的验证,但我需要让测试用户能够快速购买产品,而无需添加他们的支付数据。

我的问题是:如果我在我的生产应用程序中使用此代码(或者它只适用于 alpha/beta 版),是否会存在很大的安全问题?

最佳答案

这个修改对于生产版本肯定是不行的,因为它禁用了响应验证。如果攻击者没有提供 base64PublicKeysignedDatasignature 和您在代码中的测试 sku,那么您的应用程序将允许在生产中使用应用程序内功能而无需实际付费。

如果在 DEBUG 版本中您想要允许所有 sku 的,只需删除您的检查。如果您只想允许您的 sku,请使用 && 运算符或以下代码。

if (BuildConfig.DEBUG) {
    Log.e(TAG, "This was a test purchase");
    return "android.test.purchased".equals(sku);
}

关于java - Android 计费 - 在 production/alpha/beta 中使用 android.test.purchased 测试购买,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076543/

相关文章:

java - Spring,Tomcat 试图在 server.xml 中设置上下文 URL 路径,但它不起作用

android - android默认情况下如何更改listview中某些项目的颜色?

java - Cordova - Android 上的 XHR 请求在模拟器中工作,但在手机上不工作

java - Google Admob 关于空对象引用

java - 数据相关测试

unit-testing - 如何测试 GWT/GWTP 项目?

java - maven-javadoc-plugin 生成的库 javadoc 在 Eclipse 上链接时不起作用

java - Spring - 使用注释设置属性值而不使用属性文件