前言
介绍下最近一段时间内在公司做的一个微信小程序小项目几个核心功能的设计流程和部门代码实现
- 微信小程序登陆
- 获取手机号
- 微信OCR识别
- 微信人脸识别
- 微信支付
备注:本文章没有和公司相关的私密信息;每个功能都是通用的插件
微信小程序登陆

通过code获取secretKey和openId的接口封装
#这个appId是指小程序id在微信公众平台申请小程序的时候会生成
WxMaServicewxMaService=WxMaConfiguration.getMaService(appId);
#这里是设置失败重试次数每一次失败重试时间间隔会变成比如第一次3秒第二次隔6秒重试一次第三次隔9秒重复一次所以对于用户来说不希望等待太久所以设置为失败重试次数为0即失败了直接返回错误不重试
wxMaService.setMaxRetryTimes(0);
WxMaJscode2SessionResultsession=wxService.getUserService().getSessionInfo(code);
关键代码
https://gitee.com/pingfanrenbiji/resource/tree/master/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%BE%AE%E4%BF%A1%E7%99%BB%E9%99%86/%E5%85%B3%E9%94%AE%E4%BB%A3%E7%A0%81

demo源码
https://gitee.com/pingfanrenbiji/weixin-java-miniapp-demo
依赖pom
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${weixin-java-miniapp.version}</version>
</dependency>
<properties>
<weixin-java-miniapp.version>4.0.2-SNAPSHOT</weixin-java-miniapp.version>
</properties>
配置
wx:
miniapp:
configs:
-appid:xxxx#微信小程序的appid必填
secret:xxxx#微信小程序的Secret必填
token:#微信小程序消息服务器配置的token非必填
aesKey:#微信小程序消息服务器配置的EncodingAESKey非必填
msgDataFormat:JSON
依赖包weixin-java-miniapp源码
https://gitee.com/pingfanrenbiji/WxJava/tree/master/weixin-java-miniapp
获取手机号

手机号解密关键代码
WxMaPhoneNumberInfophoneNoInfo=wxService.getUserService().getPhoneNoInfo(sessionKey,encryptedData,iv);
本地解密函数


微信OCR识别

微信ocr识别关键代码
WxOcrIdCardResultresult=wxService.getOcrService().idCard(fileUrl);
fileUrl身份证正反照片url
备注:不建议使用该接口
1、该接口仅仅是图片ocr识别而已并不能验证身份证信息是否正确
2、拍身份证照片的时候若仅仅只拍姓名也返回正确只是返回信息中只有姓名
微信人脸识别
备注
该接口微信未公开即在技术平台查不到相关接口
需要开通该接口的话
需要给微信发送邮件申请
微信针对企业资质进行审核
若审核通过之后会发给对接文档
我们在申请的时候是以公证处的名义申请的

获取secretKeyId关键代码
WxFaceResultwxFaceResult=wxService.getWxFaceService().getSecretKeyId(name,idcard);
传入姓名、身份证号
获取人脸识别结果关键代码
WxFaceResultwxFaceResult=wxService.getWxFaceService
().getFaceResultByVerifyResult(verifyResult);
人脸识别小程序demo
该微信小程序人脸识别demo是微信内部人员通过邮件发送给我的
https://gitee.com/pingfanrenbiji/resource/tree/master/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB/calorieTestDemo

取证+微信支付
对应关系说明
1、用户拍照(无论是视屏还是照片)一次即是一个证据文件
2、一个取证订单对应多个证据文件最多可以有9个
3、一个取证订单对应一笔支付成功的记录
金额相关说明
1、假如一个证据文件1元9个证据文件是9元
2、用户首单减免减免金额和订单金额一致
关键逻辑说明
1、用户可以生成多个取证订单
2、那么这些订单全是待支付的订单
3、用户从这些订单中选择某一个订单进行支付那么这个订单是首单它有减免金额
所以至于哪个是首单在用户下取证订单的时候并不确定
而是用户选择哪个订单进行支付的时候才能确定
所以有一个支付订单金额详情页面此时会判断当前订单是否是当前用户的额首单若是首单则会有减免金额

异常情况思考
用户唤起了微信支付收银台并没有发起支付的场景
思考当前流程是否有漏洞:
用户操作过程:
1、用户选择某一个订单进行支付
2、展示该订单的支付金额的情况
包含减免金额、实际支付金额
3、用户点击支付按钮
4、小程序获取微信支付参数
5、小程序拿到微信支付参数之后唤起微信支付收银台
6、用户关闭收银台
7、在此重复3-5过程或者2-5过程
分析:
第2步每次支付金额详情展示页面上的实际金额都是根据当前这笔订单是否是当前用户首单若是首单则会有减免金额实际金额是=原金额-减免金额
所以这一步每次获取的金额都是对的
第4步每次获取微信支付信息传入的参数是订单编号
后台逻辑:
a通过订单编号查询当前订单支付中的订单记录信息
得到支付记录信息之后其中的支付金额是原金额(实际金额=原金额-减免金额)
b获取该订单最新支付金额该金额和用户在订单支付详情页面看到的金额是一致的
c若有减免金额即实际支付金额是0那么更新支付状态为成功、支付金额是0即可
d若没有减免金额即实际支付金额不为0则发起微信支付参数获取
所以用户多次对同一个订单唤起多起微信收银台都是没有关系的
因为对于同一个订单只有一笔待支付的支付记录
多次唤起对应同一个订单、同一个待支付记录所以该用户操作异常的场景是不会产生问题的