微信 oauth授权 获取用户的信息

应用场景

(1)点击菜单直接链接跳转,这样直接跳是获取不到用户的openid的,需要用到这个

(2)获取用户的一些基本信息,头像,呢称,需要用到这个

 

准备

需要在公众号里面配置一个应用域名,不配置这个的话,跳转后就是空白页面

 

步骤

(一)

//$callback="一个回调的网址比如http://www.baidu.com/auth.php";
        $param [‘redirect_uri‘] = $callback . ‘&getOpenId=1‘;
//&getOpenId=1 这个参数是自己加着用的,跟微信无关
$param [‘response_type‘] = ‘code‘; $param [‘scope‘] = ‘snsapi_userinfo‘; $param [‘state‘] = 123; $param [‘appid‘] = $info [‘appid‘]; //拼凑出一个url 请求此url $url = ‘https://open.weixin.qq.com/connect/oauth2/authorize?‘ . http_build_query ( $param ) . ‘#wechat_redirect‘; /*url大致的样子如下 https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxxxxxxx8xx9b9&redirect_uri=http%3A%2F%2Fxxxn.xingames.com%2Fweiphp%2Fixxxex.php%3Fs%3D%2Faddon%2FMxxber%2FMexxxber%2Findex%26getOpenId%3D1&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect */ redirect ( $url );

***$param [‘scope‘] = ‘snsapi_userinfo‘诸如这样的参数什么意思,可以查询微信的手册

地址:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html

 

(二) 跳转到上面的url后,微信会返回给你这个url 大致如下

http://weixin.xxxxs.com/weiphp/index.php?s=/addon/Memxxx/Mxxxber/ixxdex&getOpenId=1&code=021f5ed2e0e52421c27450565a5176aS&state=123

因为 这里可以通过 $_GET 获取一个叫code的东西 $code=$_GET[‘code‘];

(三)根据这个code 获取openid

$param [‘secret‘] = $info [‘secret‘];
$param [‘code‘] = I ( ‘code‘ );
$param [‘grant_type‘] = ‘authorization_code‘;
        
        $url = ‘https://api.weixin.qq.com/sns/oauth2/access_token?‘ . http_build_query ( $param );
        $content = file_get_contents ( $url );
        $content = json_decode ( $content, true );

/***这个$content 大概内容下
{
    "access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
    "expires_in": 7200,
    "refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "scope": "snsapi_userinfo,"
}
**********/
redirect (
$callback . ‘&openid=‘ . $content [‘openid‘] );
/**
最后跳转的url大概如下
http://weixin.xixxxxxxs.com/weiphp/index.php?s=/addon/Mexx/Mexxr/indxex&getOpenId=1&code=021f5edxxxxxxx0565a5176aS&state=123 &openid=oV6rHt3zxxxxhIi24  
这样openid就能获取到了
还有个access_token 是获取用户信息要用到的, 
*/

(四)能得到openid,基本就能标示用户的身份了,这样很多功能就ok了

这里就获取到openid了,

然后这里有个access_token称呼为授权token

还有一个access_token称呼为全局token =》是使用AppID和AppSecret获取

这俩都能获取到一些用户信息

区别就是授权的那个,如果是认证服务号使用的话,就不需要弹出微信的授权登陆确认,给用户的体验更好一些

=====》

先看授权token,这个能接上面第三步

第三步获取到授权的access_token和openid后

继续请求这个地址

    $param2 [‘access_token‘] = $access_token;
    $param2 [‘openid‘] = $openid;
    $param2 [‘lang‘] = ‘zh_CN‘;
    
    $url = ‘https://api.weixin.qq.com/sns/userinfo?‘ . http_build_query ( $param2 );

/**url大体这个样子
https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc

*/
    $content = file_get_contents ( $url );
    $content = json_decode ( $content, true );

/**
content大体这个样子
{
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "nickname": "sb",
    "sex": 1,
    "language": "zh_CN",
    "city": "深圳",
    "province": "广东",
    "country": "中国",
    "headimgurl": "http://wx.qlogo.cn/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
    "privilege": []
}

*/
    return $content;

这样就获取到了

这里基本就完了

 

 

=====》使用全局access_token获取用户信息

(一)获取access_token

直接上一个函数 weiphp的函数

// 获取access_token,自动带缓存功能
function get_access_token($token = ‘‘) {
    empty ( $token ) && $token = get_token ();
    $key = ‘access_token_‘ . $token;
    $res = S ( $key );
    if ($res !== false)
        return $res;
    
    $info = get_token_appinfo ( $token );
    if (empty ( $info [‘appid‘] ) || empty ( $info [‘secret‘] )) {
        S ( $key, 0, 7200 );
        return 0;
    }
    
    $url = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=‘ . $info [‘appid‘] . ‘&secret=‘ . $info [‘secret‘];
    $tempArr = json_decode ( file_get_contents ( $url ), true );
    if (@array_key_exists ( ‘access_token‘, $tempArr )) {
        S ( $key, $tempArr [‘access_token‘], 7200 );
//S是thinkphp的缓存函数,这个要缓存,有请求次数限制
        return $tempArr [‘access_token‘];
    } else {
        return 0;
    }
}
简单来说 就是使用appid和appsecret请求下面这个地址
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

(二)结合access_token和openid来获取用户信息

这里比较郁闷的就是需要openid,如果是推送消息方式,比如用户发送抽奖,微信推送一个抽奖页面过去的方式,这种在用户发送消息的xml内容中就包含openid了,好说

如果是直接点击链接菜单跳转,那么还是需要先走最上面的方法,来获取openid

$param [‘scope‘] = ‘snsapi_userinfo‘这个改为snsapi_base 就能获取openid,是未认证的公众号也能使用的
有了openid之后

再来一个函数

function getWeixinUserInfo($openid, $token) {
    $access_token = get_access_token ( $token );
    if (empty ( $access_token )) {
        return false;
    }
    
    $param2 [‘access_token‘] = $access_token;
    $param2 [‘openid‘] = $openid;
    $param2 [‘lang‘] = ‘zh_CN‘;
    
    $url = ‘https://api.weixin.qq.com/cgi-bin/user/info?‘ . http_build_query ( $param2 );
    $content = file_get_contents ( $url );
    $content = json_decode ( $content, true );
    return $content;
}

也就是用access_token和openid来请求

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID

最后也能获取到用户的信息

 

微信 oauth授权 获取用户的信息

上一篇:thinkphp微信开发token验证失败


下一篇:微信支付开发教程-静态链接Native原生支付开发