协议规则
开放平台接口规范
1.协议规则
数据格式:返回数据为JSON格式
字符编码:统一采用UTF-8字符编码
签名算法:MD5
签名要求:请求数据需要发送签名,服务器检验签名正确性
2.签名算法
签名通用参数
名称 | HTTP Request 存放位置 | 说明 |
---|---|---|
nonce_str | Header 注1 | 随机字符串,不大于32位,默认可采用16位 |
timestamp | Header 注1 | 时间戳,精确到秒,10位 |
sign | Header 注1 | 签名算法生成的字符串,具体过程参考 下一节 |
appid | Query String Parameters | 开放平台后台获取,识别调用者 |
appsecret | 不发送 | 开放平台后台获取,验证调用者身份,注意保密 |
注1:这3个参数,按键值对拼接成字符串,不需要进行 URLEncode,存放在 Request Header 的 ZC-Sign 字段下。
例:
nonce_str: pVNtyYGD61qmF03J
timestamp: 1592388151
sign: 2BF5DC0A701183C288043109331778EB
Request Headers 增加一项自定义参数:
ZC-Sign: nonce_str=pVNtyYGD61qmF03J×tamp=1592388151&sign=2BF5DC0A701183C288043109331778EB
签名(sign)生成的通用步骤如下:" class="mume-header" data-v-3fce46f4> 签名(sign)生成的通用步骤如下:
第一步,设所有发送的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参与签名的参数包括URL参数、POST请求中位于Body的参数、位于Header中ZC-Sign的3个参数;
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 服务器验证签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。第二步,在stringA最后拼接上appsecret得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值。
举例
开放平台后台获取 API ID 和 密钥:
appid: zc3c21dw30a0ed271f
appsecret: bf6b217ffe194js893b28319467d28a6
假设传送的参数如下:
appid: zc3c21dw30a0ed271f
nonce_str: pn7w5HLH3p32Z1dx
timestamp: 1592390251
area: 4404
find[type]: 科技
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA = "appid=zc3c21dw30a0ed271f&area=4404&find[type]=科技&nonce_str=pn7w5HLH3p32Z1dx×tamp=1592390251";
第二步:拼接 API 密钥:
stringSignTemp = stringA + "&appsecret=bf6b217ffe194js893b28319467d28a6";
sign = MD5(stringSignTemp).toUpperCase(); // 4C397363D96465D2C6BDB75CCE667439
得到最终发送的数据:
appid: zc3c21dw30a0ed271f
nonce_str: pn7w5HLH3p32Z1dx
timestamp: 1592390251
area: 4404
find[type]: 科技
sign: 4C397363D96465D2C6BDB75CCE667439
其中 nonce_str, timestamp, sign 3个参数按 注1 的方式通过 HTTP Request Header 发送
其余参数通过 URL 参数发送
3.生成随机数算法
签名算法中字段 nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:取大小写字母+数字,随机组合成16位字符串。