全部开发者教程

企业级在线办公系统

微信支付有很多种形式,调用的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个微信账号,资源有限,所以只能大家轮流使用。两周之后,你的微信账号就被取消关联开发者账号,也就无法使用密钥和数字证书了。如果你不使用支付功能的话,不影响你的程序运行。
图片描述