使用消息队列完成微信支付(含内网穿透)
序言
实现步骤
其实步骤已经说的很详细了。
使用消息队列解耦
使用消息队列的最大好处就是能够解耦不同服务之间的耦合->当我方服务器生成订单时,不需要等待用户完成支付就可以实现对订单状态的监控。
从用户的角度来说:
- 我方服务器此时就可以拿到这个地址,通过第三方插件来生成二维码->用户此时就可以扫码支付
创建一个service,实现调用。使用HTTPClient发送HTTP请求
此时使用在控制层调用方法即可,需要传入的参数为->订单号和金额(单位为分,人民币)
严格的说是在订单微服务中,调用feign来实现。
通过POSTMan得到的结果如下: 其中code_url是用来生成二维码的地址
生成访问二维码
可以使用前端的js插件来完成 : ** qrious.js** 源码: 链接: 提取码:6sbu
使用步骤很简单,建立一个HTML页面,引入JS文件,编写demo代码即可
记得更改value的值-> code_url
<html> <head> <title>二维码支付生成</title> <!--1.引入js 2. 创建一个img标签 用来存储显示二维码的图片 3.创建js对象 4.设置js对象的配置项--> <script src="qrious.js"> </script> </head> <body> <img id="myqrious" > </body> <script> var qrious = new QRious({ element:document.getElementById("myqrious"),// 指定的是图片所在的DOM对象 size:250,//指定图片的像素大小 level:H,//指定二维码的容错级别(H:可以恢复30%的数据) value:weixin://wxpay/bizpayurl?pr=MjkreGMzz//指定二维码图片代表的真正的值 }) </script> </html>
查询订单信息
那么如何查询订单是否支付了呢?

代码实现
依旧在控制层调用,传入订单编号即可
异步消息通知
param.put("notify_url", "接收回调信息的地址"); //回调地址
只需要根据支付结果通知API文档的参数来处理即可
此时需要将获取到的信息,丢到消息队列中,让订单微服务去监听消费->如根据订单的结果做订单的删除、修改,商品库存的回退等等操作
此操作在Controller中完成
随后订单微服务监听并消费即可。
但是问题来了,在开发环境时的回调地址,是本地的地址
如我的地址是:
localhost:18092/wx/pay/notifly
因此可以使用内网穿透的形式:
百度百科:
内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法
使用内网穿透需要一个第三方的供应商来给我们提供一个域名,这个域名一般是第三方的域名,因此我们使用的时候就不需要进行备案即可。
使用内网穿透,能够让公网的用户访问到你的电脑。
目前提供的服务商有很多如:
断续
花生壳
…
此处演示->断续 的过程
访问地址:https://cloud.zhexi.tech/auth/signin
扫码登录,进行一系列的认证即可,需要按提示安装客户端,都弄完了就点击建立隧道:
然后按照这个顺序点击新建
此时会生成一个地址,通过这个地址就能访问到我本地127.0.0.1:8080端口
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
解决前后台互传时间出现的问题