Blogger Information
Blog 19
fans 0
comment 1
visits 19549
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
一个php文件搞定微信小程序订阅消息推送(含access_token的获取、缓存、刷新)
TANKING的代码日志
Original
115 people have browsed it

摘要

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

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

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

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

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

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

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

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

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

如何发送订阅消息

微信提供了完善的开发文档,通过调用接口可以向指定的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

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments