C# 在c中验证android应用内购买#
在我们的应用程序中,我们有一个应用程序内购买。客户端请求从google play购买,并将从google play收到的所有信息(收据、临时收据、订单等以及签名)发送到服务器,以c#书写,进行验证。 我正在使用来自的代码示例 问题是验证失败了 注意:客户端以JSon格式发送所有数据,为此,我们操作字符串 从google play返回,如下所示: 在客户端C# 在c中验证android应用内购买#,c#,android,json,in-app-purchase,in-app-billing,C#,Android,Json,In App Purchase,In App Billing,在我们的应用程序中,我们有一个应用程序内购买。客户端请求从google play购买,并将从google play收到的所有信息(收据、临时收据、订单等以及签名)发送到服务器,以c#书写,进行验证。 我正在使用来自的代码示例 问题是验证失败了 注意:客户端以JSon格式发送所有数据,为此,我们操作字符串 从google play返回,如下所示: 在客户端 data = data.replace("\"", "\\\""); 在服务器端 data = data.Replace("\\", "")
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
}
编辑:该测试失败。verified是一个布尔变量,应该为true
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));
}
问题是客户端将从google接收的JSON字符串转换为JSONObject,然后将其转换回string()。 这导致一些json项在字符串中的位置发生变化,从而为签名创建了一个不同的bytes对象,但失败了 例如,这是从google收到的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(newJSONObject(json)
),然后再操作回一个字符串(json.toString()
),则可能会导致某些json项的位置更改,例如(请注意orderId不再是orders数组中的第二个):
GetBytes(数据)不返回相同的结果,因此验证失败
当然,解决方案是避免操纵从google收到的json字符串。把它放在你正在构建的JSONObject中。Pusher和ActionScript3.0也有同样的问题。你能提供更多的代码吗?我指的是服务器期望和发送的内容,以及应用程序期望和发送的内容。为什么需要三个反斜杠?三个反斜杠是因为字符串本身带有引号,如果我从应用程序中获得它而没有反斜杠,我得到一个例外,格式是错误的,我没有从json@goodmHaglund-更新的回答我不知道如何使用JSON来处理c,但是当我使用as 3时遇到问题,这是因为flash expect String,所以我不得不在开始时添加三重\和双重\\\": 376 ....
{
"nonce": 1165723044405495300,
"orders": [
{
"notificationId": "android.test.purchased",
"packageName": "com.company.appname",
"productId": "android.test.purchased",
"purchaseTime": 1335874740360,
"orderId": "transactionId.android.test.purchased",
"purchaseState": 0
}
]
}