生成帶參數(shù)的二維碼

作者:辰風沐陽 閱讀:2637 發(fā)布時間:2021-10-27 上次更新:2021-10-31

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

場景值

  1. $scene = 1; // 用戶id

臨時二維碼

  1. $result = $app->qrcode->temporary($scene, 6 * 24 * 3600);

永久二維碼

  1. $result = $app->qrcode->forever($scene);

獲取成功時 $result 值示例

注: 當公眾號appid或開發(fā)者密鑰配置錯誤時,創(chuàng)建二維碼 ticket 將拋出異常

expire_seconds ticket 有效時間, 也就是二維碼的有效時間,獲取臨時二維碼ticket時才有該字段

  1. ^ array:3 [▼
  2. "ticket" => "gQG37zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxxx"
  3. "expire_seconds" => 518400
  4. "url" => "http://weixin.qq.com/q/027J3KsSeoc4E1B0h61x1k"
  5. ]

二、使用二維碼 ticket,生成二維碼

  1. // 獲取二維碼網(wǎng)址(返回二維碼圖片地址)
  2. $url = $app->qrcode->url($result['ticket']);

$url 示例值如下所示: (其實就是 https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket= 拼接上 ticket值)

  1. https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQG37zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyN0ozS3NTZW9jNEUxQjBoNjF4MWsAAgRAaH5hAwQA6QcA

獲取二維碼完整示例

  1. $config = [
  2. 'app_id' => "wx0a48233ca8xxxx",
  3. 'secret' => "2674bb2165dc7c45160cxxx",
  4. 'response_type' => 'array', // 指定API調(diào)用返回結(jié)果的類型
  5. ];
  6. $app = \EasyWeChat\Factory::officialAccount($config);
  7. try {
  8. // 場景值
  9. $scene = 1;
  10. // 創(chuàng)建二維碼ticket, 當公眾號appid或開發(fā)者密鑰配置錯誤時將拋出異常
  11. $result = $app->qrcode->temporary($scene, 6 * 24 * 3600);
  12. if (isset($result['errcode']) && $result['errcode'] == 48001) {
  13. // 48001: 個人訂閱號沒有權(quán)限調(diào)用高級接口
  14. // api unauthorized rid: 615f013d-15fcf84b-054f4b9b
  15. fault($result['errmsg']);
  16. }
  17. } catch (\Exception $e) {
  18. fault($e->getMessage());
  19. }
  20. // 獲取二維碼網(wǎng)址(返回二維碼圖片地址)
  21. $url = $app->qrcode->url($result['ticket']);
  22. 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

  1. array (
  2. 'ToUserName' => 'gh_cff380f5a988',
  3. 'FromUserName' => 'ozlgE6DGcfpHE1Qz69U9xKQtsRkw',
  4. 'CreateTime' => '1635671639',
  5. 'MsgType' => 'event',
  6. 'Event' => 'subscribe',
  7. 'EventKey' => 'qrscene_1',
  8. 'Ticket' => 'gQGG7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyMkhpbHREZW9jNEUxQjc3Nk54YzgAAgRHXn5hAwQA6QcA',
  9. )

分析下數(shù)據(jù)包中的數(shù)據(jù),直

FromUserName 為用戶在該公眾號下的openid

字段 描述
FromUserName 用戶在該公眾號下的openid
MsgType 消息類型,event 代表是當前消息是事件推送
Event 值為subscribe代表時關(guān)注事件推送
EventKey qrscene_ 是固定前綴,1 是生成二維碼時傳入的場景值

$message 假設(shè)是上面的消息數(shù)據(jù)包,下面是關(guān)注公眾號后的邏輯處理示例

  1. // 判斷是否是關(guān)注事件
  2. if (!empty($message['Event']) && !empty($message['EventKey']) && $message['Event'] == 'subscribe') {
  3. // 匹配場景值
  4. preg_match('/_(\d+)$/', $message['EventKey'], $match);
  5. if (!empty($match[1])) {
  6. // 場景值
  7. $scene = $match[1];
  8. // 判斷當前用戶是不是新用戶,是新用戶則進行上下級關(guān)系綁定
  9. // ...
  10. }
  11. }

標簽: 微信公眾號