如何接入微信服务号模板消息?

部署运行你感兴趣的模型镜像

经过了几天的奋战,终于把微信服务号的模板消息给写完了。后端其实没花多少时间,因为之前已经有同学提过pull request了,我在这基础之上简单优化下就完事了,主要的时间都是花在前端上,对前端页面和参数的适配比较麻烦。

消息推送平台🔥推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型

不多说了,先来看看效果图吧。

要实现微信服务号的模板消息推送,首先我们得有一个服务号。要值得注意的是,服务号是服务号,订阅号是订阅号。服务号会有单独的聊天框,所以Java3y实际上是一个订阅号。

服务号申请要有企业的资料,而我,是没有的。那我这次是怎么调试的呢?后来经朋友圈提醒,微信是能让我们申请测试号的,相关的API都是能用的,得知了以后,那我不就屁颠屁颠花了几天实现了嘛。

申请测试号链接:mp.weixin.qq.com/debug/cgi-b…

进入到测试号以后,我们能把自己加入到测试的微信号内,拿到对应的openId

创建几个测试下发的模板;

0reG3uUoUSonh0jGi-8ufj3VheCFlaoXqxBxD-zvswE
  
待处理作业提醒
  
{{first.DATA}} 作业类型:{{keyword1.DATA}} 作业名称:{{keyword2.DATA}} 所属项目:{{keyword3.DATA}} 提交日期:{{keyword4.DATA}} {{remark.DATA}}    
复制代码

我们还能直接拿到appIDappsecret,这就相当于当前服务号账号的信息。那我要做的就是把这个信息加入到消息推送平台的账号体系下。

在新建模板发送消息的时候,我们就可以选择到这个被加入到账号体系的账户,拿到这个账户下的模板列表,再得到具体模板的详情信息啦,这会有个联动的效果。

我这就一个完整的消息模板,来让大家看看,顺便讲讲相关的功能吧。

保存之后就会跳转到模板的列表页,就能看到刚才所建的模板啦。

这时候,我们点击测试按钮,就能看到下发的效果:

至于功能实现,我就不在这多说啦。因为消息推送平台的架构已经搭好了,接入消息这个过程没多少工作量,主要是适配整个架构代码的实现就好了。至于做了什么改动,你们看commit就好啦。

几个关键代码入口:

  • 前端交互:com.java3y.austin.web.controller.OfficialAccountController
  • 发送消息入口:com.java3y.austin.service.api.impl.service.SendServiceImpl#send
  • 真正处理微信服务号模板消息发送入口:com.java3y.austin.handler.handler.impl.OfficialAccountHandler#handler

如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin(8K stars) ,可以用作毕业设计,可以用作校招,可以看看生产环境是怎么推送消息的。开源项目消息推送平台austin仓库地址:

作者:Java3y
链接:https://juejin.cn/post/7221505758603870269
 

您可能感兴趣的与本文相关的镜像

Facefusion

Facefusion

AI应用

FaceFusion是全新一代AI换脸工具,无需安装,一键运行,可以完成去遮挡,高清化,卡通脸一键替换,并且Nvidia/AMD等显卡全平台支持

<think>我们注意到用户的问题是关于如何在前端实现微信小程序向微信服务号发送模板消息的功能。但根据微信的官方规则,小程序服务号属于不同的账号体系,它们之间不能直接互相发送消息。不过,我们可以通过以下方式间接实现: 1. 用户在小程序前端触发某些操作(例如提交表单、支付成功等)时,小程序前端将需要发送的消息内容传递给小程序后端。 2. 小程序后端将消息内容通过微信提供的服务号模板消息接口(需要用户已关注服务号且授权)发送到服务号,再由服务号推送给用户。 但是,用户要求在前端实现。这里需要明确:微信服务号模板消息的发送必须由后端发起,因为需要调用微信的接口(需要access_token,而前端暴露appsecret是极其不安全的)。因此,前端无法直接推送服务号模板消息。 不过,我们可以考虑另一种方式:使用微信统一服务消息(原模板消息已弃用,现在服务号也使用订阅消息机制,但服务号目前仍支持模板消息,但新规则建议使用订阅消息)。但请注意,小程序服务号之间用户身份通过unionid关联,因此需要用户同时关注服务号且在小程序内授权过。 因此,实现步骤大致如下: 1. 小程序前端收集用户操作,并获取用户在小程序内的openid(或unionid)。 2. 小程序前端将需要发送的消息内容、用户openid(或unionid)发送给小程序后端。 3. 小程序后端通过微信服务号模板消息接口(或订阅消息接口)发送消息。这里需要服务号的appidappsecret获取access_token,然后调用发送模板消息的API。 所以,前端部分只负责收集用户操作触发后端调用,而实际的消息发送由后端完成。 但是,用户的问题特别强调“前端实现”,这可能是因为用户希望在前端触发消息推送。那么,前端需要做的工作是: 1. 确保用户已经授权并获取了用户的openid(通过wx.login获取code,然后由后端换取openid)。 2. 当用户触发某个事件(如点击按钮)时,调用小程序的wx.request将事件数据(包括用户openid、模板消息所需的数据)发送到小程序后端的一个API。 3. 后端接收到请求后,验证数据,然后使用服务号模板消息API发送消息。 另外,需要注意:服务号模板消息发送要求用户必须关注了该服务号,并且用户在小程序服务号之间是通过同一个微信开放平台账号下的unionid关联的。 因此,前端代码示例(微信小程序)如下: ```javascript // 假设用户已经登录,获取了用户的openid(实际开发中,openid通常由后端返回并存储在小程序storage中) const openid = wx.getStorageSync('openid'); // 从缓存中获取openid // 用户点击发送消息按钮 function sendTemplateMessage() { // 准备模板消息所需的数据,这里需要根据服务号模板的要求来组织数据 const data = { touser: openid, // 接收消息的用户openid(注意:这个openid是用户在小程序中的openid,但服务号发送模板消息需要的是用户在该服务号下的openid。因此,实际应用中,后端需要根据小程序的openid去查询对应的服务号openid,或者使用unionid关联。所以这里更合理的做法是传递unionid,或者由后端去转换) // 但是,由于小程序服务号在同一个开放平台下,后端可以通过unionid来关联用户,所以这里我们传递小程序的openid,由后端去获取对应的服务号openid(如果后端已经存储了用户的unionid服务号openid的关联关系) // 因此,前端只需要传递小程序的openid,以及模板消息所需的具体内容 template_id: '服务号模板消息模板ID', // 这个模板ID需要在服务号后台申请 url: '点击消息跳转的链接', // 可选 data: { // 模板消息的具体内容,根据模板的关键字来设置 keyword1: { value: '内容1' }, keyword2: { value: '内容2' } // ... 其他关键字 } }; // 调用后端API wx.request({ url: 'https://your-backend-domain.com/send-template-message', method: 'POST', data: data, success(res) { if (res.data.code === 0) { wx.showToast({ title: '发送成功', }); } else { wx.showToast({ title: '发送失败:' + res.data.message, icon: 'none' }); } }, fail() { wx.showToast({ title: '请求失败', icon: 'none' }); } }); } ``` 但是,请注意:上述代码中的template_iddata结构都是服务号模板消息的格式,而服务号模板消息的发送需要用户关注服务号。如果用户没有关注服务号,则发送失败。 另外,由于微信官方已经将小程序模板消息废弃,改为订阅消息,而服务号目前仍支持模板消息(但新开发建议使用订阅消息)。但服务号订阅消息小程序的订阅消息是独立的,不能通过小程序直接触发服务号订阅消息。因此,通常的做法还是通过服务号模板消息。 但是,如果用户希望使用服务号订阅消息,那么需要用户在小程序前端触发时,同时引导用户跳转到服务号进行订阅(这通常需要用户主动订阅,且订阅一次只能发送一条消息)。流程较为复杂,不在本题讨论范围内。 因此,总结:前端无法直接推送服务号模板消息,必须通过后端。前端只负责收集数据并调用后端API。 另外,根据引用[3]引用[4],现在小程序推荐使用订阅消息,而服务号目前也支持订阅消息(但服务号订阅消息的触发需要用户主动订阅,且订阅一次只能发送一条消息,或者长期订阅需要特定行业)。 如果用户希望实现的是小程序自己的消息推送,那么应该使用小程序的订阅消息(即用户在小程序内订阅,然后后端发送,用户在小程序的服务通知中收到)。但用户的问题明确要求是“向微信服务号发送模板消息”,所以这里我们按照服务号模板消息的实现方式。 注意:在微信开放平台中,小程序服务号绑定在同一主体下,那么用户在小程序服务号中的unionid是相同的,因此可以通过unionid来关联用户。后端需要存储用户的unionid服务号openid的对应关系(当用户关注服务号时,服务号后台可以获取到用户的openidunionid,并存储到数据库)。 因此,前端需要传递小程序的openid(或者unionid,如果前端能获取到的话)消息内容。后端根据unionid查询到该用户在服务号的openid,然后发送模板消息。 由于小程序前端无法直接获取unionid(需要用户授权且后端解密),所以通常前端只传递小程序的openid,后端通过小程序的openid去查询用户的unionid(前提是后端已经存储了该用户在小程序的登录信息,包括openidunionid)。 因此,前端代码中,我们只需要传递小程序的openid即可。 最后,需要强调的是,服务号模板消息的发送接口是:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN 而后端需要先获取服务号的access_token(通过服务号的appidappsecret)。 所以,整个流程中,前端的工作就是触发事件并传递数据到后端,后端完成消息的发送。 如果用户坚持要在前端完成,那么只能通过跳转到服务号的方式(比如通过服务号菜单或者客服消息引导用户去服务号操作),但这样就不是推送模板消息了。 因此,我们只能按照上述流程实现。 注意:如果用户没有关注服务号,则无法发送模板消息。此时,可以考虑使用小程序的订阅消息(用户在小程序内订阅,然后后端发送小程序订阅消息,用户在小程序的服务通知中收到),但这样就不是服务号消息了。 如果用户的需求是希望用户能在微信的服务通知中收到类似服务号模板消息的卡片,那么使用小程序的订阅消息也可以实现类似的效果(用户收到的是小程序的服务通知,但样式类似)。所以,如果用户不介意消息来源是小程序而不是服务号,那么使用小程序的订阅消息是更简单的方式。 这里,我们假设用户确实需要发送服务号模板消息。 所以,前端实现的部分就是调用后端API。后端实现的部分需要包括: 1. 获取服务号access_token(需要缓存,因为每日获取次数有限)。 2. 根据小程序的openid查询用户对应的服务号openid(通过unionid关联)。 3. 调用微信服务号模板消息接口发送消息。 因此,回答用户:微信小程序前端无法直接推送微信服务号模板消息,但可以通过调用后端API的方式触发后端发送。前端需要收集用户openid模板消息所需的数据,然后通过wx.request发送到后端。 下面,我们按照要求生成相关问题。</think>### 微信小程序前端实现推送服务号模板消息的步骤 根据微信官方规则,小程序**无法直接从前端推送服务号模板消息**,因为: 1. 小程序服务号属于不同账号体系(openid不同) 2. 模板消息发送需后端调用敏感接口(需access_token) 3. 需用户授权关联(unionid机制) 但可通过以下流程间接实现: ```mermaid graph LR A[小程序前端] -->|1. 触发事件| B[小程序后端] B -->|2. 获取unionid| C[微信开放平台] C -->|3. 关联用户| D[服务号后端] D -->|4. 发送模板消息| E[用户服务号] ``` #### 前端核心实现步骤 1. **获取用户授权** ```javascript // 获取用户手机号(用于关联服务号) wx.login({ success: (res) => { wx.getPhoneNumber({ success: (res) => { const { code } = res wx.request({ url: '后端API', data: { code } }) } }) } }) ``` 2. **传递模板参数** ```javascript // 提交模板消息所需数据 wx.request({ url: '后端消息推送API', method: 'POST', data: { template_id: '服务号模板ID', formData: { keyword1: { value: '订单内容' }, keyword2: { value: '2023-08-01' } } } }) ``` 3. **处理跳转引导(可选)** ```javascript // 引导用户关注服务号 wx.showModal({ title: '温馨提示', content: '需关注服务号接收消息', success: (res) => { if (res.confirm) { wx.navigateToMiniProgram({ appId: '服务号appid', path: '关注页路径' }) } } }) ``` #### 后端关键配合 1. **unionid关联用户** ```python # Python示例(使用微信开放平台API) def get_unionid(appid, secret, code): url = f'https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code' response = requests.get(url) return response.json().get('unionid') ``` 2. **发送模板消息[^2][^4]** ```python def send_template_message(openid, template_id, data): access_token = get_access_token() # 获取服务号access_token url = f'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}' payload = { "touser": openid, # 服务号openid "template_id": template_id, "data": data # 与模板占位符严格一致 } requests.post(url, json=payload) ``` #### 注意事项 1. **账号关联要求** - 小程序服务号必须在[微信开放平台](https://open.weixin.qq.com/)绑定 - 用户需同时使用小程序并关注服务号 - 需获取用户**unionid**实现账号关联[^1] 2. **消息类型限制** ```mermaid pie title 消息推送类型对比 “服务号模板消息” : 45 “小程序订阅消息” : 55 ``` 3. **合规性要求** - 模板需在服务号后台申请审核 - 禁止营销类内容推送 - 需用户主动触发事件[^3] > ⚠️ 实际开发中,**前端仅负责收集数据触发事件**,核心推送逻辑必须由后端实现,主要原因: > 1. 避免暴露AppSecret(高风险) > 2. 需要unionid关联计算 > 3. 需服务号access_token(2小时刷新) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值