2012-04-30 10 views
3

アプリではアプリを購入しています。クライアントはGoogle Playから購入をリクエストし、Google Playから受け取ったすべての情報(領収書、ノンス、注文など、署名など)を検証のためにC#で書かれたサーバーに送信します。 私はコード例を使用していますthis postCでのアプリの購入でアンドロイドを確認する#

問題は検証が失敗することです。

注:クライアントはJSON形式ですべてのデータを送信し、それが機能するために、我々はそうのようなプレー はグーグルから返された文字列を操作する:

クライアント側でサーバ側

data = data.replace("\"", "\\\""); 

data = data.Replace("\\", ""); 

編集:JSONのコード例で、アプリケーションからサーバーへ

{ 
    "data": "{\\\"nonce\\\":3768004882572571381,\\\"orders\\\":[{\\\"notificationId\\\":\\\"android.test.purchased\\\",\\\"packageName\\\":\\\"com.company.appname\\\",\\\"orderId\\\":\\\"transactionId.android.test.purchased\\\",\\\"purchaseState\\\":0,\\\"productId\\\":\\\"android.test.purchased\\\",\\\"purchaseTime\\\":1335790350398}]}", 
    "signature": "ML6ocr89x3+oT3ZKnQBEE2mNEVj6LHwt+L4I/bnhl+xCpJcjhsAIhfAumeCKwXonJV4Oh9n3Sa7SVT0F7S9XcgE2xGcf2zOZmxHB1wQcyM7fQiGj39Cyb2zuYf3T6Cs1eerDzHaO1teVQZyIhBPJf4cszD/WikSpHcF8zBTvV58FkRVwl2NR4CEvI2FrKFek8Xq2O4CsclCpS5UJorMKRAer9pcSD1BkFzynQJffbaDcRLFZ7i9vABV+GZ/xWxMGPuYYE77GYk8Q2fejgmwiZ3ysY0VjEfGRCpSA==", 
    "userId": 1 
} 

編集:そのテストは失敗します。で確認し、問題の真

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
      { 
       RSAParameters rsaKeyInfo = new RSAParameters() 
       { 
        Exponent = Convert.FromBase64String(ConfigurationManager.AppSettings["RsaKeyInfo.Exponent"]), 
        Modulus = Convert.FromBase64String(ConfigurationManager.AppSettings["RsaKeyInfo.Modulus"]) 
       }; 
       rsa.ImportParameters(rsaKeyInfo); 
       verified = rsa.VerifyData(Encoding.ASCII.GetBytes(data), "SHA1", Convert.FromBase64String(signature)); 
      } 
+0

PusherとActionScript 3.0で同じ問題が発生しました。もう少しコードを提供できますか?私はサーバーが何を期待して送信するのか、そして何を期待して送信するのかを意味します。 – goodm

+0

なぜトリプルバックスラッシュが必要ですか? –

+0

トリプルバックスラッシュは、それ自体が引用符を持っているため、バックスラッシュなしでアプリから取得した場合、形式が間違っていて、jsonからのすべての異なるパラメータを取得できないという例外が発生します。 –

答えて

2

ことになってブール変数は、()クライアントは、JSON文字列を変換しJSONObjectに、グーグルから受信し、その後のtoStringを、それをバックに変換しました。 これにより、json項目のいくつかの位置が文字列内で変更され、署名に対して異なるバイトオブジェクトが作成されましたが、これは失敗しました。例えば

- これは、JSONには、Googleから受け取った:

{ 
    "nonce": 1165723044405495300, 
    "orders": [ 
     { 
      "notificationId": "android.test.purchased", 
      "orderId": "transactionId.android.test.purchased", 
      "packageName": "com.company.appname", 
      "productId": "android.test.purchased", 
      "purchaseTime": 1335874740360, 
      "purchaseState": 0 
     } 
    ] 
} 

をあなたが戻って文字列(json.toString())に、次にJSONObject(new JSONObject(json))にそれを操作した場合、それが位置変更となったことができますJSON項目の一部について、例えば(注文IDはもう注文配列に第二ない注意):

{ 
     "nonce": 1165723044405495300, 
     "orders": [ 
      { 
       "notificationId": "android.test.purchased", 
       "packageName": "com.company.appname", 
       "productId": "android.test.purchased", 
       "purchaseTime": 1335874740360, 
       "orderId": "transactionId.android.test.purchased", 
       "purchaseState": 0 
      } 
     ] 
    } 

GetBytesメソッド(データ)が同じ結果を返さない、その検証が失敗します。

解決策はもちろんGoogleから受け取ったjson文字列を操作しないようにすることです。あなたが構築しているJSONObjectに入れてください。 jsonObj.put( "data"、jsonStringFromGoogle)。

関連する問題