微信 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
最后也能获取到用户的信息