> >

概述

当用户在前端界面通过验证码后,会产生一批与验证码相关的参数,用户的业务请求带上这些参数,后台业务接口再将这些参数上传到极验二次校验接口,确认该用户本次验证的有效性。

二次校验接口

接口信息 说明
接口地址 http://gcaptcha4.geetest.com/validate
请求方式 GET/POST
内容类型 application/x-www-form-urlencoded
返回格式 json

1.请求参数

参数名 类型 说明
lot_number string 验证流水号
captcha_output string 验证输出信息
pass_token string 验证通过标识
gen_time string 验证通过时间戳
captcha_id string 验证 id
sign_token string 验证签名

2.响应参数

参数名 类型 说明
result string 二次校验结果
reason string 校验结果说明
captcha_args dict 验证输出参数

响应参数返回示例

// 校验成功返回示例
{
"result": "success",
"reason": "",
"captcha_args": {
"used_type": "slide",
"user_ip": "127.0.0.1",
"lot_number": "4dc3cfc2cdff448cad8d13107198d473",
"scene": "反爬虫",
"referer": "http://127.0.0.1:8077/"
}
}

// 校验失败返回示例
{
"result": "fail",
"reason": "pass_token expire",
"captcha_args": {
...
}
}

// 请求异常返回示例
{
"status": "error",
"code": "-50005",
"msg": "illegal gen_time",
"desc": {
"type": "defined error"
}
}

接入示例代码

def post(self):
# 1.初始化极验参数信息
captcha_id = '647f5ed2ed8acb4be36784e01556bb71'
captcha_key = 'b09a7aafbfd83f73b35a9b530d0337bf'
api_server = 'http://gcaptcha4.geetest.com'

# 2.获取用户验证后前端传过来的验证参数
lot_number = self.get_argument('lot_number', '')
captcha_output = self.get_argument('captcha_output', '')
pass_token = self.get_argument('pass_token', '')
gen_time = self.get_argument('gen_time', '')

# 3.生成签名
# 生成签名使用标准的hmac算法,使用用户当前完成验证的流水号lot_number作为原始消息message,使用客户验证私钥作为key
# 采用sha256散列算法将message和key进行单向散列生成最终的签名
lotnumber_bytes = lot_number.encode()
prikey_bytes = captcha_key.encode()
sign_token = hmac.new(prikey_bytes, lotnumber_bytes, digestmod='SHA256').hexdigest()

# 4.上传校验参数到极验二次验证接口, 校验用户验证状态
query = {
"lot_number": lot_number,
"captcha_output": captcha_output,
"pass_token": pass_token,
"gen_time": gen_time,
"sign_token": sign_token,
}
# captcha_id 参数建议放在 url 后面, 方便请求异常时可以在日志中根据id快速定位到异常请求
url = api_server + '/validate' + '?captcha_id={}'.format(captcha_id)
# 注意处理接口异常情况,当请求极验二次验证接口异常或响应状态非200时做出相应异常处理
# 保证不会因为接口请求超时或服务未响应而阻碍业务流程
try:
res = requests.post(url, query)
assert res.status_code == 200
gt_msg = json.loads(res.text)
except Exception as e:
gt_msg = {'result': 'success', 'reason': 'request geetest api fail'}

# 5.根据极验返回的用户验证状态, 网站主进行自己的业务逻辑
if gt_msg['result'] == 'success':
self.write({'login': 'success', 'reason': gt_msg['reason']})
else:
self.write({'login': 'fail', 'reason': gt_msg['reason']})