🚩 小程序订阅消息一次性模板实现“长期订阅”

9,858 阅读4分钟

前言 📝

今天要实现一个小程序给用户发送模板消息,经过一系列的官网查看主要分为两种,一次性模板长期订阅。下面我会详细介绍两种模板的意思。

原文地址:alvis.org.cn/posts/1c4fb…

1. 消息类型

小程序订阅消息

一次性订阅:用户自主订阅后,可不限时间地下发一条对应的服务消息;每次订阅只能发送一条消息。也就是说,点击点阅之后,服务端只能帮我们下发一条信息。要想在次给用户下发信息,就需要用户再次点击订阅。

长期订阅:用户订阅一次后,可长期下发多条消息。长期订阅对资质的要求很高,目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。

这样看来是不是觉得一次性订阅比较鸡肋,没有什么用。本文选用的就是一次性订阅,使用一次性订阅达到长期订阅的效果。

2.订阅消息

2.1 消息模板

发送消息必须使用微信小程序官方提供的消息模板。消息模板可以在微信公众号平台获取,如下图:

image.png

选好模板后,点击操作栏的选用按钮即可。如下图:

image.png

2.2 消息内容说明

image.png

(1)模板id: 模板的唯一标识,微信小程序端服务器端都需使用,来确定使用那个模板。
(2)详细内容: 这里就是消息的内容,上图所示中的 计划名称 就是标题,{{ting1.DATA}}就是值。

剩余模板中的内容都不重要,在此不作赘述。

2.3 消息发送

方法:wx.requestSubscribeMessage(Object object)(微信官方文档入口)wx.requestSubscribeMessage()用在微信小程序端,用于调起订阅消息界面。如下图:

image.png

注意事项:

(1)触发方式: wx.requestSubscribeMessage(Object object)只能用于点击按钮触发。 (2)一次性消息: 在消息类型中提及到,一次性订阅消息在用户自主订阅后,只能发送一次消息。

3.前端代码

requestSubscribeMessage

  //由点击事件调出订阅消息界面
  <button bindtap="subScriptionMessage"></button>
//调出 模板消息界面
 subScriptionMessage(){
	 wx.requestSubscribeMessage({
	  	//模板id,可以写多个
		tmplIds:['模板id']
		//成功回调
		success(res){
	        console.log(res);
	    },
	    //失败回调
	    fail(res){
	        console.log(res);
	    }
  	})
 } 

4. 后端下发消息接口

发送订阅消息

POST api.weixin.qq.com/cgi-bin/mes…

image.png

需要注意的是access_token需要放在url地址栏,其余的参数我就不赘述了,官网地址都有。

5. 实际应用-长期订阅

通过上述介绍,我想大家对微信小程序发送模板消息有两个大概的认识。
我们知道用户同意订阅消息后,服务器端只能发一条消息给用户,后面如果想再次发送,还需要去询问用户是否订阅。那么如果我们想持续的给用户发消息呢?我们该如何应对这样的场景呢?

4.1 “总是保持以上选择”

在询问用户是否同意接收消息时,下方有个总是保持以上选择,如果用户勾选了,并点击确定,那么后面如果再次询问用户是否同意接收消息时,就不会弹出订阅消息界面。我们该如何判断用户勾选了保持以上选择呢?

可以通过微信小程序的wx.getSetting({})方法。这个方法会在勾选了保持以上选择后,会打印出模板id。所以我们需要在订阅界面成功回调方法中,判断下setting中是否包含模板id。

image.png

5.2 实现思路

  1. 在后台数据库中给微信用户添加一个字段:check_flag表示,表示是否勾选 总是保持以上选择,true:勾选了,false:未勾选。
  2. 在wx.requestSubscribeMessage()成功回调方法中调用wx.setting()中判断用户是否勾选了总是保持以上选择。
  3. 如果是,修改check_flag=true。
  4. 在微信小程序中必点击的地方,添加调用wx.requestSubscribeMessage()方法。
  5. 如果check_flag为true时调用wx.requestSubscribeMessage()。
  6. 然后就可以实现用户在登陆界面点击一次发送多条消息给用户。如果用户不想再次接收消息。可以在我小程序右上角三个点设置中修改即可。

5.3 代码

//在用户必点的地方,调用订阅消息方法
clickSubscribeMessage(){
   let flag = wx.getStorageSync('checkFlag');
   console.log(false);
   //订阅消息
   if(flag){
     wx.requestSubscribeMessage({
       tmplIds: ['模板id'],
       success(res){
         console.log(res);
       },
       fail(res){
         console.log(res);
       }
     })
   }
 }
...
//订阅消息
  subScriptionMessage(){
    var that = this;
    wx.requestSubscribeMessage({
      tmplIds: ['模板id'],
      success (res) { 
        if(JSON.stringify(res).indexOf("reject") != -1){
          console.log("拒绝")
        } 
        if(JSON.stringify(res).indexOf("accept") != -1){
          console.log("接受")
          wx.getSetting({
            withSubscriptions: true,
            success (res) {
              console.log(res.subscriptionsSetting)
              if(JSON.stringify(res.subscriptionsSetting).indexOf(workTaskTemplateId) != -1){
                console.log("用户选择了“保持以上选择”")
                that.checkFlag();
              }
            }
          })
        } 
      },
      fail(res){
        console.log(res);
      }
    })
  },
 ...
 //请求后台接口,修改check_flag 
 checkFlag(){
 	//请求后台修改check_flag 字段为true
    wx.request({
      url: 'xxxx',
      ...
      success:function(res){
        //如果修改成功将check_status字段放到storage中
        wx.setStorageSync("checkFlag",true)
      },
      fail:function(res){},
    })
 }