php實(shí)現(xiàn)微信小程序訂閱消息推送(access_token獲取緩存刷新)
摘要
微信小程序的訂閱消息功能具有多個(gè)優(yōu)點(diǎn),可以為開(kāi)發(fā)者和用戶帶來(lái)便利和更好的體驗(yàn)。
以下是一些主要的優(yōu)點(diǎn):
個(gè)性化消息推送: 訂閱消息允許開(kāi)發(fā)者向用戶發(fā)送個(gè)性化的消息內(nèi)容,根據(jù)用戶的偏好和行為進(jìn)行定制化推送,從而提供更有價(jià)值的信息。
降低打擾度: 相對(duì)于模板消息,訂閱消息更加注重用戶隱私和興趣,用戶可以自主選擇訂閱自己感興趣的內(nèi)容,降低了不必要的打擾。
長(zhǎng)期溝通: 訂閱消息不受時(shí)間限制,允許開(kāi)發(fā)者與用戶建立長(zhǎng)期的溝通渠道,向他們傳遞重要信息、更新和促銷等。
用戶參與度提升: 個(gè)性化的消息內(nèi)容和定制化的推送可以提高用戶的參與度和互動(dòng)性,從而增強(qiáng)用戶對(duì)小程序的粘性和忠誠(chéng)度。
多行業(yè)適用: 訂閱消息適用于多種行業(yè),包括新聞資訊、社交、電商、健康等,開(kāi)發(fā)者可以根據(jù)自己的業(yè)務(wù)需求進(jìn)行靈活應(yīng)用。
統(tǒng)計(jì)和分析: 微信提供了訂閱消息的統(tǒng)計(jì)數(shù)據(jù),開(kāi)發(fā)者可以了解消息的送達(dá)率、點(diǎn)擊率等數(shù)據(jù),有助于優(yōu)化消息內(nèi)容和推送策略。
用戶控制權(quán): 用戶有權(quán)隨時(shí)取消訂閱,保留了用戶的自主權(quán),不會(huì)讓用戶感到被過(guò)度干擾。
簡(jiǎn)化用戶操作: 用戶無(wú)需頻繁打開(kāi)小程序,即可獲取相關(guān)信息,提供了更加便捷的獲取方式。
如何發(fā)送訂閱消息
微信提供了完善的開(kāi)發(fā)文檔,通過(guò)調(diào)用接口可以向指定的openid進(jìn)行發(fā)送訂閱消息:
代碼
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); } // 發(fā)送訂閱消息 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; } } // 發(fā)送訂閱消息的接口 $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=$access_token"; // 需要發(fā)送的消息體 $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'] ]); // 執(zhí)行cURL $response = curl_exec($ch); // 判斷發(fā)送結(jié)果 if (curl_errno($ch)) { // 失敗 echo '執(zhí)行失敗: ' . curl_error($ch); } else { // 成功 echo '執(zhí)行成功: ' . $response; } // 關(guān)閉cURL curl_close($ch); } } // 小程序配置(APPID、APPSECRET) $APPID = 'xxx'; // 小程序APPID $APPSECRET = 'xxx'; // 小程序APPSECRET // 小程序訂閱消息配置(模板id、openid、模板字段) $template_id = "xxx"; // 模板id $openid = "o9usm0bhIkcbAyxM0RzDXi9tjHhM"; // 接收消息的openid // 模板id對(duì)應(yīng)的模板字段 $data_template = [ "character_string1" => ["value" => "2023-08-03"], "thing4" => ["value" => "開(kāi)發(fā)測(cè)試"] ]; // 執(zhí)行靜態(tài)方法 WeChatApi::sendMessageWithAccessToken($APPID, $APPSECRET, $template_id, $openid, $data_template); ?>
以上代碼的優(yōu)點(diǎn)顯而易見(jiàn),易擴(kuò)展,易維護(hù),易移植!而且是一個(gè)php文件解決了access_token的獲取、緩存、刷新、更新緩存、配置、發(fā)送!
access_token的有效期是2小時(shí),以上代碼直接獲取到access_token緩存到本地,然后每次請(qǐng)求直接讀取本地的緩存,高效、快速、安全、效率!
技術(shù)拓展
如果你有大量的openid,那么你需要結(jié)合異步消息隊(duì)列的技術(shù)來(lái)實(shí)現(xiàn)群發(fā),例如Redis異步消息隊(duì)列,定時(shí)任務(wù)等在后臺(tái)執(zhí)行一個(gè)任務(wù)去實(shí)現(xiàn)群發(fā),就可以實(shí)現(xiàn)批量openid的推送,可以研究一下!
以上就是php實(shí)現(xiàn)微信小程序訂閱消息推送(access_token獲取緩存刷新)的詳細(xì)內(nèi)容,更多關(guān)于php微信小程序訂閱消息推送的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
thinkphp中html:list標(biāo)簽傳遞多個(gè)參數(shù)實(shí)例
這篇文章主要介紹了thinkphp中html:list標(biāo)簽傳遞多個(gè)參數(shù)的解決方法,在處理參數(shù)傳遞的情況非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10php array_values 返回?cái)?shù)組的值實(shí)例詳解
php array_values 函數(shù)用于返回?cái)?shù)組中所有的值,注意該函數(shù)將為新數(shù)組建立數(shù)組索引,原來(lái)的文字索引將不存在。本文章向大家講解array_values函數(shù)的基本語(yǔ)法及使用實(shí)例,需要的朋友可以參考下2016-11-11smarty簡(jiǎn)單分頁(yè)的實(shí)現(xiàn)方法
這篇文章主要介紹了smarty簡(jiǎn)單分頁(yè)的實(shí)現(xiàn)方法,以一個(gè)具體的實(shí)例講述了smarty分頁(yè)的完整實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下2014-10-10PHP autoload與spl_autoload自動(dòng)加載機(jī)制的深入理解
本篇文章是對(duì)PHP中的autoload與spl_autoload自動(dòng)加載機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06laravel + vue實(shí)現(xiàn)的數(shù)據(jù)統(tǒng)計(jì)繪圖(今天、7天、30天數(shù)據(jù))
這篇文章主要給大家介紹了關(guān)于利用laravel + vue如何實(shí)現(xiàn)數(shù)據(jù)統(tǒng)計(jì)繪圖(今天、7天、30天數(shù)據(jù))的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,需要的朋友們下面隨著小編來(lái)一起看看吧2018-07-07php使用filter過(guò)濾器驗(yàn)證郵箱 ipv6地址 url驗(yàn)證
原來(lái)判斷郵箱、url和ip地址格式是否符合都是用正則表達(dá)式。后來(lái)才知道在php中也可以使用內(nèi)置的函數(shù)庫(kù)filter來(lái)完成這些功能,下面分享給大家2013-12-12在laravel框架中實(shí)現(xiàn)封裝公共方法全局調(diào)用
今天小編就為大家分享一篇在laravel框架中實(shí)現(xiàn)封裝公共方法全局調(diào)用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10PHP依賴倒置(Dependency Injection)代碼實(shí)例
這篇文章主要介紹了PHP依賴倒置(Dependency Injection)代碼實(shí)例本文只提供實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-10-10