3

我找不到使用谷歌测试产品 ID 测试InApp 订阅的方法,即private final String productID = "android.test.purchased"; // Test Product ID by Google

文档中没有写到无法用测试产品测试 InAPP 订阅的任何地方,也没有在任何地方提到如何测试 InApp 订阅。

我已经按照文档(InAppV3)实现了我的代码。

医生说:

实施订阅:启动订阅的购买流程类似于启动产品的购买流程,但产品类型必须设置为“订阅”。购买结果将传递给您的 Activity 的 onActivityResult 方法,与应用内商品的情况完全相同。

而且我也正确实施了这一点。

如果我将“inapp”替换为“subs” ,我的应用程序就可以正常工作,即它适用于产品而不是订阅。

当我将“inapp”更改为“subs”时,购买将返回:

09-24 14:01:12.943: I/(16929): isBillingSupported() - success : return 0
09-24 14:01:12.943: D/Finsky(2598): [281] InAppBillingUtils.getPreferredAccount: com.kgandroid.inappsubscriptiondemo: Account from first account - [MOn42QuZgF98vxJi0p3wAN3rfzQ]
09-24 14:01:12.943: I/(16929): getPurchases() - success return Bundle
09-24 14:01:12.943: I/(16929): getPurchases() - "RESPONSE_CODE" return 0
09-24 14:01:12.943: I/(16929): getPurchases() - "INAPP_PURCHASE_ITEM_LIST" return []
09-24 14:01:12.943: I/(16929): getPurchases() - "INAPP_PURCHASE_DATA_LIST" return []
09-24 14:01:12.943: I/(16929): getPurchases() - "INAPP_DATA_SIGNATURE" return null
09-24 14:01:12.943: I/(16929): getPurchases() - "INAPP_CONTINUATION_TOKEN" return null

如您所见,没有android.test.purchased返回的详细信息。测试应用内购买对话框也未打开

相关购买代码(虽然和我猜的问题无关):

void purchase()
{
    if (!blnBind) return;
    if (mService == null) return;

    ArrayList<String> skuList = new ArrayList<String>();
    skuList.add(productID);
    Bundle querySkus = new Bundle();
    querySkus.putStringArrayList("ITEM_ID_LIST", skuList);

    Bundle skuDetails;
    try {
        skuDetails = mService.getSkuDetails(3, getPackageName(), "subs", querySkus);
        System.out.println(skuDetails);
        Toast.makeText(context, "getSkuDetails() - success return Bundle", Toast.LENGTH_SHORT).show();
        Log.i(tag, "getSkuDetails() - success return Bundle");
    } catch (RemoteException e) {
        e.printStackTrace();

        Toast.makeText(context, "getSkuDetails() - fail!", Toast.LENGTH_SHORT).show();
        Log.w(tag, "getSkuDetails() - fail!");
        return;
    }

    int response = skuDetails.getInt("RESPONSE_CODE");
    Toast.makeText(context, "getSkuDetails() - \"RESPONSE_CODE\" return " + String.valueOf(response), Toast.LENGTH_SHORT).show();
    Log.i(tag, "getSkuDetails() - \"RESPONSE_CODE\" return " + String.valueOf(response));

    if (response != 0) return;

    ArrayList<String> responseList = skuDetails.getStringArrayList("DETAILS_LIST");
    Log.i(tag, "getSkuDetails() - \"DETAILS_LIST\" return " + responseList.toString());

    if (responseList.size() == 0) return;

    for (String thisResponse : responseList) {
        try {
            JSONObject object = new JSONObject(thisResponse);

            String sku = object.getString("productId");
            String title = object.getString("title");
            String price = object.getString("price");

            Log.i(tag, "getSkuDetails() - \"DETAILS_LIST\":\"productId\" return " + sku);
            Log.i(tag, "getSkuDetails() - \"DETAILS_LIST\":\"title\" return " + title);
            Log.i(tag, "getSkuDetails() - \"DETAILS_LIST\":\"price\" return " + price);

            if (!sku.equals(productID)) continue;

            Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(), sku, "subs", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");

            Toast.makeText(context, "getBuyIntent() - success return Bundle", Toast.LENGTH_SHORT).show();
            Log.i(tag, "getBuyIntent() - success return Bundle");

            response = buyIntentBundle.getInt("RESPONSE_CODE");
            //Toast.makeText(context, "getBuyIntent() - \"RESPONSE_CODE\" return " + String.valueOf(response), Toast.LENGTH_SHORT).show();
            Log.i(tag, "getBuyIntent() - \"RESPONSE_CODE\" return " + String.valueOf(response));

            if (response != 0) continue;

            PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
            startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), 0, 0, 0);
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();

            //Toast.makeText(context, "getSkuDetails() - fail!", Toast.LENGTH_SHORT).show();
            Log.w(tag, "getBuyIntent() - fail!");
        } catch (SendIntentException e) {
            e.printStackTrace();
        }
    } 
}

订阅是否支持测试购买?如果没有,如何测试订阅?如果是,为什么谷歌返回 null ?

任何相关的文档或链接也会有所帮助。

4

1 回答 1

7

我从未尝试使用测试产品 ID(“android.test.purchased”)测试订阅,我不确定它是否会起作用,因为它似乎是产品 ID 而不是订阅 ID。我使用真实的订阅 ID(我在 Google Play 开发者控制台上创建),但我使用的不是我的开发者帐户(即您用来发布应用程序的那个)。

如果您访问https://play.google.com/apps/publish/然后点击设置,您将看到一个名为“具有测试访问权限的 Gmail 帐户”的字段。您可以为要测试购买的帐户键入一个或多个 gmail 地址。在那里添加的任何购买订阅的帐户都不会收费,订阅将持续 24 小时。(来源: http: //developer.android.com/google/play/billing/billing_testing.html和我自己的经验)

这对我行得通。虽然我似乎确实发现了一个错误:尝试取消 Android 测试订阅给了我 500 响应代码

祝你的应用好运!

编辑:

来自谷歌文档(http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-test

您不能使用您的开发者帐户来测试完整的应用内购买过程,因为 Google 付款不允许您从自己那里购买商品。

您是否尝试过使用其他帐户?

于 2015-09-26T20:45:13.490 回答