java - 在应用内结算(IAB 版本 3)android 中恢复购买

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

Google 已升级到 IAB3(In App Billing version 3)。 首先是示例代码中的问题。super.onDestroy() 被遗漏了。

我在 http://developer.android.com/google/play/billing/billing_integrate.html 的帮助下实现了 v3

它在手机上测试过,在模拟器中不起作用。它卡在模拟器中。

我的问题是,我没有看到用于恢复交易的 API。如何恢复使用 IAB3 的购买?是 mService.getPurchases(apiVersion, packageName, type, continuationToken)。有人测试过这个吗??这会从本地存储的元素中退 repo 买的元素还是恢复购买的元素? 卸载应用程序没有 continuationToken。它应该是 null 吗?

当购买状态发生变化时呢??

请帮忙!

提前致谢。

编辑:

Google 已更新应用内结算库并解决了 super.onDestroy() 问题。 他们还添加了一些额外的功能。

最佳答案

要使元素可消耗,您必须发送消耗请求,并且必须在单独的线程中执行。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1111) {
        int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
        String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
        String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
        Logger.printMessage(TAG, "on activity result reponse"
                + responseCode, Logger.DEBUG);
        if (resultCode == RESULT_OK && responseCode == 0) {
            try {
                JSONObject jo = new JSONObject(purchaseData);
                String sku = jo.getString("productId");
                String title = jo.getString("title");
                addChipsToBalance(sku);
                final String token = jo.getString("purchaseToken");
                Toast.makeText(BuyChipsActivity.this,
                        "You have bought " + title + ". Enjoy the game!",
                        Toast.LENGTH_SHORT).show();

                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        Logger.printMessage(TAG, "inside run", Logger.DEBUG);
                        try {
                            int response = mService.consumePurchase(3,
                                    getPackageName(), token);
                            Logger.printMessage(TAG, "inside run response"
                                    + response, Logger.DEBUG);
                        } catch (RemoteException e) {
                            // TODO Auto-generated catch block
                            Logger.printMessage(TAG, "exception here 1",
                                    Logger.DEBUG);
                            e.printStackTrace();
                        }
                    }
                }).start();
                // alert("You have bought the " + sku +
                // ". Excellent choice,  adventurer!");
            } catch (JSONException e) {
                // alert("Failed to parse purchase data.");
                e.printStackTrace();
            }
        }
    }

但有时消费请求并没有在谷歌端完成,所以你可能想查询已购买的商品列表并使用购买 token 消费它。我喜欢这个

   private void showPreviousPurchases() {
    Logger.printMessage(TAG, "previous purchases", Logger.DEBUG);
    if (mService == null) {
        Toast.makeText(this, "Something Went Wrong. Try later",
                Toast.LENGTH_LONG).show();
        return;
    }
    Bundle ownedItems = null;
    ;
    try {
        ownedItems = mService.getPurchases(3, getPackageName(), "inapp",
                null);
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    if (ownedItems == null) {
        Logger.printMessage(TAG, "criical error ", Logger.DEBUG);
        return;
    }
    int response = ownedItems.getInt("RESPONSE_CODE");
    if (response == 0) {
        ArrayList<String> ownedSkus = ownedItems
                .getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
        ArrayList<String> purchaseDataList = ownedItems
                .getStringArrayList("INAPP_PURCHASE_DATA_LIST");
    /*  ArrayList<String> signatureList = ownedItems
                .getStringArrayList("INAPP_DATA_SIGNATURE");
        String continuationToken = ownedItems
                .getString("INAPP_CONTINUATION_TOKEN");*/

        for (int i = 0; i < purchaseDataList.size(); ++i) {
            String purchaseData = purchaseDataList.get(i);
            Logger.printMessage(TAG, "json  = " + purchaseData,
                    Logger.DEBUG);
            // String signature = signatureList.get(i);
            String sku = ownedSkus.get(i);

            addChipsAndMakeItConsumable(purchaseData);
            // do something with this purchase information
            // e.g. display the updated list of products owned by user
        }

        // if continuationToken != null, call getPurchases again
        // and pass in the token to retrieve more items
    }

}

private void addChipsAndMakeItConsumable(String purchaseData) {

    try {
        JSONObject jo = new JSONObject(purchaseData);
        String sku = jo.getString("productId");
        // String title = jo.getString("title");
        addChipsToBalance(sku);
        final String token = jo.getString("purchaseToken");
        Logger.printMessage(TAG, "id  = " + sku, Logger.DEBUG);

        Logger.printMessage(TAG, "inside run", Logger.DEBUG);
        try {
            int response = mService.consumePurchase(3, getPackageName(),
                    token);
            Logger.printMessage(TAG, "inside run response" + response,
                    Logger.DEBUG);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            Logger.printMessage(TAG, "exception here 1", Logger.DEBUG);
            e.printStackTrace();
        }

        // alert("You have bought the " + sku +
        // ". Excellent choice,  adventurer!");
    } catch (JSONException e) {
        // alert("Failed to parse purchase data.");
        e.printStackTrace();
    }
}

关于java - 在应用内结算(IAB 版本 3)android 中恢复购买,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13890007/

相关文章:

java - 在线程内使用方法

java - 在数组之前用 2 个对象解析 JSON

android - 应用内结算错误 : Item already owned (BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED)

ios - 使用 Swift 进行应用内购买

java - JPQL 未给出结果

java - 在不需要时使用 super 有什么坏处吗?

java - 网络应用架构

android - 代理服务器后面的 Volley

java - Android 驱动程序 JDBC PostgreSQL

flutter :storekit_duplicate_product_object。同一产品标识符有待处理的交易