逻辑:首先将所有参数除去sign本身,以及值是空的参数,按参数名字母升序排序,然后按参数1值1参数2值2…参数n值n的方式进行连接,得到一个字符串
然后在连接后得到的字符串前面加上通知验证密钥,然后计算md5值,转成大写
如订单查询参数
http://www.xxx.aspx?sign=sign_value&p2=v2&p1=v1&method=cancel&p3=&pn=vn
第一步,拼接字符串,首先去除sign参数本身,然后去除值是空的参数p3,剩下p2=v2&p1=v1&method=cancel&pn=vn,然后按参数名字符升序排序,method=cancel&p1=v1&p2=v2&pn=vn,然后做参数名和值的拼接,最后得到methodcancelp1v1p2v2pnvn
第二步,在上面拼接得到的字符串前加上接口密钥,我们假设是abc,得到新的字符串abcmethodcancelp1v1p2v2pnvn,然后将这个字符串进行md5计算,假设得到的是abcdef,然后转为大写,得到ABCDEF这个签名值,注意,计算md5之前请确保字符串是UTF-8编码的,如果是其他编码,那么计算出来的签名会校验失败
代码:
private static string GetSign(Dictionary<string, object> vDic)
{
string vKey = MainConfig.GetConfig("接口秘钥");
if (string.IsNullOrEmpty(vKey))
{
throw PiaostException.Create(0, "请检测配置接口秘钥是否存在!");
}
//按照key值升序排序
vDic = vDic.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, object> item in vDic)
{
string value = StringHelper.GetString(item.Value);
if (!string.IsNullOrEmpty(value))
{
sb.Append(item.Key);
sb.Append(item.Value);
}
}
sb.Insert(0, vKey);
string md5 = StringHelper.GetMd5(sb.ToString()).ToUpper();
return md5;
}
public static string GetMd5(string vInput)
{
string text = "";
try
{
byte[] bytes = Encoding.UTF8.GetBytes(vInput);
byte[] array = MD5.Create().ComputeHash(bytes);
for (int i = 0; i < array.Length; i++)
{
text += array[i].ToString("x2");
}
}
catch (Exception ex)
{
LogHelper.WriteLog(ex);
}
return text;
}