用户提交表单(post-form)到产品应用后台,会携带一个验证码相关的参数,参数名为 NECaptchaValidate。产品应用需要将该参数传给易盾验证码后台做二次校验,以确保该次验证是有效并且是最近完成的。
接口地址: http://c.dun.163.com/api/v2/verify
HTTP POST, 接口仅支持POST请求, 且仅接受 application/x-www-form-urlencoded
编码的参数
参数 | 类型 | 必填 | 最大长度 | 备注 |
---|---|---|---|---|
captchaId | string | Y | 32 | 验证码id |
validate | string | Y | 不限制长度,建议1024 | 提交二次校验的验证数据,即NECaptchaValidate值。只能校验成功一次,重复校验会返回校验不通过。有效时长默认20分钟,可在官网配置为1~20分钟 |
user | string | Y | 32 | 用户信息,值可为空 |
secretId | string | Y | 32 | 密钥对id |
version | string | Y | 4 | 版本信息,固定值v2 |
timestamp | string | Y | 13 | 当前时间戳的毫秒值,例1480395193000 |
nonce | string | Y | 32 | 随机字符串 |
signature | string | Y | 32 | 签名信息,见签名计算 |
签名生成方法如下:
签名生成示例代码:
/**
* 生成签名信息
* @param secretKey 产品私钥
* @param params 接口请求参数名和参数值map,不包括signature参数名
* @return
*/
public static String genSignature(String secretKey, Map<String, String> params){
// 1. 参数名按照ASCII码表升序排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 2. 按照排序拼接参数名与参数值
StringBuilder sb = new StringBuilder();
for (String key : keys) {
sb.append(key).append(params.get(key));
}
// 3. 将secretKey拼接到最后
sb.append(secretKey);
// 4. MD5是128位长度的摘要算法,转换为十六进制之后长度为32字符
return DigestUtils.md5Hex(sb.toString().getBytes("UTF-8"));
}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""生成签名信息
Args:
secretKey 产品私钥
params 接口请求参数,不包括signature参数
"""
def gen_signature(secretKey, params=None):
params_str = ""
for k in sorted(params.keys()):
params_str += str(k)+ str(params[k])
params_str += secretKey
return hashlib.md5(params_str).hexdigest()
/**
* 生成签名信息
* $secretKey 产品私钥
* $params 接口请求参数,不包括signature参数
*/
function gen_signature($secretKey,$params){
ksort($params);
$buff="";
foreach($params as $key=>$value){
$buff .=$key;
$buff .=$value;
}
$buff .= $secretKey;
return md5(mb_convert_encoding($buff, "utf8", "auto"));
}
// 根据secretKey和parameters生成签名
public static String genSignature(String secretKey, Dictionary<String, String> parameters)
{
parameters = parameters.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
StringBuilder builder = new StringBuilder();
foreach (KeyValuePair<String, String> kv in parameters)
{
builder.Append(kv.Key).Append(kv.Value);
}
builder.Append(secretKey);
String tmp = builder.ToString();
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(Encoding.UTF8.GetBytes(tmp));
builder.Clear();
foreach (byte b in result)
{
builder.Append(b.ToString("x2").ToLower());
}
return builder.ToString();
}
var genSignature=function(secretKey,paramsJson){
var sorter=function(paramsJson){
var sortedJson={};
var sortedKeys=Object.keys(paramsJson).sort();
for(var i=0;i<sortedKeys.length;i++){
sortedJson[sortedKeys[i]] = paramsJson[sortedKeys[i]]
}
return sortedJson;
}
var sortedParam=sorter(paramsJson);
var needSignatureStr="";
for(var key in sortedParam){
var value=sortedParam[key];
needSignatureStr=needSignatureStr+key+value;
}
needSignatureStr+=secretKey;
var md5er = crypto.createHash('md5');//MD5加密工具
md5er.update(needSignatureStr,"UTF-8");
return md5er.digest('hex');
};
//根据secretKey和parameters生成签名
func genSignature(secretKey string, params map[string]string) string {
var keys []string
for key, _ := range params {
keys = append(keys, key)
}
sort.Strings(keys)
buf := bytes.NewBufferString("")
for _, key := range keys {
buf.WriteString(key + params[key])
}
buf.WriteString(secretKey)
has := md5.Sum(buf.Bytes())
return fmt.Sprintf("%x", has)
}
参数 | 类型 | 必填 | 备注 |
---|---|---|---|
result | boolean | Y | 验证码最终判定结果,以此字段为准:true:校验通过,false:校验不通过 |
error | int | Y | 异常代号 |
msg | string | Y | 错误描述信息 |
phone | string | N | 仅限于短信上行验证码类型,返回用户发送上行短信成功后的手机号 |
extraData | string | N | 返回业务方在初始化时传入的extraData内容,详见web接入参数配置。 |
error | 说明 |
---|---|
0 | 无异常 |
415 | 签名校验错误 |
419 | 参数校验错误,例如参数类型错误、参数值错误、必填项为空等 |