1. 程式人生 > >Google Play In-app Billing 踩過的那些坑

Google Play In-app Billing 踩過的那些坑

最近在做的一款遊戲針對海外發行,要上 Google Play,所以支付這塊兒要接入 Google Play 。因為我們是免費 App + 應用內支付,所以 Google Play 這塊兒只接入 In-app 型別的支付方式,接下來我準備吐槽了。

大環境

國內做 Google Play 相關的開發外圍難度因素可想而知。具體原因相比大家都知道,所以那個什麼牆什麼的我就不多說了。這裡已經無力吐槽了。

流程

這裡簡單說一下 Google Play In-app Billing 支付的流程。具體的建議看官方文件最靠譜。Google Play 沒有可重複購買商品這個概念,所有的“商品/充值檔”使用者成功購買過一次之後就不允許再次購買了。所以為了實現像應用內支付充值這種可重複購買的“商品/充值檔”,Google Play 提供了一個

“消耗”藉口(Consuming In-app Products)。使用者購買完商品後,調一下“消耗”介面,這樣使用者下次就可以繼續購買了。

寫程式碼

還是就看官方文件是最靠譜的,In-app Billing 的 API 有個 v2 版本和 v3 版本,v2 版本已經不支援了,直接整 v3 版本的吧。怎麼開發,怎麼寫程式碼這塊兒沒什麼好說的,看著文件寫,基本都不會錯。這裡我只掉進坑裡去一次,說說。

ProductID 這個坑

1
2
com.abc.def.product1
com.abc.def.product2

在 Google Play Developer Console 配置充值檔時,為了統一,我們配置的和 iOS 一樣的 productId,也同樣是為了統一,我們 Android 專案配置的 package name 也和 iOS 配置的 Bundle Identifier 是一樣的,所以我就掉坑裡面了。

1
2
3
// 假設要充值的充值檔 ID 為 com.abc.def.product1 
// **注意** 這樣寫是錯誤的!!!
getBuyIntent(3, "com.abc.def", "product1", "inapp", "");
1
2
// 假設要充值的充值檔 ID 為 com.abc.def.product1 
getBuyIntent(3, "com.abc.def", "com.abc.def.product1", "inapp", "");

支付驗證

一般的支付驗證都是支付方會有個介面,玩家支付成功後需要將支付資料通過支付方提供的介面(一般為 HTTP 或 HTTPS)進行驗證,驗證通過後才會確認支付成功。

Google Play In-app Billing 並沒有提供支付驗證介面,它的驗證方法是通過公鑰自行驗證計算。在客戶端通過公鑰自行驗證雖然沒什麼問題,但總覺的不放心,特別是手遊這種,還是發往自己的伺服器端去做驗證比較好。我看 Google 的官方文件對這方面的介紹並不是很多,貼別是伺服器端驗證,這裡我貼出 PHP 的範例程式碼,其實挺簡單的。

通過參看官方文件對 getBuyIntent 支付成功返回的資料結構的說明:

Table 3. Response data from an In-app Billing Version 3 purchase request.

Key : INAPP_PURCHASE_DATA

Description : A String in JSON format that contains details about the purchase order. See table 4 for a description of the JSON fields.

Key : INAPP_DATA_SIGNATURE

Description : String containing the signature of the purchase data that was signed with the private key of the developer. The data signature uses the RSASSA-PKCS1-v1_5 scheme.

當客戶端收到玩家支付完成的回撥時,將上述兩個資料傳送給後端伺服器介面,後端的驗證流程是:

在 Google Play Developer Console 找到當前應用的設定頁面,在“服務和API”設定分頁內找到“此應用的許可金鑰”,將金鑰原封不動且刪除多餘空格地複製下來,然後我們直接上 PHP 的示例程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
$inapp_purchase_data = '客戶端回傳的 INAPP_PURCHASE_DATA 對應的資料';
$inapp_data_signature = '客戶端回傳的 INAPP_DATA_SIGNATURE 對應的資料';
$google_public_key = 'Google Play Developer Console 中此應用的許可金鑰';
$public_key = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($google_public_key, 64, "\n") . "-----END PUBLIC KEY-----";
$public_key_handle = openssl_get_publickey($public_key);
$result = openssl_verify($inapp_purchase_data, base64_decode($inapp_data_signature), $public_key_handle, OPENSSL_ALGO_SHA1);
if (1 === $result) {
    // 支付驗證成功!
}

測試

總的來說,Google Play In-app Billing 支付接入的開發算是比較簡單的,步驟不多,也比較容易理解。最讓人頭疼的是測試,特別是你人在大陸,那就是難上加難了~坑略多。

上傳測試 APK

首先你要在 Google Play Developer Console 裡面為你要測試的 APP 新建一個應用,然後上傳你要測試的 APP 的 APK 包。這裡有兩點注意:

  • 上傳的 APK 包必須要有簽名,而且不能用 Debug 簽名。
  • 上傳的 APK 包體積不能超過 50MB 超過的話要做分包(分包打算下回單開一篇來講)。

Google Play Developer Console 一個應用可以對應釋出三個頻道,正式版、Beta版和Alpha版,我們測試用的 APK 只要上傳到 Beta版或 Alpha版頻道就好。

釋出你的應用

看到“釋出”這個詞你可能會慌一下:“怎麼,我的應用還沒做完呢,怎麼能釋出呢?”。不要擔心,這裡你只上傳了你的測試 APK 包到 Beta 或 Alpha 頻道,把應用釋出了,普通使用者也是無法下載的。釋出是必須做的,如果你只處於預設的“草稿”狀態,是根本沒辦法測試支付功能的。

這裡吐個槽,當你釋出了你的應用後 Google Play 不會立即讓它生效。仔細看你的 Google Play Developer Console 頁面,你會發現 Google 提示你要等一等才會釋出成功,等待的時間是按“小時”為單位的,沒轍,耐心等待吧。

準備測試帳號

上面說了,釋出應用後要等,到底要等到什麼時候呢?在你的 Google Play Console 頁面你對應釋出的頻道那裡會有個“管理測試人員列表”的超連結,點開會彈出一個彈出框,在彈出框裡有個標題是“與測試者分享以下連結”,下面有個 URL 連結,形如:

1
https://play.google.com/apps/testing/xxxxxxx

的連結,用瀏覽器點開這個連結你會發現如果它跳轉到了 Google Play 應用商店並能看到你的測試應用了,說明你已經發布成功了。

什麼?你一直看不到 Google Play 應用商店裡你釋出的應用?那說明你當前登入到 Google Play 應用商店的帳號既不是你這個應用的開發者帳號,也不是你這個應用的測試組帳號。

成為開發者需要在 Google Play Developer Console 裡面設定,這個就不多講了。主要提一下怎麼成為測試帳號。

首先你要到 Google Group 去建立一個新的論壇,然後回到 Google Play Console 頁面你對應釋出的頻道,還是點選“管理測試人員列表”,在彈出的彈出框裡將你剛剛建立好的 Google Group 群組的 Email 填寫進去。這樣只要你邀請進入這個 Google Group 的人員都是這個應用的測試人員了。

在真機上安裝要測試的APP

要測試 Google Play In-app Billing 支付,一定要在真實的裝置上測試,而且還要保證裝置上裝了 Google Play 國內一般裝了制定 Android 系統的手機都不會預設安裝 Google Play 需要你去網上搜一艘 Google Play 的安裝包。我當時用的是 Google 的 Nexus 7 測試的,系統用的 Google 原生 4.4.4。

這裡你可能還有個疑問:“我在測試我的 APP 時肯定會經常做一些修改,或要加斷點 Debug,我總不能修改一次就發個 APK 包到 Google Play Developer Console 吧?”。這裡你可以放心,你完全沒必要用上傳的 APK 來測試,你只要保證

安裝到真機上的測試 APP 簽名和上傳到 Google Play 的 APK 包的簽名一致

搞定 Google Play

好了,如果目前你手拿著安裝好測試 APP 的真機裝置,裝置上安裝有 Google Play ,Google Play 上登入了你的開發組或測試組人員帳號,你的應用已經成功釋出了,而剛好你此時人不是在大陸,那麼恭喜你,你已經可以開始測試你的支付了。

如果你上述工作都做好了,可是你人在大陸,那麼你就“萬事俱備,只欠東風”了。

先吐槽,在 Google Play Developer Console 的應用釋出國家列表中是不允許選擇“中國”的,Google Play 在大陸也是不允許支付的。如果你用你的裝置開啟 Google Play 應用商店看到的滿眼都是免費應用,一個付費應用都沒有,那麼“恭喜”你,目前 Google Play 認為你是個大陸使用者,你是不允許付費的,自然你就沒辦法測試你的支付流程了。

網上查一圈,發現不少人給出解決方案,都挺複雜的。什麼又要先把裝置給越獄拿到 root 許可權啦,什麼又要安裝第三方破解 Google Play 的軟體啦,還有什麼需要插個國外的 SIM 卡了,據本人親測根本沒那麼那麼費勁,你只要有個 VPN 即可,你懂的。

根據我本人拿著手頭的 Nexus 7 親測,只要你在裝置上連上 VPN(也有人說要 VPN 對應的國家要涵蓋在你要測試應用對應釋出的國家範圍內,這點我沒有親測,我只知道當時我的 VPN 是加拿大,而加拿大也是在我測試的應用對應的釋出國家內)。再開啟 Google Play 應用商店,如果這時候你發現你能看到付費應用了,這說明你的“東風”也來了。

如果連上 VPN 後在 Google Play 應用商店還是看不到其他付費應用的話,先嚐試去設定那裡刪除 Google Play 的快取資料,如果還不行據說需要將你的裝置恢復一下出廠設定再連上 VPN 就可以了。

開啟你的測試 APP 點選支付,如果彈出 Google Play 的支付彈出框,說明流程都走通了。最後說一句,要想付費成功你的 Google Play 帳號必須繫結有海外支付能力的信用卡或者有海外支付能力的 Paypal 賬戶,這個只能你自己想辦法了。

祝玩得愉快~