微信公众号开发-模板消息

标题微信公众号-模板消息(公众号给指定用户发送消息)

疑问前瞻

  1. 所指定的接收者openid如何获取

    业务场景中这个openId由调用方给到我们,如果自己测试demo的话如何获取openid?

    可以参考下篇博文《2. 快速获取openId》

  2. 微信的access_token接口的expitesIn写死了导致过期时间不可控如何处理?

    expiresIn是7200可以这样子看

    1. 请求的接口 https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 该接口估计是微信遗弃的接口,没有对其进行修复,可以使用另一个POST接口获取getStableAccessToken
    2. 接口是POST请求,首次生成的access_token都是7200,我们可以放开调用(放开debug),重新调用一次接口,再次expiresIn(消耗有效时间)。

后言

微信公众号-模板消息(公众号给指定用户发送消息)

这里是我的第一篇技术博客,记录我在开发过程中对微信公众号开发的一些经历。
博客在23年12月就已经写了,但是也没想着要上传到博客,一直都是本地的,后面发现如果手机上面查看本地是很麻烦的,所以放到网上。

场景是公司现在需要对于订阅公众号发送消息,预先是通过公众号对订阅用户发送消息。

类似效果图

类似这种效果,但是通过查询微信开发文档与其他笔者博客放弃这种方式。这方式需要有前提条件,都是需要粉丝对公众号有过操作(订阅,点击菜单,发送消息等)才可以进行消息的发送,并且还有条数限制。与所需效果不符,所需要的是公众号主动发送给粉丝。那么模板消息这种方式就比较符合了,它的具体效果是:通过对公众号设定消息模板,触发消息模板接口对粉丝推送消息

成品展示

首先先上效果图:

1702868770850

选定好了需要的模式,那么就开始着手开发吧!

诶?慢着!虽然是已经知道了需要做什么对吧,但是工欲善其事必先利其器。在了解到需要的接口之后是不是找到接口直接对接微信的模版接口就万事大吉了呢?来,打开我们的宝典打开到模板消息那一页,先逐步了解到需要咋开发。

1702868789412

我们通过文档的目录了解到这个一共需要的是7步就可以完成整体的开发。但是呢,不是所有的都需要代码进行处理的。1~5呢是模板相关的,只有6是我们的一个发送接口。那么就可以知道除了6以外其余的都是前置后置操作了。那么整体流程可以总结为以下4点:

  1. 公众号设定模板
  2. 微信api获取accessToken
  3. 微信api获取模板
  4. 微信api发送消息

为啥还多了一个获取accessTokenaccessToken又是啥呢?

软件开发中,访问令牌通常用于访问受限资源或执行特定操作。 Access Token 通常由身份验证服务器颁发,以授权客户端应用程序代表用户访问受保护的资源。 当用户进行身份验证并授权后,身份验证服务器会颁发一个 Access Token 给客户端应用程序。

在微信开发文档里面是这样说的:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

好的,那么我们可以了解到accessToken是必不可少的,在对微信的api调用过程中都是需要用到accessToken。

那消息模板又是一个什么东西呢?

以下是官方文档的数据格式

{
      "template_id": "iPk5sOIt5X_flOVKn5GrTFpncEYTojx6ddbt8WYoV5s",
      "title": "领取奖金提醒",
      "primary_industry": "IT科技",
      "deputy_industry": "互联网|电子商务",
      "content": "{ {result.DATA} }\n\n领奖金额:{ {withdrawMoney.DATA} }\n领奖  时间:    { {withdrawTime.DATA} }\n银行信息:{ {cardInfo.DATA} }\n到账时间:  { {arrivedTime.DATA} }}",
      "example": "您已提交领奖申请\n\n领奖金额:xxxx元\n领奖时间:2013-10-10 12:22:22\n银行信息:xx银行(尾号xxxx)\n到账时间:预计xxxxxxx\n\n预计将于xxxx到达您的银行卡"
}

这个是我设定的模板消息获取打印出来的格式

PushWxTemplate(
    templateId=zdYdwiEyeWcTAc9sUikm98d9-xQ0XMQaHw-OV86RPA8, 
    title=设备故障提醒, 
    content=设备编号:{{character_string24.DATA}}
			故障名称:{{thing4.DATA}}
			故障代码:{{character_string42.DATA}}
			故障原因:{{thing23.DATA}}
			提醒时间:{{time41.DATA}}, 
	example=设备编号: do2230500003
			故障名称:换电车辆电池框解锁超时
			故障代码:0x00000000
			故障原因:设备检测值超限
			提醒时间:2022.02.01 00:02:30
)

通过观察我们发现content这里面是有很大一部分的{{xxx.DATA}}这种格式的数据。

1702868853306

所以,可以知道展示的标题后面的数据是由模板数据与保留字构成,也可以只有模板数据没有保留字。所以也就可以读懂我设定的那个模板了。

通过对模板数据与{{xxx.DATA}}的匹配挨个填空就是我们要发送的数据。


发送模板消息

OK呀,大体已经知道是怎样的一个流程去设定发送了,可以让我们开始动手操作了。

1. 公众号设定模板

开发文档有给定设置模板的流程与接口,但是呢这部分可以直接操作我们的公众平台直接添加,毕竟一般的开发流程是不需要我们后端去跑这一整个流程,只有需要将这一整刚刚流程封装成一个功能点到自己的系统里面才需要全部都进行接入,不需要封装的话需要的消息模板这些也是由产品经理进行一个定义提供给到我们的。现在我们是在模拟模板消息这么一个功能,模板没人给,这个就需要我们自己手动去设定。

a. 首先先根据自己的业务场景选择所在行业,添加服务类目,走到这一步了现在差不多就可以添加前面行业呀,服务类目相关的一个模板。我做的是一个设备故障提醒功能,所以选择的是

1702868916842

1702869004650

申请完之后就可以等模板通过啦

1702869021629

1702869038337

通过之后呢可以说关于模板的设定差不多就结束了。接下来就是关于代码的开发了!

2. 微信api获取accessToken

微信api获取有两个接口

APPID与APPSECRET咱们可以在公众号的基本配置>公众号开发信息里面去拿到

	1. [ 获取 Access token](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html)
	2. [获取 Stable Access token](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/getStableAccessToken.html)
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

POST https://api.weixin.qq.com/cgi-bin/stable_token

我入手开发的时候接的是第一个接口,成功接入之后发现有一个问题!就是无论如何请求接口,第一个接口返回的access_token的过期时间expires_in都是7200,也就是说微信那边是写死了这个值。但是呢实际在使用过程中可能报错access_token过期!是的实际上我们无法即刻感知到access_token不可用,因为在获取那时候就不知道这个access_token多久过期,马上?还是5min?10min?1hour?我们保存access_token应该给定多少的过期时间呢?

我们可以设定一个定时器循环调用获取token去更新,在调用接口失败的时候去重新获取新的access_token,然后重调失败接口。这个算是做一个失败保护机制吧,但是access_token的即时可用性应该微信那边去更新维护的。

出现了access_token过期问题,那么我们就需要对于这个问题去给予解决,不然等到线上有了这种问题的时候造成的损失就难搞了,而且这个bug在测试的时候都可以出现!偶发性也会很频繁。

但是别着急, 先来看到第二个接口,稳定版?会不会比第一个更靠谱呢?微信那边不会一连几个接口都会有这种问题吧?而且也不止我们接过这个接口,一定会有人也接入过这个接口遇到过同样的问题,肯定会有解决方法的。

ok呀! 设定url,request,直接调用restTemplate丢一个请求过期看看是啥个意思。

1702869057751

咋还报错了?上面的数据主要返回在errCodeerrMsg记录错误信息,通过错误信息可以知道是ip被拦截了。我们可以再微信公众平台那里去添加白名单。当然这一步你可以提前获取到ip先给设定好白名单(需要公众号管理员权限)。

添加白名单

将我们的ip添加进白名单之后呢直接调用请求,又成功获得到access_token了。

1702869099149

为啥要用又呢?不会我们请求的过期时间和第一个接口是一样写死的吧?expiresIn还是7200,咋回事呢老弟,别着急让我们放开接口之后再来调用一次看看先。

1702869179531

虚惊一场的同时也不经振奋了起来,终于是有一个真实的过期时间了,那样就解决了上面那个可能存在的token过期问题。

大家看还有几处小细节可能会出现小失误!我这边就直接标记出来,等各位读者使用的时候就不用重复去踩可能出现的坑了!

  1. 请求失败的数据是errCode与errMsg进行返回的,同时accessToken与expiresIn是null;成功的数据呢accessToken与expiresIn是有值的errCode与errMsg是null。判定成功失败的时候需要注意一下。
  2. 获取到的expiresIn时间上来说可以直接用作access_token缓存的过期时间的,但是跑程序会有耗时,可以在此之上减少几秒对于缓存主动过期,然后调用强制刷新缓存的形式(“force_refresh”: true) 去获取新的缓存,当然这只是一种思路,为了避免那一小会的我们自己保存的缓存还没有过期但是微信端过期了的情况。

示例说明: 强制刷新模式,慎用,连续使用需要至少间隔30s

请求url
POST url:"https://api.weixin.qq.com/cgi-bin/stable_token"
3. 微信api获取模板

获取模板这个就没有啥好说的啦,直接调用接口去获取,当然微信端提供的是获取所有的,所以还需要去过滤得到我们要的模板数据。当然如果是demo,其实这一步你都可以跳过的,只要你知道了模板的结构也没有必要去获取它的。只需要能够把数据排列好它要的顺序给到就OK啦,业务开发的话就不要懒了!

请求url
http请求方式:GET https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN
4. 微信api发送消息

发送请求这个可以说很简单,直接是组装好数据,请求接口,接收结果就完成了模板消息的发送

url与miniProgram这两个参数是跳转使用的,如果不需要跳转功能这两个可以空着。模板的数据格式是这样子的Map<String, SendTemplateMessage.Keyword>

"data":{

    "keyword1":{
        "value":"巧克力"
    },
    "keyword2": {
        "value":"39.8元"
    },
    "keyword3": {
        "value":"2014年9月22日"
    }
}

这个是我的request

SendTemplateMessage(
    touser=aaaaaaaaaaaaaaaaaaa,
    templateId=zdYdwiEyeWcTAc9sUikm98d9-xQ0XMQaHw-OV86RPA8, 
    url=null, 
    miniProgram=null, 
    data={
        character_string24=SendTemplateMessage.Keyword(value=CONSOLE-01), 
		time41=SendTemplateMessage.Keyword(value=2023.12.16 16:07:56), 
		character_string42=SendTemplateMessage.Keyword(value=0x0F000F000001), 		  thing23=SendTemplateMessage.Keyword(value=测试故障能有啥原因呀), 				thing4=SendTemplateMessage.Keyword(value=这是一个测试故障名称)
	},
	clientMsgId=null
)
请求url
http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

1702869205172

ok,目前到这里的话整体的流程都是差不多了。具体还有的拓展呢,就得看具体的额业务与实际要求来了。

demo

个人版的模板消息demo我是没有写redis和mysql里面。如果有需要的读者可以自己尝试着配置redis与mysql的地址链接去尝试整体的效果。当然token加缓存,模板消息发送记录入库这些业务版上面都有做,个人版我就偷懒没有配置。

demo代码可以看这里!还有其他啥问题或者一起探讨可以联系我.

我的邮箱:shineleafcc@163.com

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值