1.背景介绍
使用VS2010开发一个OCX插件,实现在Windows平台的终端上刷脸身份识别、刷脸支付。需要使用蚂蚁金服指定的奥比3D摄像头,按照开放平台https://docs.alipay.com/pre-open/20171214171953173616/flivcu的文档进行开发。后面会详细叙述整个开发工程。
2.Windows终端环境安装
目前开发环境为WIN10,需要更新到最新的版本。同时安装摄像头驱动SensorDriver_V4.3.0.9.exe,环境依赖vc_redist.x86-2013.exe。
3.VS新建OCX工程
网页上使用的clsid在这里
4.开发ActiveX具体内容
4.1.首先编译工程提示如下错误:
error MSB8011: 未能注册输出。请尝试启用“逐用户重定向”,或者使用提升的权限从命令提示符处注册该组件。
解决方法:使用管理员打开VS2010
4.2.ActiveX自带窗体,是嵌入在浏览器中的,如果需要浮动窗体,需要手工新建
新建一个Dialog资源:
设置对话框属性,去掉默认的确认退出按钮
添加对话框的类:
4.3.添加日志类Log.cpp,Log.h
报错不能将参数 1 从“CString”转换为“const char *”,按下图设置解决
4.4.设置Release模式
4.5.使用std等数据结构
如std::deque,按下图添加
4.6.确认Windows下动态库
4.7.加载阿里库文件
4.7.1使用动态调用DLL方式:
根据头文件定义写转义
DLL_EXPORT extern void zolozInstall(const std::map<std::string, std::string> info);
/************************************************************************/
/* 转义申明 */
/************************************************************************/
typedef int (*zolozInstallFPType)(const std::map<std::string, std::string>);
回调函数当参数的情况:
4.7.2使用静态库lib方式:
包含目录设置头文件所在位置,库目录设置lib和dll目录
附加依赖项填入lib库的名字
4.7.3加入Jsoncpp:
加载DLL,这里要注意阿里提供的DLL里只有带2的函数如zolozInstall2可以使用,这里是一个坑。
由于需要使用JSON数据类型,添加如下的源文件Jsoncpp的源码
cpp文件没有预编译头,会报错,需要处理
VS安装目录下增加头文件
在需要使用json的类中添加#include "json/json.h"
4.8.添加OCX给外部调用的方法
4.8.1添加Initialize方法,调用zolozInstall2和zolozGetMetaInfo2
设置回调函数,处理DLL回调信息
/************************************************************************/
/* ZolozCallback2回调函数 */
/************************************************************************/
static void ZolozCallback2Func(const char* info_json)
在这个函数里解析回调信息时,jsoncpp使用二级指针直接取二级字段信息报错,所以改为
const char * metainfodata = jsondata["metainfo"].asCString();先取出二级整体数据,再次解析
std::string apdidToken = jsonmetadata["apdidToken"].asString();
4.9.添加OCX给外部调用的属性
4.9.1添加四个属性返回zolozGetMetaInfoFP回调得到的数据给上层应用
添加一些类内部方法,设置属性值
void CAliface2payCtrl::SetMetaProperty(void)
{
m_apdidToken = apdidToken_cstr;
}
回调函数中
apdidToken_cstr = jsonmetadata["apdidToken"].asCString();
CAliface2payCtrl *pDlg ;
pDlg->SetMetaProperty();
添加自定义消息备用
#define MetaInfoMessage WM_USER+101//自定义消息
4.10.添加OCX给外部调用的事件
5.使用VS加载EXE容器调试OCX
在工程的属性中设置,设置调试里面的命令目录,然后直接在VS里运行就可以调用出EXE直接调试OCX
6.注意事项
6.1.测试流程
a.调用StartEnv
b.调用Initialize,通过属性返回metainfo:
{"apdidToken":"","appName":"com.alipay.zoloz.smiletopay","appVersion":"3.12.0","bioMetaInfo":"3.12.0:2277376,0","deviceModel":"Intel or AMD 64","deviceType":"windows","machineInfo":{"cameraDriveVer":"","cameraModel":"","cameraName":"","cameraVer":"","ext":"","group":"","machineCode":"","machineModel":"","machineVer":""},"merchantInfo":{"appId":"2016061301512892","areaCode":"","brandCode":"","deviceMac":"","deviceNum":"A001","geo":"","merchantId":"2088221973891545","merchantKey":"","partnerId":"2088221973891545","storeCode":"0000000001","wifiMac":"","wifiName":""},"osVersion":"6.2.9200 0019D998 v0.0","remoteLogID":"23b4caa6-7a27-40c1-8bf0-1c505936a720","zimVer":"1.0.0"}
c.应用程序获取metainfo调用支付网关做注册初始化
因为测试网页的需要,数据整理成如下,使用自己的测试网页发起交易:
{\"apdidToken\":\"\",\"appName\":\"com.alipay.zoloz.smiletopay\",\"appVersion\":\"3.12.0\",\"bioMetaInfo\":\"3.12.0:2277376,0\",\"deviceModel\":\"Intel or AMD 64\",\"deviceType\":\"windows\",\"machineInfo\":{\"cameraDriveVer\":\"\",\"cameraModel\":\"\",\"cameraName\":\"\",\"cameraVer\":\"\",\"ext\":\"\",\"group\":\"\",\"machineCode\":\"\",\"machineModel\":\"\",\"machineVer\":\"\"},\"merchantInfo\":{\"appId\":\"2016061301512892\",\"areaCode\":\"\",\"brandCode\":\"\",\"deviceMac\":\"\",\"deviceNum\":\"A001\",\"geo\":\"\",\"merchantId\":\"2088221973891545\",\"merchantKey\":\"\",\"partnerId\":\"2088221973891545\",\"storeCode\":\"0000000001\",\"wifiMac\":\"\",\"wifiName\":\"\"},\"osVersion\":\"6.2.9200 0019D998 v0.0\",\"remoteLogID\":\"ba3a2203-67e8-45a8-9e2e-f0feba5ca024\",\"zimVer\":\"1.0.0\"}
测试网页方法:
结果:
d.使用工具解析成如下
调用下一步方法人脸识别
调用刷脸成功后,会出行SDK自带的窗体,识别人脸成功,进入确认支付画面。
提示验证成功事件,如果取消或者验证不成功,会有失败事件
然后取出token属性
如果在2.3步骤https://docs.alipay.com/pre-open/api_pre/zoloz.authentication.customer.smilepay.initialize选择了身份证+姓名验证,验证函数将不用输入手机号,也没有修改显示手机号
e.使用测试网页发送当面付交易,使用上一步获取的token
关闭刷脸服务
f.刷脸服务官方验收时,有如下不达标
扫脸支付terminal_id和扫脸初始化的deviceNum不一致需要更改一致
扫脸支付store_id和扫脸初始化的StoreCode不一致需要更改一致,如果在支付宝或口碑开的有店铺的话支付和初始化时候需要把编号传一致
扫脸初始化中的brandCode建议传一个有意义的值方便之后出现问题后的排查和定位
订正如下:
测试网页F2FBarCodePay功能
g.尝试通过zoloz.authentication.customer.ftoken.query接口查询客户手机号和照片信息
h.补充(代理模式设置):
简易路由的转发地址可以直接填写域名(IP会变,建议用域名)
myh2.alipay.com 443
mdap.alipay.com 443,阿里终端配置文件里写的是4443,实际不通,这个域名和端口好像实际中没作用。
i:遇到问题,ocx不能在别人机器上注册,改成Debug
这样编译,报宏编译库函数名重名
这样就解决了
j:遇到问题调用OCX的EXE如果和阿里的DLL不在同一个目录,会崩溃
解决方法OCX改成用绝对路径调用DLL,同时将阿里的DLL等文件拷贝到Windows系统目录
k:支付宝官方验证刷脸付是否成功会遇到问题
扫脸支付terminal_id和扫脸初始化的deviceNum不一致需要更改一致
扫脸支付store_id和扫脸初始化的StoreCode不一致需要更改一致,如果在支付宝或口碑开的有店铺的话支付和初始化时候需要把编号传一致
扫脸初始化中的brandCode建议传一个有意义的值方便之后出现问题后的排查和定位
l:遇到问题安装完所有驱动和应用后,在调用刷脸识别函数VerifyFace时,程序卡死
主要是摄像头USB没插在主板USB口,插在了扩展口导致驱动装好后,无法识别奥比中光深度模组。在设备管理器里看不到设备模组,只有一个未知设备。
J:实际上线遇到多刷脸几次时间卡的问题。解决方法是:应用调用OCX时候,StartEnv,Initialize只调用一次,获取了metaInfo后保存信息。然后每次和支付网关交互获取新的zimid,调用VerifyFace。EndEnv不要调用。