之前做过两次网页请求微信授权登陆,后来转到magento上面,主做国外的电商系统,导致这些开发经验都生疏了。为了后期在遇到同样问题的时候能够快速的找到解决方案,所以专门做个笔记,记录下来。

首先微信授权登陆和其他的qq授权登陆、微博授权登陆都是采用的OAUTH2.0机制,大体的逻辑原理和步骤都很类似。具体的分为三步,

1、根据APPID和回调地址等参数拼装请求的url,比较重要的就是appid,这个是在微信开放平台里面申请的网页应用,需要提交资质认证等。另外就是回调地址,这个必须和微信开放平台后台填写的授权域相同,不然则会提示错误,无法请求。

public function wxlogin(){    
         $AppID = C('WechatConfig')['AppID'];
         $AppSecret = C('WechatConfig')['AppSecret'];        
         $callback = "http://".$_SERVER['HTTP_HOST'].U("User/auth");
         $code=I('get.code');
         $state  = md5(uniqid(rand(), TRUE)).$code;
         $_SESSION["wx_state"]    =   $state; //存到SESSION
         $callback = urlencode($callback);
         $wxurl = "https://open.weixin.qq.com/connect/qrconnect?appid=".$AppID."&redirect_uri={$callback}&response_type=code&scope=snsapi_login&state={$state}¶m=abc#wechat_redirect";
         header("Location: $wxurl");
     }

微信开发者工具 授权手机 微信授权登录开发_微信开放平台


PS:值得一提的是,在微信开放后台的应用里面修改授权域,此授权域可以为本地测试的域名,不用非得

 

2、如果参数全都正确,就进入到扫描界面,等使用微信扫描确认之后,即可获取到一个code,有效期五分钟,然后可以使用此code去获取access_token和用户的openid以及unionid等信息,具体的方法可以参照下面代码:

public function getToken($code){
        $AppID = C('WechatConfig')['AppID'];
         $AppSecret = C('WechatConfig')['AppSecret'];
         $url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$AppID.'&secret='.$AppSecret.'&code='.$code.'&grant_type=authorization_code';        $ch = curl_init();
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
         curl_setopt($ch, CURLOPT_URL, $url);
         $json =  curl_exec($ch);
         curl_close($ch);        $arr=json_decode($json,1);
         if($arr['errcode']!=''){
             return '';
         }else{
             session('access_token',$arr['access_token']);
             session('openid',$arr['openid']);
             return $arr;
         }    }
    public function getUserInfo($token,$openid){
         $url='https://api.weixin.qq.com/sns/userinfo?access_token='.$token.'&openid='.$openid.'&lang=zh_CN';
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
         curl_setopt($ch, CURLOPT_URL, $url);
         $json =  curl_exec($ch);
         curl_close($ch);
         $userinfo=json_decode($json,1);
         if($userinfo['errcode']!=''){
             return '';
         }else{
             return $userinfo;
         }
     }

3、最后特别说明一下,access_token有效期两个小时。然后需要先获取access_token,然后才能用该数据去获取用户的信息。另外还有一种情况,就是在pc端使用此方法没问题,但是如果是在微信客户端下,依旧是扫码界面,那就尴尬了。不过有一个客户的网站在pc端自动展示扫码界面,在微信客户端则自动提示公众号授权的界面,这个是配置方面的问题还是开发方面的具体还不清楚,略坑。最后为了以后的方便使用,封装一个第三方登陆的类,需要的直接引用即可。