微信小程序發送訂閱消息-一次訂閱,一直發送消息。

實現思路

長期訂閱要求太高,需要政府、公共交通等單位才有資格,所以只能使用一次性訂閱。
就像是買奶茶,下單以后,會彈出讓用戶訂閱消息那種。

以買奶茶為例:

用戶第一次下單成功,點擊了訂閱消息。(一般都有三個,可能有什么新品發售、訂單完成等等消息)
商家小程序就可以給用戶發送一次消息。
用戶過幾天又點了一杯奶茶,下單成功,有點擊了訂閱消息。商家就可以再發一次。

但是這種就比較麻煩,不可以重復多次發送。
并且我們公司現在需要多次主動給用戶發送通知。
所以就這么做的:

用戶點擊小程序里面的某個tab,切換的時候,會彈出窗詢問是否訂閱消息。
用戶同意訂閱并且勾選了左下角的以后總是默認訂閱的選項
用戶哪天再點擊了這個tab,就不會彈窗了,訂閱次數自動+1.

這么做的前提是,用戶必須同意訂閱并且還要勾選那個“總是默認訂閱”的選項。
這么做并不適合一些場景,因為按照常理來說,就是需要每次用戶都同意才行。我們這么做就等于用戶第一次同意,后面就默認的幫用戶選擇了。但是公司內部員工用的小程序。不在乎這些。

注意:

  1. 一次訂閱就等于可以發送一次消息!
  2. 用戶訂閱必須是用戶主動觸發!不可以在打開小程序的時候,就立馬彈出窗口詢問是否訂閱消息!
  3. 用戶第一次必須勾選左下角總是默認訂閱選項,不然無法在代碼里給用戶悄悄的加訂閱次數!

附加php發送小程序訂閱消息代碼:

<?php
class WechatNotification
{// 微信小程序配置private $miniProgramConfig = ['appId' => '',          // 小程序APPID'appSecret' => '',      // 小程序APPSECRET'templateIds' => []     // 小程序消息模板ID];// 緩存的access_tokenprivate $accessTokens = ['miniProgram' => null,'workWechat' => null,'workWechatExpires' => 0,'miniProgramExpires' => 0];/*** 構造函數,初始化配置* @param array $config 配置數組*/public function __construct($config = []){if (!empty($config['miniProgram'])) {$this->miniProgramConfig = array_merge($this->miniProgramConfig, $config['miniProgram']);}}/*** 獲取微信小程序access_token* @return string|bool*/private function getMiniProgramAccessToken(){$now = time();if ($this->accessTokens['miniProgram'] && $this->accessTokens['miniProgramExpires'] > $now) {return $this->accessTokens['miniProgram'];}$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->miniProgramConfig['appId']}&secret={$this->miniProgramConfig['appSecret']}";$result = $this->httpRequest($url);if (isset($result['access_token'])) {$this->accessTokens['miniProgram'] = $result['access_token'];$this->accessTokens['miniProgramExpires'] = $now + $result['expires_in'] - 300; // 提前5分鐘過期return $result['access_token'];}return false;}/*** 發送微信小程序訂閱消息* @param string $openid 用戶openid* @param string $templateId 模板ID* @param array $data 模板數據* @param string $page 點擊模板卡片跳轉頁面* @return array*/public function sendMiniProgramMessage($openid, $templateId, $data, $page = ''){$accessToken = $this->getMiniProgramAccessToken();if (!$accessToken) {return ['success' => false, 'error' => '獲取access_token失敗'];}$url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={$accessToken}";$postData = ['touser' => $openid,'template_id' => $templateId,'data' => $data];if (!empty($page)) {$postData['page'] = $page;}$result = $this->httpRequest($url, 'POST', $postData);if (isset($result['errcode']) && $result['errcode'] == 0) {return ['success' => true, 'data' => $result];}return ['success' => false, 'error' => $result['errmsg'] ? $result['errmsg'] : '發送失敗', 'errcode' => $result['errcode'] ? $result['errcode'] : -1];}/*** HTTP請求工具* @param string $url 請求URL* @param string $method 請求方法* @param array $data 請求數據* @return array|bool*/private function httpRequest($url, $method = 'GET', $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);if (strtoupper($method) == 'POST') {curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);}$response = curl_exec($ch);$error = curl_error($ch);curl_close($ch);if ($error) {return false;}return json_decode($response, true);}}// 快速格式化打印
function dd($data)
{echo '<pre>';var_dump($data);die;
}// 以下為測試代碼// 配置參數 (請替換為您自己的實際配置)
$config = ['miniProgram' => ['appId' => '',      // 微信小程序APPID'appSecret' => '',  // 微信小程序APPSECRET'templateIds' => ['test' => '',  // 消息模板ID]],
];// 初始化通知類
$notification = new WechatNotification($config);// 輔助函數:打印測試結果
function printResult($title, $result) {echo "===== {$title} =====\n";if ($result['success']) {echo "狀態:成功\n";echo "返回數據:" . print_r($result['data'], true) . "\n";} else {echo "狀態:失敗\n";echo "錯誤信息:{$result['error']}\n";if (isset($result['errcode'])) echo "錯誤代碼:{$result['errcode']}\n";if (isset($result['code'])) echo "錯誤代碼:{$result['code']}\n";}echo "\n";
}echo '<pre>';
1. 測試發送微信小程序通知
echo "開始測試微信小程序通知...\n";
$miniProgramResult = $notification->sendMiniProgramMessage('',  // 測試用戶的openid$config['miniProgram']['templateIds']['test'],  // 模板ID[// 模板數據,需根據您的實際模板字段進行調整'name2' => ['value' => '的飛'],'thing6' => ['value' => '有新任務包待接收!'],'time8' => ['value' => date('Y-m-d H:i:s')],'time9' => ['value' => date('Y-m-d H:i:s')],],'/pages/index/index'  // 點擊跳轉頁面
);
printResult("微信小程序通知測試", $miniProgramResult);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96379.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

408 Request Timeout:請求超時,服務器等待客戶端發送請求的時間過長。

408 Request Timeout 是 HTTP 狀態碼之一&#xff0c;表示客戶端在發送請求時&#xff0c;服務器等待的時間過長&#xff0c;最終放棄了處理該請求。此問題通常與網絡延遲、客戶端配置、服務器設置或者應用程序的性能有關。1. 常見原因1.1 客戶端問題網絡連接延遲或不穩定&…

MongoDB面試集錦

該書的使用的MongoDB版本是 4.2.01、什么是NoSQL數據庫&#xff1f;NoSQL和RDBMS有什么區別&#xff1f;在那些情況下使用和不使用NoSQL數據庫&#xff1f;NoSQL是非關系型數據庫&#xff0c;NoSQLNot Only SQL 。關系型數據庫采用的是結構化的數據&#xff0c;NoSQL采用的是鍵…

直擊JVM面試題

JVM組成 JVM JVM 就是 Java 程序的運行環境&#xff0c;它通過 類加載、字節碼執行、內存管理、GC、線程調度 等機制&#xff0c;讓 Java 實現了 跨平臺、自動內存管理和高效執行。 它是一個抽象的計算機&#xff0c;能執行以 字節碼&#xff08;.class 文件&#xff09; 為單…

地球系統模式(CESM)實踐技術應用及進階

目前通用地球系統模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的過去、現在和未來的氣候狀況中具有越來越普遍的應用。CESM由美國NCAR于2010年07月推出以來&#xff0c;一直受到氣候學界的密切關注。近年升級的CESM2.0在大氣、陸地、海…

StarRocks導入數據-使用 Broker Load 進行異步導入

目錄 一、背景 二、實操 三、查看導入進度 一、背景 將hive庫數據表導入starrocks. 二、實操 LOAD LABEL user_behavior (DATA INFILE("hdfs://<hdfs_ip>:<hdfs_port>/user/amber/user_behavior_ten_million_rows.parquet")INTO TABLE user_behavior…

c語言,識別到黑色就自動開槍,4399單擊游戲狙擊戰場,源碼分享,豆包ai出品

不好用&#xff0c;識別速度慢&#xff0c;有時候識別不準確#include <windows.h> #include <stdio.h> #include <math.h> HDC hdcScreen; void leftClick(); void RGBtoHSV(int r, int g, int b, int* h, int* s, int* v); int fuzzyFindColor(int x1, int…

電動汽車充電標準之 — SAE J1772“電動汽車傳導充電連接器”簡介

SAE J1772&#xff08;通常讀作 "J seventeen seventy-two"&#xff09;是由美國汽車工程師學會&#xff08;SAE&#xff09;制定的&#xff0c;針對電動汽車傳導充電連接器的北美標準。它規范了電動汽車&#xff08;EV&#xff09;與充電設備&#xff08;EVSE&#…

ZooKeeper Multi-op+樂觀鎖實戰優化:提升分布式Worker節點狀態一致性

系列文章目錄 第一章 ZooKeeper入門概述:Znode,Watcher,ZAB . 第二章 技術解析&#xff1a;基于 ZooKeeper 實現高可用的主-從協調系統&#xff08;通過例子深入理解Zookeeper如何進行協調分布式系統&#xff09; 第三章 基于 ZooKeeper 的主從模式任務調度系統&#xff1a;設…

生產制造過程精益化

一、核心原則&#xff1a;以“消除浪費、創造價值”為核心精益化的本質是通過系統性優化流程&#xff0c;最大化客戶價值&#xff0c;最小化資源浪費&#xff08;時間、成本、庫存等&#xff09;&#xff0c;核心原則包括&#xff1a;1. 價值導向原則定義客戶價值&#xff1a;從…

Ping命令為何選擇ICMP而非TCP/UDP?

在網絡診斷工具中&#xff0c;ping是最常用的命令之一&#xff0c;它用于測試主機之間的連通性。有趣的是&#xff0c;ping命令并不使用TCP或UDP這些傳輸層協議&#xff0c;而是基于網絡層的ICMP協議。這背后的設計選擇體現了計算機網絡協議棧的分層智慧和特定用途的優化。ICMP…

VGGNet:為什么16層簡單堆疊能成為CNN經典?

配套筆記&講解視頻,點擊文末名片獲取 研究背景和動機 在 VGG 出現之前,圖像識別就像“盲人摸象”: 計算機看一張圖,只能憑感覺抓幾個零散的“特征點”, 結果忽好忽壞,時靈時不靈。 大家發現,如果把“看圖的流程”做得更深、更系統,準確率就能蹭蹭往上漲。于是“深一…

springboot+vue醫院診療管理系統(源碼+文檔+調試+基礎修改+答疑)

目錄 一、整體目錄&#xff08;示范&#xff09;&#xff1a; 文檔含項目技術介紹、E-R圖、數據字典、項目功能介紹與截圖等 二、運行截圖 三、代碼部分&#xff08;示范&#xff09;&#xff1a; 四、數據庫表(示范)&#xff1a; 數據庫表有注釋&#xff0c;可以導出數據…

云蝠智能大模型呼叫新模型上線,擁抱AGI

在人工智能浪潮席卷全球的今天&#xff0c;AGI&#xff08;通用人工智能&#xff09;已不再遙不可及&#xff0c;而是正逐步成為驅動產業變革的核心力量。在這場技術革命中&#xff0c;云蝠智能以其前瞻性的戰略布局和技術創新&#xff0c;再次引領行業風向——全新大模型呼叫模…

晨控CK-GW08S-PN與西門子PLC配置Profinet通訊連接操作手冊

晨控CK-GW08S-PN與西門子PLC配置Profinet通訊連接操作手冊晨控CK-GW08S系列作為晨控智能工業級別網關型RFID讀寫器,支持大部分工業協議如RS232、RS485、以太網。支持工業協議Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由協議TCP/IP等。本期主題&#xff1…

【Linux】Linux常用指令合集

本文是小編鞏固自身而作&#xff0c;如有錯誤&#xff0c;歡迎指出&#xff01; 目錄 一、文件與目錄操作 (1) 查看目錄&#xff0c;切換目錄 pwd ls cd &#xff08;2&#xff09;創建、 刪除 mkdir touch rmdir rm cp mv 二、文件的查看及更改 (1)查看和更改 …

MySQL 高級特性與性能優化:深入理解函數、視圖、存儲過程、觸發器

大家好&#xff01;今天我們要深入探討 MySQL 中一些非常重要的高級主題——內置函數、視圖、存儲過程、觸發器、索引、事務和鎖機制。無論你是剛開始學習數據庫的新手&#xff0c;還是經驗豐富的開發者&#xff0c;掌握這些知識點都將極大提升你的開發效率和數據管理能力。一.…

Linux學習:基于環形隊列的生產者消費者模型

目錄1. 環形隊列的概念與實現方法1.1 環形隊列的概念1.2 環形隊列的一般實現方法2. 多線程相關的信號量概念與接口2.1 信號量類型2.2 信號量的初始化與銷毀2.3 信號量的P申請、V釋放操作3. 基于環形隊列實現p、c模型的設計方案3.1 環形隊列&#xff08;ringqueue&#xff09;作…

【左程云算法07】隊列和棧-鏈表數組實現

目錄 ?編輯1&#xff09;隊列的介紹 核心操作 3&#xff09;隊列的鏈表實現和數組實現 使用數組實現隊列 2&#xff09;棧的介紹 核心操作 4&#xff09;棧的數組實現 使用語言內置的實現 使用數組手動實現棧 5&#xff09;環形隊列的實現 leecode622 代碼解析 視頻…

Docker 清理完整指南:釋放磁盤空間的最佳實踐

前言 隨著 Docker 使用時間的增長,系統中會積累大量的容器、鏡像、數據卷和構建緩存,占用大量磁盤空間。本文將詳細介紹如何有效清理 Docker 資源,釋放磁盤空間,保持系統整潔。 Docker 資源類型 Docker 主要占用磁盤空間的資源包括: 容器 (Containers):運行中和已停止…

零基礎快速了解掌握Linux防火墻-Iptables

一、 Iptables概述Iptables 是一個用戶空間程序&#xff0c;可以用于設置和管理 Linux 操作系統的內核級防火墻。它通過表、鏈和 規則組成&#xff0c;可以靈活地根據不同的需求進行配置。iptables 具有以下特點&#xff1a;Iptables 作為內核級別的防火墻&#xff0c;具有高效…