前一段跟收银系统打了一波交道,因为用到了微信人脸支付,在对接的过程中也踩了一波小
坑,现在项目搞完运行了,特地写个博客记录一下。
先说开发文档链接的事情,微信这个文档链接容易让人混淆,先贴出目前正确的文档地址
SDK模式 | 微信刷脸支付,建议直接看这个跑demo,然后跟后台统一,我这对接的时候跟后台看的
地址就不一样,略坑.
接下来就是对接了,新的文档简单明了,看设备是走SDK模式,还是青蛙定制的设备,一般来
说都是SDK模式,开放程度高。下面来说一下我们的SDK模式。
微信的文档写的很是清晰,按照步骤一步一步来就OK了,我们来看一下步骤
1.程序启动时初始化这个建议在application中做,在activity中搞的话我测试过,有
点拉胯
private void initWeChatFace() {
WxPayFace.getInstance().initWxpayface(instance, new IWxPayfaceCallback() {
@Override
public void response(Map info) throws RemoteException {
if (!isSuccessInfo(info)) {
return;
}
Logger.d("微信人脸服务","初始化完成");
}
});
}
2.获取数据getWxpayfaceRawdata
这个是获取本地数据,目的是为了后面进行调用接口,加密等使用,前提是本地正确按照微信
的apk哈,因为这种模式,就是调用微信自己apk完成人脸支付操作的,安装包就在首页下载。
WxPayFace.getInstance().getWxpayfaceRawdata(new IWxPayfaceCallback() {
@Override
public void response(final Map info) throws RemoteException {
if (!isSuccessInfo(info)) {
return;
}
final String rawdata = info.get("rawdata") + "";
Logger.d("rawdata", rawdata);
String returnCode = (String) info.get(RETURN_CODE);
String returnMsg = (String) info.get(RETURN_MSG);
Logger.d("人脸数据", returnCode + "-----" + returnMsg);
try {
// HashMap<String, Object> map = new HashMap<>();
//
// map.put("rawdata", rawdata);
// map.put("mch_id", "1900007251");
// map.put("mch_id", "1900007231");
getAuthInfo(rawdata);
} catch (Exception e) {
e.printStackTrace();
}
}
});
3.获取调用凭证
这一步比较重要,需要后台配合,安装微信文档上的参数配置,一个都不能少,因为这个是涉
及到企业信息,这个关键点在后台,请提醒后台认证看文档配置参数毕竟都是机密信息
4.进行人脸识别
第三步调用凭证如果正常通过的话,客户端就会拿到文档上一些机密的参数,通过这些参数,
去拉起人脸识别,请注意,到这一步是识别,也就是说到这一步可以调起摄像头了,
WxPayFace.getInstance().getWxpayfaceCode(params, new IWxPayfaceCallback() {
@Override
public void response(final Map info) throws RemoteException {
if (info == null) {
showToast("调用返回为空, 请查看日志");
new RuntimeException("调用返回为空").printStackTrace();
return false;
}
String code = (String) info.get("return_code");
String msg = (String) info.get("return_msg");
String facecode = (String) info.get("face_code");
String openid = (String) info.get("openid");
String subOpenid = (String) info.get("sub_openid");
....
}
}, new IWxPayfaceCallback() {
@Override
public void response(Map info) throws RemoteException {
if (info == null) {
new RuntimeException("调用返回为空").printStackTrace();
return;
}
String code = (String) info.get("return_code"); // 错误码
String msg = (String) info.get("return_msg"); // 错误码描述
if (code == null || !code.equals("SUCCESS")) {
new RuntimeException("调用返回非成功信息,return_msg:" + msg + " ").printStackTrace();
return ;
}
/*
在这里处理您自己的业务逻辑:
执行到这里说明用户已经确认支付结果且成功了,此时刷脸支付界面关闭,您可以在这里选择跳转到其它界面
*/
}
});
如果 成功的话,就会拉起微信人脸,点亮摄像头。这一步容易出现的问题就是
1.传参一定要注意,要注意,要注意(大部分都是因为这个)
2.摄像头白屏或者调用失败,可以用出厂工具去测试摄像头,也有可能是设备本身的问题
(设备没有经过微信认证,大概率会出现白屏)
5.发起订单支付
这个也是后台接口,客户端将上一步识别成功的人脸信息facecode和其它一些后台所需要的信
息,通过接口交给后台,后台向微信下单,发起扣款,然后跟咱们就没得关系了,是不是有点小舒
服,哈哈,因为微信的apk页面逻辑帮我们搞完了,咱们只要传给后台就OK了,
我们只传了face_code和订单号,做个参照哈哈,我们后台还是非常给力的。
6.支付结果处理
微信新版的文档取消了接口回调的,所以又给我们省了一步操作,我们只要跟后台异步拿结
果 就OK了,然后跟根据自己的项目逻辑去做下面的逻辑处理,另外新版的SDK版本里面,还增加
了语音和打断支付的环节,但是没有更新,不知道为啥日志写的那么新,堪称迷之操作。如果哪位
小伙伴对接了,能用最新的就用最新的,因为旧版的安装包实在是太大了。
7.总结
总的来说,对接流程还是比较清晰明了,只是记得要认真看文档,因为参数比较多,客户端或
者后台任意一个地方出错,就会导致流程出错,因为一些涉密信息所以不太方便贴的太多,有对接
的小伙伴可以加Q940917911交流一下,目前为止我们的设备运行还比较流畅。