微信青蛙刷脸支付——Android
16lz
2021-01-26
微信青蛙刷脸支付——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); } });
更多相关文章
- Android中调用系统所装的软件打开文件
- Android中调用外部程序的方法[整理]
- Android(安卓)ListView的getview()中position错位 重复调用(posit
- Android(安卓)之AES加密,解密与后台进行数据交互
- Android(安卓)Unity Plugin 开发指南(转载)
- Hello Android(安卓)- 调用打电话和发短信及intent一些其他用法
- Android的IPC机制之Binder详细介绍
- Android开发之Thread类分析
- Android类参考---Fragment(七)