web-dev-qa-db-ja.com

Android:アプリ内購入の領収書検証Google Play

製品googleを購入した後、支払いゲートウェイにGoogleウォレットを使用しています。

{ 
 "orderId":"12999763169054705758.1371079406387615", 
 "packageName":"com.example.app",
 "productId":"exampleSku",
 "purchaseTime":1345678900000,
 "purchaseState":0,
 "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
 "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }

私はReceipt Validationを使用して、Google Playが新しく導入しました。GoogleDeveloper Consoleでcertificate keyをPermissionのサービスアカウントで作成しました。しかし、Google Playストアから製品を購入した後、領収書検証を利用する方法がわかりません。

だから誰でも領収書の検証 of InApp購入の方法を教えてください。

70
Binil Surendran

Googleは Google Play Developer API を介してレシート検証を提供します。APIには、最も関心のある2つのエンドポイントがあります: Purchases.products:get および Purchases。サブスクリプション:get

Purchases.products: getは、自動更新されていない製品の購入を確認するために使用できます。Purchases.subscriptions: getは、自動更新された製品のサブスクリプションを確認および再確認するためのものです。

いずれかのエンドポイントを使用するには、packageNameproductIdpurchaseTokenを知っている必要があります。これらはすべて、購入時に受け取ったペイロードに含まれています。また、Google APIサービスアカウントを作成して取得できるaccess_tokenも必要です。

サービスアカウントの使用を開始するには、まずGoogle Playデベロッパーコンソール APIアクセス設定ページ に移動し、[新しいプロジェクトを作成]ボタンをクリックします。

Create a new Google API Project

これで、新しいリンクプロジェクトといくつかの新しいセクションが表示され、[サービスアカウント]セクションで[サービスアカウントの作成]ボタンをクリックします。

Create a new Service Account

サービスアカウントの作成手順が記載された情報ボックスが表示されます。 Google Developers Consoleへのリンクをクリックすると、新しいタブが表示されます。

Open the Google Developers Console

[新しいクライアントIDの作成]をクリックし、オプションから[サービスアカウント]を選択して、[クライアントIDの作成]をクリックします。

Create a new Client ID

JSONファイルがダウンロードされます。これはaccess_tokenとの交換に使用するJSON Webトークンなので、安全に保管してください。

次に、タブをGoogle Playデベロッパーコンソールに切り替え、情報ボックスで[完了]をクリックします。リストに新しいサービスアカウントが表示されます。サービスアカウントのメールの横にある[アクセスを許可]をクリックします。

Grant access

[このユーザーの役割を選択してください]の下で、[財務]を選択し、[ユーザーの追加]をクリックします。

Set the role to Finance

これでサービスアカウントが設定され、受信確認を実行するために必要なすべてのアクセス権が与えられました。次は、JWTをaccess_tokenに交換します。

access_tokenは1時間の交換後に期限切れになるため、これを処理するためにサーバーコードが必要であり、Googleはこれを処理するために多くの言語でいくつかのライブラリを提供しています(完全ではありません):

これらのライブラリの使用方法に関するドキュメントはたくさんあるので詳細には触れませんが、OAuth2スコープとしてhttps://www.googleapis.com/auth/androidpublisherを使用し、JWTからclient_emailを使用したいことを述べます。 issuerおよびprivate_keyから取得できる公開鍵とパスフレーズnotasecretsigning_keyに使用されます。

access_tokenが得られたら(少なくとも次の1時間は、上記の同じプロセスに従って新しいものを要求します)。

消耗品(非自動更新)の購入のステータスを確認するには、http getリクエストを行って:https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

200のHTTP応答コードを受け取った場合、すべてが計画どおりに進み、購入は有効でした。 404はトークンが無効であることを意味するため、購入は不正行為である可能性があります。 401はアクセストークンが無効であることを意味し、403はサービスアカウントに十分なアクセス権がないことを意味します。GooglePlayデベロッパーコンソールでアクセスアカウントに対してFinanceを有効にしたことを確認してください。

200からの応答は次のようになります。

{
  "kind": "androidpublisher#productPurchase",
  "purchaseTimeMillis": long,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string
}

各プロパティの説明については、 https://developers.google.com/Android-publisher/api-ref/purchases/products をご覧ください。

サブスクリプションは似ていますが、エンドポイントは次のようになります。

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token?access_token=you_access_token

そして、応答には次のプロパティが含まれている必要があります。

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean
}

プロパティの説明については https://developers.google.com/Android-publisher/api-ref/purchases/subscriptions を参照し、startTimeMillisおよびexpiryTimeMillisが対象になることに注意してくださいサブスクリプションの期間に応じて変更します。

幸せな検証!

176
Marc Greenstock

マークの答えは素晴らしい。サーバーからGoogle Playサーバーに接続するときに Java用Google Play開発者APIクライアントライブラリ を使用すると、より簡単になります。ライブラリは自動的に認証トークンの更新を処理し、タイプセーフAPIも提供するため、URLをいじる必要はありません。

Publisherシングルトンを設定する方法は次のとおりです。

httpTransport = GoogleNetHttpTransport.newTrustedTransport();
jsonFactory = JacksonFactory.getDefaultInstance();      
credential = GoogleCredential.fromStream(getClass().getResourceAsStream("/path/to/your/key.json")).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));
publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build();

次のコードは、製品の購入を照会します。

ProductPurchase product = publisher.purchases().products().get(PACKAGE_NAME, sku, token).execute();
Integer purchaseState = product.getPurchaseState();
product.getPurchaseTimeMillis();
product.getConsumptionState();
product.getDeveloperPayload();

同様に、サブスクリプションを照会できます。

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...
19
Jeshurun

この答えは素晴らしいです。指示に従うときに発生したもう1つの問題は、サービスアカウントがGoogle Playコンソールに表示されなかったことです。最終的に、この解決策を見つけることができました: 作成後にサービスアカウントがGoogleコンソールに表示されない

基本的に、Google API ConsoleのIAMにアクセスして新しいサービスアカウントを追加すると、Google Play Consoleに表示されます。 スクリーンショット

0
soarling