在简书这一个月不可发布文章的期间,我渐渐喜欢上掘金这个软件。掘金里面很多技术性的文章,写的也很好。但是我发现,之间一些自己遇到的问题并不能很好的让别人浏览到。所以转几篇踩坑文章。
今天给大家分享一下,这几天调用身份证认证API的流程。在此是使用nodejs写的后台。
前提
1.我们需要使用是百度的API,你就必须有一个百度智能云的账号。直接百度可能找不到!在此,附上网址链接:https://login.bce.baidu.com<br >
2.注册在此不过多赘述,登录成功后跳转到如下界面:
-
点击产品服务-人工智能-文字识别。
-
点击进入如下界面。
-
因为我已经创建了一个应用,在此,大家可以点击创建应用,填写以下名称,一切默认,点击立即创建即可。
-
在你的应用列表里就会出现一个应用。在接下来你要使用的AppID、Appkey、Secret Key都在此复制。
安装
- 我选择的是Node-SDK安装,再调用接口。安装Node-SDK方法很多,你可以到官网上去下载然后把你所需要的拖到自己的文件中,你也可以到GitHub上搜索下载。
- 我选择的是直接在安装好的node_modules基础上,直接输入命令:npm install baidu-aip-sdk。
调用
-
我是直接使用npm命令导入baidu-aip-sdk模块,所以,在此之前默认项目框架已经搭建完好。(采用MVC结构)目录大致如下:
- 为方便使用,就不在此再创建文件,在你所需要认证的文件内,直接新建对象。(我是在个人中心的应用层中写入)。
- 在应用层内调用baidu-aip-sdk模块,设置APPID/AK/SK。以下步骤均在应用层操作。
var AipOcrClient = require("baidu-aip-sdk").ocr;
// 设置APPID/AK/SK
var APP_ID = "你的 App ID";
var API_KEY = "你的 Api Key";
var SECRET_KEY = "你的 Secret Key";
// 新建一个对象,建议只保存一个对象调用服务接口
var client = new AipOcrClient(APP_ID, API_KEY, SECRET_KEY);
var HttpClient = require("baidu-aip-sdk").HttpClient;
// 设置request库的一些参数,例如代理服务地址,超时时间等
// request参数请参考 https://github.com/request/request#requestoptions-callback
HttpClient.setRequestOptions({timeout: 5000});
// 也可以设置拦截每次请求(设置拦截后,调用的setRequestOptions设置的参数将不生效),
// 可以按需修改request参数(无论是否修改,必须返回函数调用参数)
// request参数请参考 https://github.com/request/request#requestoptions-callback
HttpClient.setRequestInterceptor(function(requestOptions) {
// 查看参数
console.log(requestOptions)
// 修改参数
requestOptions.timeout = 5000;
// 返回参数
return requestOptions;
});
- 上传身份证正面。首先需要完成能够上传图片的基础上,再进行身份证识别。上传图片路由、应用层:
//router文件
router.post('/idCardFront', function(req, res, next) {
userController.idCardFront(req, res)
})
//controllerse文件
idCardFront: function(req, res) {
var form = new formidable.IncomingForm() //创建上传表单对象
form.uploadDir = path.join(__dirname, '..', '/public/idCard') //设置上传文件的路径
form.keepExtensions = true //设置保留上传文件的扩展名
form.parse(req, function(err, fields, files) {
if (err) {
res.send('头像上传错误!')
}
console.log('...................')
//fields是上传的表单字段数组,files是上传的文件列表
// console.log(files)
//保存图片路径到数据库
//1.获取当前用户编号
let userId = req.user[0].base_info_Id
//2.获取当前用户的图片名称
let headPic = path.parse(files.file.path).base
// console.log('jpg格式:' + headPic)
// console.log(files.file.path)
res.json({ code: 200, data:headPic, msg: '身份证上传成功!审核通过!' })
})
}
- 在识别身份证之前,需要将你存在服务器的图片读取并以base64格式显示。
//读取服务器文件,以base64显示
let filePath = files.file.path
let bitmap = fs.readFileSync(filePath);
let image = Buffer.from(bitmap, 'binary').toString('base64');
- 调用百度接口。
client.idcard(image, idCardSide).then(function(result) {
results = JSON.stringify(result)
console.log(results)
var id = {}
res.json({ code: 200, data: results, msg:'身份证上传成功!审核通过!' })
}).catch(function(err) {
// 如果发生网络错误
console.log(err);
res.json({ code: 200, msg: '身份证上传成功!审核不通过!' })
});
7.运行postman,传入图片,进行身份证识别。
可以在服务器看到身份证上的信息代表认证成功!在此附上标准认证成功返回的json格式:
{
"log_id": 2648325511,
"direction": 0,
"image_status": "normal",
"idcard_type": "normal",
"edit_tool": "Adobe Photoshop CS3 Windows",
"words_result": {
"住址": {
"location": {
"left": 267,
"top": 453,
"width": 459,
"height": 99
},
"words": "南京市江宁区弘景大道3889号"
},
"公民身份号码": {
"location": {
"left": 443,
"top": 681,
"width": 589,
"height": 45
},
"words": "330881199904173914"
},
"出生": {
"location": {
"left": 270,
"top": 355,
"width": 357,
"height": 45
},
"words": "19990417"
},
"姓名": {
"location": {
"left": 267,
"top": 176,
"width": 152,
"height": 50
},
"words": "伍云龙"
},
"性别": {
"location": {
"left": 269,
"top": 262,
"width": 33,
"height": 52
},
"words": "男"
},
"民族": {
"location": {
"left": 492,
"top": 279,
"width": 30,
"height": 37
},
"words": "汉"
}
},
"words_result_num": 6
}
这样,身份认证就完成啦!