开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
图像技术
文字识别
人脸与人体识别
视频技术
AR与VR
自然语言处理
知识图谱
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
智能农业
信息服务
智能园区
智能硬件
人脸识别

    APP端集成开发

    人证核验工程使用说明文档

    一、 准备工作

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

    1.1 注册成为开发者

    1. STEP1:点击百度AI 开放平台导航右侧的控制台,页面跳转到百度云登录界面,登录完毕后,将会进入到百度云后台,点击「控制台」进入百度云控制台页面;您也可以在官网直接点击免费试用,登录完毕后将自动进入到百度云控制台。
    2. STEP2:使用百度账号完成登录,如您还未持有百度账户,可以点击此处注册百度账户。
    3. STEP3:进入百度云欢迎页面,填写企业和个人基本信息,注册完毕,至此成为开发者。(如您之前已经是百度云用户或百度开发者中心用户,STEP3 可略过。)
    4. STEP4:进入百度云控制台,找到人工智能相关服务面板。
    5. STEP5:点击进入「人脸识别」模块。

    1.2 创建应用

    创建好账号后,在正式调用AI 能力之前,需要您创建一下应用,这个是调用服务的基础能力单元。 选择「人脸识别」服务,首先见到此服务的控制台概览页,点击「创建应用」,即可进入应用创建界面,如下图所示:

    创建应用

    如上图所示,点击「创建应用」,即可进入应用创建界面,如下图所示:

    img

    注意:您需要创建一个应用,分别做以下作用:

    • 应用一:勾选身份证识别能力,绑定iOS OCR、Android OCR包名,用于使用OCR能力。
    • 应用二:此应用默认会沟通公安验证能力,用于使用身份验证判断;

    1.3 获取秘钥

    获取秘钥

    在您创建完毕应用后,平台将会分配给您此应用的相关凭证,主要为AppID、API Key、Secret Key,以上三个信息是您应用实际开发的主要凭证,每个应用之间各不相同,请您妥善保管。如上图所示。该AK/SK用于调用在线API 如:身份验证。注:开发中请注意区分多份AK/SK(API Key、Secret Key)

    1.4 生成token

    刚才所创建的应用在调用开放平台API 之前,首先需要获取Access Token(用户身份验证和授权的凭证)您需要使用创建应用所分配到的AppID、API Key 及Secret Key,进行Access Token 的生成,方法详见 Access Token 获取,我们为您准备了几种常见语言的请求示例代码。

    注:Access Token 的有效期为30天(以秒为单位),请您集成时注意在程序中定期请求新的token,或每次请求都获取一次token。

    1.5 示例代码下载

    人脸实名认证控制台创建完APP实名认证方案后,下载相应的IOS/安卓的示例工程。

    APP实名认证方案创建请参考这里

    img

    二、 集成逻辑

    2.1 IOS集成

    2.1.1 OCR身份证识别集成

    把下载下来的License文件(文件名:aip.license),添加到项目里面,无需更改文件名称,然后在AppDelegate添加以下代码引用进去。

    img

    FaceParameterConfig.h里面设置下载下来的License文件的名字和后缀。

    img

    通过API调用ViewController进行身份证扫描

    img

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

    2.1.2 人脸SDK集成

    1、打开或者新建一个项目。

    2、右键点击项目,会出现一个添加菜单,在菜单中选择『Add Files to“此处是你的项目名字”…… 』,如下图所示:

    img

    3、在添加文件弹出框里面选择申请到的license和SDK添加进来。如下图:

    注意:license为百度官方提供,刚才在后台下载的文件(文件名称:idl-license.face-ios)

    SDK包含下面三个文件:

    • IDLFaceSDK.framework
    • com.baidu.idl.face.faceSDK.bundle
    • com.baidu.idl.face.model.bundle

    img

    4、确认下 Bundle Identifier 是否是申请license时填报的那一个.

    5、注意:license 和 Bundle Identifier 为一一对应关系,填错了会导致SDK不可用.

    img

    6、FACE_LICENSE_ID这个参数填写百度官方给的LicenseID

    FaceParameterConfig.h 文件中填写下面三项。

    img

    7、选择链接C++标准库。

    img

    8、如果没有使用pod管理第三方库的话,请在Build Setting Linking Other Linker Flags 上面加入 –ObjC选项。如果用了pod请忽略,因为pod会自动添加上。

    img

    以下为示例工程调用身份验证的代码片段:

    [[NetAccessModel sharedInstance] verifyFaceAndIDCard:self.nameTextField.text idNumber:self.identityCardTextField.text imageStr:imageStr completion:^(NSError *error, id resultObject) {
        if (error == nil) {
            NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:resultObject options:NSJSONReadingAllowFragments error:nil];
            NSLog(@"dict = %@",dict);
            dispatch_async(dispatch_get_main_queue(), ^{
                FaceResultType type = FaceResultTypeFail;
                NSString* tip = @"验证分数";
                NSString* scoreStr = @"";
                NSString* showStr = nil;
                if ([dict[@"error_code"] intValue] == 0) {
                    CGFloat score = [dict[@"result"][@"score"] floatValue];
                    scoreStr = [NSString stringWithFormat:@"%.4f",score];
                    if (score > 80) {
                        type = FaceResultTypeSuccess;
                    }
                } else {
                    tip = [NSString stringWithFormat:@"错误码:%@\n错误信息:%@",dict[@"error_code"],dict[@"error_msg"]];
                }
                NSMutableDictionary* resultDict = [@{} mutableCopy];
                resultDict[@"type"] = @(type);
                resultDict[@"tip"] = tip;
                resultDict[@"score"] = scoreStr;
                resultDict[@"showStr"] = showStr;
                [weakSelf performSegueWithIdentifier:@"Affirm2Result" sender:resultDict];
            });
        } else {
            NSLog(@"网络请求失败");
        }
    }];

    接下来基于接口返回的分数进行业务判断即可,详细业务流程详见2.2.1所示。

    2.2 安卓集成

    2.2.1 OCR身份证识别集成

    • 把申请的license(aip.license)放到到项目中app module下的assets目录中
    • 修改app的build.gradle包名为申请时填入的包名

    1.JPG

    • 拷贝ocr-ui到您的工程中

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

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

    img

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

    2.JPG

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

    其中请求参数如下: | 请求参数 | 说明 | | ---------------| ----------------| | image | 身份证扫描的图像 | | id_card_side | 身份证的正反面类型 | | detect_risk | 是否开启旋转识别 |

    img

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

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

    2.2.2 人脸SDK集成

    1、授权参数

    (1)把申请的license(idl-license.face-android")放到到项目中app module下的assets目录中

    (2)修改 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文件";
    }

    (3)配置签名(申请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)
            }
        }

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

    1.JPG

    (5)修改app module中的AndroidManifest.xml文件下provider的包名为你自己的包名

    7.png

    (6)混淆设置

    如果工程需要做混淆处理的话,则在工程的proguard-rules.pro文件中添加如下配置: -keep class com.baidu.vis.unified.license. {*;} -keep class com.baidu.liantian. {;} -keep class com.baidu.baidusec.** {;} -keep class com.baidu.idl.main.facesdk.* {;}

    (7)模拟器功能(针对x86的模拟器)

    需要在app下的build.gradle的android{}增加下面的话,保证模拟器能安装

    splits {
            abi {
                enable true
                reset()
                include 'x86', 'armeabi-v7a','arm64-v8a'
                universalApk true
            }
        }

    2、初始化人脸相关SDK(在HomeActivity.java中)

    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;
                       }
                    });
                }
            });
        }

    针对初始化接口中的鉴权初始化部分的错误代码与信息映射关系如下:

    ErrorCode 常量值 说明
    SUCCESS 0 成功
    LICENSE_NOT_INIT_ERROR 1 license未初始化
    LICENSE_DECRYPT_ERROR 2 license数据解密失败
    LICENSE_INFO_FORMAT_ERROR 3 license数据格式错误
    LICENSE_KEY_CHECK_ERROR 4 license-key(api-key)校验错误
    LICENSE_ALGORITHM_CHECK_ERROR 5 算法ID校验错误
    LICENSE_MD5_CHECK_ERROR 6 MD5校验错误
    LICENSE_DEVICE_ID_CHECK_ERROR 7 设备ID校验错误
    LICENSE_PACKAGE_NAME_CHECK_ERROR 8 包名(应用名)校验错误
    LICENSE_EXPIRED_TIME_CHECK_ERROR 9 过期时间不正确
    LICENSE_FUNCTION_CHECK_ERROR 10 功能未授权
    LICENSE_TIME_EXPIRED 11 授权已过期
    LICENSE_LOCAL_FILE_ERROR 12 本地文件读取失败
    LICENSE_REMOTE_DATA_ERROR 13 远程数据拉取失败
    LICENSE_LOCAL_TIME_ERROR 14 本地时间校验错误
    OTHER_ERROR 0xff 其他错误

    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());
            // 风控加密类型,0:普通版;1:加密版
            config.setSecType(mConsoleConfig.getSecType());
            // 设置活体阈值
            config.setLivenessValue(mConsoleConfig.getAuraLiveness());
    
            // -----TODO:以下不需要通过console平台配置,需要手动修改-----
            // 设置可检测的最小人脸阈值
            config.setMinFaceSize(FaceEnvironment.VALUE_MIN_FACE_SIZE);
            // 设置可检测到人脸的阈值
            config.setNotFaceValue(FaceEnvironment.VALUE_NOT_FACE_THRESHOLD);
            // 设置闭眼阈值
            config.setEyeClosedValue(FaceEnvironment.VALUE_CLOSE_EYES);
            // 设置活体动作,通过设置list,LivenessTypeEunm.Eye, LivenessTypeEunm.Mouth,
            // LivenessTypeEunm.HeadUp, LivenessTypeEunm.HeadDown, LivenessTypeEunm.HeadLeft,
            // LivenessTypeEunm.HeadRight, LivenessTypeEunm.HeadLeftOrRight
            config.setLivenessTypeList(ExampleApplication.livenessList);
            // 设置图片缓存数量
            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);
            // 设置动作活体颜色类型列表
            config.setLivenessColorTypeList(ExampleApplication.livenessColorList);
            // 设置炫彩活体颜色分数阈值
            config.setLivenessColorValue(FaceEnvironment.VALUE_LIVENESS_COLOR_SCORE);
            // 设置视频录制时间
            config.setRecordVideoTime(FaceEnvironment.TIME_RECORD_VIDEO);
            // 视频录制中出现分辨率改变的手机或其它不兼容的手机统计
            config.setPhoneList(ExampleApplication.phoneList);
            FaceSDKManager.getInstance().setFaceConfig(config);
            return true;
        }

    4、活体检测接口说明(ILivenessStrategy.java)

        // 活体检测策略功能接口方法
        void setLivenessStrategyConfig(List<LivenessTypeEnum> livenessList, 
    	List<String> livenessColorList, Rect previewRect, 
    	Rect detectRect, ILivenessStrategyCallback callback);
        // 设置是否开启语音播报
        void setLivenessStrategySoundEnable(boolean flag);
        // 用于视频录制时出现手机不兼容采用抽帧的方式
        void setIsFrameExtraction(boolean frameExtraction);  
        // 开始采集(传入图像视频流,用于非录制情况)
        void livenessStrategy(byte[] imageData);
        // 开始采集(传入图片,用于录制情况)
        void livenessStrategy(Bitmap bitmap);
        // 设置图片角度
        void setPreviewDegree(int degree);
        // 释放、重置
        void reset();

    5、采集中关于View更新的回调(ILivenessViewCallback.java)

        // 获取动作活体类型,用于弹出动作的动画
        void setCurrentLiveType(LivenessTypeEnum liveType);
        // 重置当前完成动作活体个数(当前版本已不使用)
        void viewReset();
        // 设置动画停止的时机
        void animStop();
        // 用于传递faceInfo,调试画框使用
        void setFaceInfo(FaceExtInfo faceInfo);
        // 开始切换炫彩颜色(做炫彩效果时使用)
        void setBackgroundColor(int currentColor, int preColor);
        // 开始录制视频(lostFaceId为是否丢失人脸,如果丢失,则重新录制)
        void startRecordVideo(boolean lostFaceId);

    6、开始进行人脸采集

    不带视频录制功能(包含动作活体(可关闭)、炫彩活体):(在FaceLivenessActivity.java中)

    (1)在摄像头的回调方法onPreviewFrame(byte[] data, Camera camera)中调用 FaceSDKManager.getInstance().getDetectStrategyModule() 获得IDetectStrategy对象。(该方法每次调用都会返回一个新对象,建议只调用一次)。

    (2)调用 IDetectStrategy.setPreviewDegree(int degree); 设置预览图片的旋转角度。 调用 IDetectStrategy.setDetectStrategySoundEnable(boolean flag); 设置是否开启语音。 调用 IDetectStrategy.setDetectStrategyConfig(Rect previewRect, Rect detectRect, IDetectStrategyCallback callback); 设置预览框的大小,人脸检测框的坐标和回调。

    (3)多次调用 detectStrategy(byte[] imageData); 进行人脸图片采集。

    (4)实现 IDetectStrategyCallback.onDetectCompletion(FaceStatusNewEnum status, String message, HashMap<String, ImageInfo> base64ImageCropMap, HashMap<String, ImageInfo> base64ImageSrcMap, float livenessScore); 回调方法并处理结果。其中base64ImageCropMap为采集到的指定数量的抠图,base64ImageSrcMap为采集到的指定数量的原图,livenessScore表示炫彩活体的当前分数。

    (5)获取采集到的最优抠图和原图,即在上述第(4)步的 IDetectStrategyCallback.onDetectCompletion(); 回调方法中调用 getBestImage(HashMap<String, ImageInfo> imageCropMap, HashMap<String, ImageInfo> imageSrcMap);,其实现如下:

    36241779963f43ef4d96065fb.png

    3.JPG

    4.JPG

    带视频录制或图片抽帧功能(包含动作活体(可关闭)、炫彩活体):(视频录制在FaceLivenessVideoActivity.java中,图片抽帧在FaceLivenessActivity.java中)

    (1)如果想要测试视频录制功能,则需要在ExampleApplication.java中的public static boolean isOpenVideoRecord = false修改为true。

    (2)在录制视频过程中,有可能会出现部分手机不兼容的情况,例如打不开摄像头,那么需要在HomeActivity.java中加入白名单处理,如下:

    baimingdan.png 加入白名单的设备,则会采用图片抽帧的方式留存。

    视频录制的路径为:/data/data/包名/file/vrecord/XXX.mp4 抽帧图片的路径为:/data/data/包名/file/image/XXX.jpg

    (3)在摄像头的回调方法onPreviewFrame(byte[] data, Camera camera)中调用 FaceSDKManager.getInstance().getLivenessStrategyModule(ILivenessViewCallback) 获得ILivenessStrategy对象。(该方法每次调用都会返回一个新对象,建议只调用一次)。

    (4)调用 ILivenessStrategy.setPreviewDegree(int degree); 设置预览图片的旋转角度。 调用 ILivenessStrategy.setLivenessStrategySoundEnable(boolean flag); 设置是否开启语音。 调用 ILivenessStrategy.setLivenessStrategyConfig(List<LivenessTypeEnum> livenessList, Rect previewRect, Rect detectRect, ILivenessStrategyCallback callback); 设置动作活体类型、预览框的大小,人脸检测框的坐标和回调。

    (5)如果采用图片选帧留存方式,则需要调用 void setIsFrameExtraction(boolean frameExtraction); 方法,传入true

    (6)多次调用 livenessStrategy(Bitmap imageData); 进行人脸图片采集。

    (7)实现 void onLivenessCompletion(FaceStatusNewEnum status, String message, HashMap<String, ImageInfo> base64ImageCropMap, HashMap<String, ImageInfo> base64ImageSrcMap, int currentLivenessCount, float livenessScore); 回调方法并处理结果。其中base64ImageCropMap为采集到的指定数量的抠图,base64ImageSrcMap为采集到的指定数量的原图,livenessScore表示炫彩活体的当前分数。

    (8)获取采集到的最优抠图和原图,即在上述第(7)步的ILivenessStrategyCallback.onDetectCompletion(); 回调方法中调用getBestImage(HashMap<String, ImageInfo> imageCropMap, HashMap<String, ImageInfo> imageSrcMap);,其实现如下:

    36241779963f43ef4d96065fb.png

    3.JPG

    4.JPG

    5、跳转至身份核验接口调用页面,需要传入:图片的base64、图片加密类型(加密、不加密)、姓名、身份证号

    (在FaceDetectExpActivity.javaFaceLivenessExpActivity.java中)

    5.JPG

    6、获取accessToken,用于调用接口(在CollectVerifyActivity.java中)

    注意:为了防止ak、sk泄露,建议把ak、sk放在服务端,移动端通过服务端去拉取token(目前是在工程中的Config.java中)

    6.JPG

    7、根据离线采集得到的人脸图片(抠图或原图),进行人脸实名认证(在CollectVerifyActivity.java中)

    提示:为了安全及维护成本考虑,我们建议您将SDK获取的人脸图像,推送到服务器端,由服务器端进行API调用,并将结果返回给客户端APP。

    创建金融级人脸实名认证方案时,默认开启安全加密功能,会将采集SDK输出的图片进行加密,在云端进行解密,此种加密方式为百度专门针对市面的黑产攻击方式应对的防攻击策略,可以有效避免黑产绕过采集SDK,攻击云端接口的方式。

    其中请求参数如下:

    请求参数 含义 说明
    image_type 图片类型 BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;图片尺寸不超过1920*1080
    image 图片信息 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
    name 姓名 需要是UTF-8编码的中文
    id_card_number 身份证号
    quality_control 图片质量控制 NONE: 不进行控制
    LOW:较低的质量要求
    NORMAL: 一般的质量要求
    HIGH: 较高的质量要求
    默认 NONE
    liveness_control 活体检测控制 NONE: 不进行控制
    LOW:较低的活体要求(高通过率 低攻击拒绝率)
    NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
    HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
    默认 NONE
    spoofing_control 合成图控制 NONE: 不进行控制
    LOW:较低的合成图检测要求(高通过率 低攻击拒绝率)
    NORMAL: 一般的合成图检测要求(平衡的攻击拒绝率, 通过率)
    HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
    image_sec 安全加密功能 默认开启
    risk_identify 大数据风控功能 Ture:打开大数据风控功能。(接受SDK端传入的指纹信息,返回识别结果)
    False:关闭大数据风控功能。
    默认False
    IP 需要风控判别的ip地址 当risk_identify为true时传入
    iphone 需要风控判别的手机号 当risk_identify为true时传入

    其请求部分代码如下:

    /**
     * 请求公安接口(参数1:要送入图片的base64,参数2:是否加密,参数3:当前上
     * 下文)
     */
    private void policeVerifyFromServer(String base64Img, final int secType, Context context) {
            if (TextUtils.isEmpty(base64Img)) {
                return;
            }
    
            final ConsoleConfig consoleConfig = ConsoleConfigManager.getInstance(getApplicationContext()).getConfig();
            DynamicParams params = new DynamicParams();
            params.setImgType("BASE64");
            params.setBase64Img(base64Img);
            try {
                params.setUsername(URLDecoder.decode(mUsername, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                params.setUsername(mUsername);
                e.printStackTrace();
            }
            params.setIdCardNum(mIdCardNum);
            params.setQualityControl(consoleConfig.getOnlineImageQuality());
            params.setLivenessControl(consoleConfig.getOnlineLivenessQuality());
            params.setSpoofingControl("NONE");
            // 以下参数只为加密版接口使用
            if (secType == 1) {
                params.setRiskIdentify(consoleConfig.isOpenRiskIdentify());
                // 开启风控
                if (consoleConfig.isOpenRiskIdentify()) {
                    params.setZid(FaceSDKManager.getInstance().getZid(context, 5002));
                    params.setIp(IPUtil.getLocalIpAddress(getApplicationContext()));
                    // TODO: 手机号,需要自己手动修改
                    // params.setPhone("");
                }
                params.setImageSec(true);
                params.setApp("Android");
                params.setEv("smrz");
            }
    
    
            APIService.getInstance().policeVerify(params, secType, new OnResultListener<LivenessVsIdcardResult>() {
                @Override
                public void onResult(LivenessVsIdcardResult result) {
                    if (result == null || consoleConfig == null) {
                        return;
                    }
    
                    // 如果开启风控,则需要进行风险等级判断
                    if (consoleConfig.isOpenRiskIdentify()) {
                        if ("1".equals(result.getRiskLevel())) {
                            Intent intent = new Intent(CollectVerifyActivity.this,
                                    CollectFailureActivity.class);
                            intent.putExtra("err_code", FaceException.ErrorCode.VERIFY_LIVENESS_FAILURE);
                            startActivity(intent);
                            finish();
                            return;
                        }
                    }
    
                    // 针对加密版接口
                    if (secType == 1 && result.getVerifyStatus() != 0) {
                        Intent intent = new Intent(CollectVerifyActivity.this,
                                CollectFailureActivity.class);
                        intent.putExtra("verify_status", result.getVerifyStatus());
                        startActivity(intent);
                        finish();
                        return;
                    }
    
                    // 判断人证核验匹配度
                    if (result.getScore() >= consoleConfig.getRiskScore()) {
                        Intent intent = new Intent(CollectVerifyActivity.this,
                                CollectionSuccessActivity.class);
                        startActivity(intent);
                        finish();
                    } else {
                        Intent intent = new Intent(CollectVerifyActivity.this,
                                CollectFailureActivity.class);
                        intent.putExtra("err_code", FaceException.ErrorCode.LOW_SCORE);
                        startActivity(intent);
                        finish();
                    }
                }
    
                @Override
                public void onError(final FaceException error) {
                    if (error == null) {
                        return;
                    }
    
                    // 网络加载失败
                    if (error.getErrorCode() == FaceException.ErrorCode.NETWORK_REQUEST_ERROR
                            || error.getErrorCode() == FaceException.ErrorCode.VERIFY_NET_ERROR
                            || error.getErrorCode() == FaceException.ErrorCode.VERIFY_NET_ERROR_05) {
                        cancelAnim();
                        mImageAnim.setImageResource(R.mipmap.icon_verify_network);
                        mTextVerifyIng.setVisibility(View.GONE);
                        mTextCheckNet.setVisibility(View.VISIBLE);
                        mTextNetError.setVisibility(View.VISIBLE);
                        mBtnReTry.setVisibility(View.VISIBLE);
                        mBtnReturnHome.setVisibility(View.VISIBLE);
                    } else {
                        // 其它错误码
                        Intent intent = new Intent(CollectVerifyActivity.this,
                                CollectFailureActivity.class);
                        intent.putExtra("err_code", error.getErrorCode());
                        startActivity(intent);
                        finish();
                    }
                }
            });
        }
    上一篇
    金融级APP方案创建
    下一篇
    金融级H5实名认证方案(邀测)