Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中验证android应用内购买#_C#_Android_Json_In App Purchase_In App Billing - Fatal编程技术网

C# 在c中验证android应用内购买#

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("\\", "")

在我们的应用程序中,我们有一个应用程序内购买。客户端请求从google play购买,并将从google play收到的所有信息(收据、临时收据、订单等以及签名)发送到服务器,以c#书写,进行验证。 我正在使用来自的代码示例

问题是验证失败了

注意:客户端以JSon格式发送所有数据,为此,我们操作字符串 从google play返回,如下所示:

在客户端

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
            }
        ]
    }