微信小程序通用功能设计和实现

前言

介绍下最近一段时间内在公司做的一个微信小程序小项目几个核心功能的设计流程和部门代码实现

  • 微信小程序登陆

  • 获取手机号

  • 微信OCR识别

  • 微信人脸识别

  • 微信支付

备注:本文章没有和公司相关的私密信息;每个功能都是通用的插件

微信小程序登陆

通过code获取secretKey和openId的接口封装

# 这个appId是指小程序id 在微信公众平台申请小程序的时候会生成
WxMaService wxMaService=WxMaConfiguration.getMaService(appId);
# 这里是设置失败重试次数 每一次失败重试时间间隔会变成 比如第一次3秒 第二次隔6秒重试一次 第三次隔9秒重复一次 所以对于用户来说不希望等待太久 所以设置为失败重试次数为0 即失败了 直接返回错误 不重试
wxMaService.setMaxRetryTimes(0);
WxMaJscode2SessionResult session =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

获取手机号

手机号解密关键代码

WxMaPhoneNumberInfo phoneNoInfo  = wxService.getUserService().getPhoneNoInfo(sessionKey,encryptedData, iv);

本地解密函数

微信OCR识别

微信ocr识别关键代码

WxOcrIdCardResult result = wxService.getOcrService().idCard(fileUrl);

fileUrl 身份证正反照片url

备注:不建议使用该接口

1、该接口仅仅是图片ocr识别而已 并不能验证身份证信息是否正确
2、拍身份证照片的时候 若仅仅只拍姓名 也返回正确 只是返回信息中只有姓名

微信人脸识别

备注

该接口微信未公开即在技术平台查不到相关接口
需要开通该接口的话
需要给微信发送邮件申请
微信针对企业资质进行审核
若审核通过之后会发给对接文档

我们在申请的时候 是以公证处的名义申请的

获取secretKeyId关键代码

WxFaceResult wxFaceResult=wxService.getWxFaceService().getSecretKeyId(name,idcard);

传入姓名、身份证号

获取人脸识别结果关键代码

WxFaceResult wxFaceResult = 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 则发起微信支付参数获取


所以用户多次对同一个订单唤起多起微信收银台都是没有关系的
因为对于同一个订单只有一笔待支付的支付记录

多次唤起对应同一个订单、同一个待支付记录 所以该用户操作异常的场景是不会产生问题的 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值