资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

方案集成指南

本文档介绍了增强级APP实名认证方案配置流程,以及APP集成开发流程。

一、 准备工作

在正式集成前,需要做一些准备工作,完成一些账号、应用及配置,具体如下:

Step1: 注册成为开发者

在使用百度人脸实名认证方案之前,首先需注册百度云账号,账号注册方式请参考账号注册指南

百度云账号注册完成以后,为顺利调用百度AI能力,需完成企业认证。具体认证方式请参考企业认证指南

Step2:创建应用

2.1 输入应用名称,领取免费额度

  • 创建好账号后,在正式调用AI 能力之前,需首先创建应用,应用是调用服务的基础能力单元。 同时领取接口所需的免费调用额度,用于接入测试。如下图所示:

    image.png
  • 除人脸服务接口的免费调用额度外,还需领取身份证识别接口的免费调用额度,用来调用身份证OCR识别功能(必须领取,否则会报错服务异常),点击此处,按下图所示进行领取。
  • 如您之前已经领取过免费额度,无需重复领取,请跳至下一步骤。

2.2 勾选所需接口

  • 人脸识别服务相关接口已默认勾选且不可取消。

    image.png
  • 注:「接口选择」过程中,还需勾选「文字识别」中的「身份证识别」接口,用于实现身份核验流程中的身份证识别功能。如下图所示。
实名认证系统-接口选择-1.gif

2.3 输入应用包名

  • 在「文字识别包名」处选择「需要」,并根据您的APP应用信息填写包名。此处为必要操作,否则将无法顺利下载集成文件。至此应用创建完成。
image.png

2.4 获取密钥信息(AK/SK)

完成应用创建后,平台将会分配给您此应用的相关凭证,主要为AppID、API Key、Secret Key,以上三个信息是您应用实际开发的主要凭证,每个应用之间各不相同,请您妥善保管。您可在控制台的应用管理页面找到以上信息。如下图所示

image.png image.png

该AK/SK用于调用在线API 如:身份验证。在之后下载的集成文件(示例工程)中需要填写正确的AK/SK以顺利集成。

注:开发中请注意区分多份AK/SK(API Key、Secret Key),若填写的AK/SK与开发的应用不对应,会产生鉴权错误。

Step3:创建项目

  • 进入控制台-人脸实名认证页面,选择『项目管理』页面,点击『新建项目』,进行项目创建,如下图所示。

创建项目前,请确保您在应用控制台已创建应用,若您未创建应用,请参考STEP2创建应用后,再进行项目创建.

image.png

Step4:创建方案

  • 项目创建完成后,点击「方案管理」进入方案管理页面,在这里您可以为您的项目创建不同的方案,如下图所示。
image.png

若您的场景为APP场景(安卓/IOS系统),『场景方案』请选择APP实名认证方案;

若您的场景为微信、H5页面,『场景方案』请选择H5实名认证方案。

image.png

4.1 身份信息录入

  • 身份信息录入支持选择用户手动输入OCR拍照采集,如下图所示

实名认证系统-身份信息录入-1.gif

OCR拍照采集:会在之后生成的APP集成文件内集成OCR采集SDK,在本地进行身份证质量校验,并判断是否为身份证证件。 (OCR拍照采集支持实时采集和相册上传两种形式。推荐您使用实时采集,可以在一定程度增加方案的安全性及便捷性。)

手动输入:支持用户手动输入姓名+身份证号信息。

4.2 离线采集SDK配置

image.png
  • 填写授权标识:选择SDK的授权标识信息。

若您还未申请授权标识信息,请点击『新建授权』,并填写相关信息进行申请,申请过程如下图所示。

image.png image.png
  • 图像质量控制(本地):分为严格、正常、宽松三个等级,等级越严格,对采集图片的角度、模糊度、遮挡等信息参数把控越高,推荐使用正常。

此项配置为离线采集SDK端对采集图片的质量要求,推荐实名认证场景选择严格或正常模式。图片质量越好,云端接口传输的通过率越高。

  • 活体检测设置(本地):离线采集 SDK在前端要求用户做出指定动作,并检测动作的完成情况。在该过程,SDK 会随机抓取几帧图像进行本地活体检测,检测通过后将图片传至后台进行下一步检测。

此项配置为离线采集SDK端的活体检测动作,可对动作数量及顺序进行配置。推荐采用随机顺序进行三个以上动作的校验。

附录:

质量控制参数 「宽松」 「正常」 「严格」
光照最小值 30 40 60
光照最大值 240 220 200
遮挡-左眼 0.95 0.8 0.4
遮挡-右眼 0.95 0.8 0.4
遮挡-鼻子 0.95 0.8 0.4
遮挡-嘴巴 0.95 0.8 0.4
遮挡-左脸 0.95 0.8 0.4
遮挡-右脸 0.95 0.8 0.4
遮挡-下巴 0.95 0.8 0.4
姿态-俯仰角 30 20 15
姿态-左右角 18 18 15
姿态-旋转角 30 20 15
模糊度 0.8 0.6 0.4

4.3 人脸实名认证API配置

image.png
  • 人脸实名认证接口:增强级实名认证方案默认接入 增强级人脸实名认证API。在增强级APP方案中SDK会自动发起请求,但您需要在百度云控制台创建人脸识别应用,勾选增强级人脸实名认证API并开通付费
  • 安全加密能力:(增强级方案中默认开启此项功能,无需您自行配置)增强级APP方案集成文件中的采集SDK会对输出的图片进行加密,在云端增强级实名认证API进行解密。此端云配合的加密方式是百度专门针对市面黑产绕过采集SDK,攻击云端接口的攻击方式进行的功能升级。
  • 大数据风控:大数据风控功能开启后,接受SDK端传入的设备指纹信息,基于百度海量大数据设备因子,对SDK端进行设备风险识别,辨别是否为⻛险设备,返回识别结果。可有效防御黑产批量虚拟机、病毒侵入等攻击手段,降低第三方黑产攻破概率,提升业务安全性。
  • 图像质量检测:分为正常与宽松两个等级,等级设置越严格,对图片角度、模糊度、遮挡等信息参数把控越高,推荐使用宽松。
  • 活体检测:分为严格、正常、宽松三个等级,不同等级对应不同的活体检测阈值。等级设置越严格,对活体检测相关参数信息的把控越高。不同等级对应指标可参考下表,推荐使用正常。

活体检测阈值:活体检测得分高于此阈值,即判断为活体

误拒率(FRR):指误将活体用户判断为非活体的概率。如误拒率为0.5%,指1000次真人请求,会有5次因为活体分数低于阈值被错误拒绝。

控制度 对应阈值 说明
宽松 0.05 万分之一活体误拒率
正常(推荐) 0.3 千分之一活体误拒率
严格 0.9 百分之一活体误拒率
  • 阈值:用户人脸图片与公安权威数据源中人脸的相似度得分阈值,得分超过此阈值,即被判断为同一人。阈值分数相关指标可参考下表,推荐阈值为80。
阈值分数 误识率 识别率
60 0.781615% 99.550128%
70 0.096534% 98.307626%
78 0.015570%(万分之一) 95.672664%
80 (推荐) 0.009342%(低于万分之一) 94.323051%

Step5:提交方案,获取示例工程

完成上述方案配置后,点击『提交』,进入方案管理页面,下载IOS/安卓版集成文件(含示例工程)进行SDK端集成使用。

image.png

Step4中方案配置的参数会自动生成至集成文件(含示例工程)中,方便开发使用。 注意:请谨慎修改APP方案流程,修改后需要重新下载集成文件进行使用。

具体开发操作请参考以下步骤。

二、 集成逻辑

2.1 iOS集成

2.1.1 运行Demo

在真机上运行Demo代码并确认Demo本身可以正确进行人证核验

Step 1: 打开上述步骤中下载的集成文件demo,如下图所示:

Step 2: 确认demo中使用的bundleIdetifier是否为最终要使用的bundleIdetifier, 如果不对,则需要重新阅读上述文档,保证bundleIdetifier的正确性,也就是建方案的时候的iOS的包名,需要为自己工程的bundleIdetifer.

Step 3: 修改:FaceParameterConfig.h文件中的FACE_API_KEY 和 FACE_SECRET_KEY

Step 4: 真机运行demo代码,测试Demo

Step 5: 一定要确认demo是可以正常进行人脸检测的,即进行身份证识别和人脸检测之后,真机可以运行,并可以人证核验成功,如下图所示:

2.1.2 集成至目标工程

Step 1: 新建工程,如下图所示:

Step 2: 将上述demo中下载的BDFaceSDK文件夹和 AipOcrSdk.framework、AipBase.framework、IdcardQuality.frame三个framework拖动至目标工程中,如下图所示:

移动完成后,如下所示:

Step 3: 选择targets中的BuildPhases,点击下图所示的+号,然后选择New Copy File Phase,如下图所示

Step 4: 双击Copy Files,将Copy Files改名为Embed Frameworks, 然后点击Copy Files前面的>号打开该项,修改Destination为Frameworks,如下图所示

Step 5: 将工程中的AipOcrSdk.framework,AipBase.framework,IdcardQuality.framework三个framework,拖入Embed Frameworks中,如下图所示:

Step 6: 添加依赖库 libz.tbd 和 libc++.tbd ,如下图所示:

Step 7: 确认目标工程的bundleIdetifier和下载的示例工程的是一致的,同时也和申请授权标识license时填写的iOS包名是一致的。

Step 8: 真机可顺利运行代码。

2.1.3 代码说明

2.1.3.1 OCR鉴权代码

NSString *licenseFile = [[NSBundle mainBundle] pathForResource:FACE_API_ORC_KEY ofType:FACE_SECRET_OCR_KEY];
NSData *licenseFileData = [NSData dataWithContentsOfFile:licenseFile];
[[AipOcrService shardService] authWithLicenseFileData:licenseFileData];`

2.1.3.2 人脸SDK使用鉴权

[[SSFaceSDKManager sharedInstance] setBCEClientId:FACE_API_KEY clientSecret:FACE_SECRET_KEY];
NSString* licensePath = [NSString stringWithFormat:@"%@.%@", FACE_LICENSE_NAME, FACE_LICENSE_SUFFIX ];
[[SSFaceSDKManager sharedInstance] setLicenseID:FACE_LICENSE_ID andLocalLicenceFile:licensePath andRemoteAuthorize:YES];
NSLog(@"canWork = %d",[[SSFaceSDKManager sharedInstance] canWork]);
NSLog(@"version = %@",[[SSFaceSDKManager sharedInstance] getVersion]);`

2.1.3.3 获取token代码

``[self getAccessTokenWithAK:FACE_API_KEY SK:FACE_SECRET_KEY];``

2.1.3.4 初始化函数[[BDFaceActionLiveConfig sharedInstance] initSDK];

函数内容如下:

AppDelegate *appDelegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
if (![[SSFaceSDKManager sharedInstance] canWork]){
    NSLog(@"授权失败,请检测ID 和 授权文件是否可用");
    return;
}
// 设置人脸遮挡阈值
[[SSFaceSDKManager sharedInstance] setOccluThreshold:0.5];
// 设置亮度阈值
[[SSFaceSDKManager sharedInstance] setMinIllumThreshold:40];
[[SSFaceSDKManager sharedInstance] setMaxIllumThreshold:240];
// 设置图像模糊阈值
[[SSFaceSDKManager sharedInstance] setBlurThreshold:0.3];
// 初始化SDK配置参数,可使用默认配置
// 设置最小检测人脸阈值
[[SSFaceSDKManager sharedInstance] setMinFaceSize:200];
// 设置截取人脸图片高
[[SSFaceSDKManager sharedInstance] setCropFaceSizeWidth:400];
// 设置截取人脸图片宽
[[SSFaceSDKManager sharedInstance] setCropFaceSizeHeight:640];
// 设置头部姿态角度
[[SSFaceSDKManager sharedInstance] setEulurAngleThrPitch:10 yaw:10 roll:10];
// 设置人脸检测精度阈值
[[SSFaceSDKManager sharedInstance] setNotFaceThreshold:0.6];
// 设置抠图的缩放倍数
[[SSFaceSDKManager sharedInstance] setCropEnlargeRatio:2.5];
// 设置照片采集张数
[[SSFaceSDKManager sharedInstance] setMaxCropImageNum:3];
// 设置超时时间
[[SSFaceSDKManager sharedInstance] setConditionTimeout:15];
// 设置开启口罩检测,非动作活体检测可以采集戴口罩图片
[[SSFaceSDKManager sharedInstance] setIsCheckMouthMask:true];
// 设置开启口罩检测情况下,非动作活体检测口罩过滤阈值,默认0.8 不需要修改
[[SSFaceSDKManager sharedInstance] setMouthMaskThreshold:0.8f];
// 设置原始图缩放比例
[[SSFaceSDKManager sharedInstance] setImageWithScale:0.8f];
// 设置图片加密类型,type=0 基于base64 加密;type=1 基于百度安全算法加密
[[SSFaceSDKManager sharedInstance] setImageEncrypteType: 1];
// 初始化SDK功能函数

// 设置人脸过远框比例
[[SSFaceSDKManager sharedInstance] setMinRect:0.4];

// 设置图像阈值
[BDFaceAdjustParamsTool changeConfig:appDelegate.faceImageParams];
[[BDFaceActionLiveConfig sharedInstance] initActionLive];
[[SSFaceSDKManager sharedInstance] initCollect];`

2.1.3.5 设置动作函数

[BDFaceLivingConfigModel.sharedInstance.liveActionArray addObject:@(FaceLivenessActionTypeLiveEye)];
[BDFaceLivingConfigModel.sharedInstance.liveActionArray addObject:@(FaceLivenessActionTypeLiveMouth)];
[BDFaceLivingConfigModel.sharedInstance.liveActionArray addObject:@(FaceLivenessActionTypeLiveYawRight)];
BDFaceLivingConfigModel.sharedInstance.isByOrder = NO; // 动作是否是随机顺序
BDFaceLivingConfigModel.sharedInstance.numOfLiveness = 3;`

2.1.3.6 初始化SDK函数

[[SSFaceSDKManager sharedInstance] initCollect];`

2.1.3.7 活体检测状态的回调函数

- (void)livenessActionDidFinishWithCode:(LivenessRemindCode)code;`

2.1.3.8 人脸流程回调函数

- (void)faceSessionCompletionWithStatus:(BDFaceCompletionStatus)status result:(NSDictionary *)result;`

2.1.3.9 BDFaceCompletionStatus的状态

BDFaceCompletionStatusSuccess = 1,
BDFaceCompletionStatusNoRisk = 2, 
BDFaceCompletionStatusImagesSuccess = 3,
  • 上述三个都是采集流程正常的回调,BDFaceCompletionStatusNoRisk表示设备没有风险。
  • BDFaceCompletionStatusSuccessBDFaceCompletionStatusImagesSuccess 的区别是:BDFaceCompletionStatusSuccess 代表着整个流程的完成,即人脸离线活体检测和最终人证核验流程的结束;而 BDFaceCompletionStatusImagesSuccess代表了动作采集流程完成,但最终的人证核验流程还没有完成。

2.1.3.10 重要的开始人脸检测函数

[[SSFaceSDKManager sharedInstance] livenesswithList:livenessArray order:order numberOfLiveness:numberOfLiveness];

注意:进行人脸识别之前,需要先调用initCollect方法进行安全SDK初始化; 2.1.3.11 活体状态检测函数

- (void)livenessActionDidFinishWithCode:(LivenessRemindCode)code;

活体检测状态,如引导用户张嘴,转头都在这个回调里,具体看BDFaceLivenessViewController即可。 2.1.3.12 开始人脸识别函数

- (void)startRecognize {
[[BDFaceImageShow sharedInstance] setSuccessImage:nil];
NSDictionary *parameters =  [self.videoCapture creatFaceVerifyParameters:self.idCardNumber name:self.name verifyType:KFaceIdCardTypeDefault nation:nil phoneNumber:nil livenessControl:nil spoofingControl:nil qualityControl:nil];
[self.videoCapture startSessionWithType:BDFaceResultReportTypeVerifySec parameters:parameters faceFlow:self.faceFlowType viewController:self];
}

注意:上述函数中 参数: self.idCardNumber 是身份证号信息,self.name是姓名信息

2.1.4 SDK相关头文件介绍

2.1.4.1 SSFaceSDK.h

包含其他头文件,及人脸扫描、活体验证状态码,同时还有执行业务流程的参数枚举等。此处没有一一列举,具体请参照头文件:

#import "SSFaceSDKManager.h"
#import "SSFaceDetectionManager.h"
// 参数枚举等
typedef NSString *FaceIdCardType NS_STRING_ENUM;
FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeDefault; // 默认 大陆身份证
FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeMTPIDCard; // 港澳居民来往内地通行证
FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeFPRIDCard; // 外国人永久居留身份证
FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypePassport; // 定居国外的中国公民护照

// 活体检测返回状态
typedef NS_ENUM(NSUInteger, LivenessRemindCode) {
LivenessRemindCodeOK = 0,   //成功
LivenessRemindCodeBeyondPreviewFrame,    //出框
LivenessRemindCodeNoFaceDetected, //没有检测到人脸
LivenessRemindCodeMuchIllumination,
LivenessRemindCodePoorIllumination,   //光照不足
LivenessRemindCodeImageBlured,    //图像模糊
...

2.1.4.2 SSFaceSDKManager.h

图像采集行为和过程中需要的设置,属于全局配置。在原IDL库中FaceSDKManager基础上增加如下两个接口:

/**
 *  SDK云端校验设置
 *  需要云端校验,需提前申请id和secret
 *
 *  @param clientId api key
 *  @param clientSecret api secret
 */
- (void)setBCEClientId:(NSString *)clientId clientSecret:(NSString *)clientSecret;


/**
 * 设置活体动作
 * @param array 包含活体动作种类
 * @param order 是否顺序执行
 * @param numberOfLiveness 活体数量
 */
- (void)livenesswithList:(NSArray *)array order:(BOOL)order numberOfLiveness:(NSInteger)numberOfLiveness;

2.1.4.3 SSFaceDetectionManager.h

用于进行人脸识别具体行为动作。

@interface SSFaceDetectionManager : NSObject
// 图像返回帧处理代理
@property (nonatomic, weak) id<SSCaptureDataOutputProtocol> delegate;

// 采集流程运行状态
@property (nonatomic, assign, readonly) BOOL runningStatus;

// 风险检测超时时间:-1 关闭风险检测;大于0 风险检测超时时间;0 使用默认超时时间3秒
@property (nonatomic, assign) NSInteger riskDetectionSetting;

// 设置使用镜头,前置/后置
@property (nonatomic, assign) AVCaptureDevicePosition devicePosition;

// 输出形式,AVCaptureSessionPreset类型
@property (nonatomic, copy) NSString *sessionPresent;

// 采集图像区域
@property (nonatomic, assign) CGRect previewRect;

// 探测区域
@property (nonatomic, assign) CGRect detectRect;

// 是否开启声音提醒
@property (nonatomic, assign) BOOL enableSound;


/**
 * 创建用于实名认证的参数
 */
- (NSDictionary *)creatFaceVerifyParameters:(NSString *)idCardNumber
                                   name:(NSString *)name
                             verifyType:(FaceIdCardType)cardType
                                 nation:(NSString *)nation
                            phoneNumber:(NSString *)phoneNumber
                        livenessControl:(FaceLivenessControlType)livenessControl
                        spoofingControl:(FaceSpoofingControlType)spoofingControl
                         qualityControl:(FaceQualityControlType)qualityControl;

/**
 * 创建用于人脸比对的参数
 */
- (NSDictionary *)createFaceMatchParametersWithRegisterImage:(NSString *)registerImageBase64
                                       registerImageType:(FaceRegisterImageType)registerImageType
                                        registerFaceType:(FaceFaceType)registerFaceType
                                                faceType:(FaceFaceType)faceType
                                            faceSortType:(FaceSortype)faceSortType
                                             phoneNumber:(NSString *)phoneNumber
                                         livenessControl:(FaceLivenessControlType)livenessControl
                                          qualityControl:(FaceQualityControlType)qualityControl
                                 registerLivenessControl:(FaceLivenessControlType)registerLivenessControl
                                  registerQualityControl:(FaceQualityControlType)registerQualityControl;


/**
 * 开始当前人脸校验流程
 * @param detectionType 业务流程,采集信息用于实名认证、人脸比对
 * @param parameters 流程需要的参数
 * @param flowType 操作流程,人脸采集、人脸活体
 * @param vc 用于进行人脸信息采集的ViewController
 */
- (void)startSessionWithType:(BDFaceResultReportType)detectionType parameters:(NSDictionary *)parameters faceFlow:(BDFaceFlowType)flowType viewController:(UIViewController *)vc;

/**
 * 取消当前人脸校验流程
 */
- (void)cancel;
通过startSession方法开始进行人脸采集之后,会通过SSCaptureDataOutputProtocol类型的delegate进行回调:

/**
 * 流程返回结果类型
 */
typedef NS_ENUM(NSInteger, BDFaceCompletionStatus) {
BDFaceCompletionStatusSuccess = 1,  // 成功
BDFaceCompletionStatusNoRisk = 2,   // 无风险
BDFaceCompletionStatusImagesSuccess = 3, // 图像采集成功

BDFaceCompletionStatusIsRunning = -1,   // 正在采集图像
BDFaceCompletionStatusResultFail = -2,  // 云端服务执行失败
BDFaceCompletionStatusIsRiskDevice = -3,    // 风险设备
BDFaceCompletionStatusCameraError = -5,    // 没有授权镜头
BDFaceCompletionStatusTimeout = -6, // 超时
BDFaceCompletionStatusSDKNotInit = -13, // SDK未初始化
BDFaceCompletionStatusLicenseFail = -15, // 授权错误
BDFaceCompletionStatusNetworkError = -16,    // 网络错误
};

@protocol SSCaptureDataOutputProtocol <NSObject>

// 帧图像回传,用于刷新UI使用
- (void)captureOutputSampleBuffer:(UIImage *)image;

// 本次人脸流程回调
- (void)faceSessionCompletionWithStatus:(BDFaceCompletionStatus)status result:(NSDictionary *)result;

// 活体检测状态
- (void)livenessActionDidFinishWithCode:(LivenessRemindCode)code;

// 人脸识别检测
- (void)detectionActionDidFinishWithCode:(DetectRemindCode)code;

@end

2.2 安卓集成

2.2.0 运行demo

(1)替换AK、SK

AK/SK获取方式请参考这里

(2)替换签名

运行成功后,如下图所示。

2.2.1 资源准备

将申请得到的以下文件放到app module 下的assets目录中

  1. aip.license //OCR 身份证识别的license,不能修改该文件名
  2. console_config.json //人脸识别的配置
  3. idl-key.face-android //LH 加固版人脸采集的密钥,不能修改该文件名
  4. idl-license.face-android //FACESDK的license

备注 :以下列举几个关键流程,完整流程请参考下载示例代码

2.2.2 OCR身份证识别集成

  • 把申请的license(aip.license)放到到项目中app module下的assets目录中
  • 修改app的build.gradle包名为申请时填入的包名 img
  • 拷贝ocr-ui到您的工程中

接下来调用具体请看示例工程

Step 1:在首页面初始化OCR SDK(在HomeActivity.java中)

private void initOCRSDK() {
        OCR.getInstance(this).initAccessToken(new OnResultListener<AccessToken>() {
            @Override
            public void onResult(final AccessToken result) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // 调用成功,返回AccessToken对象
                        String token = result.getAccessToken();
                    }
                });
            }

            @Override
            public void onError(final OCRError error) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //调用失败
                        Log.d(TAG, "run: erromsg=" + error.getMessage());
                    }
                });

            }
        }, getApplicationContext());
    }

Step 2: 跳转至身份证扫描页面进行身份证扫描(在HomeActivity.java中)

 /**
     * 开始进入身份证认证页面
     */
    private void startIdCardVerify() {
        if (mConsoleConfig.getUseOcr() == 1) {
            Intent intent = new Intent(mContext, CameraExpActivity.class);
            // 设置临时存储
            intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
                    FileUtil.getSaveFile(getApplication()).getAbsolutePath());
            // 调用拍摄身份证正面的activity
            intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
            intent.putExtra(CameraActivity.KEY_NATIVE_TOKEN, OCR.getInstance(this).getLicense());
            intent.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
            startActivity(intent);
        } else {
            Intent intent = new Intent(mContext, IdCardInputActivity.class);
            startActivity(intent);
        }
    }

Step 3:调用身份证识别请求接口api进行身份证识别(在IdCardRecognizeActivity.java中)

其中请求参数如下:

请求参数 说明
image 身份证扫描的图像
id_card_side 身份证的正反面类型
detect_risk 是否开启旋转识别
/**
     * 识别身份证
     */
    private void recIDCard(String idCardSide, final String filePath) {
        IDCardParams param = new IDCardParams();
        param.setImageFile(new File(filePath));
        param.setIdCardSide(idCardSide);
        param.setDetectDirection(true);
        OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
            @Override
            public void onResult(final IDCardResult result) {
                    runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (result == null) {
                            return;
                        }
                        //识别成功获取值
                        Word idNumber = result.getIdNumber();
                        Word nameWord = result.getName();
                        if (idNumber != null) {
                            mIdCardNum = idNumber.getWords();
                        }

                        if (nameWord != null) {
                            mUsername = nameWord.getWords();
                        }
                    }
                });
            }

            @Override
            public void onError(final OCRError error) {
                //识别失败
            }
        });
    }

Step 4: 获得身份证号码和姓名后进入人脸活体验证步骤

详细调用文档,请参考 OCR-Android-SDK文档

2.2.3 人脸SDK集成

Step 1: 授权参数

(1)导入如下module

  • 拷贝faceplatform-ui到您的工程中
  • 拷贝lib-liantian到您的工程中

(2)把申请的license(idl-license.face-android","idle-key.face-android")放到到项目中app module下的assets目录中(console_config.json 为示例工程配置,开发者可更换配置方案)

(3)修改 Config.java 类中的参数

人脸实名认证控制台创建完APP方案后,会自动生成LicenseID和LicenseFileName信息,这里您只需要填写apiKey和secretkey信息即可。

public class Config {
    // 为了apiKey,secretKey为您调用百度人脸在线接口的,如注册,比对等。
    // 为了的安全,建议放在您的服务端,端把人脸传给服务器,在服务端端
    // license为调用sdk的人脸检测功能使用,人脸识别 = 人脸检测(SDK功能)+ 人脸比对(服务端API)
    public static String apiKey = "替换为你的apiKey(ak)";
    public static String secretKey = "替换为你的secretKey(sk)";
    public static String licenseID = "替换为你的licenseID,后台SDK管理界面中,已经生成的licenseID,如:test-face-android";
    public static String licenseFileName = "替换为你的license文件名称(放于assets目录)";
}

(4)配置签名(申请license时的md5为打包签名的文件,所以必须用申请license的签名文件

app->build.gradle->android->signingConfigs
signingConfigs {
        def password = "替换为签名密码"
        def alias = "替换为签名别名"
        def filePath = "替换为签名文件路径"  //如  ../facesharp.jks//签名文件路径
        debug {
            keyAlias alias
            keyPassword password
            storeFile file(filePath)
            storePassword(password)
        }
        release {
            keyAlias alias
            keyPassword password
            storeFile file(filePath)
            storePassword(password)
        }
    }

(5)修改包名 app->build.gradle->android->defaultConfig ->applicationId您申请license时填的包名

img

Step 2:初始化人脸相关SDK

ExampleApplication中初始化LH安全加固人脸采集类

 private void initLH() {
        LH.setAgreePolicy(getApplicationContext(), true);
        LH.init(getApplicationContext(),
                Config.licenseID,
                Config.apiKey,
                Config.secretKey);

    }

HomeActivity.java中初始化FaceSDK

private void initLicense() {
    setFaceConfig();
    // 为了android和ios 区分授权,appId=appname_face_android ,其中appname为申请sdk时的应用名
    // 应用上下文
    // 申请License取得的APPID
    // assets目录下License文件名
    FaceSDKManager.getInstance().initialize(mContext, 
    Config.licenseID, Config.licenseFileName, new IInitCallback() {
            @Override
            public void initSuccess() {
            // 初始化OCR SDK 使用的license是aip.license,名字不能修改
                initOCRSDK();
            }

            @Override
            public void initFailure(final int errCode, 
            final String errMsg) {
                runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       Log.e(TAG, "初始化失败 = " + errCode + " " + errMsg);
                       showToast("初始化失败 = " + errCode + ", " + errMsg);
                       mIsInitSuccess = false;
                   }
                });
            }
        });
    }

Step 3:设置配置参数,如不设置,将使用默认值(在 HomeActivity.java中)

    /**
     * 参数配置方法
     */
    private boolean setFaceConfig() {
        FaceConfig config = FaceSDKManager.getInstance().getFaceConfig();
        mConsoleConfig = ConsoleConfigManager.getInstance(mContext).getConfig();
        if (mConsoleConfig == null) {
            return false;
        }
        // -----TODO:以下为通过console平台获取到的配置信息-----
        // 设置模糊度阈值
        config.setBlurnessValue(mConsoleConfig.getBlur());
        // 设置最小光照阈值(范围0-255)
        config.setBrightnessValue(mConsoleConfig.getIllumination());
        // 设置最大光照阈值(范围0-255)
        config.setBrightnessMaxValue(mConsoleConfig.getMaxIllumination());
        // 设置左眼遮挡阈值
        config.setOcclusionLeftEyeValue(mConsoleConfig.getLeftEyeOcclu());
        // 设置右眼遮挡阈值
        config.setOcclusionRightEyeValue(mConsoleConfig.getRightEyeOcclu());
        // 设置鼻子遮挡阈值
        config.setOcclusionNoseValue(mConsoleConfig.getNoseOcclu());
        // 设置嘴巴遮挡阈值
        config.setOcclusionMouthValue(mConsoleConfig.getMouthOcclu());
        // 设置左脸颊遮挡阈值
        config.setOcclusionLeftContourValue(mConsoleConfig.getLeftCheekOcclu());
        // 设置右脸颊遮挡阈值
        config.setOcclusionRightContourValue(mConsoleConfig.getRightCheekOcclu());
        // 设置下巴遮挡阈值
        config.setOcclusionChinValue(mConsoleConfig.getChinOcclu());
        // 设置人脸姿态角阈值
        config.setHeadPitchValue(mConsoleConfig.getPitch());
        config.setHeadYawValue(mConsoleConfig.getYaw());
        config.setHeadRollValue(mConsoleConfig.getRoll());
        // 设置活体动作,通过设置list,LivenessTypeEunm.Eye, LivenessTypeEunm.Mouth,
        // LivenessTypeEunm.HeadUp, LivenessTypeEunm.HeadDown, LivenessTypeEunm.HeadLeft,
        // LivenessTypeEunm.HeadRight, LivenessTypeEunm.HeadLeftOrRight
        config.setLivenessTypeList(mConsoleConfig.getActions());
        // 设置动作活体是否随机
        config.setLivenessRandom(mConsoleConfig.isFaceVerifyRandom());
        // 风控加密类型,0:普通版;1:加密版
        config.setSecType(mConsoleConfig.getSecType());

        // -----TODO:以下不需要通过console平台配置,需要手动修改-----
        // 设置可检测的最小人脸阈值
        config.setMinFaceSize(FaceEnvironment.VALUE_MIN_FACE_SIZE);
        // 设置可检测到人脸的阈值
        config.setNotFaceValue(FaceEnvironment.VALUE_NOT_FACE_THRESHOLD);
        // 设置闭眼阈值
        config.setEyeClosedValue(FaceEnvironment.VALUE_CLOSE_EYES);
        // 设置图片缓存数量
        config.setCacheImageNum(FaceEnvironment.VALUE_CACHE_IMAGE_NUM);
        // 设置开启提示音
        config.setSound(ExampleApplication.isOpenSound);
        // 原图缩放系数
        config.setScale(FaceEnvironment.VALUE_SCALE);
        // 抠图宽高的设定,为了保证好的抠图效果,建议高宽比是4:3
        config.setCropHeight(FaceEnvironment.VALUE_CROP_HEIGHT);
        config.setCropWidth(FaceEnvironment.VALUE_CROP_WIDTH);
        // 抠图人脸框与背景比例
        config.setEnlargeRatio(FaceEnvironment.VALUE_CROP_ENLARGERATIO);
        // 选择针对人脸采集输出图片的类型进行加密,0:原图,1:抠图
        config.setOutputImageType(FaceEnvironment.VALUE_OUTPUT_IMAGE_TYPE);
        // 检测超时设置
        config.setTimeDetectModule(FaceEnvironment.TIME_DETECT_MODULE);
        // 检测框远近比率
        config.setFaceFarRatio(FaceEnvironment.VALUE_FAR_RATIO);
        config.setFaceClosedRatio(FaceEnvironment.VALUE_CLOSED_RATIO);
        FaceSDKManager.getInstance().setFaceConfig(config);
        return true;
    }

Step 4:开始进行人脸采集

  1. IdCardConfirmActivity.java 采集到身份证号码和姓名后开始进行人脸活体采集
    public static final String EXT_USERNAME = "username";
    public static final String EXT_ID_NUMBER = "idNumber";

    // 调转到动作活体采集界面
    faceIntent.setClass(this, FaceLivenessExpActivity.class);
    faceIntent.putExtra(EXT_USERNAME, mUsername);
    faceIntent.putExtra(EXT_ID_NUMBER, mIdNumber);
    startActivity(faceIntent);

2 . 采集过程中设置语音开关

//设置是否开启语音
LH.setSoundEnable(mIsEnableSound);

3 .开启预览,示例A为开始实名认证流程,如只进行人脸比对流程则在开启预览时替换为示例B人脸对比方法即可

示例A,开始实名认证流程

protected void startPreview() {
        if (mSurfaceView != null && mSurfaceView.getHolder() != null) {
            mSurfaceHolder = mSurfaceView.getHolder();
        }
        Log.d(TAG, "name=" + sName + " ,idNumber=" + sIdNumber);
        LH.startFaceVerify(this, mSurfaceHolder, this, 5, new FaceVerifyInfo
                (sIdNumber, sName, 0, "CHN", FaceEnum.LivenessControl.NONE,
                        FaceEnum.SpoofingControl.NONE,
                        FaceEnum.QualityControl.NONE, ""), true);


    }

实名认证参数说明:

activity:执行人脸采集的Activity。

previewSurfaceHolder:用于展示摄像头预览的SurfaceView的Holder。
processCallback:流程回调,见“FaceProcessCallback接口”。
deviceCheckTimeout:安全检测超时时间,传入正数时,若在该时间内(单位:秒)未完成检测,则跳过。传入-1跳过检测,传入0后台检测。
info:实名认证信息,包含身份证号,姓名等信息。
liveness:是否进行活体检测。

示例B,开始人脸对比流程

 String image=Base64Utils.encodeToString(
        getImageFromAssetsFile(getApplicationContext(),"ceshi.jpg"),Base64Utils.NO_WRAP);

LH.startFaceCompare(this, mSurfaceHolder, this, 5, new FaceCompareInfo
        (FaceEnum.QualityControl.NONE, FaceEnum.LivenessControl.NORMAL,
                FaceEnum.FaceType.LIVE,0,
                image,FaceEnum.ImageType.BASE64,FaceEnum.FaceType.LIVE,
                FaceEnum.QualityControl.NORMAL, FaceEnum.LivenessControl.NORMAL,""), true);
//获取assets目录下的图片             
public static byte[] getImageFromAssetsFile(Context context, String fileName) {
    byte[] result = null;
    AssetManager am = context.getResources().getAssets();
    try {
        InputStream is = am.open(fileName);
        result=new byte[is.available()];
        is.read(result);
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

人脸对比参数说明:

activity:执行人脸采集的Activity。

previewSurfaceHolder:用于展示摄像头预览的SurfaceView的Holder。
processCallback:流程回调,见“FaceProcessCallback接口”。
deviceCheckTimeout:安全检测超时时间,传入正数时,若在该时间内(单位:秒)未完成检测,则跳过。传入-1跳过检测,传入0后台检测。
info:人脸比对信息,包含比对用图片等信息。
liveness:是否进行活体检测。

4 .建议在 Activity.onPause()放方法中取消正在进行的流程

 
    @Override
    public void onPause() {
        if (!mIsCompletion) {
            LH.cancelFaceProcess();
        }
        mIsCompletion = false;
        super.onPause();
    }

取消正在进行的人脸比对或实名认证流程。安全SDK取消整个流程。请在Activity的onPause中调用此方法,保证界面离开顶端时流程被取消。下次进入界面应当重新开始人脸验证过程。调用此接口后,调用后LH 的onEnd()回调会返回-6错误码。属于正常现象。

5 . 获取校验结果

   
    @Override
    public void onEnd(final int status, String resultJson) {
        Log.e("FaceLivenessActivity", "onEnd called:" + status + "_" + resultJson);
        if (status == 1) {
            //流程正常结束
        } else {
            //流程异常结束
        }
    }

获取校验结果API接口参数说明

status:1代表正常结束, <0的值均表示未正常结束。

resultJson:云端返回的结果。只有status为1时此字段有值。其他情况为空字符串。

onEnd的部分status值列举如下

1:正常结束,返回云端验证结果。

-1:已经有一个采集验证流程在运行。

-2:云端验证过程异常。

-3:风控验证失败。

-4:更严格情形下的风控验证失败。

-5:摄像头异常。

-6:流程被取消。

-7:线程异常。

-8:筛选图像异常。

-9:采集前流程异常。

-10:活体验证步骤异常。

-11:预览异常。

-12:采集后流程异常。

-13:未初始化Liantian安全SDK。

-14:未同意隐私协议。

-15:未成功加载安全模块。

-18:未检出人脸超时。

-19:网络异常。

更多LH 接口信息点击 安全采集SDKAPI 接口

上一篇
方案简介
下一篇
金融级APP实名认证方案