Google 支付的流程和掉单bug

官方文档

1.前言

发布app到海外市场,内购不免要使用Google支付,然后发现集成Google支付有些流程和注意事项比起国内的支付宝、微信要复杂一些,在此记录一下.

2.准备工作

(1)请求的是国外的服务器,所有FQ工具是必须的.

(2)Google支付还要求手机安装Google三件套,如果没有安装,如下:
image.png

(3)准备开发者账号
Google开发者管理中心
image.png

(4)创建应用和提交测试版本(一般为Beta测试版),创建完后,要为应用添加商品,在添加测试人员账号,点击生成的链接即可,记录密匙
image.png
image.png
image.png

(5)初始化Helper的时候需要上面的密钥,根据同事反馈,密钥错误会报 response:-1003

3.Google支付大致流程

image.png

4.代码

//修改IabHelper的queryPurchases(Inventory,String)源码
  else {    
                    //失败时 获取当前失败的订单信息
                    failPurchaseData = purchaseData;
                    failSignature = signature;
                    PreSharedManager.setString("failPurchaseData", purchaseData, mContext);
                    PreSharedManager.setString("failSignature", signature, mContext);
                    logWarn("Purchase signature verification **FAILED**. Not adding item.");
                    logDebug("   Purchase data: " + purchaseData);
                    logDebug("   Signature: " + signature);
                    verificationFailed = true;
                }
// 查询我们拥有的项目和订阅时,这个监听器被调用,这步发生在初始化IabHelper后
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result,
                Inventory inventory) {
            // Have we been disposed of in the meantime? If so, quit.
            if (mHelper == null)
                return;

            // Is it a failure? 
            if (result.isFailure()) {
                String faString =PreSharedManager.getString("failPurchaseData", ZeroPayActivity.this);
                String sign=PreSharedManager.getString("failSignature", ZeroPayActivity.this);
                 if (!TextUtils.isEmpty(faString) && !TextUtils.isEmpty(sign)) {
                        try {
                            Purchase p = new Purchase("ITEM_TYPE_INAPP",faString, sign);
                            mHelper.consumeAsync(p, mConsumeFinishedListener);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        //向本地服务器请求订单号
                        googleProcess();
                    }

                return;
            }

            /*
             * Check for items we own. Notice that for each purchase, we check
             * the developer payload to see if it's correct! See
             * verifyDeveloperPayload().
             */

            // Check for gas delivery -- if we own gas, we should fill up the
            // tank immediately
            Purchase gasPurchase = inventory.getPurchase(SKU_GAS);
            // if (inventory != null) {
            // Log.i("ym", "" + inventory.getSkuDetails(SKU_GAS));
            // }
            if (inventory.hasPurchase(SKU_GAS)) {
                try {
                    mHelper.consumeAsync(inventory.getPurchase(SKU_GAS),
                            mConsumeFinishedListener);
                } catch (IabHelper.IabAsyncInProgressException e) {
                    complain("Error consuming. Another async operation in progress.");
                }
                return;
            }
            // updateUi();
            // setWaitScreen(false);
        }
    };
// Callback for when a purchase is finished购买完成时的回调
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            // if we were disposed of in the meantime, quit.
            if (mHelper == null)
                return;
            if (result.isFailure()) {
                  //支付未成功也要消耗产品,防止下次购买时,卡单无法支付
                 if (result.getResponse() == -1003||result.getResponse() == 7) {
                        if (purchase.getSku().equals(SKU_GAS)) {
                            try
                            {
                                mHelper.consumeAsync(purchase, mConsumeFinishedListener);
                            } catch (IabAsyncInProgressException e)
                            {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }

                    return;
            }

            if (purchase.getSku().equals(SKU_GAS)) {
                try {

                    mHelper.consumeAsync(purchase, mConsumeFinishedListener);
                } catch (IabHelper.IabAsyncInProgressException e) {
                    complain("Error consuming gas. Another async operation in progress.");
                    return;
                }
            }
        }
    };

猜你喜欢

转载自blog.csdn.net/a1525371383/article/details/81165643