Android转载Android开发Android技术知识

Google play之应用内支付接入

2018-02-12  本文已影响882人  转音视频的老王

前言

如果要接入google登录,可以参考我的前一篇文章Google Play登录SDK接入

官方文档

google应用内支付V3接入Android官方文档

官方Sample

Google应用内支付官方样例

google提供的官方sample是已经对官方api经过封装了的,而google官方文档是按照最原装的代码进行
描述的,所以本文将按照sample方式接入

SDK接入

配置资源文件

在AndroidManifest.xml文件中,添加以下权限:

<uses-permission android:name="com.android.vending.BILLING" />

SDK中的API调用

//设置自己从google控制台得到的公钥
 mHelper = new IabHelper(activity, "YOUR_PUBLIC_KEY");
        //调试模式
        mHelper.enableDebugLogging(true);
        Log.d(TAG, "Starting setup.");
        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            @Override
            public void onIabSetupFinished(IabResult result) {
                Log.d(TAG, "Setup finished.");
                if (!result.isSuccess()) {
                    Log.d(TAG, "Setup fail.");
                    return;
                }
                if (mHelper == null){
                    Log.d(TAG, "Setup fail.");
                    return;
                }
                Log.d(TAG, "Setup success.");
            }
        });
/**
     * 查询库存
     * */
 private void queryInventory(){
        Log.e(TAG, "Query inventory start");
        try {
            mHelper.queryInventoryAsync(mGotInventoryListener);
        } catch (IabHelper.IabAsyncInProgressException e) {
            e.printStackTrace();
        }
    }

/**查询库存的回调*/
private IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        @Override
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            Log.e(TAG, "Query inventory finished.");
            if (result.isFailure()) {
                Log.e(TAG, "Failed to query inventory: " + result);
                return;
            }
            Log.e(TAG, "Query inventory was successful." + inventory.getPurchase(mPayInfo.getProductId()));
            if (inventory.hasPurchase(mPayInfo.getProductId())){
                //库存存在用户购买的产品,先去消耗
            }else{
                //库存不存在
            }
        }
    };
//在合适的地方调用购买
mHelper.launchPurchaseFlow(mActivity, sku, RC_REQUEST, mPurchaseFinishedListener, extra);

购买的回调

private IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        @Override
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
            if (result.isFailure()) {
                // Oh noes! pay fail
                Log.d(TAG,"Error purchasing: " + result);
                return;
            }

            Log.d(TAG, "Purchase successful.");
            //模拟检测public key
            checkPk(purchase);
        }
    };

购买成功后,应该将购买返回的信息发送到自己的服务端,自己的服务端再去利用public key去验签

mHelper.consumeAsync(purchase, mConsumeFinishedListener);

消耗商品的回调

 private IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        @Override
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result);
            if (result.isSuccess()) {
                Log.d(TAG, "Consumption successful. Provisioning.");
            }
            else {
                Log.d(TAG,"Error while consuming: " + result);
            }
        }
    };

安全问题

常见问题

上一篇 下一篇

猜你喜欢

热点阅读