MD5签名规则

请使用相关函数对参数按照键名进行降序排序。
排序后请操作参数生成或拼接一个经过 URL-encode 的请求字符串
再讲拼接好的请求字符串与平台生成的Api_Key进行MD5加密得出sign签名参数

简单实例

相关语言可直接复制调用
PHP:

function getSign($param, $key)
{
    $signPars = "";
    ksort($param);
    foreach ($param as $k => $v) {
        if ("sign" != $k && "" != $v) {
            $signPars .= $k . "=" . $v . "&";
        }
    }
    $signPars = trim($signPars, '&');
    $signPars .= $key;
    $sign = md5($signPars);
    return $sign;
}

JAVA:

/**

  • 签名生成算法

  • @param HashMap<String,String> params 请求参数集,所有参数必须已转换为字符串类型

  • @param String secret 签名密钥

  • @return 签名

  • @throws IOException
    */
    public static String getSignature(HashMap<String,String> params, String secret) throws IOException
    {
    // 先将参数以其参数名的字典序升序进行排序
    Map<String, String> sortedParams = new TreeMap<String, String>(params);
    Set<Entry<String, String>> entrys = sortedParams.entrySet();

    // 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起
    StringBuilder basestring = new StringBuilder();
    for (Entry<String, String> param : entrys) {

     basestring.append(param.getKey()).append(&quot;=&quot;).append(param.getValue());

    }
    basestring.append(secret);

    // 使用MD5对待签名串求签
    byte[] bytes = null;
    try {

     MessageDigest md5 = MessageDigest.getInstance(&quot;MD5&quot;);
     bytes = md5.digest(basestring.toString().getBytes(&quot;UTF-8&quot;));

    } catch (GeneralSecurityException ex) {

     throw new IOException(ex);

    }

    // 将MD5输出的二进制结果转换为小写的十六进制
    StringBuilder sign = new StringBuilder();
    for (int i = 0; i < bytes.length; i++) {

     String hex = Integer.toHexString(bytes[i] &amp; 0xFF);
     if (hex.length() == 1) {
         sign.append(&quot;0&quot;);
     }
     sign.append(hex);

    }
    return sign.toString();
    }
    ~


*易语言:*

.子程序 sign计算, 文本型, 公开
.参数 param, 文本型
.参数 key, 文本型
.局部变量 signpars, 文本型
.局部变量 分割, 文本型, , "0"
.局部变量 x, 整数型
.局部变量 k, 文本型
.局部变量 v, 文本型
.局部变量 sign, 文本型

分割 = 分割文本 (param, “&”, )
数组_排序 (分割, 0, )

.计次循环首 (取数组成员数 (分割), x)
k = 文本取左边 (分割 [x], “=”, , )
v = 文本
取右边 (分割 [x], “=”, , )
.如果真 (k ≠ “sign” 且 v ≠ “”)
.如果 (x = 取数组成员数 (分割))
signpars = signpars + k + “=” + v
.否则
signpars = signpars + k + “=” + v + “&”
.如果结束

.如果真结束

.计次循环尾 ()
signpars = signpars + key
sign = 取数据摘要 (到字节集 (signpars))
返回 (sign)


*C#:*
/// &lt;summary&gt;
/// 计算参数签名
/// &lt;/summary&gt;
/// &lt;param name=&quot;params&quot;&gt;请求参数集,所有参数必须已转换为字符串类型&lt;/param&gt;
/// &lt;param name=&quot;secret&quot;&gt;签名密钥&lt;/param&gt;
/// &lt;returns&gt;签名&lt;/returns&gt;
public static string getSignature(IDictionary&lt;string, string&gt; parameters, string secret)
{
    // 先将参数以其参数名的字典序升序进行排序
    IDictionary&lt;string, string&gt; sortedParams = new SortedDictionary&lt;string, string&gt;(parameters);
    IEnumerator&lt;KeyValuePair&lt;string, string&gt;&gt; iterator= sortedParams.GetEnumerator();

    // 遍历排序后的字典,将所有参数按&quot;key=value&quot;格式拼接在一起
    StringBuilder basestring= new StringBuilder();
    while (iterator.MoveNext()) {
            string key = iterator.Current.Key;
            string value = iterator.Current.Value;
            if (!string.IsNullOrEmpty(key) &amp;&amp; !string.IsNullOrEmpty(value)){
                basestring.Append(key).Append(&quot;=&quot;).Append(value);
            }
    }
    basestring.Append(secret);

    // 使用MD5对待签名串求签
    MD5 md5 = MD5.Create();
    byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(basestring.ToString()));

    // 将MD5输出的二进制结果转换为小写的十六进制
    StringBuilder result = new StringBuilder();
    for (int i = 0; i &lt; bytes.Length; i++) {
            string hex = bytes[i].ToString(&quot;x&quot;);
            if (hex.Length == 1) {
                result.Append(&quot;0&quot;);
            }
            result.Append(hex);
    }

    return result.ToString();
}

~