阿里云RecognizeIdcard - 身份证识别的这个PHP的sdk版本运行的时候,总是不显示,对php新手来说,就是一头雾水,无从下手。这里给大家做一个讲解。
首先,我们看下php下载下来的SDK。 默认的他包含autoload和src下面的sample.php 这两个文件。当然其他文件,我们暂时不看。autoload.php这个就不用管他了。他是一过自动加载的功能的文件。主要就是src下面的sample.php 这个。我们把他们的这个SDK放到web目录之后,你配置好了php环境就可以运行了。但是这个时候,我们访问这个文件的时候,他是不显示的。这里,我们先看sample.php 文件的代码。
<?php
// This file is auto-generated, don't edit it. Thanks.
namespaceAlibabaCloud\SDK\Sample;
use AlibabaCloud\SDK\Ocrapi\V20210707\Ocrapi;
use AlibabaCloud\Tea\Utils\Utils;
use AlibabaCloud\Tea\Console\Console;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Ocrapi\V20210707\Models\RecognizeIdcardRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
classSample {
/**
* 使用AK&SK初始化账号Client
* @paramstring $accessKeyId
* @paramstring $accessKeySecret
* @returnOcrapi Client
*/
publicstaticfunctioncreateClient($accessKeyId, $accessKeySecret){
$config = newConfig([
// 必填,您的 AccessKey ID
"accessKeyId" => $accessKeyId,
// 必填,您的 AccessKey Secret
"accessKeySecret" => $accessKeySecret
]);
// 访问的域名
$config->endpoint = "ocr-api.cn-hangzhou.aliyuncs.com";
returnnewOcrapi($config);
}
/**
* 使用STS鉴权方式初始化账号Client,推荐此方式。本示例默认使用AK&SK方式。
* @paramstring $accessKeyId
* @paramstring $accessKeySecret
* @paramstring $securityToken
* @returnOcrapi Client
*/
publicstaticfunctioncreateClientWithSTS($accessKeyId, $accessKeySecret, $securityToken){
$config = newConfig([
// 必填,您的 AccessKey ID
"accessKeyId" => $accessKeyId,
// 必填,您的 AccessKey Secret
"accessKeySecret" => $accessKeySecret,
// 必填,您的 Security Token
"securityToken" => $securityToken,
// 必填,表明使用 STS 方式
"type" => "sts"
]);
// 访问的域名
$config->endpoint = "ocr-api.cn-hangzhou.aliyuncs.com";
returnnewOcrapi($config);
}
/**
* @paramstring[] $args
* @returnvoid
*/
publicstaticfunctionmain($args){
// 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/311677.html
$client = self::createClient("ACCESS_KEY_ID", "ACCESS_KEY_SECRET");
$recognizeIdcardRequest = newRecognizeIdcardRequest([]);
$runtime = newRuntimeOptions([]);
$resp = $client->recognizeIdcardWithOptions($recognizeIdcardRequest, $runtime);
Console::log(Utils::toJSONString($resp));
}
}
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
require_once$path;
}
Sample::main(array_slice($argv, 1));
如上面的代码,差不多的意思就是一个叫sample的类,然后,我们在最后面使用了设个类的静态方法。samle::main();
换句话说就是main算是这个php文件的运行的入口了。我们细看下,$argv 这个参数是一个数组,但是并未有实例化,也就是说,这个$argv是空数组。这里,因为这个数组就是空的,所以就没有值了。
这里,我们先给$argv=array("url"=>"http://tywl88.com/sfz.jpg"); 给他一个数组,有人问,为什么是 url呢?其实这个是这个接口要求的,他要求传入一个url或者一个body,我们这里就用url好了。还有个小问题,就是array_slice()这个数组函数。他是从1开始的。但是我们只定义了一个元素的一维数组。所以,这个从1,改成0.就是 array_slice($argv,0),从0开始就可以了。
但是,到这里,有参数了,也是不显示的。因为上面的main方法中,我们并未返回查询结果。所以,这里要在上面增加一个函数的返回结果。
这里,我们直接上代码好了。
<?php
// This file is auto-generated, don't edit it. Thanks.
namespaceAlibabaCloud\SDK\Sample;
use AlibabaCloud\SDK\Ocrapi\V20210707\Ocrapi;
use\Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use AlibabaCloud\Tea\Utils\Utils;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Ocrapi\V20210707\Models\RecognizeIdcardRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
classSample {
/**
* 使用AK&SK初始化账号Client
* @paramstring $accessKeyId
* @paramstring $accessKeySecret
* @returnOcrapi Client
*/
publicstaticfunctioncreateClient($accessKeyId, $accessKeySecret){
$config = newConfig([
// 必填,您的 AccessKey ID
"accessKeyId" => $accessKeyId,
// 必填,您的 AccessKey Secret
"accessKeySecret" => $accessKeySecret
]);
// 访问的域名
$config->endpoint = "ocr-api.cn-hangzhou.aliyuncs.com";
returnnewOcrapi($config);
}
/**
* @paramstring[] $args
* @returnvoid
*/
publicstaticfunctionmain($args){
// 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/311677.html
$client = self::createClient("xxxx", "yyyy"); //这里替换成你的密钥那些
$recognizeIdcardRequest = newRecognizeIdcardRequest($args);
$runtime = newRuntimeOptions([]);
try {
// 复制代码运行请自行打印 API 的返回值
$fan=$client->recognizeIdcardWithOptions($recognizeIdcardRequest, $runtime);
}
catch (Exception$error) {
if (!($error instanceof TeaError)) {
$fan= $error = newTeaError([], $error->getMessage(), $error->getCode(), $error);
}
// 如有需要,请打印 error
$fan=Utils::assertAsString($error->message);
}
return$fan;
}
}
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
require_once$path;
}
$argv=array(
);
$str=Sample::main(array_slice($argv, 0));
var_dump($str);
经过这样的修改之后,你访问 http://www.tywl88.com/src/sample.php 就可以有返回结果了。这里真心服了给这个SDK的程序员,就不能一次性给一个可以执行的案例码?给一个案例,还埋了这么多坑。返回没写,参数没写,对了,还有个地方没说,$recognizeIdcardRequest = newRecognizeIdcardRequest($args);
这里他将$args去掉,直接写成 [] 这样的格式,喵了个咪,这个坑算是天坑了。如果你不把这个参数输入进去,他就永远都是[] ,空数组。永远不会有查询结果。真心服了这些大神了。就不能写完整点码?
以上编码由惠州网站建设修复,并测试通过。