实现流程

  • 1.通过原生云函数的默认函数获取用户openid
  • 2.获取用户授权,获取一次授权就可以发送一次订阅消息,所以多引导用户多点击订阅消息授权。
  • 3.实现发送订阅给单个授权用户
  • 4.实现发送订阅给多个授权用户

一,获取用户openid

  • 原生云函数内容
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 云函数入口函数
exports.main = async(event, context) => {
  const wxContext = cloud.getWXContext()

  return {
    event,
    openid: wxContext.OPENID,//通过该参数来获取当前用户的openid
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID,
  }
}
  • 调用云函数方法获取到用户openid
//获取用户openid
  getOpenid() {
    wx.cloud.callFunction({
      name: "yunkaifa_getopenid"
    }).then(res => {
      console.log("获取openid成功", res)
      userid = res.result.openid
    }).catch(res => {
      console.log("获取openid失败", res)
    })
  },

二,生成订阅模板并引导用户进行授权-默认对当前用户进行授权(尽量引导用户多点击授权,具体可参考美团优选小程序一开始的授权引导)

iOS 开发 服务端取消订阅_前端

//获取用户授权,获取一次授权就可以发送一次订阅消息,所以多引导用户多点击订阅消息授权。
  shouquan() {
    wx.requestSubscribeMessage({
      // 1.登录小程序管理平台
      // 2.选择左侧的订阅消息
      // 3.点击同意开启该功能
      // 4.选用模板后即可获取模板id
      tmplIds: ['-t0yjI0tuZowJtpJxwQNaCH1uRQaMTMJSWhMlOjs92w'], //这里填入我们生成的模板id
      success(res) {
        console.log('授权成功', res)
      },
      fail(res) {
        console.log('授权失败', res)
      }
    })
  },

三,发送订阅消息给单个授权用户

iOS 开发 服务端取消订阅_iOS 开发 服务端取消订阅_02


iOS 开发 服务端取消订阅_小程序_03

//发送消息给单个用户
  sendOne() {
    if (name == null || name == '') {
      wx.showToast({
        icon: "none",
        title: '请输入日程主题',
      })
      return
    }
    //这里的用户id给指定为自己的id了,如需指定可以按照注释方式指定
    // this.sendFun("oucwI5bkpw2xgXN8kUameZfbzAAE", name)
    console.log(userid)
    this.sendFun(userid, name)//发送订阅消息实现函数(云函数)
  },
  //封装的方式方法
  sendFun(openid, name) {
    wx.cloud.callFunction({
      name: "yunkaifa_dingyuetuisong",
      data: {
        openid: openid,
        name: name
      }
    }).then(res => {
      console.log("发送多条成功", res)
    }).catch(res => {
      console.log("发送多条失败", res)
    })
  }

四,发送订阅消息给多个授权用户

iOS 开发 服务端取消订阅_前端_04

//发送订阅消息给多个用户
  sendAll() {
    if (name == null || name == '') {
      wx.showToast({
        icon: "none",
        title: '请输入日程主题',
      })
      return
    }
    //指定多个用户id
    let users = [
      "oucwI5bkpw2xgXN8kUameZfbzAAE",
      // "oc4sa0dZ-pSCu95djiLCt7jo97bY" 因为没有多个用户id,所以在这里仅演示功能,如有多个id可自己设定
    ]
    //循环调用发送函数给多个用户发送订阅消息
    users.forEach(item => {
      console.log("for循环", item)
      this.sendFun(item, name)
    })
  },
  //封装的方式方法
  sendFun(openid, name) {
    wx.cloud.callFunction({
      name: "yunkaifa_dingyuetuisong",
      data: {
        openid: openid,
        name: name
      }
    }).then(res => {
      console.log("发送多条成功", res)
    }).catch(res => {
      console.log("发送多条失败", res)
    })
  }

五,整体代码

  • 云函数yunkaifa_dingyuetuisong
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 云函数入口函数
exports.main = async(event, context) => {
  try {
    const result = await cloud.openapi.subscribeMessage.send({
      touser: event.openid, //要推送给哪个用户
      page: 'pages/index/index', //要跳转到那个小程序页面,点开订阅消息时。一般都是跳转到小程序首页
      data: { //推送的内容
        thing1: {
          value: event.name
        },
        time3: {
          value: '2020年3月10日 14:00'
        },
        thing4: {
          value: '杭州市浙江大学'
        },
      },
      templateId: '-t0yjI0tuZowJtpJxwQNaCH1uRQaMTMJSWhMlOjs92w' //模板id
    })
    console.log(result)
    return result
  } catch (err) {
    console.log(err)
    return err
  }
}
  • 云函数yunkaifa_getopenid
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 云函数入口函数
exports.main = async(event, context) => {
  const wxContext = cloud.getWXContext()

  return {
    event,
    openid: wxContext.OPENID,
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID,
  }
}
  • index.wxss
/**index.wxss**/
.userinfo {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.userinfo-avatar {
  width: 128rpx;
  height: 128rpx;
  margin: 20rpx;
  border-radius: 50%;
}

.userinfo-nickname {
  color: #aaa;
}

.usermotto {
  margin-top: 200px;
}
  • index.wxml
<button bindtap="getOpenid">1:获取用户openid</button>
<button bindtap="shouquan">2:获取用户授权</button>
<input placeholder="输入日程主题" bindinput="getName"></input>
<button bindtap="sendOne">3:发送订阅消息给单个用户</button>
<button bindtap="sendAll">4:发送订阅消息给多个用户</button>
  • index.js
let name = ''
let userid = ""
Page({
  //获取用户openid
  getOpenid() {
    wx.cloud.callFunction({
      name: "yunkaifa_getopenid"
    }).then(res => {
      console.log("获取openid成功", res)
      userid = res.result.openid
    }).catch(res => {
      console.log("获取openid失败", res)
    })
  },
  //获取用户授权,获取一次授权就可以发送一次订阅消息,所以多引导用户多点击订阅消息授权。
  shouquan() {
    wx.requestSubscribeMessage({
      // 1.登录小程序管理平台
      // 2.选择左侧的订阅消息
      // 3.点击同意开启该功能
      // 4.选用模板后即可获取模板id
      tmplIds: ['-t0yjI0tuZowJtpJxwQNaCH1uRQaMTMJSWhMlOjs92w'], //这里填入我们生成的模板id
      success(res) {
        console.log('授权成功', res)
      },
      fail(res) {
        console.log('授权失败', res)
      }
    })
  },
  //获取用户输入的日程主题
  getName(event) {
    name = event.detail.value
  },
  //发送消息给单个用户
  sendOne() {
    if (name == null || name == '') {
      wx.showToast({
        icon: "none",
        title: '请输入日程主题',
      })
      return
    }
    //这里的用户id给指定为自己的id了,如需指定可以按照注释方式指定
    // this.sendFun("oucwI5bkpw2xgXN8kUameZfbzAAE", name)
    console.log(userid)
    this.sendFun(userid, name)
  },
  //发送订阅消息给多个用户
  sendAll() {
    if (name == null || name == '') {
      wx.showToast({
        icon: "none",
        title: '请输入日程主题',
      })
      return
    }
    //指定多个用户id
    let users = [
      "oucwI5bkpw2xgXN8kUameZfbzAAE",
      // "oc4sa0dZ-pSCu95djiLCt7jo97bY" 因为没有多个用户id,所以在这里仅演示功能,如有多个id可自己设定
    ]
    //循环调用发送函数给多个用户发送订阅消息
    users.forEach(item => {
      console.log("for循环", item)
      this.sendFun(item, name)
    })
  },
  //封装的方式方法
  sendFun(openid, name) {
    wx.cloud.callFunction({
      name: "yunkaifa_dingyuetuisong",
      data: {
        openid: openid,
        name: name
      }
    }).then(res => {
      console.log("发送多条成功", res)
    }).catch(res => {
      console.log("发送多条失败", res)
    })
  }
})