40

ユーザーがダウンロード可能なコンテンツを利用できるようにする前に、サーバー上でアプリ内課金の購入を確認する方法について、率直な答えを見つけることができません。

アプリ課金バージョン 3 で使用します。TrivialDrive サンプル コードの IabHelper クラスに基づくコードを使用して、管理対象製品を購入します。すべてがうまくいき、購入が正常に完了しました。完全な Purchase オブジェクトが返され、次の元の JSON データが返されます。

{
    "orderId":"12999763169054705758.1364365967744519",
    "packageName":"my package name",
    "productId":"77",
    "purchaseTime":1366217534000,
    "purchaseState":0,
    "purchaseToken":"utfwimslnrrwvglktizikdcd.AO-J1OwZ4l5oXz_3d2SAWAAUgFE3QErKoyIX8WuSEnBW26ntsyDmlLgoUd5lshqIY2p2LnlV4tpH4NITB4mJMX98sCtZizH7wGf6Izw3tfW_GflJDKFyb-g"
}

私が理解しているように、 purchaseToken と、署名と呼ばれるものをサーバーに渡す必要があります。次に、サーバーは秘密鍵を使用して購入を確認します。これは正しいです?もしそうなら、どこから署名を取得すればよいですか?また、購入のサーバー側の検証に関する適切なドキュメントは本当にありませんか?

4

5 に答える 5

23
where do I get the signature from ?

公式ドキュメントを見て、

例に示すように、メソッド内でonActivityResult()次のデータを取得できると書かれています。

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
   if (requestCode == 1001) {           
      int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
      String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
      String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");//this is the signature which you want

      if (resultCode == RESULT_OK) {
         try {
            JSONObject jo = new JSONObject(purchaseData);//this is the JSONObject which you have included in Your Question right now
            String sku = jo.getString("productId");
            String purchaseToken = jo.getString("purchaseToken");
           //you need to send sku and purchaseToken to server for verification
          }
          catch (JSONException e) {
             alert("Failed to parse purchase data.");
             e.printStackTrace();
          }
      }
   }
}

サーバー側での検証については公式ドキュメントをご覧ください

前述のように、クライアント アプリはサーバー API に送信しますskupurchaseTokenサーバーはこれらの値を受け取る必要があり、購入を確認するために Android パブリッシュ API でチェックを実行する必要があります。

サーバーは、必要なパラメーターを追加して、次のGET 要求を呼び出すことができます。

https://www.googleapis.com/androidpublisher/v2/applications/ packageName /purchases/products/ productId /tokens/ token

ここで、
packageName = クライアント アプリの
パッケージ名 productId = クライアント アプリから受け取った sku
token = クライアント アプリから受け取った purchaseToken

JSONObject前述の形式の応答になります。

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

ここで、purchaseState = 0 は有効な購入を意味します

参考になれば幸いです!!

于 2013-04-17T18:37:23.237 に答える
3

これは古すぎる質問ですが、私の答えが誰かの役に立てば幸いです。

クライアント側で署名を検証する必要があり、次にサーバー側purchaseTokenに渡す必要があります。その後、サーバーはGoogle のサーバーに接続し、購入に関するすべての必要な情報 ( や など) を取得します。purchaseStateconsumptionState

https://developers.google.com/android-publisher/api-ref/purchases/products

于 2016-03-30T10:14:53.220 に答える