1. 某些系統方法,例如.NET系統方法HttpUtility.UrlEncode會將‘=’編碼成‘%3d’,而不是%3D,致使加密簽名通不過驗證,請開發者注意檢查。java
2.Java 1.3和早期版本中,調用java.net.URLEncoder下的方法進行URL編碼時,某些特殊字符並不會被編碼,例如星號(*)。 因爲URL編碼規則中規定了星號(*)必須編碼,所以在請求字符串中含星號(*)的狀況下若是使用了上述方法,會致使生成的簽名不能經過驗證。 例如調用v3/pay/buy_goods接口時, payitem參數值中必定會含有* ,在使用類java.net.URLEncoder下的方法進行編碼後,需開發人員手動將星號字符「*」替換爲「%2A」,不然將致使加密簽名一直通不過驗證,請開發者注意檢查。c#
3. 某些語言的urlencode方法會把「空格」編碼爲「+」,實際上應該編碼爲「%2B」。這也將生成錯誤的簽名,致使簽名通不過驗證。 請開發者注意檢查,手動將「+」替換爲「%2B」。 在PHP中,推薦用rawurlencode方法進行URL編碼。api
下面是關於c#語言對UrlEncode重寫:ui
/// <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);