昨天下午易宝维护人员联系我,询问我三笔订单的状态,他们是扣费成功了,我们这还是订单待扣费状态,经过检查发现双方的签名有问题,仔细一看这三笔订单都有一个共性,用户名都包含中文,然后就对症下药。。。
由于易宝再扣费成功后通知我方前,对字符串用gb2312 urlencode了,而我方接口是用.net实现的,所以默认的编码格式是utf-8,所以接收到请求后就把字符串的内容用utf-8 urldecode了,导致我这边HttpUtility.UrlDecode(Request["user_name"], Encoding.GetEncoding("GB2312")) 获得到的数据就是乱码了。
现在问题找到原因了,怎么修改呢。。。
我查看了整个request对象,发现Request.Url.Query中,获得的参数是最原始的没有经过url解码前的值然后就这么修改了
1 public static NameValueCollection GetQueryString(string queryString, Encoding encoding)
2 {
3 queryString = queryString.Replace("?", "");
4 NameValueCollection result = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
5 if (!string.IsNullOrEmpty(queryString))
6 {
7 int count = queryString.Length;
8 for (int i = 0; i < count; i++)
9 {
10 int startIndex = i;
11 int index = -1;
12 while (i < count)
13 {
14 char item = queryString;
15 if (item == '=')
16 {
17 if (index < 0)
18 {
19 index = i;
20 }
21 }
22 else if (item == '&')
23 {
24 break;
25 }
26 i++;
27 }
28 string key = null;
29 string value = null;
30 if (index >= 0)
31 {
32 key = queryString.Substring(startIndex, index - startIndex);
33 value = queryString.Substring(index + 1, (i - index) - 1);
34 }
35 else
36 {
37 key = queryString.Substring(startIndex, i - startIndex);
38 }
39
40 result[key] = HttpUtility.UrlDecode(value, encoding);
41
42 if ((i == (count - 1)) && (queryString == '&'))
43 {
44 result[key] = string.Empty;
45 }
46 }
47 }
48 return result;
49 }
50
51 NameValueCollection col = GetQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"));
52 string user_id = col["user_name"];
|