PHP 身份证二要素检测

复制代码
<?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;
    }

}
相关推荐
码小猿的CPP工坊26 分钟前
C++跨平台开发之基于wxWidgets开发GUI程序简介-002
开发语言·c++
波力海苔夹心脆67528 分钟前
C# 固高 GTS 运动控制卡入门:伺服上下电、Jog 点动与二维插补(WinForms 实战)
服务器·开发语言·c#·运动控制·伺服电机·winforms·固高
aixingpan29 分钟前
aixingpan.cn API开发文档:api_docs_onechart_marks_secondary2接口指南
前端·php
海绵宝宝转agent35 分钟前
LeetCode100个人题解+java面经总结
java·开发语言·笔记·学习·算法
chenbingjie_c37 分钟前
C++ 继承全解析(从三种继承方式到菱形继承与内存布局)
开发语言·c++
学逆向的9 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi9 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua
OpenAnolis小助手11 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
阿尼卡~11 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows