1. 前言
為了滿足用戶渠道推廣分析和用戶帳號綁定等場景的需要,公眾平臺提供了生成帶參數(shù)二維碼的接口
生成帶參數(shù)的二維碼官方文檔: https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html
目前有兩種類型的二維碼: 1、臨時二維碼 2、永久二維碼
應(yīng)用場景:
在一個公眾號網(wǎng)頁項目中每個用戶都有一個邀請好友的海報圖片,海報圖片中有一張公眾號二維碼,掃碼二維碼即可關(guān)注公眾號,通過二維碼關(guān)注公眾號的新用戶將自動綁定為二維碼所屬用戶的下級
功能實現(xiàn):
第一步: 給用戶都生成一個二維碼,該二維碼的場景值為該用戶的唯一標識,例如:id
第二步: 監(jiān)聽公眾號關(guān)注事件推送,當有用戶關(guān)注時判斷有沒有場景值,是不是新用戶,當有場景值并且是新用戶時,將該用戶綁定為場景值所屬用戶的下級
2. 代碼實現(xiàn)
我在 TP6.0中 使用 EasyWechat4.x 寫的
一、創(chuàng)建二維碼 ticket
場景值
$scene = 1; // 用戶id
臨時二維碼
$result = $app->qrcode->temporary($scene, 6 * 24 * 3600);
永久二維碼
$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,生成二維碼
// 獲取二維碼網(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調(diào)用返回結(jié)果的類型
];
$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: 個人訂閱號沒有權(quán)限調(diào)用高級接口
// 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 . ">";
三、關(guān)注公眾號,綁定上下級關(guān)系
用戶關(guān)注公眾號后,微信服務(wù)器會向 服務(wù)器配置URL
推送一個消息,并攜帶一下數(shù)據(jù)包格式
服務(wù)器URL配置參考官方文檔,本文不做介紹:
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
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代表時關(guān)注事件推送 |
EventKey | qrscene_ 是固定前綴,1 是生成二維碼時傳入的場景值 |
$message 假設(shè)是上面的消息數(shù)據(jù)包,下面是關(guān)注公眾號后的邏輯處理示例
// 判斷是否是關(guān)注事件
if (!empty($message['Event']) && !empty($message['EventKey']) && $message['Event'] == 'subscribe') {
// 匹配場景值
preg_match('/_(\d+)$/', $message['EventKey'], $match);
if (!empty($match[1])) {
// 場景值
$scene = $match[1];
// 判斷當前用戶是不是新用戶,是新用戶則進行上下級關(guān)系綁定
// ...
}
}