签名生成及验证

  1. 设 所有发送或者接收的数据为集合 M,将集合 M 内非空参数值的参数按照参数名 ASCII 码从小到大排序(字典序),使用 URL 键值对的格式(即 key1=value1&key2=value2 …)拼接成字符串 stringA。

    特别注意以下重要规则:
    • 参数名 ASCII 码从小到大排序(字典序);
    • 如果参数的值为空,不参与签名;
    • 参数名区分大小写;
    • sign 参数不参与签名,验证时,将生成的签名与该 sign 值做校验;
  2. 在 stringA 最后拼接上 secret 得到 stringSignTemp 字符串,并对 stringSignTemp 进行 MD5 运算,再将得到的字符串所有字符转换为大写,得到 sign 值 signValue。



举例:

假设传递的参数如下:

app_id: 204185
nonce_str: SuzYEGVOOIDYqDdr

第一步:对参数按照 键值对参数名 ASCII 字典顺序排序 处理后结果如下:

stringA="app_id=204185&nonce_str=SuzYEGVOOIDYqDdr";

第二步:拼接 API 密钥:

stringSignTemp="stringA&secret=sldfaksdjfsdienmnweoi"
sign=MD5(stringSignTemp).toUpperCase()="4AA6869D42A8A1CB5532EA916D16C4B3"

最终的发送数据:

<xml>
  <app_id>204185</app_id>
  <nonce_str>SuzYEGVOOIDYqDdr</nonce_str>
  <sign>4AA6869D42A8A1CB5532EA916D16C4B3</sign>
<xml>