一、前言
最近在項目開發(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 字符串的列表以及 SkuType
。SkuType
可以是 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);
}
}
}