2014-01-14 86 views
1

我正在使用Google Play應用內購買的Android應用。我也有一個服務器應用程序(JAVA)在後臺工作。每當用戶在應用程序中成功進行購買(購買工作)時,服務器應用程序應向Google Play發送請求以驗證購買。Google androidpublish api access_token

谷歌Play是提供了androidpublisher API爲: developers.google.com/android-publisher/getting_started

的問題是的access_token。無論何時我獲得新的access_token(無論是刷新還是新的令牌請求方法),如果嘗試使用GET方法從Google Play商店(https://developers.google.com/android-publisher/v1/purchases/get)向購買inapp項目詢問信息,則無法使用 - >它總是導致錯誤401(無效憑證)或403(訪問未配置)。 https://developers.google.com/apis-explorer/#p/androidpublisher/v1.1/androidpublisher.inapppurchases.get,我只可以從那裏讀有效的access_token,只與該令牌,我可以得到我的服務器應用程序工作,但是:經過不斷嘗試我發現,我只能得到該方法與環節的工作

只爲一個小時,1小時後,我不得不再次做同樣的步驟...

現在我真的需要一個合適的方式來獲得一個有效的access_token我的申請

我已經研究了很多互聯網上,但我找不到有用的東西。 我知道我不是唯一一個有這個問題的人,或許你們有人知道該怎麼做或已經有過這種經歷

回答

1

您可以使用com.google.api-clientgoogle-api-services-androidpublisher庫。

首先去谷歌開發者控制檯上的項目(https://console.developers.google.com

  • 的API &驗證 - >的API
  • 啓用 「谷歌Play Android開發者API」
  • 轉到證書 - >創建新客戶端ID
  • 選擇服務帳戶
  • 創建客戶端ID
  • 保存P1 2文件保存在某個安全

那麼對於服務帳戶添加剛纔生成的電子郵件地址,你的谷歌遊戲開發者控制檯(https://play.google.com/apps/publish/

  • 設置 - >用戶帳戶&權利 - >邀請新用戶
  • 粘貼@developer.gserviceaccount.com電子郵件帳戶
  • 選擇「查看財務報表」
  • 發送邀請

現在的代碼。將以下依賴關係添加到您的pom中。xml文件:

<dependency> 
    <groupId>com.google.api-client</groupId> 
    <artifactId>google-api-client</artifactId> 
    <version>1.18.0-rc</version> 
</dependency> 
<dependency> 
    <groupId>com.google.http-client</groupId> 
    <artifactId>google-http-client-jackson2</artifactId> 
    <version>1.18.0-rc</version> 
</dependency> 
<dependency> 
    <groupId>com.google.apis</groupId> 
    <artifactId>google-api-services-androidpublisher</artifactId> 
    <version>v1.1-rev25-1.18.0-rc</version> 
</dependency> 

那麼首先驗證簽名:

byte[] decoded = BASE64DecoderStream.decode(KEY.getBytes()); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(decoded)); 
Signature sig = Signature.getInstance("SHA1withRSA"); 
sig.initVerify(publicKey); 
sig.update(signedData.getBytes()); 
if (sig.verify(BASE64DecoderStream.decode(signature.getBytes()))) 
{ 
    // Valid 
} 

如果簽名驗證獲取訂閱詳情:

// fetch signature details from google 
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 
GoogleCredential credential = new GoogleCredential.Builder() 
    .setTransport(httpTransport) 
    .setJsonFactory(jsonFactory) 
    .setServiceAccountId(ACCOUNT_ID) 
    .setServiceAccountScopes(Collections.singleton("https://www.googleapis.com/auth/androidpublisher")) 
    .setServiceAccountPrivateKeyFromP12File(new File("key.p12")) 
    .build(); 

AndroidPublisher pub = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential) 
    .setApplicationName(APPLICATION_NAME) 
    .build(); 
AndroidPublisher.Purchases.Get get = pub.purchases().get(
    APPLICATION_NAME, 
    PRODUCT_ID, 
    token); 
SubscriptionPurchase subscription = get.execute(); 
System.out.println(subscription.toPrettyString()); 

這將產生一個充分利用所有的令牌問題護理JWT令牌,因此您不必親自處理它。

+0

謝謝你這麼多我得到它與你的代碼:) 我不明白的是上面的代碼爲什麼你實現驗證,你的意思是什麼「簽名」和什麼是變量「KEY」應該是? – user3193443

相關問題