签名算法
为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝。TOP目前支持的签名算法只有一种:MD5(sign_method=md5)签名大体过程如下:
  • ● 对所有API请求参数(包括公共参数和业务参数,但除去sign参数和byte[]类型的参数),根据参数名称的ASCII码表的顺序排序。如:foo=1, bar=2, foo_bar=3, foobar=4排序后的顺序是bar=2, foo=1, foo_bar=3, foobar=4。
  • ● 将排序好的参数名和参数值拼装在一起,根据上面的示例得到的结果为:bar2foo1foo_bar3foobar4。
  • ● 把拼装好的字符串采用utf-8编码,使用签名算法对编码后的字节流进行摘要,如:md5(bar2foo1foo_bar3foobar4)。
  • ● 将摘要得到的字节流结果使用十六进制表示,如:hex(“helloworld”.getBytes(“utf-8”)) = “68656C6C6F776F726C64”
说明:MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
C#签名示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public static string SignTopRequest(IDictionary<string, string> parameters,string signMethod, string appSecret)
{
     // 第一步:把字典按Key的字母顺序排序
     IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);
     IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
 
     // 第二步:把所有参数名和参数值串在一起
     StringBuilder query = new StringBuilder();
     while (dem.MoveNext())
     {
         string key = dem.Current.Key;
         string value = dem.Current.Value;
         if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
         {
             query.Append(key).Append(value);
        }
     }
     query.Append(appSecret);
 
     // 第三步:使用MD5加密
     byte[] bytes;
     MD5 md5 = MD5.Create();
     bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString()));
 
     // 第四步:把二进制转化为大写的十六进制
     StringBuilder result = new StringBuilder();
     for ( int i = 0 ; i < bytes.Length; i++)
     {
         result.Append(bytes[i].ToString( "X2" ));
     }
 
     return result.ToString();
}
注意事项
  • ●所有的请求和响应数据编码皆为utf-8格式,URL里的所有参数名和参数值请做URL编码。如果请求的Content-Type是application/x-www-form-urlencoded,则HTTP Body体里的所有参数值也做URL编码;如果是multipart/form-data格式,每个表单字段的参数值无需编码,但每个表单字段的charset部分需要指定为utf-8。
  • ●所有API都用POST发起请求。
  • ●生成签名(sign)仅对未使用官方SDK进行API调用时需要操作,如使用了官方SDK,该步骤SDK会自动完成。
FAQ
关于此文档暂时还没有FAQ