微信登录接口

写在前面 : 微信有2个ACCESS_TOKEN,

1,基础接口的token 获取接口是
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

2,用户网页授权access_token 获取接口地址是
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

网页授权access_token 需要通过code去获取 而code是通过调用下面接口来获取的

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=URL&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

注意这个接口中有个参数scope 默认有2个值snsapi_basesnsapi_userinfo,根据scope 来生成不同的code并且获取不同作用的access_token ,不管scope传什么值都能在得到对应access_token的同时得到open_id。如果你只需要得到opend_id 那使用snsapi_base参数到此结束了,如果需要获取用户的其他信息比如 昵称 地址 就要snsapi_userinfo 此时会弹出授权

3 调用下面接口获取用户信息

https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN

这个接口中的access_token是第二步获取code的时候scope 参数传snsapi_userinfo换取来的access_token

4 微信还有一个获取用户基本信息的接口 但是这个接口需要你关注了公众号

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
(此接口的access_token 是接口基础调用access_token 不是网页授权access_token)

微信的解释:是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

也就是说在用户关注了公众号的前提下,我们获取了openid之后,可以根据此接口再获取到access_token,然后通过openid和access_token去获取用户信息

下面是代码部分

//scope=snsapi_userinfo时的方法
public function wx_login(){
    $appid = 'wx8888888';  //公众号唯一标识
    $secret = '88888888'; //公众号的Appsecret
    $REDIRECT_URI = "http://www.8888.com/"; //微信公众号里设置的回调地址 

        if(!isset($_GET['code']) || empty($_GET['code'])){

            //urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%

            $url1 = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".urlencode($REDIRECT_URI)."&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";
            header("Location:".$url1); 
            exit;
        }

        //上面请求成功后 会重定向到 "http://8888.com"  &code=CODE  &state=STATE
        //如此我们便得到了code
        $code =	trim($_GET['code']);


        //接下来利用获取到的code再获取到openid和access_token  
        //然后就可以根据openid和access_token调用微信的相关接口查询用户信息了。


        $getTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token".
                                    "?appid=".$appid.
                                    "&secret=".$secret.
                                    "&code={$code}".
                                    "&grant_type=authorization_code";

        $ch1 = curl_init(); //curl_init()函数的作用初始化一个curl会话
        //curl_setopt -- 为CURL调用设置一个选项
        curl_setopt($ch1, CURLOPT_URL,$getTokenUrl);
        curl_setopt($ch1, CURLOPT_HEADER,0);
        curl_setopt($ch1, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据
        curl_setopt($ch1, CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST,false);
        $result1 = curl_exec($ch1);  //curl_exec — 执行一个cURL会话
        curl_close($ch1);
        $result = json_decode($result1);   
        //json_decode — 对 JSON 格式的字符串进行编码    即接受一个 JSON 格式的字符串并且把它转换为PHP变量 


/*          
print_r($result1);

stdClass Object ( 
        [access_token] => FW2O7863V1k_FPAmupAGCwX9XUssVlAmx2ZHS6Ctkdb6AdQiV63rzToqk78-BKLE7J_uchDA0B4KBekOeVK7_qVgtyNyEQ0TnI4wmQxk30k 
        [expires_in] => 7200 
        [refresh_token] => JY1J6BNabrEL5CUAc89gh9qkX1RdJi0ryhVnHebwSf-tjtzpwmnDWAjmLfT7ujYGnxyctxoy71ofZG0UCJNu0nYzih1w6qXfUvCgjGzPn_Q 
        [openid] => o4ZzuwFFDMnWpSijGTns8JIHtI2Y 
        [scope] => snsapi_userinfo ) 

*/

    $openid =  $result->openid;     //openid:普通用户的标识,对当前公众号唯一
    $access_token =  $result->access_token; 
    //网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

 $url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";

        $ch2 = curl_init();
        curl_setopt($ch2, CURLOPT_URL,$url2);
        curl_setopt($ch2, CURLOPT_HEADER,0);
        curl_setopt($ch2, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据
        curl_setopt($ch2, CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch2, CURLOPT_SSL_VERIFYHOST,false);
        $result1 = curl_exec($ch2);

/*      print_r($result1);

stdClass Object ( 
[subscribe] => 1 
[openid] => o14ZzuwFFDMnWpSijGTns8JIHtI2Y 
[nickname] => 一码十行 
[sex] => 1 [language] => zh_CN [city] => 深圳 [province] => 广东 [country] => 中国 
[headimgurl] => http://wx.qlogo.cn/mmopen/1icSm9BZqddoialAxYj2TFrICqFYr3maSTkqHZElDicJFicFCJc5rdoRLWmR0TomaAL3Ek3XFK7XHINOJicwicYOiappdr89eMHGT7XC/0 
[subscribe_time] => 1500533604 [remark] => [groupid] => 0 [tagid_list] => Array ( ) )

*/
}

//下面是scope=snsapi_base时的方法(此方法获取用户信息的前提是该用户已经关注了公众号,否则无法获取到)

public function wx_login(){

$appid = 'wx888888';   //公众号唯一标识
        $secret = '8888888'; //公众号的Appsecret
        $REDIRECT_URI = "http://www.8888.com/"; //微信公众号里设置的回调地址 

        if(!isset($_GET['code']) || empty($_GET['code'])){

            //urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%

            $url1 = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".urlencode($REDIRECT_URI)."&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
            header("Location:".$url1); 
            exit;
        }


        //上面请求成功后 会重定向到 "http://www.8888.com/"  &code=CODE  &state=STATE
        //如此我们便得到了code
        $code =	trim($_GET['code']);



        //接下来利用获取到的code再获取到openid 再调用基础接口来获取到access_token    然后就可以根据openid和access_token调用微信的相关接口查询用户信息了。



        //获取openid
        $getTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token".
                                    "?appid=".$appid.
                                    "&secret=".$secret.
                                    "&code={$code}".
                                    "&grant_type=authorization_code";

        $ch1 = curl_init(); //curl_init()函数的作用初始化一个curl会话
        //curl_setopt -- 为CURL调用设置一个选项
        curl_setopt($ch1, CURLOPT_URL,$getTokenUrl);
        curl_setopt($ch1, CURLOPT_HEADER,0);
        curl_setopt($ch1, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据
        curl_setopt($ch1, CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST,false);
        $result1 = curl_exec($ch1);  //curl_exec — 执行一个cURL会话
        curl_close($ch1);
        $result1 = json_decode($result1);   //json_decode — 对 JSON 格式的字符串进行编码    即接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 
        $openid =  $result1->openid;     //openid:普通用户的标识,对当前公众号唯一




/*          print_r($result1);

        stdClass Object ( 
        [access_token] => FW2O7863V1k_FPAmupAGCwX9XUssVlAmx2ZHS6Ctkdb6AdQiV63rzToqk78-BKLE7J_uchDA0B4KBekOeVK7_qVgtyNyEQ0TnI4wmQxk30k 
        [expires_in] => 7200 
        [refresh_token] => JY1J6BNabrEL5CUAc89gh9qkX1RdJi0ryhVnHebwSf-tjtzpwmnDWAjmLfT7ujYGnxyctxoy71ofZG0UCJNu0nYzih1w6qXfUvCgjGzPn_Q 
        [openid] => o4ZzuwFFDMnWpSijGTns8JIHtI2Y 
        [scope] => snsapi_base ) 



此时获取到的access_token不是用来和openid一起调用获取用户信息的access_token
*/



    //调用基础接口获取access_token
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_HEADER,0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
        $result = curl_exec($ch);
        curl_close($ch);
        $result = json_decode($result);

        $access_token =  $result->access_token;


/*      print_r($result);  

        stdClass Object ( 
        [access_token] => meXlSh-n1unYg__MV8GjDYOu6D6H9IEL2Rt1zeZGd9kiKsLwV90RmoI8QsI5Xeqrx6S52CgQsaIt-9atyXhaaKRCGOwzL9rWOLy0ZXf5VNe8oK3foCgBco49ghPzGB3uOQNhADAVXU 
        [expires_in] => 7200 )


*/



        //根据openid和access_token调用微信的相关接口查询用户信息
        $url2 = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
        $ch2 = curl_init();
        curl_setopt($ch2, CURLOPT_URL,$url2);
        curl_setopt($ch2, CURLOPT_HEADER,0);
        curl_setopt($ch2, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据
        curl_setopt($ch2, CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch2, CURLOPT_SSL_VERIFYHOST,false);
        $result2 = curl_exec($ch2);

/*      print_r($result2);

stdClass Object ( 
[subscribe] => 1 [openid] => o14ZzuwFFDMnWpSijGTns8JIHtI2Y [nickname] => 一码十行 
[sex] => 1 [language] => zh_CN [city] => 深圳 [province] => 广东 [country] => 中国 
[headimgurl] => http://wx.qlogo.cn/mmopen/1icSm9BZqddoialAxYj2TFrICqFYr3maSTkqHZElDicJFicFCJc5rdoRLWmR0TomaAL3Ek3XFK7XHINOJicwicYOiappdr89eMHGT7XC/0 
[subscribe_time] => 1500533604 [remark] => [groupid] => 0 [tagid_list] => Array ( ) )
*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值