章节索引 :

微信支付有很多种形式,调用的API接口也不相同。现在我们做的是Web版本的在线办公系统,所以就得使用Web版本的微信支付API接口。这里我们用的是微信支付里面的Native支付,就是网站生成支付二维码,然后用户在手机上面用微信扫码付款。

图片描述

一、微信支付

1. 微信支付接口用V3还是V2版本?

经常有同学问我微信支付要不要使用V3版本?这个问题很好回答,暂时不考虑使用V3版本。因为支付是跟真金白银打交道,决不能出现任何差错。V2版本经历了多年检验,非常稳定。我们没有必要为了追求新版本API,而忽视了支付的安全和稳定性,所以这里我们依然使用V2版本,一两年之后V3版本BUG修复的差不多了,我们再切换到V3版本。

2. 创建支付订单

商品订单是我们本地系统生成的。由于我们做的不是电商系统,所以本地的商品订单其实就是罚款单,用户要为这笔罚款付钱。支付订单是微信服务器生成的,我们调用API接口,传入参数就能创建支付订单了。

图片描述
每个支付订单都有唯一的ID值,将来我们查询这笔付款是否支付成功,就会用到支付订单的ID作为查询条件。另外,商品订单ID在我们的项目中也必须要唯一。例如我们用某个商品订单ID创建支付订单,第一次可以成功创建支付订单,但是你再用这个重复的商品订单ID创建支付订单,微信服务器就会报错,因为这个商品订单ID已经用过一次了,这一点大家要切记。你仔细回想,tb_amect表中的uuid字段是全局唯一的,用来做商品订单ID正好合适。

3. 执行付款

用户拿微信扫描网站生成的二维码,并不是直接扣款。因为用户信不过卖家。假如商品订单金额是100元,但是卖家的系统调用微信平台接口,创建了一个1000元的支付订单。如果用户在微信上不核实付款金额和内容的话,就被商家骗走了900元钱。

所以当用户拿手机扫描二维码之后,自动访问微信平台,然后查询支付订单的详情(收款方、支付金额、订单备注等等),如果用户确认没有问题,就可以在手机上输入支付密码了。这个付款请求不是发给卖家的(怕卖家篡改支付金额),而是直接发送给微信平台的。微信平台先核对请求内容,然后执行扣款,最后把付款结果分别发送给商家的后端系统和付款人。

图片描述

4. 确认付款结果

创建支付订单的时候,其中的参数就包含了商户系统的接收付款结果的URL地址,微信服务器会向这个URL地址发送付款结果。但是万事万物总有个特殊情况,万一微信服务器的消息队列宕机了,没能向商家的系统发送付款结果,那么商家系统中的订单状态就依然是未付款的状态。当然了,商家系统没能接收到付款通知的原因有很多,例如短暂的网络故障,程序错误等原因。

与其被动等待付款结果的通知,不如让商家系统主动去查询付款结果。当用户手机微信显示付款成功,但是商户页面上没有出现付款成功的提示,这时候用户可以点击页面上的“已经付款成功”按钮。前端页面会向商户系统发送Ajax请求,商户系统会主动想微信服务器发起查询请求,核对该笔支付是否成功付款。如果付款成功,就修改商品订单为已付款状态。

5. 推送付款结果给前端页面

因为接收到付款结果的是商户系统,并不是前端页面,那么前端页面怎么显示付款成功的提示信息呢?第一种办法是前端页面弹出支付二维码以后,就创建一个定时器,每隔几秒向商户系统发出轮询请求,查询商品订单是否为已付款状态。这种做法的优点是简单,不需要复杂的技术就能实现。但是缺点也很明显,那就是增大了网络开销,面对轮询请求,后端项目和服务器负载都增加了。

图片描述
另一种做法是用WebSocket向前端页面推送结果。传统的HTTP协议是短连接,请求响应结束之后,HTTP连接就断开了。服务器想推送数据给前端都不行,因为连接已经切断了。WebSocket是一种长连接技术,所以前端和后端可以使用某个连接反复发送和接收数据,这效率可比HTTP协议快多了,省去了频繁创建连接和协议握手的时间。你可能有个疑惑,如果客户端和服务器之间不怎么发送数据,维护一个长连接还有必要么?毕竟服务器的网络带宽也是宝贵的。这个尽可放心,我们可以给WebSocket连接设置超时时间,超过这个间隔时间不发送数据,连接就自动切断。

图片描述
服务器把每个WebSocket连接都缓存起来,然后想要推送数据给前端的时候,就从缓存中找到与之对应的连接即可。你仔细观察,前端和服务端都没有使用定时器,所以CPU的开销是很小的。WebSocket技术要比前端JS定时轮询方案好多了。

二、微信支付必要的资质

1. 如何开通微信支付

对于商家来说,想要开通微信支付,必须要去微信商户平台注册(https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F),然后把工商登记证明、企业银行账户开户证明、组织机构代码证提交上去,经过半天的审核,如果没有问题,你就开通了微信支付功能。

图片描述
如果想要在网站或者小程序上面使用微信支付,还要在微信公众平台上面关联你自己的微信商户账号。前提是你的微信开发者账号必须是企业身份,个人身份的开发者账号是无法调用微信支付API的。

下面是已经关联好的微信商户平台账号,于是我们就可以在网站上面使用Native支付了。
图片描述

2. 如何借用企业身份

本课程提供借用企业身份的服务,但是需要注意,企业身份的微信开发者账号做认证的时候就已经与企业开户银行账户绑定了,所以我们根本不可能把收款银行账户改成你自己的。也就是说,你利用这个企业身份的微信支付功能,客户支付的每一笔钱,都打不到你个人账户中。不过,现在微信支付最低金额是1分钱,我们在测试支付罚款的时候,把罚款金额设置成1分钱就行了。1元钱相当于可以支付100次罚款,足够开发练习使用了。

大家添加慕课网java就业班微信(imooc_java)添加微信时请提供用户名+用户ID+购课订单号。然后将同学自己的微信号码告诉慕课网java就业班,我会把你的微信开发者账号关联到企业账号的开发组,这样你就可以用企业账号做微信支付了。

图片描述

大家注意,微信号不是你的电话号码。虽然你可以用手机号登录微信,但是手机号并不是你的微信号,大家自己查询清楚自己的微信号是什么。

你必须要开启可以通过微信号查找到你的微信,这样我才能在微信公众平台的控制面板上搜索到你,把你拉入到企业开发组。

3. 如何拿到支付密钥和数字证书

因为调用微信支付平台的API接口,必须要用到支付密钥和数字证书,这两个东西大家可以在本课程教辅资料区里找到。支付密钥和数字证书一般每隔两周都会更新,所以大家发现不能付款了,你就得从教辅资料区下载最新的密钥和数字证书。

大家需要注意,如果你没有被拉入企业开发组,即便你拿到了密钥个数字证书也没有用,你的微信无法支付用这个数字证书和密钥生成的支付订单。所以大家必须要申请加入企业开发组。

4. 每次借用两周时间

因为企业身份的开发者账号的开发组只能关联90个微信账号,资源有限,所以只能大家轮流使用。两周之后,你的微信账号就被取消关联开发者账号,也就无法使用密钥和数字证书了。如果你不使用支付功能的话,不影响你的程序运行。
图片描述

第一章 搭建开发环境
1-1 导学 1-2 搭建开发环境 1-3 MacOS环境的程序安装 1-4 本课程学习方法介绍 1-5 本章总结
第二章 运行项目工程
2-1 本章介绍 2-2 运行工作流项目 2-3 运行后端SpringBoot项目 2-4 运行移动端和前端项目 2-5 前后端项目分析 2-6 前端页面布局设计 2-7 本章总结
第三章 用户管理模块
3-1 本章介绍 3-2 用户登陆系统的流程说明 3-3 编写用户登陆程序(后端) 3-4 编写用户登陆程序(前端) 3-5 修改密码和退出登陆(后端) 3-6 修改密码和退出登陆(前端) 3-7 查询用户分页数据(后端) 3-8 查询用户分页数据(前端) 3-9 添加新用户(后端) 3-10 添加新用户(前端) 3-11 修改用户信息(后端) 3-12 修改用户信息(前端) 3-13 删除非管理员帐户(后端) 3-14 删除非管理员帐户(前端) 3-15 本章总结
第四章 角色管理
4-1 本章介绍 4-2 查询角色分页数据(后端) 4-3 查询角色分页数据(前端) 4-4 添加新角色(后端) 4-5 添加新角色(前端) 4-6 修改角色信息(后端) 4-7 修改角色信息(前端) 4-8 删除非内置角色(后端) 4-9 删除非内置角色(前端) 4-10 本章总结
第五章 部门管理
5-1 本章介绍 5-2 查询部门分页数据(后端) 5-3 查询部门分页数据(前端) 5-4 添加新部门(后端) 5-5 添加新部门(前端) 5-6 修改部门信息(后端) 5-7 修改部门信息(前端) 5-8 删除无用户的部门(后端) 5-9 删除无用户的部门(前端) 5-10 本章总结
第六章 会议室管理
6-1 本章介绍 6-2 查询会议室分页数据(后端) 6-3 查询会议室分页数据(前端) 6-4 添加新会议室(后端) 6-5 添加新会议室(前端) 6-6 修改会议室信息(后端) 6-7 修改会议室信息(前端) 6-8 删除空闲的会议室(后端) 6-9 删除空闲会议室(前端) 6-10 本章总结
第七章 线下会议管理
7-1 本章介绍 7-2 线下会议日程表(持久层) 7-3 线下会议日程表(业务层&Web层) 7-4 分析线下会议日程表前端设计 7-5 线下会议日程表(前端) 7-6 分析会议申请的执行流程 7-7 用异步线程开启线下会议审批流程 7-8 创建线下会议申请(后端) 7-9 创建线下会议申请(前端) 7-10 线下会议周日历(后端) 7-11 线下会议周日历(前端) 7-12 周日历弹窗浏览会议详情(前端) 7-13 删除线下会议申请(后端) 7-14 删除线下会议申请(前端) 7-15 本章总结 附-1 查询线上会议分页数据(后端) 附-2 查询线上会议分页数据(前端) 附-3 申请线上会议(前端) 附-4 删除线上会议申请(前端)
第八章 会议审批
8-1 章节介绍 8-2 查询会议申请分页数据(后端) 8-3 查询会议申请分页数据(前端) 8-4 查询审批任务详情信息(后端) 8-5 查询审批任务详情信息(前端) 8-6 加载BPMN实时进度图 8-7 审批会议申请(后端) 8-8 审批会议申请(前端) 8-9 本章总结
第九章 TRTC在线视频会议
9-1 本章介绍 9-2 获取用户签名和视频会议室RoomID 9-3 查询参会人,生成视频墙(后端) 9-4 生成视频会议室视频墙(前端) 9-5 如何创建TRTC视频推流 9-6 推送本地视频流,订阅远端视频流 9-7 实现入会签到功能 9-8 实时更新上线参会人列表 9-9 动态显示参会人语音强弱 9-10 挂断TRTC,退出视频会议 9-11 大屏显示某个远端视频 9-12 本地屏幕共享,广播推流 9-13 本章总结
第十章 罚款管理
10-1 本章介绍 10-2 查询罚款分页数据(后端) 10-3 查询罚款分页数据(前端) 10-4 添加新罚款记录(后端) 10-5 添加新罚款记录(前端) 10-6 修改罚款单(后端) 10-7 修改罚款单(前端) 10-8 删除罚款单(后端) 10-9 删除罚款单(前端) 10-10 了解微信Native支付罚款流程 10-11 设置内网穿透,用于接收付款结果 10-12 创建支付订单(持久层&业务层) 10-13 创建支付订单(Web层) 10-14 创建支付订单(前端) 10-15 接收付款结果(后端) 10-16 配置SpringBoot支持WebSo 10-17 推送付款结果 10-18 接收付款结果(前端) 10-19 主动查询付款结果(后端) 10-20 主动查询付款结果(前端) 10-21 本章总结 附-1 查询图表数据(后端) 附-2 显示图表数据(前端)
第十一章 罚款类型管理
11-1 本章介绍 11-2 查询罚款类别分页数据(后端) 11-3 查询罚款类别分页数据(前端) 11-4 添加新罚款类型(后端) 11-5 添加新罚款类型(前端) 11-6 修改罚款类型信息(后端) 11-7 修改罚款类型信息(前端) 11-8 删除罚款类型记录(后端) 11-9 删除罚款类型记录(前端) 11-10 本章总结
第十二章 请假管理
12-1 本章介绍 12-2 查询请假分页数据(后端) 12-3 查询请假分页数据(前端) 12-4 用异步线程开启请假审批 12-5 我要请假(后端) 12-6 我要请假(前端) 12-7 用异步线程关闭请假审批工作流实例 12-8 删除请假申请(后端) 12-9 删除请假申请(前端) 12-10 审批员工请假 12-11 生成请假单(后端) 12-12 生成请假单(前端) 12-13 封装腾讯云存储服务 12-14 执行请假归档(后端) 12-15 上传归档文件(前端) 12-16 执行请假归档(前端) 12-17 本章总结
第十三章 报销管理
13-1 本章介绍 13-2 查询报销分页数据(后端) 13-3 查询报销分页数据(前端) 13-4 用异步线程开启报销审批 13-5 创建报销申请(后端) 13-6 创建报销申请(前端) 13-7 生成PDF报销单(后端) 13-8 生成PDF报销单(前端) 13-9 审批报销申请 13-10 删除报销申请(后端) 13-11 删除报销申请(前端) 13-12 本章总结
第十四章 部署Emos项目
14-1 本章介绍 14-2 选购云主机 14-3 安装Docker环境 14-4 Docker中安装程序 14-5 在Docker中部署Java项目 14-6 在Docker中部署前端项目 14-7 本章总结 附录1 为云主机配置域名
第十五章 扩展功能
15-1 微信扫码登陆(后端生成二维码图片) 15-2 微信扫码登陆(前端加载二维码) 15-3 微信扫码登陆(微信小程序) 15-4 NFC扫码功能简介 15-5 NFC扫码识别
第十六章 员工离职
16-1 员工离职(一) 16-2 员工离职(二) 16-3 调试员工离职功能
第十七章 工作流
17-1 Activiti简介 17-2 创建工作流项目 17-3 BPMN入门 17-4 任务审批 16-5 会议审批工作流(一) 16-6 会议审批工作流(二) 16-7 审批工作流
附录
附录1 创建SpringBoot项目 附录2 集成常用工具库 附录3 整合权限验证与授权 附录4 允许跨域请求 附录5 封装全局异常 附录6 全局处理异常 附录7 开启Java异步执行 附录8 抵御XSS攻击 附录9 创建分页数据封装类