应用内订阅

In-App Subscription

每当我使用测试帐户测试应用程序中的订阅时,它 return 成功回调,根据回调,我在我的远程服务器上存储了一些信息......但是当我发布它并测试时其他帐户扣除订阅金额并成功执行,但我无法收到成功回调,因此我无法访问内容。我们如何从采购模型或库存模型中获取交易信息,除此之外,我们如何获取有关特定订单 ID 的信息,例如其剩余时间等,这些信息由 google 它自己管理。我们如何在每台设备上识别用户和(his/her)订阅以访问内容

mHelper = new IabHelper(this, "Key");
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            if (!result.isSuccess()) {
                Log.d(TAG, "In-app Billing setup failed: " + result);
            } else {
                Log.d(TAG, "In-app Billing is set up OK");
            }
            // Hooray, IAB is fully set up!
        }
    });

    levelSubscriptionPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase) {
            if (result.isFailure()) {
                Log.d(TAG, "failed billing");
            } else {
                Log.d(TAG, "purchase success Callback billing");
                Log.d(TAG, purchase.getToken());
                setSubscription(session.getUserDetail().getEmail());
            }

        }
    };


    mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result,
                                             Inventory inventory) {

            if (!result.isFailure()) {
                Log.d(TAG, "Query Inventory  failed Callback billing");

                /*Toast.makeText(Dashboard.this, "InventoryListener", Toast.LENGTH_SHORT).show();
                // Handle failure
                mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                        mConsumeFinishedListener);*/
            } else {
                Log.d(TAG, "Query Inventory success Callback billing");
            }
        }
    };

    mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        public void onConsumeFinished(Purchase purchase,
                                      IabResult result) {

            if (result.isSuccess()) {
                Log.d(TAG, "Consume finish success Callback billing");
            } else {
                Log.d(TAG, "Consume finish failed Callback billing");
            }
        }
    };

您可以在 QueryInventoryFinishedListener 中获取购买详细信息,例如

Purchase monthlySubscription = inv.getPurchase(SKU_SUBSCRIPTION_MONTHLY);

        if (monthlySubscription != null) {
            Log.d(TAG, "User has already subscribed for monthly benefits.");
            Utils.Log(monthlySubscription.toString());

        } else {
            launchSubscriptions();
        }



private void launchSubscriptions() {
    try {
        iabHelper.launchSubscriptionPurchaseFlow((Activity) context, 
        SKU_SUBSCRIPTION_MONTHLY, REQUEST_CODE, new 
        IabHelper.OnIabPurchaseFinishedListener() {
            @Override
            public void onIabPurchaseFinished(IabResult result, 
            Purchase monthlySubscription) throws 
            IabHelper.IabAsyncInProgressException {
                if (result.isFailure()) {
                    Log.e(TAG, "Error purchasing: " + result);
                } else if (result.isSuccess()) {
                    Log.d(TAG, "---Success---");
                } else {
                    Log.d(TAG, "---Error---");
                }
            }
        }, String.valueOf(preferences.getUserId()));
    } catch (IabHelper.IabAsyncInProgressException e) {
        e.printStackTrace();
    }
}

您还在 "launchSubscriptionPurchaseFlow" 方法中添加了一个额外的参数。每当您获得购买详细信息时,您还会获得该额外参数。所以使用这个参数你可以识别用户明智的购买 (在我的例子中,我在 launchSubscriptions() 方法中添加了 userId)