为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝。目前支持的签名算法只支持MD5,签名大体过程如下:
将除Sign参数外的所有“参数 参数值”进行字典排序生成串,而后将AppSecret加到该串的首尾转小写进行MD5加密,此时的生成的串即为Sign。例:
method=Differ.JH.Business.GetOrder
appkey=438b2f6ff103422a98a9349507293bb2
token=9415c33b04d24c7dae320b0185f42fb0
platid=500
version=1.0
bizcontent={"a":"a1","b":"b1"}
contenttype=json
按字典排序生成的串为:appkey438b2f6ff103422a98a9349507293bb2bizcontent{"a":"a1","b":"b1"}contenttypejsonmethodDiffer.JH.Business.GetOrderplatid500token9415c33b04d24c7dae320b0185f42fb0version1.0。
若Appsecret=5ee2084de90043be989d4d99d0dd0eaa,则Sign=MD5(转小写(5ee2084de90043be989d4d99d0dd0eaaappkey438b2f6ff103422a98a9349507293bb2bizcontent{"a":"a1","b":"b1"}contenttypejsonmethodDiffer.JH.Business.GetOrderplatid500token9415c33b04d24c7dae320b0185f42fb0version1.05ee2084de90043be989d4d99d0dd0eaa))=b43537d3768636f57d1c24f64188b22a
C#签名示例代码
/// <summary> /// 生成签名。 /// </summary> /// <returns></returns> private string Sign() { //appSecret。 var appSecret = "5ee2084de90043be989d4d99d0dd0eaa"; //将参数加入排序字典。 var dic = new SortedDictionary<string, string>(); dic.Add("method", "Differ.JH.Business.GetOrder"); dic.Add("appkey", "438b2f6ff103422a98a9349507293bb2"); dic.Add("token", "9415c33b04d24c7dae320b0185f42fb0"); dic.Add("platid", "500"); dic.Add("version", "1.0"); dic.Add("bizcontent", "{\"a\":\"a1\",\"b\":\"b1\"}"); dic.Add("contenttype", "json"); dic.Add("timestamp", "2013-02-15 13:32:30"); //构建待签名的字符串。 var beSignText = string.Empty; foreach (string _key in dic.Keys) beSignText += _key + dic[_key]; //转小写生成签名。 return this.MD5((appSecret + beSignText + appSecret).ToLower()); } /// <summary> /// 字符串生成MD5码。 /// </summary> /// <param name="data">待MD5字符</param> /// <returns></returns> public string MD5(string data) { var bytes = Encoding.UTF8.GetBytes(data); var hashmd5 = new MD5CryptoServiceProvider(); byte[] byteOriginal = hashmd5.ComputeHash(bytes); StringBuilder ciphertext = new StringBuilder(32); for (int i = 0; i < byteOriginal.Length; i++) { ciphertext.Append(byteOriginal[i].ToString("x").PadLeft(2, '0')); } return ciphertext.ToString(); }
注意事项:
所有的请求和响应数据编码皆为utf-8格式,URL里的所有参数名和参数值请做URL编码。
所有API请尽量使用POST发起请求。