美文网首页技术干货
微信公众号授权登陆PHP

微信公众号授权登陆PHP

作者: RtyXmd | 来源:发表于2018-04-02 19:04 被阅读169次

    申请微信测试号:微信测试号申请
    参考微信网页授权官方文档

    !!需要注意的几点
    请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头

    在微信公众号请求用户网页授权之前,要先到公众平台官网中修改授权回调域名
    正式公众号:开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息修改授权回调域名
    测试公众号:直接在首页 - 功能服务 - 网页账号中修改回调域名

    关于网页授权的两种scope的区别说明

    1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
    2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    整体思路分析

    微信授权登陆官方分为四步
    1.引导用户同意授权(获取code)
    2.通过code换取accessToken
    3.刷新token(非必须)
    4.通过token和openid获取用户信息
    根据微信官方文档的介绍,在具体实现中我的思路是这样的

    抛开微信授权登陆,我们只看业务层面(假设已经授权成功)

    1.微信登陆后,用户信息会存储在session中,在用户登陆网页时,判断session信息是否匹配,不匹配的话会让用户重新进行登陆授权;
    2.微信授权登陆成功,session中与存在用户信息,这时对比数据库的openid,如果是老用户,返回用户信息,如果是新用户,先添加用户信息再返回新用户信息

            //微信appid&secret
            $wxAppId=$this->config->item('WeChat')['APPID'];
            //授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
            $codeBackUrl=urlencode('http://starwalker.asesspace.com/home/getToken');
    
            if(isset($_SESSION['starWalkWxUserInfo'])){//session中有信息
                $swWxOpenId=$_SESSION['starWalkWxUserInfo']['starWxOpenId'];
                $swWxName=$_SESSION['starWalkWxUserInfo']['starWxName'];
                $swWxSex=$_SESSION['starWalkWxUserInfo']['starWxSex'];
                $swWxIcon=$_SESSION['starWalkWxUserInfo']['starWxIcon'];
                //查询微信用户比对信息
                $result = $this->User_model->getUserByOpen($swWxOpenId);
                if(isset($result)){//老用户
                    $data['wx_userinfo']=$result;
                }else{//新用户
                    //插入新增微信用户
                    $data = array();
                    $data['u_wechatopenid'] = $swWxOpenId;
                    $data['u_wechatnick'] = $swWxName;
                    $data['u_gender'] = $swWxSex;
                    $data['u_wechaticon'] = $swWxIcon;
                    $addResult = $this->User_model->addUser($data); 
                    $result = $this->User_model->getUserByOpen($swWxOpenId);
                    $data['wx_userinfo']=$result;
                }     
               
            }else{//session中没有信息
                $this->wxAuthUrl($wxAppId,$codeBackUrl);
            }
    
    思路清晰了 开始撸代码
    1.定义wxAuthUrl方法引导用户授权登陆
    //引导用户授权
    public function wxAuthUrl($wxAppId,$codeBackUrl){
        $url='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$wxAppId.'&redirect_uri='.$codeBackUrl.'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
        header("Location:" . $url);
    }
    

    **参数appid和回调url的准确书写
    **回调url需要进行urlencode处理才能正常被解析


    2.用户确认授权后进入回调getToken的方法中
    //获取用户授权code 
    public function getToken(){
        $wxAppId=$this->config->item('WeChat')['APPID'];
        $wxAppSecret=$this->config->item('WeChat')['APPSECRET'];
        $code=$_GET['code'];
        //通过code换取网页授权access_token
        $codeUrl='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$wxAppId.'&secret='.$wxAppSecret.'&code='.$code.'&grant_type=authorization_code';
        //初始化curl
        $ch = curl_init();
        //需要获取的URL地址
        curl_setopt($ch,CURLOPT_URL, $codeUrl);
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        $TokenData = curl_exec($ch);
        curl_close($ch);
        $TokenArr=json_decode($TokenData);
        $tokenAccess=$TokenArr->access_token;
        $tokenOpenid=$TokenArr->openid;
        $lang='zh_CN';
        $this->getWxInfo($tokenAccess,$tokenOpenid,$lang);
    }
    

    **在回调中拿到code和state,我这个项目中没有用到state,所以就不拿state了
    **通过拿到的code换取accesstoken传入正确的参数,appid、appsecret、code

    3.刷新token没有用到,直接获取用户信息
    //获取用户信息
    public function getWxInfo($tokenAccess,$tokenOpenid,$lang){
        $userUrl='https://api.weixin.qq.com/sns/userinfo?access_token='.$tokenAccess.'&openid='.$tokenOpenid.'&lang='.$lang.'';
        //初始化curl
        $ch = curl_init();
        //需要获取的URL地址
        curl_setopt($ch,CURLOPT_URL, $userUrl);
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        $data = curl_exec($ch);
        curl_close($ch);
        if($data){
            $wx_info=json_decode($data);
            // var_dump($wx_info->openid);
            $starWalkWx=array(
                'starWxOpenId'=>$wx_info->openid,
                'starWxName'=>$wx_info->nickname,
                'starWxSex'=>$wx_info->sex,
                'starWxIcon'=>$wx_info->headimgurl,
                // 'starWxlanguage'=>$wx_info->language,//语言
                // 'starWxcity'=>$wx_info->city,//城市
                // 'starWxprovince'=>$wx_info->province,//省份
                // 'starWxcountry'=>$wx_info->country,//国家
                // 'starWxprivilege'=>$wx_info->privilege,//用户特权信息
                // 'starWxunionid'=>$wx_info->unionid,//只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
                );
            $this->session->set_userdata('starWalkWxUserInfo', $starWalkWx);
            //登陆成功
            $starwalkUrl='http://starwalker.asesspace.com/home/test';
            header("Location:" . $starwalkUrl);
        }
    }
    

    **通过token和openid拿到用户信息存入session,公司项目只需要四个参数,其他的数据注释了,以备需要的时候直接释放出来
    **到这里授权登陆就成功了,把页面指向项目的首页


    成功拿到微信用户信息

    相关文章

      网友评论

        本文标题:微信公众号授权登陆PHP

        本文链接:https://www.haomeiwen.com/subject/acpxhftx.html