【小程序】微信小程序关联公众号(服务号)推送通知消息

一、背景

最近开发的一个小程序项目需要通过服务号来推送通知。但是在最开始开发小程序的时候并没有考虑到这个功能。

二、准备条件

预备知识

小程序openid:小程序用户的唯一id

公众号openid:公众号用户的唯一id

unionid:同一用户,对同一个微信开放平台下的不同应用,unionid是相同的

准备

1.将小程序与公众号绑定(绑定后才可获取unionid),官方文档:小程序与公众号绑定获取unionid

2.接入微信公众平台开发,也就是给服务号配置一下开发者服务器。当有用户关注/取消服务号时,微信服务器会推送关注/取消的事件给我们的服务器。官方文档:接入微信公众平台开发

3.获取公众号用户列表,即所有用户的公众号openid。官方文档:获取公众号用户列表

4.通过公众号openid获取用户的unionid。官方文档:通过公众号openid获取unionid

5.推送服务号消息。官方文档:公众号发送模版消息

注意

1.在上述的一些接口中,需要获取access_token。小程序和公众号的access_token是不同的,需要用各自的appid和secret去获取。

2.access_token每天只能获取200次,有效期是7200秒。所以应该把它加入缓存,而不是每次都去获取新的access_token。

三、开始开发

将小程序用户与公众号用户关联:

小程序用户openid→unionid←公众号用户openid

要想将小程序与公众号用户关联,第一件事就是获取用户的unionid。

我们可以在两种情况下获取用户的unionid:

一、如果用户已经关注了公众号,那么在用户登录的时候,就可以获取到unionid

二、如果用户没有关注公众号,那么得让前端调用wx.getUserInfo,把加密数据给后端解密拿到unionid。

解密需要session_key,而session_key又有有效期,得注意它过期的情况。

当用户关注公众号时,微信会推送事件给我们(本文准备条件的第2条)。

通过关注事件,我们可以拿到用户的公众号openid,再获取unionid(本文准备条件的第4条)。拿到unionid后,去数据库查询这个unionid的用户,并把公众号openid保存。

但是,还有两个情况没有考虑到:

一、在我们开发之前,已经关注了公众号的用户没有去关联

解决方案:

获取微信公众号的用户列表,再依次获取用户unionid(本文准备条件的第3、4条)。注意,此操作非常耗时。

二、用户先关注了公众号,但是从来没用过小程序(数据库里没有unionid,导致无法关联)

解决方案:

新建一张表,把这个公众号用户先记录下来。当小程序用户登录时,先检查一遍这张表尝试关联。

至此,小程序用户与公众号用户就已经完成了关联。

发送模版消息:

这个就很简单了,照着官方文档(本文准备条件的第5条)做就行了。

需要注意的是,参数别写错了,我就是把miniprogram放到data里面去了,导致不能跳转小程序

最后附上发送模版消息的python代码:

def send_oa_msg(oa_openid, template_id, jump_param, param):
    """
    发送模版消息
    """
    oa_token = get_oa_access_token()
    url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={oa_token}'.format(oa_token=oa_token)
    post_data = {
        "touser": oa_openid,
        "template_id": template_id,
        "miniprogram": jump_param,
        "data": param
    }
 
    res = requests.post(url, json=post_data)
    result = res.json()
 
    if result['errcode'] == 0:
        return True
    else:
        return False
### 微信小程序集成公众号消息推送教程 #### 一、准备工作 确保已经拥有并配置好微信公众号以及小程序账号,在微信公众平台上完成相应设置。这包括但不限于获取AppIDAppSecret等必要参数,这些将在后续开发过程中频繁使用[^3]。 #### 二、引入官方组件 在页面中添加`<official-account>`标签用于展示关联小程序入口,并通过事件绑定函数处理加载逻辑: ```html <!-- wxml 文件 --> <view> <!-- 关联已认证的服务号或订阅号 --> <official-account bindload="onOfficialAccountLoad"></official-account> </view> ``` ```javascript // js文件 Page({ onOfficialAccountLoad(e) { console.log('Official account loaded:', e.detail); } }); ``` 此部分操作允许用户从小程序内部访问指定的公众号资料页,从而促进两者之间的互动。 #### 三、服务器端对接口的支持 对于希望向关注者发送模板消息的情况,则需依赖于后端服务来调用微信API接口。这里推荐采用Spring Boot框架构建RESTful API作为中介层,负责接收来自前端请求并向微信服务器发起HTTP POST请求以触发具体的消息推送行为[^1]。 - **创建Controller类** ```java @RestController @RequestMapping("/wx") public class WxMessageController { @Autowired private WxMpService wxMpService; @PostMapping("/sendTemplateMsg") public ResponseEntity<String> sendTemplateMsg(@RequestBody Map<String, String> params){ try{ // 构建模板数据对象... WxMpTemplateMessage templateMessage = new WxMpTemplateMessage(); // 设置模板id其他属性... boolean result = wxMpService.getTemplateMsgService().send(templateMessage); if(result){ return ResponseEntity.ok("Success"); }else{ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to send message."); } }catch(Exception ex){ log.error(ex.getMessage(),ex); return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } } } ``` 上述代码片段展示了如何定义一个简单的控制器方法用来接受从前端传来的JSON格式的数据包,解析其中的信息填充到`WxMpTemplateMessage`实例里再经由MP SDK执行实际的通知动作。 请注意,以上仅为简化版示例,真实项目可能还需要考虑更多细节如安全性验证、错误重试机制等方面的设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值