Tencent OCR API
编写背景(废话):开发项目中部分依赖环境老旧,用为省事弃用 composer 引入官方SDK,故参照官方文档(链接如上),本着能跑就行的原则编写如下代码。留此文以防健忘或往后回顾。
- 仅支持图片格式
- 或可通过修改公共参数 Action、Version 调用 OCR 其他功能(通用文字识别、通用卡证识别等)。
<?php
class TxOcr
{
# 图片识别
// $imgFile = ""; // 选择文件(路径)
// $fp = fopen($imgFile, "rb", 0); // 打开文件
// $binary = fread($fp, filesize($imgFile)); // 读取文件
// fclose($fp); // 关闭文件
// $img_data = base64_encode($binary); // 转码成 base64
// $resCode = $Ocr -> DutyPaidProofOCR($img_data); // 调用
# 完税证明接口
# $Img 为 base64 格式时, $ImgFormat 应为 "ImageBase64"
# $Img 为 URL(如:img.xxx.com/xxx.jpg)时, $ImgFormat 应为 "ImageUrl"
public function DutyPaidProofOCR($Img, $ImgFormat = "ImageBase64")
{
// 配置参数
$SecretId = ""; // 腾讯云控制台中获取 SecretId
$SecretKey = ""; // 腾讯云控制台中获取 SecretKey
$api_url = "https://ocr.tencentcloudapi.com/"; // 接口请求域名
$api_host = "ocr.tencentcloudapi.com";
$api_service= "ocr";
$api_action = "DutyPaidProofOCR"; // 公共参数:Action
$api_region = "ap-guangzhou"; // 公共参数:Region
$api_version = "2018-11-19"; // 公共参数:Version
// 请求时间
$request_time = time();
$request_date = date("Y-m-d", $request_time);
//图片参数
$ImgFormat == "ImageBase64" ? "ImageBase64" : "ImageUrl";
$params_data = [
$ImgFormat => $Img,
];
$params_data = json_encode($params_data);
// 1.拼接规范请求串
$httpRequestMethod = "POST";
$canonicalUri = "/";
$canonicalQueryString = "";
$canonicalHeaders = "content-type:application/json; charset=utf-8\n"."host:".$api_host."\n";
$signedHeaders = "content-type;host";
// $payload = '{"Limit": 1, "Filters": [{"Values": ["\u672a\u547d\u540d"], "Name": "instance-name"}]}';
// $hashedRequestPayload = hash("SHA256", $payload);
$hashedRequestPayload = hash("SHA256", $params_data);
$canonicalRequest = $httpRequestMethod."\n"
.$canonicalUri."\n"
.$canonicalQueryString."\n"
.$canonicalHeaders."\n"
.$signedHeaders."\n"
.$hashedRequestPayload;
// 2.拼接待签名字符串
$algorithm = "TC3-HMAC-SHA256";
$requestTimestamp = $request_time;
$credentialScope = $request_date."/".$api_service."/tc3_request";
$hashedCanonicalRequest = hash("SHA256", $canonicalRequest);
$stringToSign = $algorithm."\n"
.$requestTimestamp."\n"
.$credentialScope."\n"
.$hashedCanonicalRequest;
// 3.计算签名
$secretDate = hash_hmac("SHA256", $request_date, "TC3".$SecretKey, true);
$secretService = hash_hmac("SHA256", $api_service, $secretDate, true);
$secretSigning = hash_hmac("SHA256", "tc3_request", $secretService, true);
$signature = hash_hmac("SHA256", $stringToSign, $secretSigning);
// 4.拼接 Authorization
$Authorization = $algorithm."Credential=".$SecretId."/".$credentialScope.", SignedHeaders=content-type;host, Signature=".$signature; // HTTP 标准身份认证头部字段
// 设置 header
$curl_header = array(
"Content-Type: application/json; charset=utf-8",
"Authorization:".$Authorization,
"Host:".$api_host,
"X-TC-Action:".$api_action,
"X-TC-Region:".$api_region,
"X-TC-Version:".$api_version,
"X-TC-Timestamp:".$request_time,
);
$ocrRes = $this -> httpRequest($api_url, "POST", $params_data, $curl_header);
if ($ocrRes) {
$infoDetail = json_decode($ocrRes, true)['Response']['DutyPaidProofInfos'];
}
var_dump($infoDetail);
}
// http 请求
private function httpRequest($url, $method='POST', $data='', $curl_header)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_REFERER, $_SERVER['HTTP_HOST']);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
if ($method == 'POST') {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HTTPHEADER, $curl_header);
}
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
$result = curl_exec($curl);
if (curl_getinfo($curl, CURLINFO_HTTP_CODE ) == "200") {
$resHeaderSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$result = substr($result, $resHeaderSize);
}
curl_close($curl);
return $result;
}
}