實現思路
長期訂閱要求太高,需要政府、公共交通等單位才有資格,所以只能使用一次性訂閱。
就像是買奶茶,下單以后,會彈出讓用戶訂閱消息那種。
以買奶茶為例:
用戶第一次下單成功,點擊了訂閱消息。(一般都有三個,可能有什么新品發售、訂單完成等等消息)
商家小程序就可以給用戶發送一次消息。
用戶過幾天又點了一杯奶茶,下單成功,有點擊了訂閱消息。商家就可以再發一次。
但是這種就比較麻煩,不可以重復多次發送。
并且我們公司現在需要多次主動給用戶發送通知。
所以就這么做的:
用戶點擊小程序里面的某個tab,切換的時候,會彈出窗詢問是否訂閱消息。
用戶同意訂閱并且勾選了左下角的以后總是默認訂閱的選項
用戶哪天再點擊了這個tab,就不會彈窗了,訂閱次數自動+1.
這么做的前提是,用戶必須同意訂閱并且還要勾選那個“總是默認訂閱”的選項。
這么做并不適合一些場景,因為按照常理來說,就是需要每次用戶都同意才行。我們這么做就等于用戶第一次同意,后面就默認的幫用戶選擇了。但是公司內部員工用的小程序。不在乎這些。
注意:
- 一次訂閱就等于可以發送一次消息!
- 用戶訂閱必須是用戶主動觸發!不可以在打開小程序的時候,就立馬彈出窗口詢問是否訂閱消息!
- 用戶第一次必須勾選左下角總是默認訂閱選項,不然無法在代碼里給用戶悄悄的加訂閱次數!
附加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);