阿里云OCR身份证识别

# 如果身份证上传的是独立服务器 一定记得把自己服务器的下行网速放开 否则可能造成阿里拉取超时的情况 【若阿里拉取图片时间大于等于5秒 则报错:超时】。

composer 安装以下:
alibabacloud/ocr-api-20210707,
alibabacloud/darabonba-openapi,
alibabacloud/darabonba-stream

<?php declare(strict_types=1); namespace App\Service\ALiYun; use AlibabaCloud\Darabonba\Stream\StreamUtil; use AlibabaCloud\SDK\Ocrapi\V20210707\Models\RecognizeIdcardRequest; use AlibabaCloud\SDK\Ocrapi\V20210707\Ocrapi; use AlibabaCloud\Tea\Exception\TeaError; use AlibabaCloud\Tea\Tea; use AlibabaCloud\Tea\Utils\Utils; use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions; use App\Helper\Minio; use App\Service\Report\ReportService; use Darabonba\OpenApi\Models\Config; use \Exception; use Hyperf\Di\Annotation\Inject; class OCRAPIService { /** * 使用AK&SK初始化账号Client * @param string $accessKeyId * @param string $accessKeySecret * @return Ocrapi Client */ public static function createClient(){ $config = new Config([ // 您的 AccessKey ID "accessKeyId" => env('ALIYUN_ACCESSKEY_ID'), // 您的 AccessKey Secret "accessKeySecret" => env('ALIYUN_ACCESSKEYSECRET') ]); // 访问的域名 $config->endpoint = "ocr-api.cn-hangzhou.aliyuncs.com"; return new Ocrapi($config); } /** * @param string[] $args * @return void */ public static function main($FilePath, $fileName){ $client = self::createClient(); $uploadPath = sprintf("/idcard/%s/%s_%s.jpg", date('Ymd'), $fileName, uniqid());  # 存私有服务器 ReportService::uploadFileToMinio($FilePath,$uploadPath, $fileName, 'image/jpeg');  # 私有服务器 $url = \App\Kernel\Minio\Minio::createPublicBucketFileLink(env('S3_BUCKET'), $uploadPath);  # 图片地址
    # 以上可以选择存阿里oss中。或者其他选择 【目前看 阿里的身份证识别不支持body格式,即不支持本地上传图片。
      只支持url方式识别身份证,所以必须要存在一个安全 且可外网访问的地方】
      
$recognizeIdcardRequest = new RecognizeIdcardRequest([ "url" => $url ]); $runtime = new RuntimeOptions([]); try { $resp = $client->recognizeIdcardWithOptions($recognizeIdcardRequest, $runtime); $res = json_decode(Utils::toJSONString(Tea::merge($resp)),true); if(isset($res['statusCode']) && $res['statusCode'] === 200) { $info = json_decode($res['body']['Data'],true); if(isset($info['data']['face'])) return $info['data']['face']['data'];  # 正面          else
            return $info['data']['back']['data'];  # 反面 } } catch (Exception $error) { if (!($error instanceof TeaError)) { $error = new TeaError([], $error->getMessage(), $error->getCode(), $error); } // 获取报错数据 $res = Utils::assertAsString($error->message); var_dump($res); } } }

 

 

# 追加一个body方式上传 后面阿里应该会完善该功能,或者改了写法也不一定,所以下面的只是个示例。
        $bodySyream = StreamUtil::readFromFilePath("<your-file-path>");
        $recognizeIdcardRequest = new RecognizeIdcardRequest([
            "body" => $bodySyream
        ]);

  

posted @ 2022-11-02 13:39  现世中的素人  阅读(782)  评论(0编辑  收藏  举报