0

Androidアプリからアプリ内購入をどのように処理できるかについて学習しています。私はthis documentを読んでいます。ユーザーの支払い情報を収集して、Google Playのサーバーと通信のGoogle Playアプリのと通信します(クライアントAKA)アイテムがユーザーによって購入されたかどうかを確認するためにGoogle Play Serverに問い合わせることはできますか?

私のAndroidアプリ:

基本的には、この文書は説明の流れは以下の通りです。 。 Google Playサーバーはアイテムをユーザーに割り当て、Google Playアプリに応答し、購入したことをクライアントに伝えます。その後、クライアントは商品を配送し、その商品が消費されたことをGoogle Play Appに報告します。これにより、Google Playサーバーは商品を消費済みとしてマークします。

セキュリティ上の問題が発生します。クライアントがアイテムを購入したことをサーバーに伝えてアイテムを配信します。私のサーバはアイテムを配送するサーバです。私のクライアントアプリケーションはマルチプレイヤーゲームです。このため私のサーバーはにはがあります。クライアントアプリケーションだけでは実行できません。

しかし、上記のフローでは、私のサーバーがクライアントを信頼する必要があります。クライアントがハッキングされている場合や、悪意のあるプログラムに置き換えられた場合、クライアントは任意のアイテムを何度も配信するようにサーバーに指示することができます。私のサーバーが、これらの購入が正当なものであるかどうかを確認する方法があります。セキュリティリスクです。

代わりに、私のサーバーでGoogle Playサーバーに尋ねます:このユーザーは実際にこのアイテムを所有していますか? Google Play Serverが報告する回答は信頼できるものでした。しかし、そうするAPIはありますか?もしそうなら、その文書はどこにありますか?そのようなAPIがない場合、マルチプレーヤーゲームはどのようにして購入のセキュリティを保証しますか?

答えて

1

このQuerying for purchased itemsトピックが役立つかもしれない:

を購入したアイテム

あなたのアプリからユーザーによって作られて購入に関する情報を取得するためのクエリ、INにgetPurchasesメソッドを呼び出しますアプリ課金サービス。 アプリ内課金APIのバージョン、お電話番号 アプリのパッケージ名、購入タイプ(「inapp」または「subs」)をメソッドに渡します。ここで は例です:

Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null); 

Google Playのサービスは、現在デバイスにログインしているユーザー アカウントによって行われたのみの購入を返します。要求が であれば、返されたBundleのレスポンスコードは0になります。応答 バンドルには、プロダクトIDのリスト、各購入の詳細 の詳細、購入ごとのシグニチャのリストが含まれています。

パフォーマンスを向上させるため、In-app Billingサービスは、getPurchaseが最初に呼び出されたときにユーザーが所有する製品を最大で 個返します。 が呼び出されます。ユーザーが多数の商品を所有している場合、Google Play には、返品バンドルの INAPP_CONTINUATION_TOKENキーにマッピングされた文字列トークンが含まれており、 商品をさらに検索できることを示しています。その後、アプリケーションは次の getPurchases呼び出しを行い、このトークンを引数として渡すことができます。 Google Play は、応答バンドルの継続トークンを まで返品し、ユーザーが所有するすべての商品がアプリに送信されます。

getPurchasesから返されるデータの詳細については、 「In-app Billing Reference」を参照してください。次の例では、 応答からこのデータを取得する方法を示しています。

理想的
int response = ownedItems.getInt("RESPONSE_CODE"); 
if (response == 0) { 
    ArrayList<String> ownedSkus = 
     ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST"); 
    ArrayList<String> purchaseDataList = 
     ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST"); 
    ArrayList<String> signatureList = 
     ownedItems.getStringArrayList("INAPP_DATA_SIGNATURE_LIST"); 
    String continuationToken = 
     ownedItems.getString("INAPP_CONTINUATION_TOKEN"); 

    for (int i = 0; i < purchaseDataList.size(); ++i) { 
     String purchaseData = purchaseDataList.get(i); 
     String signature = signatureList.get(i); 
     String sku = ownedSkus.get(i); 

     // do something with this purchase information 
     // e.g. display the updated list of products owned by user 
    } 

    // if continuationToken != null, call getPurchases again 
    // and pass in the token to retrieve more items 
} 
+0

これは、私のサーバーではなく、デバイス上のアプリケーションから呼び出されなければならないようです。 '' Google Playサービスは、現在デバイスにログインしているユーザーアカウントで行われた購入のみを返します。 "'私のサーバーは、購入したアイテムをGoogle Playから(アプリを信用することなく)見つけることができます。まだ消費されていない。 –

+1

アプリの請求でGoogle Playを試したことがありませんので、私が引用できるのは公式ドキュメントです。あなたがしていることがサポートされているかどうかは分かりません。 – noogui

0

、我々は上で使用できるサードパーティのアプリを見てきましたので、あなたは、クライアント上で行わ購入を信用してはいけませんGoogle Playストアとのやりとりを模倣したjailbroken Android携帯

  1. リスト項目
  2. は、サーバー上で生成された購入トークンを使用してアプリの購入フローを通じて行く必要があります。
  3. サーバーに購入情報を送信し、クライアント
  4. の購入情報を受信 - 購入・トークンを確保するため、製品、注文情報
  5. 有効な購入を確認するためにGoogleにサーバーの話を持っている - https://developer.android.com/google/play/billing/api.html を見ます
  6. 確認後、返信をクライアントに返します。
  7. クライアントにGoogleへの返信を依頼してください。購入依頼は消費されたものとしてマークされます。
関連する問題