app_key = $app_key; $this->app_secret = $app_secret; } /** * @param $url * @param $appKey * @param $appSecret * @param $bodyContent * @return Http\HttpResponse */ private function doPost($url, $appKey, $appSecret, $bodyContent) { // 域名后、query前的部分 $urlEles = parse_url($url); $host = $urlEles["scheme"] . "://" . $urlEles["host"]; $path = $urlEles["path"]; $request = new HttpRequest($host, $path, HttpMethod::POST, $appKey, $appSecret); // 设定Content-Type,根据服务器端接受的值来设置 $request->setHeader(HttpHeader::HTTP_HEADER_CONTENT_TYPE, ContentType::CONTENT_TYPE_JSON); // 设定Accept,根据服务器端接受的值来设置 $request->setHeader(HttpHeader::HTTP_HEADER_ACCEPT, ContentType::CONTENT_TYPE_JSON); // 注意:业务body部分,不能设置key值,只能有value if (0 < strlen($bodyContent)) { $request->setHeader(HttpHeader::HTTP_HEADER_CONTENT_MD5, base64_encode(md5($bodyContent, true))); $request->setBodyString($bodyContent); } // 指定参与签名的header $request->setSignHeader(SystemHeader::X_CA_TIMESTAMP); $response = HttpClient::execute($request); return $response; } /** * 营业执照识别 * @param $image_url */ public function getBusinessLicense($image_url, $type = 0) { $cache_key = 'ocr_license_' . md5($image_url); if ($license = cache()->get($cache_key)) { return [ 'code' => 0, 'msg' => 'success', 'data' => $this->handleLicenseData($license) ]; } $url = $this->business_license_api; $file = $image_url; // 如果没有configure字段,configure设为空 $configure = []; if (substr($file, 0, 4) == "http") { if ($type) { $file = $this->imgToBase64($file); } $base64 = $file; } else if ($fp = fopen($file, "rb", 0)) { $binary = fread($fp, filesize($file)); // 文件读取 fclose($fp); $base64 = base64_encode($binary); // 转码 } $request = [ 'image' => "$base64" ]; if (count($configure) > 0) { $request["configure"] = json_encode($configure); } $body = json_encode($request); $response = $this->doPost($url, $this->app_key, $this->app_secret, $body); $stat = $response->getHttpStatusCode(); if ($stat == 200) { $result_str = $response->getBody(); $data = Json::decode($result_str); cache()->set($cache_key, $data, 30 * 60); return [ 'code' => 0, 'msg' => 'success', 'data' => $this->handleLicenseData($data) ]; } elseif ($stat == 462) { return $this->getBusinessLicense($image_url, 1); } else { return [ 'code' => $stat, 'msg' => 'fail' ]; // printf("Http error code: %d\n", $stat); // printf("Error msg in body: %s\n", $response->getBody()); // printf("header: %s\n", $response->getHeader()); } } /** * 身份证识别 * @param string $image_url * @param string $side */ public function getIDCard($image_url, $side = self::SIDE_FACE, $type = 0) { $cache_key = 'ocr_id_card_' . md5($image_url) . '_' . $side; if ($card = cache()->get($cache_key)) { return [ 'code' => 0, 'msg' => 'success', 'data' => $this->handleIDCardData($card, $side) ]; } $url = $this->id_card_api; $file = $image_url; // 如果没有configure字段,configure设为空 $configure = [ 'side' => $side ]; if (substr($file, 0, 4) == "http") { if ($type) { $file = $this->imgToBase64($file); } $base64 = $file; } else if ($fp = fopen($file, "rb", 0)) { $binary = fread($fp, filesize($file)); // 文件读取 fclose($fp); $base64 = base64_encode($binary); // 转码 } $request = [ 'image' => "$base64" ]; if (count($configure) > 0) { $request["configure"] = json_encode($configure); } $body = json_encode($request); $response = $this->doPost($url, $this->app_key, $this->app_secret, $body); $stat = $response->getHttpStatusCode(); if ($stat == 200) { $result_str = $response->getBody(); $data = Json::decode($result_str); cache()->set($cache_key, $data, 30 * 60); return [ 'code' => 0, 'msg' => 'success', 'data' => $this->handleIDCardData($data, $side) ]; } elseif ($stat == 462) { return $this->getIDCard($image_url, $side, 1); } else { return [ 'code' => $stat, 'msg' => 'fail' ]; // printf("Http error code: %d\n", $stat); // printf("Error msg in body: %s\n", $response->getBody()); // printf("header: %s\n", $response->getHeader()); } } /** * 银行卡 * @param string $image_url * @param string $side */ public function getBankCard($image_url, $type = 0) { $cache_key = 'ocr_bank_card_' . md5($image_url); if ($bank = cache()->get($cache_key)) { return [ 'code' => 0, 'msg' => 'success', 'data' => $this->handleBankCardData($bank) ]; } $url = $this->bank_card_api; $file = $image_url; // 如果没有configure字段,configure设为空 $configure = [ 'card_type' => true ]; if (substr($file, 0, 4) == "http") { if ($type) { $file = $this->imgToBase64($file); } $base64 = $file; } else if ($fp = fopen($file, "rb", 0)) { $binary = fread($fp, filesize($file)); // 文件读取 fclose($fp); $base64 = base64_encode($binary); // 转码 } $request = [ 'image' => "$base64" ]; if (count($configure) > 0) { $request["configure"] = json_encode($configure); } $body = json_encode($request); $response = $this->doPost($url, $this->app_key, $this->app_secret, $body); $stat = $response->getHttpStatusCode(); if ($stat == 200) { $result_str = $response->getBody(); $data = Json::decode($result_str); cache()->set($cache_key, $data, 30 * 60); return [ 'code' => 0, 'msg' => 'success', 'data' => $this->handleBankCardData($data) ]; } elseif ($stat == 462) { return $this->getBankCard($image_url, 1); } else { return [ 'code' => $stat, 'msg' => 'fail' ]; // printf("Http error code: %d\n", $stat); // printf("Error msg in body: %s\n", $response->getBody()); // printf("header: %s\n", $response->getHeader()); } } /** * 处理文字识别数据 */ public function getTextRecognition($image_url, $type = 0) { $url = $this->text_recognition; $file = $image_url; $configure = [ 'output_prob' => false, 'output_keypoints' => false, 'skip_detection' => false, 'dir_assure' => false, 'language' => 'sx' ]; if (substr($file, 0, 4) == "http") { if ($type) { $file = $this->imgToBase64($file); } $base64 = $file; } else if ($fp = fopen($file, "rb", 0)) { $binary = fread($fp, filesize($file)); // 文件读取 fclose($fp); $base64 = base64_encode($binary); // 转码 } $request = [ 'image' => "$base64" ]; if (count($configure) > 0) { $request["configure"] = $configure; } $body = json_encode($request); $response = $this->doPost($url, $this->app_key, $this->app_secret, $body); $stat = $response->getHttpStatusCode(); $result_str = $response->getBody(); $str = ""; if ($stat == 200) { $result = json_decode($result_str, true); if (!empty($result['ret'])) { foreach ($result['ret'] as $ret) { $str .= $ret['word'] . " "; } } return [ 'code' => 0, 'msg' => '识别成功', 'data' => [ 'result' => $result, 'str' => $str ] ]; } return [ 'code' => 1, 'msg' => '识别失败', 'data' => $result_str ]; } /** * 处理拿到的营业执照数据 */ private function handleLicenseData($res) { if (empty($res)) { return []; } $data = [ 'address' => $res['address'], 'business' => $res['business'], 'capital' => $res['capital'], 'establish_date' => $this->handleDate($res['establish_date']), 'name' => $res['name'], 'person' => $res['person'], 'reg_num' => $res['reg_num'], 'type' => $res['type'], 'valid_period' => $this->handleDate($res['valid_period']) ]; return $data; } /** * 处理拿到的身份证信息数据 */ private function handleIDCardData($res, $side = self::SIDE_FACE) { if (empty($res)) { return []; } if ($side == self::SIDE_FACE) { $data = [ 'address' => $res['address'], 'birth' => $this->handleDate($res['birth']), 'name' => $res['name'], 'nationality' => $res['nationality'], 'num' => $res['num'], 'sex' => $res['sex'] ]; } else { $data = [ 'end_date' => $this->handleDate($res['end_date']), 'issue' => $res['issue'], 'start_date' => $this->handleDate($res['start_date']) ]; } return $data; } /** * 处理拿到的银行卡信息数据 */ private function handleBankCardData($res) { if (empty($res)) { return []; } $data = [ 'bank_name' => $res['bank_name'], 'card_num' => $res['card_num'], 'card_type' => $res['card_type'], 'valid_date' => $res['valid_date'] ]; return $data; } /** * 处理日期20220101 to 2020-01-01 * @param $date */ private function handleDate($date) { if (is_numeric($date)){ return substr($date, 0 , 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2); } else { return $date; } } public function imgToBase64($img_file) { $img_file = $this->saveTempImage($img_file); $img_base64 = ''; if (file_exists($img_file)) { $app_img_file = $img_file; // 图片路径 $img_info = getimagesize($app_img_file); // 取得图片的大小,类型等 //echo '
' . print_r($img_info, true) . '

'; $fp = fopen($app_img_file, "r"); // 图片是否可读权限 if ($fp) { $filesize = filesize($app_img_file); $content = fread($fp, $filesize); $file_content = chunk_split(base64_encode($content)); // base64编码 switch ($img_info[2]) { //判读图片类型 case 1: $img_type = "gif"; break; case 2: $img_type = "jpg"; break; case 3: $img_type = "png"; break; } $img_base64 = 'data:image/' . $img_type . ';base64,' . $file_content;//合成图片的base64编码 } fclose($fp); } return $img_base64; //返回图片的base64 } //获取网络图片到临时目录 public function saveTempImage($url) { if (strpos($url,'http') === false) { $url = 'http:'. trim($url); } if (!is_dir(\Yii::$app->runtimePath . '/image')) { mkdir(\Yii::$app->runtimePath . '/image'); } $save_path = \Yii::$app->runtimePath . '/image/' . md5($url) . '.jpg'; CurlHelper::download($url, $save_path); return $save_path; } }