#### 1. 前言 ---- 為了滿足用戶渠道推廣分析和用戶帳號綁定等場景的需要,公眾平臺提供了生成帶參數(shù)二維碼的接口 生成帶參數(shù)的二維碼官方文檔: [https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html](https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html) 目前有兩種類型的二維碼: 1、臨時二維碼 2、永久二維碼 **應用場景:** 在一個公眾號網(wǎng)頁項目中每個用戶都有一個邀請好友的海報圖片,海報圖片中有一張公眾號二維碼,掃碼二維碼即可關注公眾號,通過二維碼關注公眾號的新用戶將自動綁定為二維碼所屬用戶的下級 **功能實現(xiàn):** 第一步: 給用戶都生成一個二維碼,該二維碼的場景值為該用戶的唯一標識,例如:`id` 第二步: 監(jiān)聽公眾號關注事件推送,當有用戶關注時判斷有沒有場景值,是不是新用戶,當有場景值并且是新用戶時,將該用戶綁定為場景值所屬用戶的下級 #### 2. 代碼實現(xiàn) ---- `我在 TP6.0中 使用 EasyWechat4.x 寫的` **一、創(chuàng)建二維碼 ticket** 場景值 ```php $scene = 1; // 用戶id ``` 臨時二維碼 ```php $result = $app->qrcode->temporary($scene, 6 * 24 * 3600); ``` 永久二維碼 ```php $result = $app->qrcode->forever($scene); ``` 獲取成功時 $result 值示例 注: 當公眾號appid或開發(fā)者密鑰配置錯誤時,創(chuàng)建二維碼 ticket 將拋出異常 `expire_seconds` ticket 有效時間, 也就是二維碼的有效時間,獲取臨時二維碼ticket時才有該字段 ``` ^ array:3 [▼ "ticket" => "gQG37zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxxx" "expire_seconds" => 518400 "url" => "http://weixin.qq.com/q/027J3KsSeoc4E1B0h61x1k" ] ``` **二、使用二維碼 ticket,生成二維碼** ```php // 獲取二維碼網(wǎng)址(返回二維碼圖片地址) $url = $app->qrcode->url($result['ticket']); ``` $url 示例值如下所示: (其實就是 `https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=` 拼接上 `ticket值`) ``` https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQG37zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyN0ozS3NTZW9jNEUxQjBoNjF4MWsAAgRAaH5hAwQA6QcA ``` 獲取二維碼完整示例 ``` $config = [ 'app_id' => "wx0a48233ca8xxxx", 'secret' => "2674bb2165dc7c45160cxxx", 'response_type' => 'array', // 指定API調用返回結果的類型 ]; $app = \EasyWeChat\Factory::officialAccount($config); try { // 場景值 $scene = 1; // 創(chuàng)建二維碼ticket, 當公眾號appid或開發(fā)者密鑰配置錯誤時將拋出異常 $result = $app->qrcode->temporary($scene, 6 * 24 * 3600); if (isset($result['errcode']) && $result['errcode'] == 48001) { // 48001: 個人訂閱號沒有權限調用高級接口 // api unauthorized rid: 615f013d-15fcf84b-054f4b9b fault($result['errmsg']); } } catch (\Exception $e) { fault($e->getMessage()); } // 獲取二維碼網(wǎng)址(返回二維碼圖片地址) $url = $app->qrcode->url($result['ticket']); echo "<img src=" . $url . ">"; ``` **三、關注公眾號,綁定上下級關系** 用戶關注公眾號后,微信服務器會向 `服務器配置URL` 推送一個消息,并攜帶一下數(shù)據(jù)包格式 服務器URL配置參考官方文檔,本文不做介紹: [https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html) ```php array ( 'ToUserName' => 'gh_cff380f5a988', 'FromUserName' => 'ozlgE6DGcfpHE1Qz69U9xKQtsRkw', 'CreateTime' => '1635671639', 'MsgType' => 'event', 'Event' => 'subscribe', 'EventKey' => 'qrscene_1', 'Ticket' => 'gQGG7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyMkhpbHREZW9jNEUxQjc3Nk54YzgAAgRHXn5hAwQA6QcA', ) ``` 分析下數(shù)據(jù)包中的數(shù)據(jù),直 `FromUserName` 為用戶在該公眾號下的openid | 字段 | 描述 | | ------------ | ------------ | | FromUserName | 用戶在該公眾號下的openid | | MsgType | 消息類型,event 代表是當前消息是事件推送 | | Event | 值為subscribe代表時關注事件推送 | | EventKey | qrscene_ 是固定前綴,1 是生成二維碼時傳入的場景值 | $message 假設是上面的消息數(shù)據(jù)包,下面是關注公眾號后的邏輯處理示例 ```php // 判斷是否是關注事件 if (!empty($message['Event']) && !empty($message['EventKey']) && $message['Event'] == 'subscribe') { // 匹配場景值 preg_match('/_(\d+)$/', $message['EventKey'], $match); if (!empty($match[1])) { // 場景值 $scene = $match[1]; // 判斷當前用戶是不是新用戶,是新用戶則進行上下級關系綁定 // ... } } ```