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

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

TANKING的代码日志
TANKING的代码日志原创
2023年10月21日 09:54:58108浏览

摘要

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

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

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

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

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

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

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

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

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

如何发送订阅消息

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

代码

sendDyxx.phpsendDyxx.php
  1. <?php
  2. namespace MyWeChat;
  3. class WeChatApi
  4. {
  5. // 刷新access_token
  6. private static function refreshAccessToken($appid, $appsecret)
  7. {
  8. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
  9. $ch = curl_init();
  10. curl_setopt($ch, CURLOPT_URL, $url);
  11. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  12. $response = curl_exec($ch);
  13. curl_close($ch);
  14. $data = json_decode($response, true);
  15. if (isset($data['access_token'])) {
  16. return $data['access_token'];
  17. } else {
  18. return false;
  19. }
  20. }
  21. // 获取新的access_token
  22. private static function getAccessTokenFromCache($tokenFile)
  23. {
  24. if (file_exists($tokenFile)) {
  25. $tokenData = include($tokenFile);
  26. if ($tokenData && is_array($tokenData) && isset($tokenData['access_token']) && isset($tokenData['expires_at'])) {
  27. return $tokenData;
  28. }
  29. }
  30. }
  31. // 更新access_token缓存文件
  32. private static function updateAccessTokenCache($tokenFile, $access_token, $expires_in)
  33. {
  34. $expires_at = time() + $expires_in - 60;
  35. $tokenData = "<?php\nreturn array('access_token' => '$access_token', 'expires_at' => $expires_at);\n";
  36. file_put_contents($tokenFile, $tokenData);
  37. }
  38. // 发送订阅消息
  39. public static function sendMessageWithAccessToken($appid, $appsecret, $template_id, $openid, $data_template)
  40. {
  41. $TOKEN_FILE = 'access_token.php';
  42. $tokenData = self::getAccessTokenFromCache($TOKEN_FILE);
  43. if ($tokenData && $tokenData['expires_at'] > time()) {
  44. $access_token = $tokenData['access_token'];
  45. } else {
  46. $access_token = self::refreshAccessToken($appid, $appsecret);
  47. if ($access_token) {
  48. self::updateAccessTokenCache($TOKEN_FILE, $access_token, 7200);
  49. } else {
  50. echo "Access_Token刷新失败\n";
  51. return;
  52. }
  53. }
  54. // 发送订阅消息的接口
  55. $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=$access_token";
  56. // 需要发送的消息体
  57. $message_data = [
  58. "touser" => $openid,
  59. "template_id" => $template_id,
  60. "page" => "pages/read/read?aid=360282",
  61. "miniprogram_state" => "formal",
  62. "lang" => "zh_CN",
  63. "data" => $data_template
  64. ];
  65. // 初始化cURL
  66. $ch = curl_init();
  67. // 配置cURL
  68. curl_setopt_array($ch, [
  69. CURLOPT_URL => $url,
  70. CURLOPT_POST => 1,
  71. CURLOPT_POSTFIELDS => json_encode($message_data),
  72. CURLOPT_RETURNTRANSFER => true,
  73. CURLOPT_HTTPHEADER => ['Content-Type: application/json']
  74. ]);
  75. // 执行cURL
  76. $response = curl_exec($ch);
  77. // 判断发送结果
  78. if (curl_errno($ch)) {
  79. // 失败
  80. echo '执行失败: ' . curl_error($ch);
  81. } else {
  82. // 成功
  83. echo '执行成功: ' . $response;
  84. }
  85. // 关闭cURL
  86. curl_close($ch);
  87. }
  88. }
  89. // 小程序配置(APPID、APPSECRET)
  90. $APPID = 'xxx'; // 小程序APPID
  91. $APPSECRET = 'xxx'; // 小程序APPSECRET
  92. // 小程序订阅消息配置(模板id、openid、模板字段)
  93. $template_id = "xxx"; // 模板id
  94. $openid = "o9usm0bhIkcbAyxM0RzDXi9tjHhM"; // 接收消息的openid
  95. // 模板id对应的模板字段
  96. $data_template = [
  97. "character_string1" => ["value" => "2023-08-03"],
  98. "thing4" => ["value" => "开发测试"]
  99. ];
  100. // 执行静态方法
  101. WeChatApi::sendMessageWithAccessToken($APPID, $APPSECRET, $template_id, $openid, $data_template);
  102. ?>

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

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

技术拓展

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

作者

TANKING

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议