微信公众号授权登陆PHP

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

!!需要注意的几点
请注意,这里填写的是域名(是一个字符串),而不是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,公司项目只需要四个参数,其他的数据注释了,以备需要的时候直接释放出来
**到这里授权登陆就成功了,把页面指向项目的首页


成功拿到微信用户信息
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容