签名生成方法如下: - 对所有请求参数(包括公有参数和私有参数,但不包括 signature 参数),按照参数名ASCII码表升序顺序排序。如:foo=1, bar=2, foo_bar=3, baz=4 排序后的顺序是 bar=2, baz=4, foo=1, foobar=3。 - 将排序好的参数名和参数值构造成字符串,格式为:key1+value1+key2+value2… 。根据上面的示例得到的构造结果为:bar2baz4foo1foobar3 。 - 选择与 secretId 配对的 secretKey ,加到上一步构造好的参数字符串之后,如 secretKey=6308afb129ea00301bd7c79621d07591 ,则最后的参数字符串为 bar2baz4foo1foobar36308afb129ea00301bd7c79621d07591。 - 把c步骤拼装好的字符串采用 utf-8 编码,使用 MD5 算法对字符串进行摘要,计算得到 signature 参数值,将其加入到接口请求参数中即可。MD5 是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32位十六进制字符。 签名生成示例代码: [md-tab] [md-pane] Code (java): /** * 生成签名信息 * @param secretKey 产品私钥 * @param params 接口请求参数名和参数值map,不包括signature参数名 * @return */ public static String genSignature(String secretKey, Map params){ // 1. 参数名按照ASCII码表升序排序 String[] keys = params.keySet().toArray(new String[0]); Arrays.sort(keys); // 2. 按照排序拼接参数名与参数值 StringBuilder sb = new StringBuilder(); for (String key : keys) { sb.append(key).append(params.get(key)); } // 3. 将secretKey拼接到最后 sb.append(secretKey); // 4. MD5是128位长度的摘要算法,转换为十六进制之后长度为32字符 return DigestUtils.md5Hex(sb.toString().getBytes("UTF-8")); } [md-pane] Code (python): #!/usr/bin/env python # -*- coding: utf-8 -*- """生成签名信息 Args: secretKey 产品私钥 params 接口请求参数,不包括signature参数 """ def gen_signature(secretKey, params=None): params_str = "" for k in sorted(params.keys()): params_str += str(k)+ str(params[k]) params_str += secretKey return hashlib.md5(params_str).hexdigest() [md-pane] Code (PHP): /** * 生成签名信息 * $secretKey 产品私钥 * $params 接口请求参数,不包括signature参数 */ function gen_signature($secretKey,$params){ ksort($params); $buff=""; foreach($params as $key=>$value){ $buff .=$key; $buff .=$value; } $buff .= $secretKey; return md5(mb_convert_encoding($buff, "utf8", "auto")); } [md-pane] Code (csharp): // 根据secretKey和parameters生成签名 public static String genSignature(String secretKey, Dictionary parameters) { parameters = parameters.OrderBy(o => o.Key,StringComparer.Ordinal).ToDictionary(o => o.Key, p => p.Value); StringBuilder builder = new StringBuilder(); foreach (KeyValuePair kv in parameters) { builder.Append(kv.Key).Append(kv.Value); } builder.Append(secretKey); String tmp = builder.ToString(); MD5 md5 = new MD5CryptoServiceProvider(); byte[] result = md5.ComputeHash(Encoding.UTF8.GetBytes(tmp)); builder.Clear(); foreach (byte b in result) { builder.Append(b.ToString("x2").ToLower()); } return builder.ToString(); } [md-pane] Code (js): var genSignature=function(secretKey,paramsJson){ var sorter=function(paramsJson){ var sortedJson={}; var sortedKeys=Object.keys(paramsJson).sort(); for(var i=0;i