从A页面传送ID和Name到B页面,路径如下
到达B页面后调用微信JDK接口,多次尝试失败"报invalid signature签名 "错误.
经过一番检查发现http://www.XXX.com/wx/CustomerEdit?CustomerID=694访问没问题
那么就是中文转义的问题!
查看google浏览器的地址栏地址http://www.XXX.com/wx/CustomerEdit?CustomerID=694&CustomerName=自动转义的中文
后台跟踪,默认asp.net会自动转义,将前台传送的字符解密.
处理:
将Request.Url更换为Request.Url.AbsoluteUri去实现signature生成
原因如下
UriBuilder builder = new UriBuilder("http://xxx/xxx");
builder.Query = "somekey=" + HttpUtility.UrlEncode("some+value");
Uri someUri = builder.Uri;
Response.Write("<p>" + someUri.AbsoluteUri + "</p>");
Response.Write("<p>" + someUri.ToString() + "</p>");
http://xxx/xxx?somekey=some%2bvalue
http://xxx/xxx?somekey=some+value
- 可以看出 AbsoluteUri 是经过编码的,如果访问这个网址,再取 somekey 的值,结果为“some+value”,
- 符合原值。
- 而 ToString() 是取原值,如果访问这个网址,再取 somekey 的值时,结果为“some value”,
- 与原值不符。
- 如果要在微信中使用Uri,则使用 AbsoluteUri;如果要获得未编码的 Uri,则直接使用 Uri.ToString().