接入网易易盾验证码流程图:
后端接入:http://support.dun.163.com/documents/15588062143475712?docId=69218161355051008
前端web接入:http://support.dun.163.com/documents/15588062143475712?docId=150442915877015552
官方PHP示例代码:https://github.com/yidun/captcha-php-demo
这里是基于 laravel 框架来实现
效果图如下:
封装service代码如下:
<?php
namespace App\Services;
/**
* 易盾验证码二次校验SDK
* WXiangQian <[email protected]>
*/
class CaptchaVerifier {
const VERSION = 'v2';
const API_TIMEOUT = 5;
const API_URL = 'http://c.dun.163yun.com/api/v2/verify';
protected $captcha_id;
protected $secret_id;
protected $secret_key;
/**
* 验证码id
* 密钥对
* 密钥对
* @param $captcha_id
* @param $secret_id
* @param $secret_key
*/
public function __construct($captcha_id, $secret_id, $secret_key) {
$this->captcha_id = $captcha_id;
$this->secret_id = $secret_id;
$this->secret_key = $secret_key;
}
/**
* 发起二次校验请求
* 二次校验数据
* @param $validate
* @param string $user 用户信息
* @return bool|mixed
* User: WXiangQian <[email protected]>
* Date: 2019-05-13 17:22
*/
public function verify($validate, $user = '') {
$params = array();
$params["captchaId"] = $this->captcha_id;
$params["validate"] = $validate;
$params["user"] = $user;
// 公共参数
$params["secretId"] = $this->secret_id;
$params["version"] = self::VERSION;
$params["timestamp"] = sprintf("%d", round(microtime(true)*1000));// time in milliseconds
$params["nonce"] = sprintf("%d", rand()); // random int
$params["signature"] = $this->sign($this->secret_key, $params);
$result = $this->send_http_request($params);
return array_key_exists('result', $result) ? $result['result'] : false;
}
/**
* 计算参数签名
* 密钥对key
* 请求参数
* @param $secret_key
* @param $params
* @return string
* User: WXiangQian <[email protected]>
* Date: 2019-05-13 17:23
*/
private function sign($secret_key, $params){
ksort($params); // 参数排序
$buff="";
foreach($params as $key=>$value){
$buff .=$key;
$buff .=$value;
}
$buff .= $secret_key;
return md5($buff);
}
/**
* 发送http请求
* @param $params
* @return array|mixed
* User: WXiangQian <[email protected]>
* Date: 2019-05-13 17:23
*/
private function send_http_request($params){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, self::API_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, self::API_TIMEOUT);
curl_setopt($ch, CURLOPT_TIMEOUT, self::API_TIMEOUT);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
/*
* Returns TRUE on success or FALSE on failure.
* However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, FALSE on failure.
*/
$result = curl_exec($ch);
// var_dump($result);
if(curl_errno($ch)){
$msg = curl_error($ch);
curl_close($ch);
return array("error"=>500, "msg"=>$msg, "result"=>false);
}else{
curl_close($ch);
return json_decode($result, true);
}
}
}
新建config/captcha.php 添加如下代码
<?php
#联系商务获取秘钥
return [
'captcha'=>[
'CAPTCHA_ID' => env('CAPTCHA_ID'),
'SECRET_ID' => env('SECRET_ID'),
'SECRET_KEY' => env('SECRET_KEY'),
]
];
.env添加
#captcha
CAPTCHA_ID=CAPTCHA_ID
SECRET_ID=SECRET_ID
SECRET_KEY=SECRET_KEY
二次校验
public function wangyiVerify(Request $request)
{
$validate = $request->input('validate');
// 文档地址:http://support.dun.163.com/documents/15588062143475712?docId=69218161355051008
$CaptchaVerifier = new CaptchaVerifier(config('captcha.captcha.CAPTCHA_ID'),config('captcha.captcha.SECRET_ID'),config('captcha.captcha.SECRET_KEY'));
//通过则返回true
$validatePass = $CaptchaVerifier->verify($validate);
if (!$validatePass) {
return $this->responseError('验证不通过');
}
return $this->responseSuccess('验证通过');
}
项目中有示例代码:https://github.com/WXiangQian/laravel-api
掘金原文:https://juejin.im/post/5d0f37c65188254b5457d443
感谢大家的支持,希望可以帮助到大家