![314bba0e6b77397434f8506206636de8.png](https://i-blog.csdnimg.cn/blog_migrate/da7ef44953c40ea89b6b282b5645086b.jpeg)
本文主要讲述微信支付JSAPI支付的开发。
首先先看一下微信官方文档的业务开发流程:
【微信支付】JSAPI支付开发者文档pay.weixin.qq.com![fee4e4e30e4c626ff596a4f964f2a196.png](https://i-blog.csdnimg.cn/blog_migrate/e24afb591ef826679499b2b63edaf0bf.png)
总结起来可以概括为以下几步:
(1)商家后台系统生成客户订单
(2)商家系统调用微信提供的统一下单API
(3)微信支付系统会返回给商家预支付信息(prepay_id)
(4)商家系统返回给前端调用JSAPI页面唤醒支付(其中包括生成参数,签名等)
(5)用户支付完成后,微信端会传来异步通知结果
(6)商家后台需要将订单状态改为“已支付”
(7)后台返回给微信端,通知处理结果
项目中主要应用“统一下单”和“支付结果通知”这两个API。
为了避免重复造轮子,采用支付SDK完成:
https://github.com/Pay-Group/best-pay-sdk/blob/develop/doc/use.mdgithub.com项目支付订单的API设定:
![1dd08c0a7c3ec9e83c8421f0978f4110.png](https://i-blog.csdnimg.cn/blog_migrate/d43751a0470cc9bcd17392e6754cb8d0.png)
开始开发:
先写一个支付的controller:
支付过程可以理解为先通过orderId查取订单,然后发起支付这两部分
@Controller
前期工作:
引入SDK依赖,根据SDK的要求需要先配置
https://github.com/Pay-Group/best-pay-sdk/blob/develop/doc/use.mdgithub.com微信支付配置格式如下:
//微信支付配置
理解清楚这个SDK的配置要求之后,在本地项目中开始配置如下:
首先建一个配置类(用于存储account信息):
@Data
然后在application.ym文件相应位置配置自己的各个字段名称,Spring在扫描component时会自动注入。
再配置bestPayService(SDK中要求):
@Component
接着,支付部分的实现:先看SDK中的调用方法
PayRequest
可以看出SDK中的支付方法是在payRequest对象中传入OrderId,OrderAmount等信息,然后利用bestPayService的pay方法即可。
所以,按照规则书写支付部分的逻辑:
@Service
经过测试,上面程序response即为微信返回的信息,其中比较重要的是prepay_id。
以上部分即完成了调用微信下单API和返回prepay_id。
接着开始完成网页支付,先按照惯例阅读“微信H5调起支付”
【微信支付】JSAPI支付开发者文档pay.weixin.qq.com官方文档给了一段前端代码:
function
先在本地项目中测试一下,将文件<script></script>粘贴到resource的static目录下,用浏览器访问(注意:在访问之前需要传入appId,timeStamp等等,可以看上面JavaScript代码中的相应字段)。这些字段怎么获得呢?
显然根据支付流程,这些参数应该通过统一下单接口得到(也就是前一个步骤得到的参数,作为H5支付唤起的参数),所以测试时先请求一下预支付部分(上面的程序),然后将获得的参数注入JavaScript中即可实现。
但每次都这样注入,十分繁琐,所以改为采用freemarker模板技术来动态注入参数。
首先引入freemarker的依赖,在resources目录下的templates目录新建pay.ftl文件(ftl为freemarker默认的后缀),修改控制器的类returnType为ModelAndView,最后返回freemarker的ModelAndView即可。
前端代码如下:
<
其中的语句:
location.href = "${returnUrl}";
用于前端生成签名等信息之后返回的地址(需要设置)
后端控制器:
写法解释:由于经过测试,create.ftl文件需要orderId的传入,所以利用hashMap来存储,最终重定向到ftl文件的同时注入给模板的参数。
@Controller
接下来,开始写接收微信端发来的异步通知,并将后台订单状态变为已支付部分的逻辑:
同样,先看SDK的规则:
微信异步回调函数为
bestPayService
于是,继续在service中添加逻辑
@Override
注意:异步通知需要验证以下几点:
(1)验证微信发来异步通知中的签名
(2)验证微信发来异步通知中的支付状态(是否支付成功等)
(3)验证微信发来异步通知中的金额(是否与后台订单金额相同)
(4)验证微信发来异步通知中的支付人是否等于下单人
控制器中添加相应的逻辑代码:
//此函数用于接收微信发过来的异步通知(用于后端修改所下订单的支付状态)
写完商家后台订单支付状态变更模块后,微信一直不停的回调(因为没有返回微信商户处理的结果),所以需要进行最后一步操作。
微信文档:
【微信支付】JSAPI支付开发者文档pay.weixin.qq.com返回给微信的xml文件:
<xml>
写至freemarker中即可。
以上即为微信支付的开发过程和实现。