微信第三方登录授权后,能获取到code码,但是获取gat_token()信息就会返回这样的错误信息:
Array( [errcode] => 40029 [errmsg] => invalid code, hints: [ req_id: jGkksa0933ssz5 ])
有问题,先查下官方的文档,熟悉下授权流程:
微信第三方授权登录文档:
官方文档:
网页授权流程分为四步:
1、引导用户进入授权页面同意授权,获取code2、通过code换取网页授权access_token(与基础支持中的access_token不同)3、如果需要,开发者可以刷新网页授权access_token,避免过期4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
知乎上边的答案:
微信公众号错误提示:{"errcode":40029,"errmsg":"invalid code"} code失效求解决方案(code只能被使用一次)
code失效,是因为你重复请求了,请求两次导致code失效(code只能使用一次)
小结:
经过翻官方文档,网上查解决的方法,终于解决了这个问题 ^_^
有两个问题需要注意:
第一,code不能重复请求,这个可以通过在微信请求的登录页面header("Location: ".$url);之前加个log记录或记录到缓存数组中,看一共请求了几次。
第二,在用curl获取Token信息时,会因为 api.weixin.qq.com域名解析慢的问题,出现超时,导致不能根据code码获取到token,解决方法可以看我的另一篇博客http://my.oschina.net/corwien/blog/674496。
还要注意一点,为避免问题一的出现,我们应该将微信请求的登录页面(获取授权后返回code码)和回调页面(根据code码获取token信息,然后处理自己的业务逻辑)分开写,之前是由于偷懒,全都写在一块了。
微信请求登录页面 index.php:
回调页面callback.php:
$appid, 'secret'=>$secret, 'code'=>$code)); // 判断授权是否成功 if(empty($token_info['access_token']) || empty($token_info['openid']) || empty($token_info['unionid'])) { die('授权Token失败!'); } // 获取用户信息 $user = get_user($token_info); $user = eval('return ' . mb_convert_encoding(var_export($user,true), 'GBK', 'UTF-8') . ';'); // 微信的用户信息获取到手了,然后接下来处理自己的业务逻辑,保存相关的信息,然后登陆自己的网站 // ... // ... // ...}else{ die('404');}function get_token($options){ $appid = $options['appid']; $secret = $options['secret']; $code = $options['code']; $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code'; $curl = curl_init (); curl_setopt ( $curl, CURLOPT_URL, $url ); curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE ); curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); $output = curl_exec ( $curl ); curl_close ( $curl ); return json_decode($output, true);}function get_user($options){ $access_token = $options['access_token']; $openid = $options['openid']; $url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN'; $curl = curl_init (); curl_setopt ( $curl, CURLOPT_URL, $url ); curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE ); curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); $output = curl_exec ( $curl ); curl_close ( $curl ); return json_decode($output, true);}?>
###封装的Qzone第三方curl获取TOken和用户信息的方法
```
// curl 请求获取远程数据,file_get_contents获取数据太慢了【2016-05-19】
function do_http($url) { // 域名解析太慢,将域名替换为IP openapi.qzone.qq.com =》 183.60.15.158 $url = str_replace('openapi.qzone.qq.com', '183.60.15.158', $url); $curl = curl_init (); curl_setopt ( $curl, CURLOPT_URL, $url ); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Host:openapi.qzone.qq.com')); curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE ); curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); $output = curl_exec ( $curl ); curl_close ( $curl ); // return json_decode($output, true); return $output; }```