<?php
namespace ztools\aliyun;
class CdCard
{
// Access Key ID
private static $accessKeyId = 'LTAI5tRnC5zq4jh2gkXvDxTX';
// Access Key Secret
private static $accessKeySecret = 'j5Y3xAqDD0Sb18qdhOyggVHxn84gS9';
/**
* 实名认证(身份证二要素核验)
* @param string $name 姓名
* @param string $cdCard 身份证号
* @return mixed
* @throws \Exception
*/
public static function verify($name, $cdCard)
{
// 接口基础信息
$host = 'cloudauth.aliyuncs.com';
$path = '/';
$method = 'POST';
$timestamp = gmdate('Y-m-d\TH:i:s\Z');
$nonce = uniqid();
// 公共参数
$apiParams = [
'Action' => 'Id2MetaVerify',
'Version' => '2019-03-07',
'AccessKeyId' => self::$accessKeyId,
'Timestamp' => $timestamp,
'Format' => 'JSON',
'SignatureMethod' => 'HMAC-SHA1',
'SignatureVersion' => '1.0',
'SignatureNonce' => $nonce,
// 业务参数
'ParamType' => 'normal',
'UserName' => $name,
'IdentifyNum' => $cdCard,
];
// 签名算法
$signature = self::sign($apiParams, self::$accessKeySecret, $method);
$apiParams['Signature'] = $signature;
// 请求头
$headers = [
'Content-Type: application/x-www-form-urlencoded',
];
// 构建请求体
$bodys = http_build_query($apiParams);
// cURL 请求
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://' . $host . $path);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $bodys);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
// 执行请求
$result = curl_exec($curl);
$errno = curl_errno($curl);
$error = curl_error($curl);
curl_close($curl);
// 请求异常
if ($errno) {
exception('网络请求失败:' . $error);
}
// 解析返回
$res = json_decode($result, true);
if (json_last_error() !== JSON_ERROR_NONE) {
exception('返回数据解析失败');
}
// 业务判断
if (isset($res['Code']) && $res['Code'] == '200') {
return $res['ResultObject']['BizCode'];
}
// 抛出错误信息
$msg = isset($res['Message']) ? $res['Message'] : '接口请求失败';
exception($msg);
}
/**
* 阿里云API签名算法
*/
private static function sign($params, $accessSecret, $method = 'POST')
{
ksort($params);
$canonicalQuery = '';
foreach ($params as $key => $val) {
$canonicalQuery .= '&' . self::percentEncode($key) . '=' . self::percentEncode($val);
}
$canonicalQuery = substr($canonicalQuery, 1);
$stringToSign = $method . '&%2F&' . self::percentEncode($canonicalQuery);
$sign = base64_encode(hash_hmac('sha1', $stringToSign, $accessSecret . '&', true));
return $sign;
}
/**
* URL编码
*/
private static function percentEncode($str)
{
$res = urlencode($str);
$res = preg_replace('/\+/', '%20', $res);
$res = preg_replace('/\*/', '%2A', $res);
$res = preg_replace('/%7E/', '~', $res);
return $res;
}
}
PHP 身份证二要素检测
Java源头2026-05-17 12:23
相关推荐
折哥的程序人生 · 物流技术专研1 小时前
《Java 100 天进阶之路》第21篇:Java Object类谙弆悕博士1 小时前
快速学C语言——第17章:多文件编程与头文件规范熊猫_豆豆1 小时前
仿真模拟两颗卫星的自主交会对接过程(Python版)三品吉他手会点灯1 小时前
C语言学习笔记 - 31.数据类型 - 基本输入输出函数printf与scanfsycmancia1 小时前
Qt中的事件处理(二)万岳科技程序员小赵2 小时前
同城外卖 APP 与小程序开发实战:系统模块拆分及多语言适配要点happymaker06262 小时前
Spring学习日记——DAY04(复杂对象创建,AOP静态代理)ComputerInBook2 小时前
C++ 17 相比 C++ 14 新增之特征我命由我123452 小时前
Android Framework P2 - 开机启动 Zygote 进程、Zygote 的预加载机制