小程序如何使用订阅消息(PHP代码+小程序js代码)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 本次开发时又再次用到,结合之前的摸爬滚打的经验,我给大家整理下,做到一文就能让你明白[什么是订阅消息?]、[如何使用订阅消息]、[开发订阅消息],还在等什么?小程序学习订阅本专栏不香嘛?!,顺便关注走一走[滑稽]可以实现给授权了的用户进行消息推送,推送一些指定的消息,带动用户的点击,例如提醒用户签到,或者发送一些奖励到账等通知,目的就是一个,带动用户的点击,留住老用户。在这里我们需要通过,小程序的后台去开通订阅消息,订阅消息企业、个人都可以开通,机关部门可以申请长期订阅模板、而其他的就只能选择一次性模板消
❤️❤️❤️❤️❤️❤️ 🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,欢迎加入人工智能交流群(看我的动态),更多周边福利等你🥳🥳🥳

在这里插入图片描述

✨✨欢迎订阅本专栏或者关注我,大家一起努力每天一题算法题✨✨

❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!

愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海! ❤️❤️❤️

前景

本次开发时又再次用到,结合之前的摸爬滚打的经验,我给大家整理下,做到一文就能让你明白[什么是订阅消息?]、[如何使用订阅消息]、[开发订阅消息],==还在等什么?小程序学习订阅本专栏不香嘛?!==,顺便关注走一走[滑稽]

什么是小程序订阅消息?

在这里插入图片描述

可以实现给授权了的用户进行消息推送,推送一些指定的消息,带动用户的点击,例如提醒用户签到,或者发送一些奖励到账等通知,目的就是一个,带动用户的点击,留住老用户。在这里我们需要通过,小程序的后台去开通订阅消息,订阅消息企业个人都可以开通,机关部门可以申请长期订阅模板、而其他的就只能选择一次性模板
消息类型

1. 一次性订阅消息

一次性订阅消息用于解决用户使用小程序后,后续服务环节的通知问题。用户自主订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。

2. 长期订阅消息

一次性订阅消息可满足小程序的大部分服务场景需求,但线下公共服务领域存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提醒。为便于服务,我们提供了长期性订阅消息,用户订阅一次后,开发者可长期下发多条消息。

目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。

3. 设备订阅消息

设备订阅消息是一种特殊类型的订阅消息,它属于长期订阅消息类型,且需要完成「设备接入」才能使用。

设备订阅消息用于在设备触发某些需要人工介入的事件时(例如设备发生故障、设备耗材不足等),向用户发送消息通知。详见设备订阅消息文档

何为一次性模板?

简明扼要来说,就是用户授权一次可以获取一次消息,开发者不可以一直推送消息打扰用户

订阅消息的格式

订阅消息是不可以随便发送的,需要对应到格式,包括字数长度等等,可以看这个,这是一个签到模板
在这里插入图片描述

看下他的详情

在这里插入图片描述

活动名称 {{thing1.DATA}}
温馨提示 {{thing2.DATA}}
签到方式 {{thing5.DATA}}
签到状态 {{phrase6.DATA}}

这里的thing1、thing5都由字数的规范,防止推送垃圾消息,引流之类的

运行基本流程

前端通过组件接口用户进行授权,后端通过定时触发,将模板消息触发
可以通过宝塔的定时计划来进行触发,用到的各种鉴权,我们通过redis来存储

开发步骤

第一步开通订阅消息

在这里插入图片描述

选择消息模板

在这里插入图片描述
注意:如果没有想要的模板,去把小程序的服务类目多加几个
在这里插入图片描述

小程序申请授权

一次性订阅消息、长期订阅消息,接口

wx.requestSubscribeMessage

代码:

wx.requestSubscribeMessage({
      tmplIds: [],
    })

上面的tmplIds里面填写的就是申请到的模板ID,例如我的

6io5lFLo4OEdNjl2_F RZEm6RMdHLQ

这里之前做过测试多个模板id一次性授权,存在bug,只会取第一个有效,啥意思呢?就是像这样

tmplIds: ['1','2'],
这个大家自己去测试

我们新建wxml文件:

<view style="height: 100rpx;"></view>
<button>抽奖</button>
<view style="height: 100rpx;"></view>
<button type="primary" bindtap="sign_up">签到</button>
<view style="height: 100rpx;"></view>
<button>购买</button>
<view style="height: 100rpx;"></view>
<button>分享</button>
注释:1每个人能每天能分享一次,重复分享积分不算入
2邀请新用户登录后加积分

新建js文件:

// pages/share/share.js
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },
  sign_up:function(){
    wx.requestSubscribeMessage({
      tmplIds: ['6io5lFLo4OEdNjl2_F********RZEm6RMdHLQ'],
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

测试下可以正常授权
在这里插入图片描述

后端PHP封装、redis配置

在api目录下新建文件notify.php

<?php
// 微信小程序通知主要函数
//http_request 利用curl请求  两个参数   url连接地址   数据信息
function http_request($url,$data){
    $ch = curl_init();//初始化
    curl_setopt($ch, CURLOPT_URL, $url);//设置
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $output = curl_exec($ch);//执行 
    curl_close($ch);//关闭
    return $output;//返回结果
}

//封装方法

//签到通知
 function notify_sign($touser,$ACCESS_TOKEN,$order_num,$shop_name,$user_name9,$phone,$address)
  {
    $template=array(
        'touser'=>"$touser",//接收方openid
        'template_id'=>"8nHJ-TGMbPXBEROLpIEsba4ZMKt4lkJlJoEO5RcTYmk",    //模板的id
        'page'=>"pages/admin_order/admin_order",//点击小程序订阅消息跳转的页
        'data'=>array(
            // 'character_string1'=>array('value'=>"$out_trade_no",'color'=>"#00008B"),   
            'character_string12'=>array('value'=>"$order_num",'color'=>'#00008B'),  
            // 'amount4'=>array('value'=>"15",'color'=>'#00008B'),  
            'thing1'=>array('value'=>"$shop_name",'color'=>'#00008B'),
            'thing8'=>array('value'=>"$user_name9",'color'=>'#00008B'),
            'phone_number9'=>array('value'=>"$phone",'color'=>'#00008B'),
            'thing11'=>array('value'=>"$address",'color'=>'#00008B')
        )
        // 'phrase1'=>array('value'=>urlencode($plan),'color'=>'#00008B'),   //时间
    );
    $json_template=json_encode($template);
    $url="https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".$ACCESS_TOKEN;
    $res=http_request($url,urldecode($json_template));
    print_r($res);
}


?>

下载redis服务,记得开放6379端口
在这里插入图片描述


新建access_token.php文件
通过定时任务对access_token的存储,在快过期时调用更新,这里说一次为啥不调用一次刷新一次access_token就好了,弄这么麻烦?因为当access_token刷新后已经通知过的模板消息就会失效,为了防止以前发的模板消息失效,能最大程度降低失效,可以用定时器的方法更新access_token即可

再看下官方怎么说的:

access_token 的存储至少要保留 512 个字符空间;
access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;
<?php
//access_token
$appid="wxe20298c8e087576e";//小程序id
$secret="*****";//密钥
$grant_type="client_credential";
$access_token=curl_get("https://api.weixin.qq.com/cgi-bin/token?appid=$appid&secret=$secret&grant_type=$grant_type");
echo $access_token;
function curl_get($url){
 
   $header = array(
       'Accept: application/json',
    );
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 超时设置,以秒为单位
    curl_setopt($curl, CURLOPT_TIMEOUT, 1);
 
    // 超时设置,以毫秒为单位
    // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
 
    // 设置请求头
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    //执行命令
    $data = curl_exec($curl);
 
    // 显示错误信息
    if (curl_error($curl)) {
        print "Error: " . curl_error($curl);
    } else {
       $result=json_decode($data,true);
    //  $ACCESS_TOKEN=$result['access_token'];
        curl_close($curl);//关闭连接
        //  return $result['access_token'];
         // //存入到redis
// // 如果未修改php.ini下面两行注释去掉
 ini_set('session.save_handler', 'redis');
 ini_set('session.save_path', 'tcp://127.0.0.1:6379');
 $redis = new redis();
 $redis->connect('127.0.0.1', 6379);
 $redis->set('kuaiquyin_wx_token',$result['access_token']);
 echo $redis->get('kuaiquyin_wx_token');
    }
}
 ?>

我们访问测试下:
在这里插入图片描述

设计定时器触发更新access_token
在这里插入图片描述

修改notify.php文件

打开小程序模板的详情我们进行替换,例如我的:
在这里插入图片描述

那就需要把内容的数据替换

替换后notify.php文件如下:
在这里插入图片描述

<?php
// 微信小程序通知主要函数
//http_request 利用curl请求  两个参数   url连接地址   数据信息
function http_request($url,$data){
    $ch = curl_init();//初始化
    curl_setopt($ch, CURLOPT_URL, $url);//设置
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $output = curl_exec($ch);//执行 
    curl_close($ch);//关闭
    return $output;//返回结果
}

//封装方法

//签到
 function notify_sign($touser,$ACCESS_TOKEN)
  {
    $template=array(
        'touser'=>"$touser",//接收方openid
        'template_id'=>"6io5lFL**********HLQ",    //模板的id
        'page'=>"pages/jifen/jifen",//点击小程序订阅消息跳转的页
        'data'=>array(
            // 'character_string1'=>array('value'=>"$out_trade_no",'color'=>"#00008B"),   
            'thing1'=>array('value'=>"积分签到提醒",'color'=>'#00008B'),  
            // 'amount4'=>array('value'=>"15",'color'=>'#00008B'),  
            'thing2'=>array('value'=>"签到获得10积分",'color'=>'#00008B'),
            'thing5'=>array('value'=>"点击立即签到",'color'=>'#00008B'),
            'phrase6'=>array('value'=>"今天还没签到哦",'color'=>'#00008B')
        )
        // 'phrase1'=>array('value'=>urlencode($plan),'color'=>'#00008B'),   //时间
    );
    $json_template=json_encode($template);
    $url="https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".$ACCESS_TOKEN;
    $res=http_request($url,urldecode($json_template));
    print_r($res);
}


?>

测试

通过定时计划我们先触发一次access_token的获取
在这里插入图片描述
然后新建sign.php文件

写入代码

<?php
//签到通知
header("Content-type:text/html;charset=utf-8");//字符编码设置  

//通知
 include 'notify.php';//引用通知模板文件
 ini_set('session.save_handler', 'redis');
 ini_set('session.save_path', 'tcp://127.0.0.1:6379');
 $redis = new redis();
 $redis->connect('127.0.0.1', 6379);
 $redius_token=$redis->get('kuaiquyin_wx_token');//鉴权

// $name=mb_substr($name,0,10,'utf-8');
notify_sign("你的openid",$redius_token,$name);

openid是小程序登陆后给的,可以去参考其他文章,这里不做说明
例如我的openid
在这里插入图片描述
写入后,去小程序点击签到授权
在这里插入图片描述
访问后报错:
在这里插入图片描述
我们看一下是啥错误
在这里插入图片描述
不好意思😄忘记改了,忘记改openid了

改了之后:

在这里插入图片描述
微信成功收到消息
在这里插入图片描述

总结

以上就是今天的教程,做一个简单的记录,方便自己以后能用到,也希望能帮助到屏幕中困扰的你,谢谢支持

相关文章
|
27天前
|
小程序 前端开发 关系型数据库
基于Uniapp+php校园小程序,校园圈子论坛系统功能,校园跑腿二手交流功能设计
校园圈子论坛及综合服务平台集成了校园跑腿、兼职信息、外卖团购、闲置交换、租赁服务、表白墙等多功能模块,提供一站式校园生活解决方案。系统采用uniapp前端和PHP后端开发,支持多城市、多学校切换,配备分站式后台管理,确保稳定性和安全性。通过融云IM SDK实现即时通讯功能,增强用户互动与粘性。适用于大学校园、城市及社区圈子,满足多样化需求,提升便捷体验。
|
29天前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
53 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
1月前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
123 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
1月前
|
人工智能 JavaScript 前端开发
一段 JavaScript 代码,集成网站AI语音助手
根据本教程,只需通过白屏化的界面操作,即可快速构建一个专属的AI智能体。
|
2月前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
2月前
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
169 4
|
2月前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
147 15
在 golang 中执行 javascript 代码的方案详解
|
2月前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
72 20
|
3月前
|
PHP 开发者 UED
探索PHP中的异常处理:提升代码的健壮性
在PHP开发中,优雅地处理错误和异常是确保应用稳定性和用户体验的关键。本文将通过深入浅出的方式,介绍如何在PHP中实现有效的异常处理机制,包括异常的基本概念、如何抛出和捕获异常,以及最佳实践。准备好让你的代码变得更加健壮和可靠吧!
34 2
|
3月前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例

热门文章

最新文章

  • 1
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    47
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 3
    Node.js 中实现多任务下载的并发控制策略
    34
  • 4
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 5
    【JavaScript】深入理解 let、var 和 const
    49
  • 6
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    47
  • 7
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    57
  • 8
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    57
  • 9
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    72
  • 10
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    57