Google支付Java服務端訂單校驗
原文鏈接:https://blog.csdn.net/qq_40193787/article/details/123507578
一、Google Play 結算系統概覽
Google Play 結算系統是一項可讓您在 Android 應用中銷售數字產品和內容的服務,
您可以使用 Google Play 結算系統銷售以下型別的數字內容:
一次性商品:一次性商品是指用戶可以通過一次性的非定期付費(通過用戶的付款方式收取)購買的內容,
一次性商品可以是消耗型商品,也可以是非消耗型商品:
- 消耗型商品是指用戶為了獲得應用內內容(如游戲代幣)而消耗的商品,當用戶消耗該商品時,您的應用會分配關聯的內容,而用戶隨后可以
再次購買相應的商品,- 非消耗型商品是指購買一次就能永久使用的商品,示例包括付費升級和關卡包等等,
訂閱:訂閱是一種讓用戶定期使用內容的商品,訂閱會自動續訂,直到被取消,訂閱的示例包括在線雜志瀏覽和音樂在線播放服務等等,
借助 Google Play 管理中心,您可以非常靈活地創建訂閱產品,例如,您可以設定結算周期、提供免費試訂、提供初次體驗價、在付款失敗時提供寬限期,以及允許用戶暫停訂閱來替代取消,如需了解詳情以及查看訂閱功能的完整串列,請參閱實作訂閱專用功能,
摘自:https://developer.android.google.cn/google/play/billing?hl=zh-cn
二、Google Play 主要支付流程
1、客戶端根據服務端提供的商品ID串列向谷歌服務器拉取Google Play控制臺配置的商品資訊,獲取商品價格并展示,
2、用戶購買商品,客戶端調起谷歌支付,
3、支付成功后,Google服務器將支付結果回傳給客戶端,
4、客戶端攜帶支付結果向服務端發送支付校驗請求,校驗通過后處理下一步業務
三、Google Play 控制臺準備
1、進入Google控制臺,選擇開發者賬號登錄
2、進入API權限設定,初始狀態是沒有的(我這里是已經創建了),直接創建一個新的專案就可以了,

3、給該API服務創建一個服務賬號,

4、按照彈窗的提示進行操作,

5、點擊創建一個服務賬號,

6、寫好必填的名稱即可直接點擊完成,

7、點擊進入剛剛創建好的賬號(可以復制一下,等等添加權限的時候需要粘貼過去),選擇添加密鑰,

8、選擇Json格式,點擊創建,然后保存好生成的Json檔案,

9、回到控制臺,給剛剛創建好的服務賬號添加權限,

10、邀請剛剛添加的服務賬戶并授權后完成邀請,


11、進入應用的商品頁面,重新保存一下商品(修改一下描述資訊,然后修改回來即可),不然請求Google服務器進行校驗時,會出現401沒有用戶沒有api權限的問題!!!!!!

至此完成了控制臺的準備作業,
四、Java 服務端處理
1、maven依賴
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-androidpublisher</artifactId>
<version>v3-rev24-1.24.1</version>
</dependency>
2、校驗代碼
/**
* @param packageName 應用程式包名
* @param productId 商品id
* @param purchaseToken 購買令牌
* @return
* @throws IOException
* @throws GeneralSecurityException
*/
public ProductPurchase checkOrder(String packageName, String productId, String purchaseToken) throws IOException, GeneralSecurityException {
GoogleCredentials credentials = GoogleCredentials.fromStream(new ClassPathResource("私鑰檔案.json").getInputStream())
.createScoped(Sets.newHashSet(AndroidPublisherScopes.ANDROIDPUBLISHER));
AndroidPublisher androidPublisher = new AndroidPublisher.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
JacksonFactory.getDefaultInstance(),
new HttpCredentialsAdapter(credentials)).build();
//一次性商品
ProductPurchase productPurchase = androidPublisher.purchases().products().get(packageName, productId, purchaseToken).execute();
//訂閱
//SubscriptionPurchase subscriptionPurchase = androidPublisher.purchases().subscriptions().get(packageName, productId, purchaseToken).execute();
System.out.println(JsonUtil.toJson(productPurchase));
return productPurchase;
}
3、私鑰檔案
{
"type": "service_account",
"project_id": "xxx",
"private_key_id": "xxx",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIE...\n-----END PRIVATE KEY-----\n",
"client_email": "xxx",
"client_id": "xxx",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/developer%40pc-api-8544243815725524966-996.iam.gserviceaccount.com"
}
4、請求結果
{
"acknowledgementState":0,
"consumptionState":0,
"developerPayload":"",
"kind":"androidpublisher#productPurchase",
"orderId":"GPA.3308-7963-0055-36023",
"purchaseState":0,
"purchaseTimeMillis":1652178403396,
"purchaseType":0,
"regionCode":"US"
}
| 欄位 | |
|---|---|
kind |
string 這種表示 androidpublisher 服務中的一個 inappPurchase 物件, |
purchaseTimeMillis |
string (int64 format) 購買產品的時間,自紀元(1970 年 1 月 1 日)以來的毫秒數, |
purchaseState |
integer 訂單的購買狀態,可能的值為: 0. 已購買 1. 已取消 2. 待定 |
consumptionState |
integer inapp產品的消費狀態,可能的值為: 0. 尚未消費 1. 已消費 |
developerPayload |
string 開發人員指定的字串,其中包含有關訂單的補充資訊, |
orderId |
string 與購買應用內產品相關的訂單 ID, |
purchaseType |
integer inapp 產品的購買型別,僅當此購買不是使用標準應用內結算流程進行時才設定此欄位,可能的值有: 0. 測驗(即從許可證測驗帳戶購買) 1. 促銷(即使用促銷代碼購買) 2. 獎勵(即通過觀看視頻廣告而不是付費) |
acknowledgementState |
integer inapp 產品的確認狀態,可能的值為: 0. 尚未確認 1. 已確認 |
purchaseToken |
string 為識別此次購買而生成的購買令牌, |
productId |
string 應用內產品 SKU, |
quantity |
integer 與購買應用內產品相關的數量, |
obfuscatedExternalAccountId |
string 與您的應用中的用戶帳戶唯一關聯的 id 的混淆版本,只有在購買時使用https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setobfuscatedaccountid指定時才會出現, |
obfuscatedExternalProfileId |
string 與您應用中的用戶個人資料唯一關聯的 id 的混淆版本,只有在購買時使用https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setobfuscatedprofileid指定時才會出現, |
regionCode |
string 授予產品時用戶的 ISO 3166-1 alpha-2 計費區域代碼, |
5、附客戶端支付結果
{
"originalJson":"{\"orderId\":\"GPA.3308-7963-0055-36023\",\"packageName\":\"com.xx\",\"productId\":\"test_001\",\"purchaseTime\":1652087527765,\"purchaseState\":0,\"purchaseToken\":\"onaneopknaamljbljegbignl.AO-J1OxgUizChLw-Zg7ouBVLEULe8aDYxARV7DAvs6ECkwbcgFI5doEDl7Ks2CXO6JWnyMmrZwZe85Nr6PA_3ycUmWMVqnK6zsdde-6WY0PkIJsn0x0VsWY\",\"quantity\":1,\"autoRenewing\":true,\"acknowledged\":false}",
"signature":"NCbU1RdAvGsrOow8lW/7x7GL4f7Ks2IbIWEQ1qPQwsapCPpjxx8Xcgyqfz8QD/kaeG+tH5l1PW7vGbObZwzxgglLQP5qmeR23sIq8srX3vAT3SUoCoEy6dYGnPomGSzJqLZOOf7e7QS/9+ivuij/J0Y1fMjpEowm+WY8LLGiHVguqpObg07rJdoMa16DaBU4/dtZUoFD3KVWPSAQRtqU/hzXG+iJ+fPEs2DMMRzTNZ4LR5V/wJEy43527imtUlk9d8vKlf2RZVSa/4pWtfdqQmBHV8b1lY4fut9gPuifUEoFxmYzQV8j6jZKEQSayS+50USecIjNh1o9eSFD1j8q4A\u003d\u003d"
}
本文來自博客園,作者:zhanglei-code,轉載請注明原文鏈接:https://www.cnblogs.com/zhanglei-code/p/16258993.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/472353.html
標籤:其他
上一篇:final關鍵字簡介說明
