Android Google應(yīng)用內(nèi)支付(新的集成方式)

前言

之前寫(xiě)過(guò)一篇通過(guò)AIDL方式集成Google支付
的文章,如有需要,可以去看看。但是,不建議使用。為啥呢?,因?yàn)樽罱碐oogle文檔中說(shuō)已經(jīng)不再支持AIDL的方式了。所以今天就來(lái)說(shuō)說(shuō)新的Google支付繼承方式,當(dāng)然,我們這里只說(shuō)集成方式,配置可以看Google(應(yīng)用內(nèi)支付)官方文檔。

準(zhǔn)備工作

要集成Google支付的準(zhǔn)備工作有哪些呢?

  • 1、手機(jī)上安裝Google服務(wù)(當(dāng)然是針對(duì)國(guó)內(nèi)的用戶,國(guó)外的相信大部分都有Google服務(wù));
  • 2、一個(gè)綁定信用卡的Google賬號(hào);
  • 3、Google play客戶端;
  • 4、Google play console用于配置應(yīng)用內(nèi)商品信息);

首先

上面的準(zhǔn)備工作都做好了之后需要干什么呢?當(dāng)然是在Google play console上配置相關(guān)應(yīng)用和商品信息了,至于如何配置具體可以參考Google支付配置。

  • 1、支付流程說(shuō)明
    關(guān)于Google支付的流程說(shuō)明:
    1>前提條件

    1、檢查你的包名和簽名文件是否和Google Console 上面上傳的apk包是否一致
    2、檢查版本號(hào)是否和Google console發(fā)布的apk版本是否一致
    3、檢查你是否可以購(gòu)買,是否綁定了銀行卡,手機(jī)支不支持Google支付,手機(jī)是否有Google服務(wù)
    

    2>支付流程

     1、第一步,初始化Google支付
     2、第二步,初始化成功后調(diào)用查詢購(gòu)買的商品操作,查詢成功調(diào)用消耗操作,防止不能購(gòu)買的情 況發(fā)生
     3、第三步,生成訂單號(hào)進(jìn)行購(gòu)買操作
     4、第四步,購(gòu)買成功后再次調(diào)用一次消耗操作(為了下次購(gòu)買可以成功)
     5、第五步,拿到Google支付返回的相關(guān)信息,在服務(wù)器進(jìn)行驗(yàn)證操作。
     6、第六步,服務(wù)器拿到你上傳的相關(guān)信息和Google支付進(jìn)行交互驗(yàn)證,驗(yàn)證成功后Google發(fā)貨,服務(wù)器給你返回相關(guān)信息
    
支付流程.jpg
補(bǔ)單流程.jpg
后臺(tái)驗(yàn)證流程.png
  • 2、集成工作
    首先在你的項(xiàng)目的build.gradle文件中加入Google支付的在線依賴
  implementation 'com.android.billingclient:billing:3.0.0'

注意:我用的時(shí)候版本是2.1.0,你可以去官網(wǎng)查查最新的版本

其次

上面是接入的前提條件,下面看具體代碼

public class GooglePlayHelper {
private static final String TAG = GooglePlayHelper.class.getSimpleName();
private static final int GAME_ORDER_ID=0x01;

//訂單號(hào)
private String mOrderID;
//用戶信息
privata String mUserID;
//商品集合
private WeakReference<Activity> mActivityRef;
//回調(diào)
private OnRechargeStateListener mListener;
//商品
private String mSku;
private String goods_number;//  商品ID,游戲提供
private BillingClient mBillingClient;
private int mPayTest;
private String mConsume = "0";

GooglePlayHelper(Activity activity, 
                String goods_number, int mPayTest,
                 String sku, OnRechargeStateListener mListener) {
    this.mActivityRef = new WeakReference<>(activity);
    this.goods_number = goods_number;
    this.mSku = sku;
    this.mPayTest = mPayTest;
    this.mListener = mListener;
}

  public GooglePlayHelper(Activity activity, int mPayTest) {
    this.mActivityRef = new WeakReference<>(activity);
    this.mPayTest = mPayTest;
}




/**
 * 初始化
 */
void init() {
    mBillingClient = BillingClient.newBuilder(mActivityRef.get())
            .setListener(mPurchasesUpdatedListener)
            .enablePendingPurchases()
            .build();
    if (!mBillingClient.isReady()) {
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult != null) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                        if (!TextUtils.isEmpty(PreferencesUtils.getString(mActivityRef.get(),
                                Constants.USER_LT_UID_KEY))) {
                            getLTOrderID();
                        } else {
                            mListener.onState(mActivityRef.get(), RechargeResult.failOf(LTGameError.make(
                                    LTResultCode.STATE_GP_CREATE_ORDER_FAILED,
                                    "order create failed:user key is empty"
                            )));
                            mActivityRef.get().finish();
                        }
                    }
                }

            }

            @Override
            public void onBillingServiceDisconnected() {
            }
        });
    } else {
        if (!TextUtils.isEmpty(PreferencesUtils.getString(mActivityRef.get(),
                Constants.USER_LT_UID_KEY))) {
            getLTOrderID();
        } else {
            mListener.onState(mActivityRef.get(), RechargeResult.failOf(LTGameError.make(
                    LTResultCode.STATE_GP_CREATE_ORDER_FAILED,
                    "order create failed:user key is empty"
            )));
            mActivityRef.get().finish();
        }
    }
}


/**
 * 購(gòu)買回調(diào)
 */
private PurchasesUpdatedListener mPurchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> list) {
        String debugMessage = billingResult.getDebugMessage();
        Log.e(TAG, debugMessage);
        if (list != null && list.size() > 0) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                for (Purchase purchase : list) {
                    mConsume = "2";
                    uploadToServer(purchase.getPurchaseToken(), purchase.getOrderId(),mOrderID, mPayTest);
                }

            }
        } else {
            switch (billingResult.getResponseCode()) {
                case BillingClient.BillingResponseCode.SERVICE_TIMEOUT: {//服務(wù)連接超時(shí)
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("-3"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED: {
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("-2"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED: {//服務(wù)未連接
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("-1"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.USER_CANCELED: {//取消
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("1"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE: {//服務(wù)不可用
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("2"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE: {//購(gòu)買不可用
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("3"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.ITEM_UNAVAILABLE: {//商品不存在
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("4"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.DEVELOPER_ERROR: {//提供給 API 的無(wú)效參數(shù)
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("5"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.ERROR: {//錯(cuò)誤
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("6"));
                    mActivityRef.get().finish();
                    break;
                }
                case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED: {//未消耗掉
                    mConsume = "1";
                    queryHistory();
                    break;
                }
                case BillingClient.BillingResponseCode.ITEM_NOT_OWNED: {//不可購(gòu)買
                    mListener.onState(mActivityRef.get(), RechargeResult.failOf("8"));
                    mActivityRef.get().finish();
                    break;
                }
            }
        }
    }
};

/**
 * 購(gòu)買
 */
private void recharge() {
    if (mBillingClient.isReady()) {
        List<String> skuList = new ArrayList<>();
        skuList.add(mSku);
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
        mBillingClient.querySkuDetailsAsync(params.build(),
                new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(BillingResult billingResult,
                                                     List<SkuDetails> skuDetailsList) {
                        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                                && skuDetailsList != null) {
                            for (SkuDetails skuDetails : skuDetailsList) {
                                String sku = skuDetails.getSku();
                                if (mSku.equals(sku)) {
                                    BillingFlowParams purchaseParams =
                                            BillingFlowParams.newBuilder()
                                                    .setSkuDetails(skuDetails)
                                                    .setObfuscatedAccountId(mUserID)
                                                    .setObfuscatedProfileId(mOrderID)
                                                    .build();
                                    mBillingClient.launchBillingFlow(mActivityRef.get(), purchaseParams);
                                }
                            }
                        }

                    }
                });

    }


}


/**
 * 消耗
 */
private void consume(String purchaseToken) {
    if (mBillingClient.isReady()) {
        ConsumeParams consumeParams = ConsumeParams.newBuilder()
                .setPurchaseToken(purchaseToken)
                .build();
        mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
            @Override
            public void onConsumeResponse(BillingResult billingResult, String s) {

            }
        });
    } else {
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult != null) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                        ConsumeParams consumeParams = ConsumeParams.newBuilder()
                                .setPurchaseToken(purchaseToken)
                                .build();
                        mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
                            @Override
                            public void onConsumeResponse(BillingResult billingResult, String s) {

                            }
                        });
                    }
                }

            }

            @Override
            public void onBillingServiceDisconnected() {
            }
        });
    }

}

/**
 * 消耗
 */
private void consume2(String purchaseToken) {
    if (mBillingClient.isReady()) {
        ConsumeParams consumeParams = ConsumeParams.newBuilder()
                .setPurchaseToken(purchaseToken)
                .build();
        mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
            @Override
            public void onConsumeResponse(BillingResult billingResult, String s) {

            }
        });
        recharge();
    } else {
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult != null) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                        ConsumeParams consumeParams = ConsumeParams.newBuilder()
                                .setPurchaseToken(purchaseToken)
                                .build();
                        mBillingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
                            @Override
                            public void onConsumeResponse(BillingResult billingResult, String s) {

                            }
                        });
                    }
                }

            }

            @Override
            public void onBillingServiceDisconnected() {
            }
        });
        recharge();
    }

}

/**
 * 補(bǔ)單操作
 */
private void queryHistory() {
   Purchase.PurchasesResult mResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (int i = 0; i < mResult.getPurchasesList().size(); i++) {
        if (mResult.getPurchasesList().get(i).isAcknowledged()) {
            consume2(mResult.getPurchasesList().get(i).getPurchaseToken());
        } else {
            uploadToServer2(mResult.getPurchasesList().get(i).getPurchaseToken(),
                    mResult.getPurchasesList().get(i).getOrderId(),
                    mResult.getPurchasesList().get(i).getAccountIdentifiers().getObfuscatedProfileId(),
                    mPayTest);
        }
    }

}

/**
 * 獲取訂單ID
 */
private void getLTOrderID() {
   //自己獲取訂單ID的接口(和你們自己的服務(wù)器進(jìn)行商量)
    LoginRealizeManager.createOrder(mActivityRef.get(), xx, xx, xx,
            new OnRechargeStateListener() {

                @Override
                public void onState(Activity activity, RechargeResult result) {
                    if (result != null) {
                        if (result.getResultModel() != null) {
                            if (result.getResultModel().getData() != null) {
                                if (result.getResultModel().getCode() == 0) {
                                    if (result.getResultModel().getData().getOrder_number() != null) {
                                        mOrderID = result.getResultModel().getData().getOrder_number();
                                        PreferencesUtils.init(mActivityRef.get());
                                        PreferencesUtils.putString(mActivityRef.get(), GAME_ORDER_ID, mOrderID);
                                        recharge();
                                    }
                                } else {
                                    mListener.onState(mActivityRef.get(),
                                            RechargeResult.failOf(result.getResultModel().getMsg()));
                                    mActivityRef.get().finish();
                                    activity.finish();
                                }

                            }

                        }
                    }
                }

            });

}

/**
 * 上傳到服務(wù)器驗(yàn)證接口(具體傳值和你們的服務(wù)器進(jìn)行溝通確認(rèn))
 */
private void uploadToServer(final String purchaseToken,String mGoogleOrder, String mOrderID, int mPayTest) {
    LoginRealizeManager.googlePlay(mActivityRef.get(),
            purchaseToken, mOrderID, mPayTest, new OnRechargeStateListener() {
                @Override
                public void onState(Activity activity, RechargeResult result) {
                    if (result != null) {
                        if (result.getResultModel() != null) {
                            if (result.getResultModel().getCode() == 0) {
                                mListener.onState(mActivityRef.get(), RechargeResult
                                        .successOf(result.getResultModel()));
                                consume(purchaseToken);
                            } else if (result.getResultModel().getCode() == 10500) {//網(wǎng)絡(luò)中斷再次重新上傳驗(yàn)證上傳
                                uploadToServer(purchaseToken,mGoogleOrder, mOrderID, mPayTest);
                            } else {//上傳訂單驗(yàn)證錯(cuò)誤日志信息到服務(wù)器
                                LoginRealizeManager.sendGooglePlayFailed(mActivityRef.get(), mOrderID, purchaseToken,
                                        mGoogleOrder,
                                        mPayTest, result.getResultModel().getMsg(), mListener);
                            }
                        }

                    }

                }

            });

}

/**
 * 上傳到服務(wù)器驗(yàn)證接口(具體傳值和你們的服務(wù)器進(jìn)行溝通確認(rèn))
 */
private void uploadToServer2(final String purchaseToken,String mGoogleOrder, String mOrderID, int mPayTest) {
    LoginRealizeManager.googlePlay(mActivityRef.get(),
            purchaseToken, mOrderID, mPayTest, new OnRechargeStateListener() {
                @Override
                public void onState(Activity activity, RechargeResult result) {
                    if (result != null) {
                        if (result.getResultModel() != null) {
                            if (result.getResultModel().getCode() == 0) {
                                consume2(purchaseToken);
                                if (mConsume.equals("1")) {
                                    recharge();
                                }
                            } else if (result.getResultModel().getCode() == 10500) {
                                uploadToServer2(purchaseToken,mGoogleOrder, mOrderID, mPayTest);
                            } else {
                                LoginRealizeManager.sendGooglePlayFailed(mActivityRef.get(), mOrderID, purchaseToken,
                                        mGoogleOrder,
                                        mPayTest, result.getResultModel().getMsg(), mListener);
                            }
                        }

                    }

                }

            });

}

   /**
    * 上傳到服務(wù)器驗(yàn)證
    */
private void uploadToServer3(final String purchaseToken, String mGoogleOrder,String mOrderID, int mPayTest) {
    LoginRealizeManager.googlePlay(mActivityRef.get(),
            purchaseToken, mOrderID, mPayTest, new OnRechargeStateListener() {
                @Override
                public void onState(Activity activity, RechargeResult result) {
                    if (result != null) {
                        if (result.getResultModel() != null) {
                            if (result.getResultModel().getCode() == 0) {
                                consume2(purchaseToken);
                            } else if (result.getResultModel().getCode() == 10500) {
                                uploadToServer3(purchaseToken,mGoogleOrder, mOrderID, mPayTest);
                            } else {
                                LoginRealizeManager.sendGooglePlayFailed(mActivityRef.get(), mOrderID, purchaseToken,
                                        mGoogleOrder,
                                        mPayTest, result.getResultModel().getMsg(), mListener);
                            }
                        }

                    }

                }

            });

}


/**
 * 釋放
 */
void release() {
    if (mBillingClient.isReady()) {
        mBillingClient.endConnection();
    }
}

/**
 * 補(bǔ)單操作
 */
public void addOrder() {
    mBillingClient = BillingClient.newBuilder(mActivityRef.get())
            .setListener(mPurchasesUpdatedListener)
            .enablePendingPurchases()
            .build();
    mBillingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(BillingResult billingResult) {
            if (billingResult != null) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    Purchase.PurchasesResult mResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
                    for (int i = 0; i < mResult.getPurchasesList().size(); i++) {
                        if (mResult.getPurchasesList().get(i).isAcknowledged()) {//服務(wù)器驗(yàn)證
                            consume2(mResult.getPurchasesList().get(i).getPurchaseToken());
                        } else {//服務(wù)器未驗(yàn)證走驗(yàn)證流程
                            uploadToServer3(mResult.getPurchasesList().get(i).getPurchaseToken(),
                                    mResult.getPurchasesList().get(i).getOrderId(),
                                    mResult.getPurchasesList().get(i).getAccountIdentifiers().getObfuscatedProfileId(),
                                    mPayTest);
                        }
                    }
                }
            }

        }

        @Override
        public void onBillingServiceDisconnected() {
        }
    });
}


}

最后

好了,這就是今天的Google支付說(shuō)明了,如果還有疑問(wèn)可以加群探討(493180098)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容