为了防止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发起请求。