整理下Google Play in-app Billing支付的接入流程。眾所周知,Google Play是Google Android官方的應用商店,也是將應用發布到世界各地一個重要的渠道。支付作為盈利的一個重要手段,可以借助Google in-app Billing api來達到目的。
Google Play in-app Billing的接入過程需要閱讀接入文檔。官方的接入文檔地址為:
https://developer.android.com/google/play/billing/billing_integrate.html#billing-download
(1)Google Play開發者控制台
Google Play開發者控制台是管理應用,配置商品和發布的后台。參考地址為:
https://developer.android.com/distribute/googleplay/developer-console.html
Google Play的幫助文檔地址為:
https://support.google.com/googleplay/android-developer/answer/6112435?hl=zh-Hans
使用步驟:
1. 注冊Google Play開發者帳號
Google Play開發者帳號注冊地址為:(需支付25美元的注冊費,支持Visa信用卡等支付。)
2. 配置應用商品,獲取客戶端接入參數,步驟簡述如下:
在Google Play后台創建應用,設置游戲名稱。按照要求填寫商品詳情。上傳APK,注意上傳的APK必須是release簽名的正式包,同時要匹配好包名和版本號,然后再配置商品品項。獲取Google Play的接入公鑰(Base64編碼的RSA公共密鑰)。
受管理的商品:每個帳號只能購買一次,不能重復購買的商品。例如:激活碼、解鎖關卡等。
不受管理的商品:該商品可重復購買。包含支付完須消費,沒消費的不可能重復購買,這步對消費者是透明的。例如:金幣、鑽石等。
訂閱:通過按月或按年結算的方式在應用內向用戶銷售內容、服務或功能。
3. 獲取服務端接入參數
支付完成之后,需要在服務端校驗支付的票據是否合法。同樣,也需要獲取服務端參數。步驟如下:
(1)使用創建應用的開發者帳號,進入Google API管理后台。地址如下:
(2)確認是否啟用了Google Play Android Developer API。若未啟用,則點啟用。
(3)配置OAuth,填寫郵件地址和產品名稱,並保存。
(4)創建客戶端OAuth id。
(5)在新界面中,選擇網頁應用。並配置授權地址和重定向地址,並點擊創建。
(6)獲取客戶端id和客戶端密鑰。
(7)回到在Google Play后台啟用API。確保一個關聯和一個啟用狀態。
(8)用客戶端id獲取code。
在瀏覽器中訪問,如下地址(注意XXX替換實際的客戶端id):
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=http://www.example.com/oauth2callback&client_id=XXX
會得到如下地址,至此便獲取code的值:
https://www.example.com/oauth2callback?code=XXX
(9)再利用獲取到的code,獲取refresh_token參數。
用post請求如下地址,注意參數:code=XXX&client_id=XXX&client_secret=XXX&redirect_uri=http://www.example.com/oauth2callback&grant_type=authorization_code
,其中grant_type為固定值。
得到json:
{ "access_token" : "ya29.dAFAF9xX89iR4s0Li4_faSmtGFonWQz67HvfXZFkPWsY_tHI_q1c7fc6WTS9EqKMi7_wonxhp4Q2FA", "token_type" : "Bearer", "expires_in" : 3600, "refresh_token" : "XXX" }
這樣便獲得了refresh_token參數。
服務器校驗的時候,便可以通過refresh_token,來獲取access_token等。
(2)Google Play in-app Billing購買流程
這里我就直接從Google Play官方文檔摘取過來購買流程的內容,方便查找。
Google Play官方購買流程文檔:https://developer.android.com/google/play/billing/api.html?hl=zh-cn
1. 購買流程
先熟悉下V3版本的購買流程,知道大體的支付步驟和實現邏輯。如圖:
(1) 您的應用向 Google Play 發送 isBillingSupported
請求,以確定您當前使用的應用內結算 API 目標版本是否受支持。
(2) 當您的應用啟動或用戶登錄時,最好向 Google Play 進行查詢,確定該用戶擁有哪些商品。要查詢用戶的應用內購買,請發送 getPurchases
請求。如果該請求成功,Google Play 會返回一個 Bundle
,其中包含所購商品的商品 ID 列表、各項購買詳情的列表以及購買簽名的列表。
(3) 通常情況下,您需要通知用戶商品是否可供購買。要查詢您在 Google Play 中定義的應用內商品的詳細信息,應用可以發送 getSkuDetails
請求。您必須在該查詢請求中指定商品 ID 列表。如果該請求成功,Google Play 會返回一個包含產品詳情(包括商品的價格、標題、說明和購買類型)的 Bundle
。
(4) 如果該用戶還未擁有應用內商品,您可以提示購買。為了發起購買請求,您的應用會發送 getBuyIntent
請求,指定要購買商品的商品 ID 以及其他參數。當您在開發者控制台中創建新的應用內商品時,應記錄其商品 ID。
Google Play 返回的 Bundle
中包含 PendingIntent
,您的應用可用它來啟動購買結帳界面。
您的應用通過調用 startIntentSenderForResult
方法來啟動 PendingIntent
。
當結帳流程結束后(即用戶成功購買商品或取消購買),Google Play 會向您的 onActivityResult
方法發送響應 Intent。onActivityResult
的結果代碼中有一個代碼將用於表明用戶是完成了購買還是取消了購買。響應 Intent
中會包含所購商品的相關信息,其中包括 Google Play 為了唯一識此次購買交易而生成的 purchaseToken
字符串。Intent
中還包含使用您的私人開發者密鑰簽署的購買簽名。
2. 消耗流程
Google Play的支付分為購買-消耗
兩步。如果是在Google Play后台配置的商品品項是受管理類型的商品,則只需要調用購買即可,即不可重復購買。如果配置的是不受管理類型的商品,則在購買成功回調里要手動調用下消耗接口,否則該商品不能重復購買。
在第 3 版中,所有應用內商品都是托管的。也就是說,用戶對所購應用內商品的所有權由 Google Play 進行維護,您的應用可以在需要時查詢用戶的購買信息。當用戶成功購買應用內商品后,該次購買就會記錄在 Google Play 中。應用內商品一經售出,就會被視為“被擁有”。處於“被擁有”狀態的應用內商品無法再通過 Google Play 購買。您必須對“被擁有”的應用內商品發送消耗請求,然后 Google Play 才能再次將其設成可購買狀態。消耗應用內商品會將商品切換回“未被擁有”狀態並刪除之前的購買數據。
為了檢索用戶所擁有商品的列表,您的應用會向 Google Play 發送 getPurchases
調用。您的應用可以通過發送 consumePurchase
調用提出消耗請求。在請求參數中,您必須指定應用內商品獨一無二的 purchaseToken
字符串,此字符串是在商品售出時由 Google Play 指定的。Google Play 會返回一個狀態代碼,指明此次消耗是否已成功記錄。
(1)調用 getBuyIntent
啟動購買流程。
(2)從 Google Play 接收指示購買是否成功完成的響應 Bundle
。
(3)如果購買成功,通過調用 consumePurchase
消耗此次購買。
(4)從 Google Play 接收指示消耗是否成功完成的響應代碼。
(5)如果消耗成功,在應用中配置商品。
以上是購買到消耗的整個流程,這么復雜的購買流程到代碼層該如何實現了。還好我們可以通過取巧的辦法,用Google Play給我們提供的Samples中代碼“拿來即用”,節省開發周期。
(3)Google Play in-app Billing api接入
1. 下載Google Play Billing Library
打開ANdroid SDK Manager。在extras中勾選Google Play Billing Library和Google Play Service。如圖:
下載完的Library路徑應該會在<android-sdk-root>/extras/google/play_billing
。目錄結構如圖:
並導入samples到Eclipse中。用AndroidStudio也類似,這里主要介紹下Eclipse的操作步驟。
2. 將samples對應的代碼直接拷貝到自己的項目中。如圖:
3. 在AndroidManifest中添加如下權限:
<uses-permission android:name="com.android.vending.BILLING" />
4. 初始化in-app Billing api。直接把以下代碼放到合適的地方,一般是主Activity的onCreate中。IabHelper
是一個封裝了購買-消耗的個工具類,queryInventoryAsync
是訂單查詢方法。注意替換實際的公鑰(Google Play后台創建應用里,在服務和API這項可以找到,一串Base64編碼的字符串)。
// base64EncodedPublicKey為Base64編碼RSA公共密鑰 String base64EncodedPublicKey = "CONSTRUCT_YOUR_KEY_AND_PLACE_IT_HERE"; // Create the helper, passing it our context and the public key to verify signatures with Log.d(TAG, "Creating IAB helper."); mHelper = new IabHelper(this, base64EncodedPublicKey); // enable debug logging (for a production application, you should set this to false). mHelper.enableDebugLogging(true); // Start setup. This is asynchronous and the specified listener // will be called once setup completes. Log.d(TAG, "Starting setup."); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { Log.d(TAG, "Setup finished."); if (!result.isSuccess()) { // Oh noes, there was a problem. return; } // Have we been disposed of in the meantime? If so, quit. if (mHelper == null) return; // IAB is fully set up. Now, let's get an inventory of stuff we own. Log.d(TAG, "Setup successful. Querying inventory."); mHelper.queryInventoryAsync(mGotInventoryListener); } });
5. 支付。在發起購買請求的時候,調用以下代碼。sku參數為對應Google Play后台配置的商品品項id。extraData可用於透傳參數
IabHelper.launchPurchaseFlow(Activity act, String sku, int requestCode, OnIabPurchaseFinishedListener listener, String extraData)
6. 消耗。一般是在支付成功或查詢成功的回調里調用消費方法。
注意:不受管理的商品,在支付完需要調用消費。不然,沒法重復購買。測試帳號返回的票據中不帶orderId。
IabHelper.consumeAsync(Purchase purchase, OnConsumeFinishedListener listener)
7. 查詢。在查詢回調里,檢測如果存在支付但沒消費的商品,繼續調用消費。可用於漏單處理。直接放在IapHelper初始化中即可。
IabHelper.queryInventoryAsync(QueryInventoryFinishedListener listener)
8. 銷毀。一般是在主Activity的onDestory里執行。
public void onDestroy() { super.onDestroy(); // very important: Log.d(TAG, "Destroying helper."); if (mHelper != null) mHelper.dispose(); mHelper = null; }
9.
onActivityResult設置
protected void onActivityResult(int requestCode, int resultCode, Intent data) { Toast.makeText(getApplicationContext(), "onActivityResult(" + requestCode + "," + resultCode + "," + data, Toast.LENGTH_SHORT).show(); if (mHelper == null) return; if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } }
(一般大多數網站都沒有這一步,如果不加入這一步,購買的時候,彈出google支付界面后返回,就會發現再次點擊購買就不會有反應,加上這句 就不會出現不能再次點擊的問題)
(4)測試Google Play in-app Billing api的接入
1. 測試機上安裝Google框架
國內的手機一般需要手動安裝Google框架(Google Play商店,Google Play Service等),這里推薦個“谷歌安裝器”的app。安裝這個app可以自動檢測手機內缺少哪些Google服務。不過,安裝“谷歌安裝器”部分手機需要Root權限。
下載谷歌安裝器。當然,安裝完Google框架還需要VPN,能FQ,正常打開Google Play商店。
2. 安裝接入好Google Play in-app Billing的app到手機
前面提到,測試Google Play in-app Billing的接入,須包名,版本好跟上傳的一致,而且簽名必須是release簽名的。這樣我們可以將release簽名文件修改為默認的簽名,方便我們調試。直接連手機運行,省去了每次打包再安裝到手機
(1)先備份正式的簽名文件。然后,在Windows命令行窗口中修改keystore密碼為android。
keytool -storepasswd -keystore test.keystore
先輸入原簽名文件的密碼,再輸入新密碼為android。
(2)修改原簽名文件的alias,修改為androiddebugkey。
keytool -changealias -keystore test.keystore -alias test -destalias androiddebugkey
test為原簽名文件的alias,修改為androiddebugkey
這步會要求輸入keystore的密碼(即:android)和當前alias的密碼
(3)修改alias密碼
keytool -keypasswd -keystore my.keystore -alias androiddebugkey
這步會要求輸入keystore密碼(即:android)和原alias密碼,然后在輸入新的alias密碼,輸入android即可。
(4)Eclipse中指定默認的簽名
選擇Window->Preferences->Android->Build->Browse,選擇剛制作的簽名文件即可。這樣,就可以直接連手機調試運行了。
3. 添加測試帳號
在Google Play后台上傳Alpha版測試或Beta測試版里添加測試人員帳號。
(1)創建Google+群
邀請測試人員加入Google+群組的方式,邀請會收到郵件,不過邀請大概會有4小時延遲。
(2)分享測試連接
將形如以下連接分享給測試者,測試者打開連接加入測試。“org.cocos2d.game”為應用對應的包名。