一个php文件搞定微信小程序订阅消息推送(含access_token的获取、缓存、刷新)

摘要

微信小程序的订阅消息功能具有多个优点,可以为开发者和用户带来便利和更好的体验。以下是一些主要的优点:

**个性化消息推送: **订阅消息允许开发者向用户发送个性化的消息内容,根据用户的偏好和行为进行定制化推送,从而提供更有价值的信息。

**降低打扰度: **相对于模板消息,订阅消息更加注重用户隐私和兴趣,用户可以自主选择订阅自己感兴趣的内容,降低了不必要的打扰。

**长期沟通: **订阅消息不受时间限制,允许开发者与用户建立长期的沟通渠道,向他们传递重要信息、更新和促销等。

**用户参与度提升: **个性化的消息内容和定制化的推送可以提高用户的参与度和互动性,从而增强用户对小程序的粘性和忠诚度。

**多行业适用: **订阅消息适用于多种行业,包括新闻资讯、社交、电商、健康等,开发者可以根据自己的业务需求进行灵活应用。

**统计和分析: **微信提供了订阅消息的统计数据,开发者可以了解消息的送达率、点击率等数据,有助于优化消息内容和推送策略。

**用户控制权: **用户有权随时取消订阅,保留了用户的自主权,不会让用户感到被过度干扰。

**简化用户操作: **用户无需频繁打开小程序,即可获取相关信息,提供了更加便捷的获取方式。

如何发送订阅消息

微信提供了完善的开发文档,通过调用接口可以向指定的openid进行发送订阅消息:

在这里插入图片描述

代码

sendDyxx.php

<?phpnamespace MyWeChat;class WeChatApi
{// 刷新access_tokenprivate static function refreshAccessToken($appid, $appsecret){$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($ch);curl_close($ch);$data = json_decode($response, true);if (isset($data['access_token'])) {return $data['access_token'];} else {return false;}}// 获取新的access_tokenprivate static function getAccessTokenFromCache($tokenFile){if (file_exists($tokenFile)) {$tokenData = include($tokenFile);if ($tokenData && is_array($tokenData) && isset($tokenData['access_token']) && isset($tokenData['expires_at'])) {return $tokenData;}}}// 更新access_token缓存文件private static function updateAccessTokenCache($tokenFile, $access_token, $expires_in){$expires_at = time() + $expires_in - 60;$tokenData = "<?php\nreturn array('access_token' => '$access_token', 'expires_at' => $expires_at);\n";file_put_contents($tokenFile, $tokenData);}// 发送订阅消息public static function sendMessageWithAccessToken($appid, $appsecret, $template_id, $openid, $data_template){$TOKEN_FILE = 'access_token.php';$tokenData = self::getAccessTokenFromCache($TOKEN_FILE);if ($tokenData && $tokenData['expires_at'] > time()) {$access_token = $tokenData['access_token'];} else {$access_token = self::refreshAccessToken($appid, $appsecret);if ($access_token) {self::updateAccessTokenCache($TOKEN_FILE, $access_token, 7200);} else {echo "Access_Token刷新失败\n";return;}}// 发送订阅消息的接口$url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=$access_token";// 需要发送的消息体$message_data = ["touser" => $openid,"template_id" => $template_id,"page" => "pages/read/read?aid=360282","miniprogram_state" => "formal","lang" => "zh_CN","data" => $data_template];// 初始化cURL$ch = curl_init();// 配置cURLcurl_setopt_array($ch, [CURLOPT_URL => $url,CURLOPT_POST => 1,CURLOPT_POSTFIELDS => json_encode($message_data),CURLOPT_RETURNTRANSFER => true,CURLOPT_HTTPHEADER => ['Content-Type: application/json']]);// 执行cURL$response = curl_exec($ch);// 判断发送结果if (curl_errno($ch)) {// 失败echo '执行失败: ' . curl_error($ch);} else {// 成功echo '执行成功: ' . $response;}// 关闭cURLcurl_close($ch);}
}// 小程序配置(APPID、APPSECRET)
$APPID = 'xxx'; // 小程序APPID
$APPSECRET = 'xxx'; // 小程序APPSECRET// 小程序订阅消息配置(模板id、openid、模板字段)
$template_id = "xxx"; // 模板id
$openid = "o9usm0bhIkcbAyxM0RzDXi9tjHhM"; // 接收消息的openid// 模板id对应的模板字段
$data_template = ["character_string1" => ["value" => "2023-08-03"],"thing4" => ["value" => "开发测试"]
];// 执行静态方法
WeChatApi::sendMessageWithAccessToken($APPID, $APPSECRET, $template_id, $openid, $data_template);?>

以上代码的优点显而易见,易扩展,易维护,易移植!而且是一个php文件解决了access_token的获取、缓存、刷新、更新缓存、配置、发送!

access_token的有效期是2小时,以上代码直接获取到access_token缓存到本地,然后每次请求直接读取本地的缓存,高效、快速、安全、效率!

技术拓展

如果你有大量的openid,那么你需要结合异步消息队列的技术来实现群发,例如Redis异步消息队列,定时任务等在后台执行一个任务去实现群发,就可以实现批量openid的推送,可以研究一下!

作者

TANKING

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60538.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货 | 详述 Elasticsearch 向量检索发展史

1. 引言 向量检索已经成为现代搜索和推荐系统的核心组件。 通过将复杂的对象&#xff08;例如文本、图像或声音&#xff09;转换为数值向量&#xff0c;并在多维空间中进行相似性搜索&#xff0c;它能够实现高效的查询匹配和推荐。 图片来自&#xff1a;向量数据库技术鉴赏【上…

HTTP——十一、Web的攻击技术

HTTP 一、针对Web的攻击技术1、HTTP 不具备必要的安全功能2、在客户端即可篡改请求3、针对Web应用的攻击模式 二、因输出值转义不完全引发的安全漏洞1、跨站脚本攻击2、SQL 注入攻击3、OS命令注入攻击4、HTTP首部注入攻击5、邮件首部注入攻击6、目录遍历攻击7、远程文件包含漏洞…

力扣 -- 139. 单词拆分

一、题目 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:bool wordBreak(str…

电脑开机出现Boot Device怎么办?

开机出现Boot Device这个问题很常见&#xff0c;有时还会出现No Boot Device的问题&#xff0c;虽然多了一个单词&#xff0c;但意思是相同的&#xff0c;这些问题说明你的系统盘出现了问题&#xff0c;或者是引导出现了问题。这该如何解决呢&#xff1f; 方法1. 检查主板或硬盘…

需要数电发票接口的,先熟悉下数电发票基本常识

最近有一些技术小伙伴来咨询数电发票接口的时候&#xff0c;对数电发票的一些常识不太了解&#xff0c; 导致沟通起来比较困难。比较典型的这三个问题&#xff1a; 一、开具数电票时&#xff0c;如何设置身份认证频次&#xff1f; 请公司的法定代表人或财务负责人登录江苏省电…

面试热题(最长上升子序列)

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 输入&#xff1…

智慧工地源码,Spring Cloud+ Vue+UniApp开发,微服务架构

智慧工地源码&#xff0c;智慧工地云平台源码 智慧工地APP源码 智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云…

信号平滑或移动平均滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

集合工具类 Collections:提升集合操作效率

文章目录 多元素添加&#xff1a;addAll 方法随机置换&#xff1a;shuffle 方法自定义对象排序&#xff1a;sort 方法总结 在Java的集合框架中&#xff0c;Collections 是一个包含了许多操作集合的静态方法的工具类。通过使用 Collections 类提供的方法&#xff0c;我们能够更加…

最好的和解,是陪“内在小孩”一起长大

“为什么我总是很心累&#xff1f;” 经常莫名感到心累、有深深的无力感&#xff0c;是现代成年人的通病。 生活压力大&#xff0c;忙忙碌碌却觉得迷茫、空虚、压抑&#xff1b; 不管怎么努力&#xff0c;好像总是卡在某个地方&#xff0c;得不到升职加薪&#xff1b; 每段感情…

【D3S】集成smart-doc并同步配置到Torna

目录 一、引言二、maven插件三、smart-doc.json配置四、smart-doc-maven-plugin相关命令五、推送文档到Torna六、通过Maven Profile简化构建 一、引言 D3S&#xff08;DDD with SpringBoot&#xff09;为本作者使用DDD过程中开发的框架&#xff0c;目前已可公开查看源码&#…

临时文档2

java 中 IO 流分为几种? 按照流的流向分&#xff0c;可以分为输入流和输出流&#xff1b;按照操作单元划分&#xff0c;可以划分为字节流和字符流&#xff1b;按照流的角色划分为节点流和处理流。 Java Io流共涉及40多个类&#xff0c;这些类看上去很杂乱&#xff0c;但实际…