Android:アプリ内購入レシート検証グーグルプレイ


97

ペイメントゲートウェイにグーグルウォレットを使用しています。グーグルの製品を購入した後、以下の応答があります。

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

グーグルプレイが新たに導入したレシート検証を利用しようとしています。グーグルデベロッパーコンソールで、パーミッションのサービスアカウントで証明書キーを作成しました。しかし、Google Playストアから商品を購入した後、レシート検証を利用する方法がわかりません。

だから誰かが購入の領収書の検証を行う方法を教えてくださいInApp


こんにちはビニル、サブスクリプション購入のためにそれを完了しましたか?
Anshul Tyagi 2016

その管理製品@AnshulTyag
Binil Surendran

@BinilSurendran ..私の質問はあなたの質問とは異なりますが、アプリ内購入に使用されたメールIDを知る必要があります。私のアプリでさらに参照するために必要なので、そのメールを取得する方法を教えてください
Pallavi 2016年

@Pallavi。申し訳ありませんが、購入者のメールIDを取得するためのアイデアがありません。購入後にグーグルによって与えられた応答にはemail_idがないので
Binil Surendran

回答:


221

Googleは、Google Play Developer APIを介してレシート検証を提供します。API内には、Purchases.products:getPurchases.subscriptions:getの2つのエンドポイントがあります。

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

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

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

新しいGoogleAPIプロジェクトを作成する

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

新しいサービスアカウントを作成する

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

Google DevelopersConsoleを開きます

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

新しいクライアントIDを作成します

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

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

アクセス許可

次に、[このユーザーの役割の選択]で、[財務]を選択し、[ユーザーの追加]をクリックします。

役割を財務に設定します

これでサービスアカウントが設定され、領収書の検証を実行するために必要なすべてのアクセス権があります。次は、JWTをaccess_tokenと交換します。

access_tokenあなたがそうこれを処理すると、Googleは、この(網羅的ではないリスト)を処理するために多くの言語で、いくつかのライブラリを提供しているいくつかのサーバーコードを必要と為替の1時間後に期限切れになります:

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

準備ができたらaccess_token(少なくとも次の1時間は、上記の段落と同じプロセスに従って新しいものをリクエストする必要があります)。

消耗品(自動更新ではない)購入のステータスを確認するには、次の宛先にhttpgetリクエストを送信します。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デベロッパーコンソールでアクセスアカウントのファイナンスが有効になっていることを確認してください。

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をプロパティの説明とノートのstartTimeMillisexpiryTimeMillis対象がサブスクリプションの期間に応じて変更することになります。

検証をお楽しみください!


開発者コンソールに新しいユーザーを追加し、コンソールから取得するJSON証明書を取得しました。ダウンロードしたファイル@Marc Greenstock
Binil Surendran

@BinilSより具体的にする必要があります。コードを記述するサーバー側の言語は何ですか?
マークグリーンストック2016

サーバーサイドでJavaを使用しています@MarcGreenstock
Binil Surendran

3
2日間の検索でサーバー支払いの検証を実装するための詳細なガイドを見たのはこれが初めてです。いいぞ。どこかにサーバーコードを使用する準備ができていますか?そのようなものがどこにも見つからないのは非常に奇妙だと思います
匿名

2
@MarcGreenstock詳細な回答をありがとう。
Lavakush 2017

28

マークの答えは素晴らしいです。Java用のGooglePlay Developer APIクライアントライブラリを使用すると、サーバーからGooglePlayサーバーに接続するときにはるかに簡単になることを付け加えておきます。ライブラリは認証トークンの更新を自動的に処理し、タイプセーフ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();
...

これはJavaサーバー上のコードですか、それとも任意のサーバーに呼び出す前にAndroidで実行されますか?
ユーザー

2
@jeshurunコードをありがとう。他の読者へAPP_NAME = APP_PACKAGE_NAME
ブリザード2017

1
Pythonはどうですか?
BabkenVardanyan18年

1
ありがとうございました!私の代わりgetClass().getResourceAsStream(...に使用しましたnew FileInputStream(...
アントニオアルメイダ

ありがとう。非常に便利。ただし、credential.refreshToken();資格情報の取得と発行者の間にも追加する必要が ありました。
grooble

5

@ marc-greenstockは素晴らしい答えを提供しましたが、Google Play Android DeveloperAPIを使用したレシート検証には非常に重要なことがあります。

このAPIの使用に問題があり、権限を付与したりサービスアカウントにリンクしたりする前にアプリ内製品を追加した場合は、「アプリ内製品」を開いて更新を実行する必要があります。たとえば、商品の説明を編集して保存することができます。すぐに許可を得る必要があります。

私は何を間違えたのか考えて数時間を過ごしました...


2

この答えは素晴らしいです。指示に従っていたときに遭遇したもう1つの問題は、サービスアカウントがGooglePlayConsoleに表示されなかったことです。結局、この解決策が役立つことがわかりました。作成後にサービスアカウントがGoogleコンソールに表示されない

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


ここに説明を追加できますか。それ以外の場合、リンクが取り消された場合、回答は無効になります
MathewsSunny18年

1
追加されたアカウントの役割はどうあるべきですか?
アディ

1

私は同様の問題に直面しました、問題は私たちがグーグル開発者プロジェクトで行う設定にあります。

設定については、create-play-service-credentialsを参照しください。アプリ内製品を作成したときと同じプライマリアカウントを使用します。

必ず前のものを削除してください。

Google DeveloperProjectへのリンクPlayDeveloperアカウントはGoogleDeveloperProjectにリンクする必要があります。

1a。[設定]> [開発者アカウント]メニューを開き、[APIアクセス]を選択します

APIアクセス

1b。リンクを選択して、PlayアカウントをGoogle DeveloperProjectに接続します

選択-プロジェクト-リンク

1c。利用規約に同意する

同意-条件-条件

2.サービスアカウントの作成 次に、サービスアカウントを作成する必要があります。これは、GoogleAPIコンソールから実行されます。

2a。[サービスアカウントの作成]を選択します

create-service-account

2b。サービスアカウントキーの資格情報を作成する

サービスアカウント

2c。サービスアカウントの詳細を入力します

enter-service-account-details

2d。JSON認証情報をダウンロードします。 json-credentials

3.アクセスを許可する

3a。Playコンソールで、新しく作成したサービスアカウントで[アクセスを許可]を選択します

アクセス許可

3b。次の権限を付与します。

適用-許可

この後、48時間待って、GoogleがAPIのすべてのアクセス権を伝播できるようにします。


1
こんにちは、私はこの手順に従ってGoogle Play Android Developer APIにアクセスしました。この権限を付与している間、ユーザーを招待するように求められます。どうすればよいですか。「サービスアカウントID」がこの開発者アカウントにアクセスするように招待されます。 .. 何か案が ?
Jay RathodRJ20年

これはsasikanth.dev/posts/iap-verification-using-cloud-functionsの代替手段ですか?Firebaseを使用するかどうかは完全に混乱しています.....データベースが必要なため(ブログから)、購入情報をデータベースに保存し、サブスクリプションの重複を避けるために他のユーザーとクロスチェックすることをお勧めします
RahulKahale20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.