最近有个新东西要做,就是使用微信公众号推送消息,大致的需求就是要实现多公众号消息推送,并且要知道消息最终有没有推送成功,我们需要去查阅一下官方的模板消息接口文档,在文档中我们可以看到,在调用推送接口会,会有一个回调事件来告诉我们此次消息是否推送成功,那么这就好办了,下来我们就燥起来吧。
这里我涉及到工具包和环境如下:
- JDK1.8
- Spring Boot 2.3.3
- Win10
- IDEA 2020.2.1
- lombok 1.18.12
- springfox-boot-starter 3.0.0
- weixin-java-mp 3.9.0
好了,我进入我们的主题吧,新建一个Spring Boot的项目,并引入上面的这些包
1 | <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-cp --> |
这里我们直接使用weixin-java-mp
github上的多公众号示例,
先创建个名为JsonUtils的utils类:
1 | import com.fasterxml.jackson.annotation.JsonInclude.Include; |
继续再分别新建两个名为WxMpProperties和WxMpConfiguration的Configuration类:
1 | import lombok.Data; |
按照weixin-java-mp我们还需要新建handler和builder,我就一一复制出来了,我们继续其他的吧,去配置文件把微信公众号配置好,这里我用的是测试公众号,如果你们也需要的话,可以去https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index申请,很简单,就微信扫一扫即可,我登录后就出现这样的界面
现在就得到了我们的AppId和appsecret了,然后去配置文件中配置好
1 | wx: |
现在我们就来实现消息发送吧,借助weixin-java-mp来实现消息推送真的是方便,我新建了分别新建了一个IWechatMsgPushService和WechatMsgPushServiceImpl
1 | public interface IWechatMsgPushService { |
这里的templateId需要我们去手动创建一个
如果是一个公众号的话,就不需要wxMpService.switchover(appId);
,否则会报错,因为它不知道你是要调用哪个公众号。
现在就新建一个Controller
1 | @Slf4j |
因为我们使用的*springfox-boot-starter,它已经默认为我们做了一些配置,所以,我们直接运行就可以访问Swagger
这里需要注意的是,新版的springfox访问路径有些变化,现在要访问swagger-ui/index.html,我们来发条测试消息试试
这里的OpenId可以直接在测试公众号后台获取,那么消息推送就差不多了,现在我们来看看事件回调。我们继续搬Demo的代码,新建一个WxPortalController,代码如下:
1 | @Slf4j |
我们再启动起来,可以在swagger中看到新的接口
现在我们就开始去配置回调地址了,因为我们本地启动起来外网是访问不到的,所以需要做内网穿透,这里我推荐两个比较常用的内网穿透软件natapp和ngrok,之前ngrok有免费的,但是不是很稳定,现在我用的natapp,因为他有免费的通道使用,只是免费版带宽只有1M,也不支持HTTPS和绑定域名,不过对我来说已经够用,因为只是测试嘛,我的natapp配置如下
然后,需要natapp来启动,启动成功后会出现如下界面
现在我们就可以通过互联网来访问我们的接口了
现在,我们就去测试公众号配置回调地址
回调地址已经配置完成,我们再重新推送一次模版消息看看效果
在我们实践过程中得知,在调用发送模版接口的时候,会返回一个msgid,在回调事件中也会返回msgid,现在我们就可以通过msgid来关联之前发送的消息,从而得知该模版消息的最终推送状态。