【uniapp】微信小程序订阅/通知/模板消息—私发/群发_微信小程序订阅消息
写在前面
项目1(1对多):教师发起签到,学生可以收到签到提醒(已实现);
项目2(1对1):用户下单之后,管理员可以收到新订单通知(已实现)。
📌:效果如下


1.准备工作
1.1 获取小程序的appId和appSecret
登录微信小程序后台,找到左侧【开发与服务】里面的【开发管理】,然后复制小程序的appId和appSecret,注意:appSecret需要点击右侧的生成,及时保存!!!
1.2 获取订阅消息ID
右侧点击【选用】,找一个自己需要的,没有的可以申请新名词。
选择参数/申请新名词
点开对应模板右侧的详情,复制对应的参数,
模板ID(templateId)、thing34和thing7(具体根据你的模板来)
然后把刚刚的参数写到如下代码
templateId: \'通知模板ID\'const postData = { touser: openid, template_id: config.templateId, page: \'/pages/orders/manage/manage\', data: { thing8: { value: templateData.thing8.value }, //通知参数1thing9: { value: templateData.thing9.value } //通知参数2 } }
最后,我这边使用的openid是固定的(大家不要学我!!!)
注意!!!这里有个坑
每个微信小程序的openid是独立的!!,因为我拿A小程序的openid,去给B小程序发通知,死活发不过去(整了我快一周,崩溃了!),所以大家如果也是写固定的openid,要记得提前拿到被通知用户openid。
参考获取openid代码:
getopenid() {console.log(\'执行\');uni.login({provider: \"weixin\",success: (res) => { // 改为箭头函数确保this指向uniCloud.callFunction({name: \'getOpenid\',data: {code: res.code},success: (res) => {console.log(\'Openid为:\', res.result)this.openid = res.result},fail: () => {console.log(\'获取失败\')}})},});},
2 参考代码(亲测可用)
2.1 服务器端
依次打开uniCloud/cloudfunctions文件夹,右击新建云函数
把以下文件复制到index.js中即可
const axios = require(\'axios\')// 配置信息(直接硬编码,不使用环境变量)const config = { appId: \'小程序的appId\', appSecret: \'小程序的appSecret\', templateId: \'通知模板ID\'}let accessTokenCache = { token: \'\', expireTime: 0}/** * 获取AccessToken */async function getAccessToken() { if (accessTokenCache.token && Date.now() < accessTokenCache.expireTime) { return accessTokenCache.token } const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.appId}&secret=${config.appSecret}` try { const response = await axios.get(url) if (response.data.errcode) { console.error(`获取Token失败: ${response.data.errmsg}`) throw new Error(`获取Token失败: ${response.data.errmsg}`) } // 设置缓存(提前5分钟过期) accessTokenCache = { token: response.data.access_token, expireTime: Date.now() + (response.data.expires_in - 300) * 1000 } console.log(\'AccessToken获取成功,已更新缓存\') return response.data.access_token } catch (error) { console.error(`获取Token异常: ${error.message}`) throw error }}/** * 发送微信订阅消息 */async function sendWeChatMessage(openid, templateData) { try { const accessToken = await getAccessToken() const apiUrl = `https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=${accessToken}` const postData = { touser: openid, // 被通知用户openoid template_id: config.templateId, page: \'/pages/orders/manage/manage\', // 点击通知打开微信小程序页面 data: { thing8: { value: templateData.thing8.value }, //通知参数1thing9: { value: templateData.thing9.value } //通知参数2 } } const response = await axios.post(apiUrl, postData) if (response.data.errcode !== 0) { console.error(`消息发送失败: ${response.data.errmsg}, openid=${openid}`) throw new Error(`消息发送失败: ${response.data.errmsg}`) } console.log(`消息发送成功, openid=${openid}`) return { success: true, msg: \'消息发送成功\' } } catch (error) { console.error(`发送消息异常: ${error.message}, openid=${openid}`) return { success: false, msg: error.message } }}/** * 云函数入口 */exports.main = async (event, context) => { const { openids, templateData } = event if (!openids || !templateData) { return { code: 400, msg: \'参数缺失\' } } const results = [] for (const openid of openids) { const result = await sendWeChatMessage(openid, templateData) results.push(result) } return { success: true, results }}
2.2 用户端
仅保留基础代码,按需自己复制到对应位置
单发、群发仅用户端代码不一样
<template> <view> <button @click=\"msg()\">通知消息</button> </view></template><script> export default { data() { return { openid: [\'修改为被通知用户的openid\'], // 示例openid,把此处写为动态获取的数组即可 }; }, methods: { // 群发就打开这个 // messages() {// // 使用当前选中的班级进行筛选// const query = {};// if (this.filters.class) {// query.class = this.filters.class;// }// db.collection(\'wc_user\')// .where(query)// // .limit(300)// .get()// .then((e) => {// // 获取原始数据// const userData = e.result.data || [];// // 提取所有openid到一个新数组// this.openid = userData.map(item => item.Openid);// console.log(\'提取后的openid列表\', this.openid);// // 调用消息通知// this.msg();// })// .catch((err) => console.error(\'数据库操作失败:\', err));// },async msg(){const templateData = {thing8: {value: \'小程序订单\'}, // 固定订单类型thing9: {value: \'您有新的订单,请注意查看\'}, // 固定温馨提示};const result = await uniCloud.callFunction({name: \'WeChatMessage\',data: {openids: this.openid,templateData: templateData}});if (result.result && result.result.results) { const msg = result.result.results[0].msg || \'消息发送成功\'; uni.showToast({ icon: \'success\', title: msg });} else { uni.showToast({ icon: \'none\', title: \'服务端返回异常\' });}},</script><style></style>
3.最终效果
至此,一个微信小程序订阅消息—新订单通知就完成了,大家也一起来试一试吧
最后,这个程序还有不少需要修改和完善的,欢迎大家指正,谢谢大家!
相关推荐
【uniapp】使用admin模板,搭建uniCloud后端管理系统
【uniapp】如何下载、安装软件,使用云数据库
【uniapp】使用uniCloud上传数据
© 原创不易,引用转载请联系 > 周国波