博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信第三方授权登录返回错误信息: 40029
阅读量:2384 次
发布时间:2019-05-10

本文共 3159 字,大约阅读时间需要 10 分钟。

微信第三方登录授权后,能获取到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;
}

```

转载于:https://my.oschina.net/corwien/blog/673988

你可能感兴趣的文章
ceph集群的扩展(centos7环境)
查看>>
linux命令之top(查看cpu、内存等负载)
查看>>
linux_详解find命令
查看>>
openstack的swift组件详解
查看>>
两大主流开源分布式存储的对比:GlusterFS vs. Ceph
查看>>
面试笔试动态规划问题--python篇
查看>>
linux下的svn常用命令使用指南
查看>>
阿里云iot事业部一面面经
查看>>
《云计算架构技术与实践》
查看>>
《云计算架构技术与实践》序言(李德毅院士)
查看>>
《云计算架构技术与实践》连载(2):1.2 云计算的发展趋势
查看>>
《跨界杂谈》企业商业模式(七):其他
查看>>
STL介绍 - map
查看>>
ssh 命令的用法
查看>>
scp 命令的用法
查看>>
ldcofig 命令的用法
查看>>
tar 命令的用法
查看>>
mount 命令的用法
查看>>
fdisk 命令的用法
查看>>
ln 命令的用法
查看>>