龙空技术网

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

平凡人笔记 479

前言:

当前你们对“weixinjavaminiapp”都比较关切,朋友们都想要学习一些“weixinjavaminiapp”的相关资讯。那么小编也在网上搜集了一些关于“weixinjavaminiapp””的相关知识,希望兄弟们能喜欢,看官们快快来了解一下吧!

前言

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

微信小程序登陆获取手机号微信OCR识别微信人脸识别微信支付

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

微信小程序登陆

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

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

关键代码

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源码

获取手机号

手机号解密关键代码

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是微信内部人员通过邮件发送给我的
取证+微信支付

对应关系说明

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 则发起微信支付参数获取所以用户多次对同一个订单唤起多起微信收银台都是没有关系的因为对于同一个订单只有一笔待支付的支付记录多次唤起对应同一个订单、同一个待支付记录 所以该用户操作异常的场景是不会产生问题的 

标签: #weixinjavaminiapp