数据签名说明
开放平台数据写接口,为了防止数据提交过程中被第三方篡改或者重复提交数据。在调用写接口时需要进行数据签名,服务器得到数据后,先进行验签,再调用业务。如果签名参数不符则业务调用失败。
在调用需要数据签名的接口之前,首先要调用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而不是signKey
String 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分钟内有效。