2012-04-30 53 views
3

在我們的應用程序,我們有一個應用程序內購買。客戶要求從谷歌播放購買,併發送從谷歌播放收到的所有信息(收據,隨機數,訂單等和簽名)到服務器,用C#編寫,以便驗證。 我正在使用代碼示例this post驗證android在應用程序購買c#

問題是驗證失敗。

注:客戶端發送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從谷歌獲得:

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

,如果你操縱它到一個JSONObject(new JSONObject(json)),然後返回一個字符串(json.toString()),它可以產生一個位置變化對於一些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會(數據)不返回相同的結果,爲此驗證失敗。

解決方案當然是避免操縱從谷歌收到的JSON字符串。只要把它放在你正在構建的JSONObject中。 jsonObj.put(「data」,jsonStringFromGoogle)。