HttpUtility.UrlEncode编码重写
1. 某些系统方法,例如.NET系统方法HttpUtility.UrlEncode会将‘=’编码成‘%3d’,而不是%3D,导致加密签名通不过验证,请开发者注意检查。
2.Java 1.3和早期版本中,调用java.net.URLEncoder下的方法进行URL编码时,某些特殊字符并不会被编码,例如星号(*)。 由于URL编码规则中规定了星号(*)必须编码,因此在请求字符串中含星号(*)的情况下如果使用了上述方法,会导致生成的签名不能通过验证。 例如调用v3/pay/buy_goods接口时, payitem参数值中一定会含有* ,在使用类java.net.URLEncoder下的方法进行编码后,需开发人员手动将星号字符“*”替换为“%2A”,否则将导致加密签名一直通不过验证,请开发者注意检查。
3. 某些语言的urlencode方法会把“空格”编码为“+”,实际上应该编码为“%2B”。这也将生成错误的签名,导致签名通不过验证。 请开发者注意检查,手动将“+”替换为“%2B”。 在PHP中,推荐用rawurlencode方法进行URL编码。
下面是关于c#语言对UrlEncode重写:
/// <summary> /// UrlEncode重写:小写转大写,特殊字符特换 /// </summary> /// <param name="strSrc">原字符串</param> /// <param name="encoding">编码方式</param> /// <param name="bToUpper">是否转大写</param> /// <returns></returns> private string UrlEncode(string strSrc, System.Text.Encoding encoding, bool bToUpper) { System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); for (int i = 0; i < strSrc.Length; i++) { string t = strSrc[i].ToString(); string k = HttpUtility.UrlEncode(t, encoding); if (t == k) { stringBuilder.Append(t); } else { if (bToUpper) stringBuilder.Append(k.ToUpper()); else stringBuilder.Append(k); } } if (bToUpper)
return stringBuilder.ToString().Replace("+", "%2B"); else
return stringBuilder.ToString();
}
调用方法:
string org_loc = this.UrlEncode("/dfdasf/get_api_m", Encoding.UTF8, true);