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);

 

posted @ 2015-03-20 10:52  沙漠绿洲uibe  阅读(3578)  评论(0编辑  收藏  举报