php实现微信小程序订阅消息推送(access_token获取缓存刷新)

 更新时间:2023年08月06日 11:01:23   作者:TANKING  
这篇文章主要为大家介绍了php实现微信小程序订阅消息推送包含access_token获取缓存刷新示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

摘要

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

以下是一些主要的优点:

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

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

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

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

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

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

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

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

如何发送订阅消息

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

代码

sendDyxx.php

<?php
namespace MyWeChat;
class WeChatApi
{
    // 刷新access_token
    private 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_token
    private 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();
        // 配置cURL
        curl_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;
        }
        // 关闭cURL
        curl_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的推送,可以研究一下!

以上就是php实现微信小程序订阅消息推送(access_token获取缓存刷新)的详细内容,更多关于php微信小程序订阅消息推送的资料请关注脚本之家其它相关文章!

相关文章

  • PHP通过pem文件校验签名异常问题解决

    PHP通过pem文件校验签名异常问题解决

    在对接第三方支付过程中,支付成功异步回调时,校验签名,一直无法通过,最后经过排查,是引用秘钥文件时,报错了,本文给大家分享PHP通过pem文件校验签名异常问题解决方法,需要的朋友可以参考下
    2023-09-09
  • PHP中使用strpos函数实现屏蔽敏感关键字功能

    PHP中使用strpos函数实现屏蔽敏感关键字功能

    这篇文章主要介绍了PHP中使用strpos函数实现屏蔽敏感关键字功能,本文用在发布文章保存到数据库时前拦截敏感关键,需要的朋友可以参考下
    2014-08-08
  • ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例

    ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例

    这篇文章主要介绍了ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能,结合实例形式分析了ThinkPHP5使用富文本编辑器UEditor实现图片上传到阿里云的相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • yii2 数据库读写分离配置示例

    yii2 数据库读写分离配置示例

    本篇文章主要介绍了yii2 数据库读写分离配置示例,数据库读写分离是在网站遇到性能瓶颈的时候最先考虑优化的步骤,有兴趣的可以了解一下。
    2017-02-02
  • Laravel5.1 框架模型远层一对多关系实例分析

    Laravel5.1 框架模型远层一对多关系实例分析

    这篇文章主要介绍了Laravel5.1 框架模型远层一对多关系,结合实例形式分析了laravel5.1框架模型远层一对多关系相关原理、实现方法与操作注意事项,需要的朋友可以参考下
    2020-01-01
  • 百度地图API使用方法详解

    百度地图API使用方法详解

    百度地图api是由javascript语言编写的,在使用之前需要把api引用到页面中,本篇文章给大家介绍百度地图api使用方法,需要的朋友可以参考下
    2015-08-08
  • 在PHP中使用X-SendFile头让文件下载更快

    在PHP中使用X-SendFile头让文件下载更快

    这篇文章主要介绍了在PHP中让文件下载更快的一个方法,那就是使用X-SendFile头实现,主流量的服务器都支持这个头文件,的朋友可以参考下
    2014-06-06
  • PHP与jquery实时显示网站在线人数实例详解

    PHP与jquery实时显示网站在线人数实例详解

    在线人数最简单的就是直接利用js调用php了,这样可以显示出有多少人访问了本站,如果要在用户未刷新页面的状态实时显示用户在线人数,我们可以利用jquery ajax来实现,需要的朋友可以参考下
    2016-12-12
  • 微信自定义菜单的处理开发示例

    微信自定义菜单的处理开发示例

    在微信5.0以前,自定义菜单是作为一种内测资格使用的,只有少数公众帐号拥有菜单,因此出现很多企业为了弄到菜单不惜重金求购。现如今,一大批帐号从订阅号转为服务号,很多都是奔着自定义菜单去的。今天我们就来简单研究下微信自定义菜单的处理。
    2015-04-04
  • smarty模板引擎基础知识入门

    smarty模板引擎基础知识入门

    这篇文章主要介绍了smarty模板引擎基础知识入门,较为详细的分析了smarty的基本概念并实例分析了相关的基本用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论