微信第三方受權登陸返回錯誤信息: 40029

微信第三方登陸受權後,能獲取到code碼,可是獲取gat_token()信息就會返回這樣的錯誤信息:php

Array
(
    [errcode] => 40029
    [errmsg] => invalid code, hints: [ req_id: jGkksa0933ssz5 ]
)

有問題,先查下官方的文檔,熟悉下受權流程:html

微信第三方受權登陸文檔:http://blog.csdn.net/iamduoluo/article/details/40384419前端

官方文檔:json

http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.htmlapi

網頁受權流程分爲四步:數組

一、引導用戶進入受權頁面贊成受權,獲取code
二、經過code換取網頁受權access_token(與基礎支持中的access_token不一樣)
三、若是須要,開發者能夠刷新網頁受權access_token,避免過時
四、經過網頁受權access_token和openid獲取用戶基本信息(支持UnionID機制)

知乎上邊的答案:緩存

微信公衆號{"errcode":40029,"errmsg":"invalid code"} ?

微信公衆號錯誤提示:{"errcode":40029,"errmsg":"invalid code"} code失效求解決方案(code只能被使用一次)微信

code失效,是由於你重複請求了,請求兩次致使code失效(code只能使用一次)app

http://www.zhihu.com/question/33594002curl

小結:

通過翻官方文檔,網上查解決的方法,終於解決了這個問題 ^_^

有兩個問題須要注意:

第一,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:

<?php

/**
 * ----------------------------------------------------------------
 * 微信登陸-請求頁面
 * ----------------------------------------------------------------
 * [訪問URL]
 * http://mysite.com/partner_login/index.php
 * ----------------------------------------------------------------
 * [功能描述]
 * 用於前端頁面請求調用微信登陸界面的入口
 * ----------------------------------------------------------------
 * [參數說明]
 * redirect_url  string  跳轉回網站的地址,默認:'http://m.baidu.com/'
 * ----------------------------------------------------------------
 * @author Corwien
 * @version 2016-05
 * ----------------------------------------------------------------
 */


// 微信服務號  
$appid = 'wxwxxxxxxxxxxxxxx';

// 獲取參數,前端傳過來須要跳轉回的連接
$return_url = $_GET['return_url'];
$return_url = !empty($return_url) ? $return_url : 'http://m.baidu.com/';

// 添加隨機值
$rand_num = rand(1,10000);

// 回調頁面
$call_url = 'http://mysite.com/partner_login/callback.php';

// 連接
$redirect_uri = urlencode($call_url.'?goback_url='.$return_url);

$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$redirect_uri.'&response_type=code&no='.$rand_num.'&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect';

// 能夠在此添加日誌或緩存記錄,查看這個頁面是否請求了兩次

// 請求微信
header("Location: ".$url);

?>

 

回調頁面callback.php:

<?php
 /**
 * ----------------------------------------------------------------
 * 微信登陸-回調頁面
 * ----------------------------------------------------------------
 * [訪問URL]
 * http://mysite.com/partner_login/callback.php
 * ----------------------------------------------------------------
 * [功能描述]
 * 用於獲取第三方用戶信息
 * ----------------------------------------------------------------
 * [參數說明]
 * goback_url  string  跳轉回網站的地址
 * code        string  受權後的Code碼
 * ----------------------------------------------------------------
 * @author Corwien
 * @version 2016-05
 * ----------------------------------------------------------------
 */
 
 // 微信服務號
 $appid = 'WXXXXXXXXXXXXXXXXXXXX';
 $secret = 'OOOOOOOOOOXXXXXXXXXXXXXX';

// 獲取code碼
$code       = isset($_GET['code']) ? $_GET['code'] : false;
$goback_url = isset($_GET['goback_url']) ? $_GET['goback_url'] : null;

// 校驗code碼
if(empty($code))
{
  die('Not allow!');
}

if($code && $goback_url)
{

  // 獲取Token信息
  $token_info = get_token(array('appid'=>$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;
}

```

相關文章
相關標籤/搜索