Files
water_new/modules/User/Models/Traits/CertificationTrait.php
2023-03-08 09:16:04 +08:00

283 lines
8.5 KiB
PHP

<?php
namespace Modules\User\Models\Traits;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Storage;
trait CertificationTrait
{
protected $params = [];
protected $header = [];
protected $errorMessage = '';
/**
* Notes : 自动认证操作
*
* @Author: Mr.wang
* @Date : 2021/12/7 13:53
* @param $keys
* @return array|int[]
*/
public function autoVerified($keys): array
{
if (config('userCertification.is_open')) {
if (config('userCertification.is_ocr_open')) {
$verified = $this->ocrVerified(Storage::url($keys['front_card']), 'front');
if (! $verified) {
return [
'code' => 0,
'message' => $this->getErrorMessage(),
];
} else {
if ($verified['words_result']['姓名']['words'] != $keys['name']) {
return [
'code' => 0,
'message' => '正面图片与填写信息不符',
];
}
if ($verified['words_result']['公民身份号码']['words'] != $keys['idcard']) {
return [
'code' => 0,
'message' => '正面图片与填写信息不符',
];
}
}
$verified = $this->ocrVerified(Storage::url($keys['back_card']), 'back');
if (! $verified) {
return [
'code' => 0,
'message' => $this->getErrorMessage(),
];
} else {
if ($verified['image_status'] != 'normal') {
return [
'code' => 0,
'message' => '背面图片与填写信息不符',
];
}
}
}
$base = [
'name' => $keys['name'],
'idcard' => $keys['idcard'],
];
$data = $this->check($base);
if ($data === false) {
return [
'code' => 0,
'message' => $this->getErrorMessage(),
];
} else {
return [
'code' => 1,
];
}
} else {
return [
'code' => 1,
];
}
}
/**
* Notes : ocr认证
*
* @Author: Mr.wang
* @Date : 2021/12/7 13:54
* @param $image
* @param $type
* @return bool
*/
public function ocrVerified($image, $type): bool
{
$AppID = config('userCertification.ocr_appid');
$SecretKey = config('userCertification.ocr_secretkey');
if (empty($AppID)) {
$this->setErrorMessage('请配置接口AppID');
return false;
}
if (empty($SecretKey)) {
$this->setErrorMessage('请配置接口SecretKey');
return false;
}
$access = $this->getAccess($AppID, $SecretKey);
if ($access === false) {
$this->setErrorMessage('access_token不正确');
return false;
}
$token = $access->access_token;
$apiUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/idcard';
$result = $this->getOcr($apiUrl, $token, $image, $type);
if (($result['error_code'] ?? 0) == 100) {
$this->setErrorMessage($result['error_msg'] ?? '未知错误');
return false;
} else {
if (empty($result['words_result']) || ! isset($result['words_result'])) {
$this->setErrorMessage('图片未识别');
return false;
}
return $result;
}
}
protected function getAccess($AppID, $SecretKey)
{
$authUrl = 'https://aip.baidubce.com/oauth/2.0/token';
try {
$Client = new Client();
$response = $Client->post($authUrl, [
'query' => [
'grant_type' => 'client_credentials',
'client_id' => $AppID,
'client_secret' => $SecretKey,
],
]);
$result = json_decode($response->getBody()->getContents());
return $result;
} catch (\Exception $e) {
return false;
}
}
protected function getOcr($url, $token, $image, $type)
{
$url = $url.'?access_token='.$token;
$params = [
'url' => $image,
'id_card_side' => $type,
];
try {
$Client = new Client();
$response = $Client->post($url, ['form_params' => $params]);
$result = json_decode($response->getBody()->getContents(), true);
return $result;
} catch (\Exception $e) {
return false;
}
}
public function getErrorMessage()
{
return $this->errorMessage;
}
protected function setErrorMessage($message)
{
$this->errorMessage = $message;
}
/**
* Notes : 网络验证
*
* @Date : 2021/9/25 15:42
* @Author : Mr.wang
* @param $keys
* @return bool|mixed
*/
protected function check($keys): bool
{
$apiUrl = config('userCertification.url');
if (empty($apiUrl)) {
$this->setErrorMessage('请配置接口地址');
return false;
}
$apiCode = config('userCertification.code');
if (empty($apiCode)) {
$this->setErrorMessage('请配置接口Code');
return false;
}
$this->setParams($keys);
$this->setHeaders();
$result = $this->dopost($apiUrl);
try {
if (config('userCertification.type') == 2) {
if ($result->code == 0 && $result->message == '成功') {
if ($result->result->res == 1) {
return true;
} else {
$this->setErrorMessage('信息'.$result->result->description);
return false;
}
} else {
$this->setErrorMessage('信息'.$result->result->description);
return false;
}
} else {
if ($result->code == 200 && $result->success === true) {
if ($result->data->result == 0) {
return true;
} else {
$this->setErrorMessage($result->data->desc);
return false;
}
} else {
$this->setErrorMessage($result->msg);
return false;
}
}
} catch (\Exception $e) {
return $result;
}
}
protected function setParams($keys)
{
$this->params = $keys;
}
protected function setHeaders()
{
$this->header = [
"Authorization" => 'APPCODE '.config('userCertification.code'),
"Accept" => "application/json",
];
}
protected function dopost($url)
{
try {
$Client = new Client();
$response = $Client->get($url, ['query' => $this->params, 'headers' => $this->header]);
// switch (config('usercertification.request_method')) {
// case 'get':
// $response = $Client->get($url, ['query' => $this->params, 'headers' => $this->header]);
// break;
// case 'post':
// $response = $Client->post($url, ['query' => $this->params, 'headers' => $this->header]);
// break;
// default:
// $this->setErrorMessage('不允许的请求方式');
//
// return false;
// break;
// }
$result = json_decode($response->getBody()->getContents());
return $result;
} catch (\Exception $e) {
preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $e->getmessage(), $cn_name);
$this->setErrorMessage($cn_name[0][0]);
return false;
}
}
}