写在前面 : 微信有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_base和snsapi_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 ( ) )
*/
}