数据签名说明
开放平台数据写接口,为了防止数据提交过程中被第三方篡改或者重复提交数据。在调用写接口时需要进行数据签名,服务器得到数据后,先进行验签,再调用业务。如果签名参数不符则业务调用失败。
在调用需要数据签名的接口之前,首先要调用nonce接口获取一个一次性验证码。
nonce验证码可同时存在多个,最长有效期为5分钟,且在使用一次后失效。
nonce验证码的长度并不确定,但是不会大于512个字符。
nonce接口调用说明
请求协议: HTTPS
请求方式: GET
请求地址: https://api.mytijian.com/open-api/V2/nonce?accessToken=ACCESS_TOKEN
| 参数 | 是否必须 | 说明 |
|---|---|---|
| accessToken | 是 | 当前可用的accessToken |
正常情况下接口返回如下数据
{"success":"T","data":{"result":"0HpsLui7o8xHj_V_uoCgJZNUwilp9R_7"},"msg":"success"}
返回数据说明
| 字段 | 说明 |
|---|---|
| result | 本次请求产生的nonce验证码 |
错误示例
{"success":"F","errCode":"101101","msg":"Invaild Access Token"}
表示使用的accessToken错误或过期
签名示例 (模拟调用业务接口)
现在我们假设需要调用业务接口 /nonp
https请求方式:post
https请求地址:https://api.mytijian.com/open-api/V2/nonp?accessToken=ACCESS_TOKEN&nonce=NONCE&sign=SIGN
app signKey 值为 eccdcff429b342399582d81029652ae9
接口请求内容为: {“test”:”context use sign test”}
则请求nonp接口的操作过程如下
首先调用nonce获取一次性校验码,假设 nonce=0HpsLui7o8xHj_V_uoCgJZNUwilp9R_7
然后将nonce、请求内容、signKey拼装为一个字符串 p
计算字符串p的md5值sign
将nonce、sign作为url参数,context作为post内容,调用业务接口。
伪代码如下
String accessToken = "token"String content = "{\"test\":\"context use sign test\"}";String nonce = "0HpsLui7o8xHj_V_uoCgJZNUwilp9R_7"; // 假设请求nonce接口获取到的nonce值String signKey = "eccdcff429b342399582d81029652ae9"; // signKey 任何时候都不作为参数传输String p = nonce + content + signKey;String sign = MD5(p);// 请注意 使用的是sign而不是signKeyString requestUrl = "https://api.mytijian.com/open-api/nonp?accessToken"+accessToken+"&nonce="+nonce+"&sign="+sign;// 发送post请求(地址,内容)doHttpPostRequest(requestUrl, content);
如果nonce有效且sign验证成功,则根据具体业务返回数据。
常见错误如下:
{"success":"F","errCode":"101102","msg":"require 'sign' and 'nonce' param"}
url中缺少sign或者nonce参数
{"success":"F","errCode":"101103","msg":"sign error"}
sign值错误,可能引起的原因是字符串组装顺序不正确、或者signKey与服务器端不一致造成的
{"success":"F","errCode":"101104","msg":" Invaild Nonce String"}
无效的nonce, nonce获取之后只能使用一次,且只在5分钟内有效。