最近和同学做一个微信小程序项目,碰到一个比较棘手的问题,花了几天时间解决,用此篇文章记下这个过程

模板消息推送,已在2020年1月10日下线,我们根据开发功能需求选择订阅消息功能。

小程序订阅消息

我们先看看微信官方给的说明

功能介绍

消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。

  • 订阅消息推送位置:服务通知
  • 订阅消息下发条件:用户自主订阅
  • 订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面

小程序消息订阅回调接口java判断用户是订阅还是取消订阅_模板消息

使用说明

步骤一:获取模板 ID

在微信公众平台手动配置获取模板 ID:
登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。

  • 选择适合的消息模板

小程序消息订阅回调接口java判断用户是订阅还是取消订阅_模板消息_02

  • 给消息模板选择需要的细则

小程序消息订阅回调接口java判断用户是订阅还是取消订阅_移动开发_03

  • 获取模板ID

小程序消息订阅回调接口java判断用户是订阅还是取消订阅_接口调用_04

步骤二:获取下发权限

我们已经配置好了需要的模板,获取到了ID,但是需要给用户发送ID需要用户进入小程序端授权
详见小程序端消息订阅接口 wx.requestSubscribeMessage

wx.requestSubscribeMessage(Object object)

基础库 2.4.4 开始支持,低版本需做兼容处理。

调起客户端小程序订阅消息界面,返回用户订阅消息的操作结果。当用户勾选了订阅面板中的“总是保持以上选择,不再询问”时,模板消息会被添加到用户的小程序设置页,通过 wx.getSetting 接口可获取用户对相关模板消息的订阅状态。

注意事项

  • 一次性模板 id 和永久模板 id 不可同时使用,只用特定行业可以使用模板id,个人以及一般企业无法使用永久模板id
  • 低版本基础库2.4.4~2.8.3 已支持订阅消息接口调用,仅支持传入一个一次性 tmplId / 永久 tmplId。
  • 2.8.2 版本开始,用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面。
  • 2.10.0 版本开始,开发版和体验版小程序将禁止使用模板消息 formId。

参数

Object object

属性

类型

默认值

必填

说明

tmplIds

Array


需要订阅的消息模板的id的集合,一次调用最多可订阅3条消息(注意:iOS客户端7.0.6版本、Android客户端7.0.7版本之后的一次性订阅/长期订阅才支持多个模板消息,iOS客户端7.0.5版本、Android客户端7.0.6版本之前的一次订阅只支持一个模板消息)消息模板id在[微信公众平台(mp.weixin.qq.com)-功能-订阅消息]中配置

success

function


接口调用成功的回调函数

fail

function


接口调用失败的回调函数

complete

function


接口调用结束的回调函数(调用成功、失败都会执行)

object.success 回调函数
参数
Object res

属性

类型

说明

errMsg

String

接口调用成功时errMsg值为’requestSubscribeMessage:ok’

TEMPLATE_ID

String

[TEMPLATE_ID]是动态的键,即模板id,值包括’accept’、‘reject’、‘ban’。'accept’表示用户同意订阅该条id对应的模板消息,'reject’表示用户拒绝订阅该条id对应的模板消息,'ban’表示已被后台封禁。例如 { errMsg: “requestSubscribeMessage:ok”, zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: “accept”} 表示用户同意订阅zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE这条消息

示例代码

我们需要将在第一步中获取到的订阅消息模板ID,填入tmplIds,这里可以同时填入多个订阅消息模板的ID,在发送消息给用户之前,需要用户登陆小程序端,执行以下接口:

wx.requestSubscribeMessage({
  //发送获取订阅消息的发送权限,一下ID需要根据你自己的ID更改
      tmplIds: ['dD6qreqBVnloaGUVp7-eKaASyaYi0BuEVdhyNcv2zBY'],
      success(res) {
        console.log(res)
      },
      fail(err) {
        console.log(err)
      }
    })

以上代码会出现确认弹窗,需要用户确认,值得注意的是,以上代码只能在真机上调试,没办法在开发者工具上运行

步骤三:调用接口下发订阅消息

发送订阅消息有两种方法,一种是使用自己的服务器动用Fttp接口,一种是微信小程序云开发的服务器,调用云开发的接口,这里我们演示第二种方法
详见服务端消息发送接口 subscribeMessage.send

云调用

云调用是小程序·云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过 wx-server-sdk 使用。

接口方法

openapi.subscribeMessage.send

需在 config.json 中配置 subscribeMessage.send API 的权限,详情

请求参数

属性

类型

默认值

必填

说明

touser

string


接收者(用户)的 openid

templateId

string


所需下发的订阅模板id

page

string


点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。

data

Object


模板内容,格式形如 { “key1”: { “value”: any }, “key2”: { “value”: any } }

miniprogramState

string


跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版

lang

string


进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN

返回值

Object

返回的 JSON 数据包

属性

类型

说明

errCode

number

错误码

errMsg

string

错误信息

errCode 的合法值


说明

最低版本

0

成功

Object

抛出的异常

属性

类型

说明

errCode

number

错误码

errMsg

string

错误信息

# 请求示例

新建一个云函数send,在send.js中写入以下代码,上传更新,注意参数中data部分,所有的键名要和模板信息中的一一对应

小程序消息订阅回调接口java判断用户是订阅还是取消订阅_java_05

// send.js
const cloud = require('wx-server-sdk')

cloud.init({
  env:cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  try {
    const result = await cloud.openapi.subscribeMessage.send({
      //需要发送消息的用户openid
      touser: wxContext.OPENID,
      page:"pages/index/index",
      data: {
        //此处的date3对应上图的date3
        date3: {
          value: "2015年01月05日"
        },
        //此处的thing2对应上图的thing2
        thing2: {
          value: '请登陆小程序查收维保申请'
        }
      },
      templateId: "dD6qreqBVnloaGUVp7-eKaASyaYi0BuEVdhyNcv2zBY",
      miniprogramState: 'developer'
    })
    return result
  } catch (err) {
    return err
  }
}
  • 只要用户已经授权,就可以调用此函数向用户发送订阅消息,此函数可以在小程序端调用以下代码即可完成向用户发送消息
wx.cloud.callFunction({
      name:"send",
    }).then(res=>{
      console.log(res)
    }).catch(er=>{
      console.log(err)
    })

但是一般来说,订阅消息是需要开发者设置触发器定时自动运行的