博客列表 >PHP 通过事件推送, 关注公众号获取用户openid并绑定 (亲测有效)

PHP 通过事件推送, 关注公众号获取用户openid并绑定 (亲测有效)

Ant.
Ant. 原创
2022年06月10日 09:51:431313浏览

首先配置好网页授权域名, 事件推送只能是服务器上,本地弄不了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 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议