#### 1. 前言 ---- 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口 生成带参数的二维码官方文档: [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、永久二维码 **应用场景:** 在一个公众号网页项目中每个用户都有一个邀请好友的海报图片,海报图片中有一张公众号二维码,扫码二维码即可关注公众号,通过二维码关注公众号的新用户将自动绑定为二维码所属用户的下级 **功能实现:** 第一步: 给用户都生成一个二维码,该二维码的场景值为该用户的唯一标识,例如:`id` 第二步: 监听公众号关注事件推送,当有用户关注时判断有没有场景值,是不是新用户,当有场景值并且是新用户时,将该用户绑定为场景值所属用户的下级 #### 2. 代码实现 ---- `我在 TP6.0中 使用 EasyWechat4.x 写的` **一、创建二维码 ticket** 场景值 ```php $scene = 1; // 用户id ``` 临时二维码 ```php $result = $app->qrcode->temporary($scene, 6 * 24 * 3600); ``` 永久二维码 ```php $result = $app->qrcode->forever($scene); ``` 获取成功时 $result 值示例 注: 当公众号appid或开发者密钥配置错误时,创建二维码 ticket 将抛出异常 `expire_seconds` ticket 有效时间, 也就是二维码的有效时间,获取临时二维码ticket时才有该字段 ``` ^ array:3 [▼ "ticket" => "gQG37zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxxx" "expire_seconds" => 518400 "url" => "http://weixin.qq.com/q/027J3KsSeoc4E1B0h61x1k" ] ``` **二、使用二维码 ticket,生成二维码** ```php // 获取二维码网址(返回二维码图片地址) $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; // 创建二维码ticket, 当公众号appid或开发者密钥配置错误时将抛出异常 $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()); } // 获取二维码网址(返回二维码图片地址) $url = $app->qrcode->url($result['ticket']); echo "<img src=" . $url . ">"; ``` **三、关注公众号,绑定上下级关系** 用户关注公众号后,微信服务器会向 `服务器配置URL` 推送一个消息,并携带一下数据包格式 服务器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', ) ``` 分析下数据包中的数据,直 `FromUserName` 为用户在该公众号下的openid | 字段 | 描述 | | ------------ | ------------ | | FromUserName | 用户在该公众号下的openid | | MsgType | 消息类型,event 代表是当前消息是事件推送 | | Event | 值为subscribe代表时关注事件推送 | | EventKey | qrscene_ 是固定前缀,1 是生成二维码时传入的场景值 | $message 假设是上面的消息数据包,下面是关注公众号后的逻辑处理示例 ```php // 判断是否是关注事件 if (!empty($message['Event']) && !empty($message['EventKey']) && $message['Event'] == 'subscribe') { // 匹配场景值 preg_match('/_(\d+)$/', $message['EventKey'], $match); if (!empty($match[1])) { // 场景值 $scene = $match[1]; // 判断当前用户是不是新用户,是新用户则进行上下级关系绑定 // ... } } ```