使用消息队列完成微信支付(含内网穿透)

序言

实现步骤

其实步骤已经说的很详细了。

使用消息队列解耦

使用消息队列的最大好处就是能够解耦不同服务之间的耦合->当我方服务器生成订单时,不需要等待用户完成支付就可以实现对订单状态的监控。

从用户的角度来说:

  1. 我方服务器此时就可以拿到这个地址,通过第三方插件来生成二维码->用户此时就可以扫码支付

创建一个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>

查询订单信息

那么如何查询订单是否支付了呢?

![image.png](https://img-blog.img.cn/img_convert/8b1cd26e7636b30b4300f6e0e947b78e.png#align=left&display=inline&height=300&margin=[object Object]&name=image.png&originHeight=600&originWidth=1247&size=77690&status=done&style=none&width=623.5)

代码实现

依旧在控制层调用,传入订单编号即可

异步消息通知

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端口

经验分享 程序员 微信小程序 职场和发展