登录  /  注册
博主信息
博文 17
粉丝 0
评论 1
访问量 25558
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP 通过事件推送, 关注公众号获取用户openid并绑定 (亲测有效)
Ant.
原创
1774人浏览过

首先配置好网页授权域名, 事件推送只能是服务器上,本地弄不了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 "";
            }
        }
    }

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

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学