Blogger Information
Blog 17
fans 0
comment 1
visits 21575
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 通过事件推送, 关注公众号获取用户openid并绑定 (亲测有效)
Ant.
Original
1299 people have browsed it

首先配置好网页授权域名, 事件推送只能是服务器上,本地弄不了Snipaste_2022-06-10_09-32-14.png

配好后服务器配置也要先做好, 不过一般看这篇文章的人都是已经配好了的, 怎么配置就不再说了 , 百度一下很多 , 官方文档也有dome微信图片_20220610092725.png

配置好服务器配置就在服务器配置的地址里面获取事件推送消息 , 事件推送我们是被动接收的;

好了, 开始我们正式的业务代码吧

第一步 生成带参数的临时二维码 , 参数为用户ID

    // 生成带参数的临时二维码
    public function qrCode()
    {
        // 获取你的access_token并拼接在路径上
        $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' . WeChatLogic::getAccessToken();
        // 定义请求参数
        $data = [
            'expire_seconds' => 86400, // 过期时间
            'action_name' => 'QR_SCENE', //参数类型,官网都有介绍,不多重复
            'action_info' => [  // 参数值
                'scene_id' => USER_ID // 你们自己的用户ID, 参数带在这里, 注意这是个int类型的
            ]
        ];
        $createQrcode = Curl::post($url, json_encode($data)); // 请求微信接口
        // 请求回来的数据里面有ticket , 拼接到下面这个路径上浏览器打开就是个二维码
        $createQrcode->src = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=";
        $this->success($createQrcode);
        return false;
    }

第二步, 用户扫码,我们接收时间推送

         public function reponseMsg()
    {
        //1.获取到微信推送过来post数据(xml格式) , 接收的方式根据框架不同,都有些不一样,具体需要你们看自己的框架文档
        $xml = $this->request()->getBody()->__toString();
        //2.处理消息类型,并设置回复类型和内容
        $postObj = simplexml_load_string($xml);//转化成对象
        // 事件推送, MsgType有很多个类型, 我这里只写了event 事件推送, 官方文档有介绍
        if (strtolower($postObj->MsgType) == "event"){
            $openid = strtolower($postObj->FromUserName); // openid
            $adminId = strtolower($postObj->EventKey); // 这个是我们二维码参数的值, 也就是生成临时二维码我们定义的scene_id值
            if (empty($adminId)){
                return "";
            }
            // 如果是没有关注会多一个qrscene_前缀, 不过我的业务逻辑不太关心这个, 所以我直接做了替换处理
            $adminId = strpos($adminId,'qrscene_') !== false ? str_replace('qrscene_', '', $adminId) : $adminId;
            if (!$userInfo = AdminModel::create()->get(['id' => $adminId])) { // 获取用户信息
                return "";
            }
            // 根据推送事件做相应的处理, 按照你们自己业务逻辑来, 我是只用于openid绑定用户ID,所以业务简单
            switch(strtolower($postObj->Event)){
                    // 已关注公众号 通过扫码进来的
                case 'scan':
                    // 没有关注,第一次关注的
                case "subscribe" :
                    if (!empty($userInfo->official_openid)){
                        return "";
                    }
                    $userInfo->official_openid = $openid;
                    $userInfo->update();
                    return "";
                    //取消关注
                case "unsubscribe" :
                    $userInfo->official_openid = "";
                    $userInfo->update();
                    return "";
                default:
                    return "";
            }
        }
    }

到这就结束了 , 有什么问题可以留言讨论

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post