微信青蛙刷脸支付——Android
使用设备: 天之河刷脸设备(开放版)
基础配置
需要用到 微信刷脸支付 SDK
将下载的 微信刷脸支付 SDK 放入工程 libs 下,并添加该依赖
-
在 application 中初始化微信刷脸 SDK
/** * 初始化微信刷脸SDK */ private void initFaceSDK() { WxPayFace.getInstance().initWxpayface(context, new IWxPayfaceCallback() { @Override public void response(Map map) throws RemoteException { Log.d("initWxpayface: " + map.toString()); String returnCode = (String) map.get(RETURN_CODE); String returnMsg = (String) map.get(RETURN_MSG); if (String.valueOf(EnumWxFacePayPublicErrorCode.SYSTEMERROR).equals(returnCode)){ ToastUtils.showShort("系统异常,请重新打开应用重试"); }else if (String.valueOf(EnumWxFacePayPublicErrorCode.SUCCESS).equals(returnCode)){ }else { ToastUtils.showShort(returnMsg); } } }); }
刷脸支付
- 调用 SDK 获取后台需要的 Rawdata
WxPayFace.getInstance().getWxpayfaceRawdata(new IWxPayfaceCallback() {
@Override
public void response(Map map) throws RemoteException {
Log.d("getWxpayfaceRawdata: " + map.toString());
if (null == map) {
return;
}
String code = (String) map.get(RETURN_CODE);
String msg = (String) map.get(RETURN_MSG);
String rawdata = map.get(RAWDATA).toString();
if (code == null || rawdata == null || !code.equals(EnumWxFacePayPublicErrorCode.SUCCESS.toString())) {
new RuntimeException("调用返回非成功信息,return_msg:" + msg + " ").printStackTrace();
return;
}
getAuthInfo(rawdata);//调用自己后台接口
}
});
-
调用自己后台接口,获取验证信息
private String appid; private String mch_id; private String sub_mch_id; private String store_id; private String store_name; private String device_id; private String auth_info; private String expires_in; private String out_trade_no; private String nonce_str;
-
使用第二布获取到的验证信息调用 wxfacepay_app 的刷脸功能
Map<String, Object> map = new HashMap<>(); map.put("appid", authInfoRsp.getAppid()); map.put("mch_id", authInfoRsp.getMch_id()); map.put("store_id", authInfoRsp.getStore_id()); map.put("out_trade_no", authInfoRsp.getOut_trade_no()); map.put("total_fee", "1"); map.put("face_authtype", EnumFaceAuthType.FACEPAY.toString()); map.put("authinfo", authInfoRsp.getAuth_info()); map.put("ask_face_permit", "0"); map.put("ask_ret_page", "0"); map.put("ignore_update_pay_result", "0"); WxPayFace.getInstance().getWxpayfaceCode(map, new IWxPayfaceCallback() { @Override public void response(Map info) throws RemoteException { Log.d("getWxpayfaceCode: " + info.toString()); if (info == null) { new RuntimeException("调用返回为空").printStackTrace(); return; } //用户退出了人脸识别 if (info.get("return_code").equals(String.valueOf(EnumWxFacePayPublicErrorCode.EnumGetFaceCodeErrorCode.USER_CANCEL))) { } //用户选择扫码支付 else if (info.get("return_code").equals(String.valueOf(EnumWxFacePayPublicErrorCode.EnumGetFaceCodeErrorCode.SCAN_PAYMENT))) { startCodeScanner(); } //人脸识别成功 else if (info.get("return_code").equals(String.valueOf(EnumWxFacePayPublicErrorCode.SUCCESS))) { String openid = info.get("openid").toString(); // openid String faceCode = info.get("face_code").toString(); // 人脸凭证,用于刷脸支付 facePay(openid, faceCode, authInfoRsp.getOut_trade_no());//调用自己后台刷脸支付接口 } } });
-
请求后台刷脸支付接口 facepay
Map<String, Object> map = new HashMap<>(); map.put("store_id", sotreId); map.put("total", view.getTotalStr()); map.put("openId", openId); map.put("faceCode", faceCode); map.put("out_trade_no", outTradeNo); map.put("nonce_str", nonceStr); String dataAddSaleStr = buildRequestDataForSign(map, loginRsp.getKey()); String sign = MD5Utils.MD5Upper(dataAddSaleStr); RequestBase requestBase = new RequestBase(loginRsp.getAppid(), Constants.WX_FACEPAY, map, sign); homeModel.facePay(requestBase) .subscribe(new BaseObserver<FacePayRsp>() { @Override protected void onSuccees(BaseResponse<FacePayRsp> t) throws Exception { updateWxpayfaceBannerState(true); } @Override protected void onCodeError(BaseResponse<FacePayRsp> t) throws Exception { updateWxpayfaceBannerState(false); } @Override protected void onFailure(String errorMsg, boolean isNetWorkError) throws Exception { updateWxpayfaceBannerState(false); } });
-
得到支付结果后调用 SDK 中 updateWxpayfaceBannerState() 关闭刷脸界面,并处理自己业务逻辑
HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("banner_state", 0); // 设置运营位状态 0: 可展示运营图片 1: 不可展示运营图片 必填 WxPayFace.getInstance().updateWxpayfaceBannerState(map, new IWxPayfaceCallback() { @Override public void response(Map info) throws RemoteException { if (info == null) { new RuntimeException("调用返回为空").printStackTrace(); view.facePayResult(false); 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(); view.facePayResult(false); return; } /* 在这里处理您自己的业务逻辑: 执行到这里说明用户已经确认支付结果且成功了,此时刷脸支付界面关闭,您可以在这里选择跳转到其它界面 */ view.facePayResult(isPaySuccess); } });