other|微信网页授权登陆开发示例

之前做过两次网页请求微信授权登陆,后来转到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}&param=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端自动展示扫码界面,在微信客户端则自动提示公众号授权的界面,这个是配置方面的问题还是开发方面的具体还不清楚,略坑。最后为了以后的方便使用,封装一个第三方登陆的类,需要的直接引用即可。
 

猜你喜欢

转载自blog.csdn.net/lolgigeo/article/details/88289890