為了防止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發起請求。