Android集成Google Pay流程以及注意事項

一、前言

最近在項目開發(fā)中箕肃,需要集成Google Play支付,也是第一次集成Google的支付功能今魔,在集成過程中也下了一番功夫勺像,故在此記錄分享一下,希望能給大家提供一些幫助错森。

二吟宦、準(zhǔn)備工作

1.注冊Google賬號 點此了解注冊流程
2.在Google play管理中心創(chuàng)建和配置商品
點此創(chuàng)建和配置一次性商品
點此創(chuàng)建和配置訂閱

三、開始集成并實現(xiàn)Google支付

首先附上Google支付官方集成文檔

在App module的build.gradle中添加Google支付依賴

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
  ...
  //Google支付
  implementation 'com.android.billingclient:billing:4.0.0'
}

1.初始化BillingClient

BillingClient 為許多常見的結(jié)算操作提供了方便的方法问词,既有同步方法督函,又有異步方法嘀粱。強烈建議一次打開一個活躍的 BillingClient 連接激挪,以避免對某一個事件進行多次 PurchasesUpdatedListener 回調(diào)

//處理購買監(jiān)聽,后續(xù)購買完成后在該監(jiān)聽中處理購買結(jié)果
private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // To be implemented in a later section.
    }
};

private BillingClient billingClient = BillingClient.newBuilder(activity)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .build();

2.與Google play建立連接

如需連接到 Google Play锋叨,調(diào)用 startConnection()垄分。連接過程是異步進行的,因此必須實現(xiàn) BillingClientStateListener娃磺,以便在客戶端的設(shè)置完成后且它準(zhǔn)備好發(fā)出進一步的請求時接收回調(diào)薄湿。

此外,還必須實現(xiàn)重試邏輯偷卧,以處理與 Google Play 失去連接的問題豺瘤。如需實現(xiàn)重試邏輯,請?zhí)鎿Q onBillingServiceDisconnected() 回調(diào)方法听诸,并確保 BillingClient 先調(diào)用 startConnection() 方法以重新連接到 Google Play坐求,然后再發(fā)出進一步的請求。

billingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(BillingResult billingResult) {
        if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    @Override
    public void onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
        billingClient.startConnection(this);
    }
});

3.根據(jù)商品id查詢可購買的商品

與 Google Play 建立連接后晌梨,向 Google Play 查詢應(yīng)用內(nèi)商品詳情桥嗤,請調(diào)用 querySkuDetailsAsync()

調(diào)用 querySkuDetailsAsync() 時仔蝌,應(yīng)傳遞 SkuDetailsParams 的實例泛领,用于指定在 Google Play 管理中心創(chuàng)建的商品 ID 字符串的列表以及 SkuTypeSkuType 可以是 SkuType.INAPP(針對一次性商品)敛惊,也可以是 SkuType.SUBS(針對訂閱)渊鞋。

須指定實現(xiàn) SkuDetailsResponseListener 接口的監(jiān)聽器。然后,您可以替換 onSkuDetailsResponse()篓像,該方法會在查詢完成時通知監(jiān)聽动知。

List<String> skuList = new ArrayList<> ();
skuList.add("替換為你的商品id");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),
    new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(BillingResult billingResult,
                List<SkuDetails> skuDetailsList) {
            // Process the result.
        }
    });

4.啟動購買流程

如需從應(yīng)用發(fā)起購買請求,請從應(yīng)用的主線程調(diào)用 launchBillingFlow() 方法员辩。

// An activity reference from which the billing flow will be launched.
Activity activity = ...;

// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .build();
int responseCode = billingClient.launchBillingFlow(activity, billingFlowParams).getResponseCode();

// Handle the result.

launchBillingFlow() 方法會返回 BillingClient.BillingResponseCode 中列出的幾個響應(yīng)代碼之一盒粮。BillingResponseCode 為 OK 表示成功啟動。

啟動成功后Google Play 會調(diào)用 onPurchasesUpdated()奠滑,以將購買操作的結(jié)果傳送給實現(xiàn) PurchasesUpdatedListener 接口的監(jiān)聽器丹皱。實現(xiàn)如下:

@Override
void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK
        && purchases != null) {
        for (Purchase purchase : purchases) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

5.處理購買交易

完成購買后,需要處理該購買交易宋税。應(yīng)按以下方式處理購買交易:

1.驗證購買交易摊崭。
2.向用戶提供內(nèi)容,并確認內(nèi)容已傳送給用戶杰赛。還可以選擇性地將商品標(biāo)記為已消費呢簸,以便用戶可以再次購買商品。

驗證購買交易乏屯,請先檢查購買交易的狀態(tài)是否為 PURCHASED根时。如果購買交易的狀態(tài)為 PENDING,則您應(yīng)按照處理待處理的交易中的說明處理購買交易辰晕。

對于消耗型商品蛤迎,請調(diào)用 consumeAsync() 并添加 Google Play 應(yīng)在用戶重新購買時提供的購買令牌。示例如下:

void handlePurchase(Purchase purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
    Purchase purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    ConsumeParams consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build();

    ConsumeResponseListener listener = new ConsumeResponseListener() {
        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                // Handle the success of the consume operation.
            }
        }
    };

    billingClient.consumeAsync(consumeParams, listener);
}

對于消耗型商品含友,請使用結(jié)算庫中的 BillingClient.acknowledgePurchase() 或 Google Play Developer API 中的 Product.Purchases.Acknowledge替裆。在確認購買交易之前,您的應(yīng)用應(yīng)使用 Google Play 結(jié)算庫中的 isAcknowledged() 方法或 Google Play Developer API 中的 acknowledgementState 字段檢查該購買交易是否已經(jīng)過確認窘问。示例如下:

BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...

void handlePurchase(Purchase purchase) {
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged()) {
            AcknowledgePurchaseParams acknowledgePurchaseParams =
                AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
            client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
        }
    }
}

6.處理完購買交易后辆童,還需調(diào)用自己服務(wù)端驗證接口,驗證購買是否真的成功(此步驟非常重要惠赫,處理交易中返回的狀態(tài)不能作為最終處理結(jié)果把鉴,需再調(diào)用服務(wù)端接口驗證購買結(jié)果

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汉形,隨后出現(xiàn)的幾起案子纸镊,更是在濱河造成了極大的恐慌,老刑警劉巖概疆,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗威,死亡現(xiàn)場離奇詭異,居然都是意外死亡岔冀,警方通過查閱死者的電腦和手機凯旭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罐呼,你說我怎么就攤上這事鞠柄。” “怎么了嫉柴?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵厌杜,是天一觀的道長。 經(jīng)常有香客問我计螺,道長夯尽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任登馒,我火速辦了婚禮匙握,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陈轿。我一直安慰自己圈纺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布麦射。 她就那樣靜靜地躺著蛾娶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪法褥。 梳的紋絲不亂的頭發(fā)上茫叭,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天酬屉,我揣著相機與錄音半等,去河邊找鬼。 笑死呐萨,一個胖子當(dāng)著我的面吹牛杀饵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谬擦,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼切距,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惨远?” 一聲冷哼從身側(cè)響起谜悟,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎北秽,沒想到半個月后葡幸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡贺氓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年蔚叨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔑水,死狀恐怖邢锯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搀别,我是刑警寧澤丹擎,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站歇父,受9級特大地震影響鸥鹉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庶骄,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一毁渗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧单刁,春花似錦灸异、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逻淌,卻和暖如春么伯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卡儒。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工田柔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骨望。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓硬爆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親擎鸠。 傳聞我的和親對象是個殘疾皇子缀磕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容