浅析微信公众号订阅消息开发流程
<p><span style="font-size: 16px"> 官方文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html</span></p><p><span style="font-size: 16px">1、登录公众号管理平台:广告与服务 - 模板消息</span></p>
<p><span style="font-size: 16px"> 在这里需要添加“消息模板”(这里是需要拿到模板 id 的),以及查看“模板消息接口文档”,根据文档去做后台开发即可。</span></p>
<p><span style="font-size: 16px"> 模板库里没有合适的模板时,需要自己新建,等待审核周期有点长,7-15天,所以需要提前申请模板</span></p>
<p><span style="font-size: 16px"><img src="https://img2022.cnblogs.com/blog/1158910/202204/1158910-20220418152230971-1510855530.png"></span></p>
<p><span style="font-size: 16px">2、前提条件:</span></p>
<p><span style="font-size: 16px">(1)用户需关注了你的微信公众号</span></p>
<p><span style="font-size: 16px">(2)你有用户的 openId</span></p>
<p><span style="font-size: 16px">3、如何确定发送给哪些人?</span></p>
<p><span style="font-size: 16px">(1)如果你有关联性的成员,比如问题,需要发送给该问题领域的技术专家去回答,那就直接取关联的该领域的技术专家的 users 去遍历发送订阅消息即可</span></p>
<p><span style="font-size: 16px">(2)如果没有关联性的成员,比如资讯或每日一题,怎么办呢?</span></p>
<p><span style="font-size: 16px"> 1. 可以在页面放置微信公众号的二维码,让用户去扫码</span></p>
<p><span style="font-size: 16px"> 2. 扫码进入公众号,关注后,自动回复快捷链接</span></p>
<p><span style="font-size: 16px"><img src="https://img2022.cnblogs.com/blog/1158910/202204/1158910-20220418153441302-992300716.png"></span></p>
<p><span style="font-size: 16px"> 3. 点击订阅数据库每日一题,即可进入每日一题页面,给予按钮进行订阅(订阅后在表里存储订阅的哪些用户即可,在发送订阅消息时,从这些用户里去取即可)</span></p>
<p><span style="font-size: 16px">4、具体开发步骤:</span></p>
<p><span style="font-size: 16px">(1)Controller 层:声明接口</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px">@ApiOperation(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">发送每日一题微信提醒</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
@PreAuthorize(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hasRole('sys')</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
@PostMapping(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/dailys/{dailyId}/remind</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> OperationInfo remindDaily(@PathVariable Integer dailyId) throws EmcsCustomException {
dailyService.sendWxRemind(dailyId);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> OperationInfo.success(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">发送订阅消息成功</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}</span></span></pre>
</div>
<p><span style="font-size: 16px">(2)异步遍历订阅用户发送消息提醒</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(0, 0, 0, 1)">@Async
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> sendWxRemind(Integer dailyId) throws EmcsCustomException {<br></span><span style="color: rgba(0, 0, 0, 1)"> ......
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取订阅用户</span>
List<User> users =<span style="color: rgba(0, 0, 0, 1)"> getSubscribedUsers();
</span><span style="color: rgba(0, 0, 255, 1)"> if</span> (users == <span style="color: rgba(0, 0, 255, 1)">null</span> ||<span style="color: rgba(0, 0, 0, 1)"> users.isEmpty()) {
log.error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">每日一题订阅用户为空</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
}
users.forEach(user</span>-><span style="color: rgba(0, 0, 0, 1)"> {
wxService.sendLessonRemind(user, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">每日一题更新啦</span><span style="color: rgba(128, 0, 0, 1)">"</span>, title, startTime, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">点击查看或退订</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, pagePath);
});
}</span></span></pre>
</div>
<p><span style="font-size: 16px">(3)如何发送,看文档即可,比如这样</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> sendEventStartRemind(User user, String title, String name, String time, String comment, String url) {
......
requestBody.put(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">template_id</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span>第一步的模板ID<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
requestBody.put(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">url</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, url);
requestBody.put(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">data</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, data);
String accessToken </span>=<span style="color: rgba(0, 0, 0, 1)"> getAccessToken(WxPublicConfig.getInstance()).getAccess_token();
wechatApi.sendPublicTemplateMessage(accessToken, requestBody);
}</span></span></pre>
</div>
<p><span style="font-size: 16px"> 这里比较重要的是第一步的模板id,以及 accessToken 的获取,也有文档</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"> <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 获取微信token, 公众号,开放号,小程序
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> WxTokenVO getAccessToken(IWxConfig config) {
WxTokenVO token </span>=<span style="color: rgba(0, 0, 0, 1)"> wechatApi.getAccessToken(config.getAppID(), config.getAppSecret());
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (token.getErrcode() != <span style="color: rgba(0, 0, 255, 1)">null</span> && token.getErrcode() != <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">) {
log.error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">获取微信账户token异常: {}, code: {}, message: {}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, config.getAppID(), token.getErrcode(), token.getErrmsg());
}
log.info(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">获取{}token: {}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, config.getAppID(), JSON.toJSONString(token));
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> token;
}</span></span></pre>
</div>
<p><span style="font-size: 16px"> 下面就是按文档用 OpenFeign 请求微信提供的接口去做对应事情即可,如这样:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(0, 0, 0, 1)">@FeignClient(name </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wechatApi</span><span style="color: rgba(128, 0, 0, 1)">"</span>, url = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://api.weixin.qq.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> WechatApi {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 获取微信账号access token, 公众账号,开放账号,小程序账号
* </span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html</span>
<span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@RequestLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GET /cgi-bin/token?grant_type=client_credential&appid={appId}&secret={appSecret}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
WxTokenVO getAccessToken(@Param(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">appId</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">) String appId,
@Param(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">appSecret</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">) String appSecret);</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 发送微信公众号模板消息
* </span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html</span>
<span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@RequestLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">POST /cgi-bin/message/template/send?access_token={accessToken}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
@Body(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">void</span> sendPublicTemplateMessage(@Param(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">accessToken</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">) String accessToken, JSONObject body);</span><span style="color: rgba(0, 0, 0, 1)">
}</span></span></pre>
</div>
<p><span style="font-size: 16px">5、接收微信服务器返回</span></p>
<p><span style="font-size: 16px"> 如果需要接收微信服务器的返回,然后根据发送消息是否发送成功,然后做一些自己的相关业务的话,就需要填写这个回调地址(你可以把它理解为一个 api 接口,该接口必须是 public 完全公开的,这是供微信服务器去回调的)。</span></p>
<p><span style="font-size: 16px"> 在微信公众管理平台:设置与开发 - 基本配置 - 服务器配置,这里去进行回调地址配置。</span></p>
<p><span style="font-size: 16px"> 具体如何做,看官方文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html,这里需要注意的是第二步:需要验证消息的确来自微信服务器,验证成功之后才能去做自己平台相关的业务逻辑。</span></p><br><br>
来源:https://www.cnblogs.com/goloving/p/16159918.html
頁:
[1]