목차
回复讨论(解决方案)
백엔드 개발 PHP 튜토리얼 微信oauth2的access_token问题

微信oauth2的access_token问题

Jun 23, 2016 pm 01:43 PM

微信oauth2获取用户信息的整个流程都走通了。也没有问题。。

不过中间有一事不明。希望哪位知道的朋友帮解答下。。

每一次都要通过code去获取access_token吗?
不的话,那么用户的openid又只能在获取access_token时返回,不然就得不到用户的openid了。
或者是第一次获取到用户的openid以后存到cookie里去,下次读cookie吗???
否则那个刷新access_token有什么意义啊。。。

再有就是获取到的access_token是只是当前会话有效,还是对应某个用户openid有效,或者是所有用户都有效。。。

初次接触微信这个,谢谢。。。。。


回复讨论(解决方案)

这个只是针对你需要操作微信上的管理功能的时候才用到的,像一般的聊天啥的是没必要获取的,一般只有微信平台的管理后台才会用到这个,一般是在获取第一次之后记录下来防止每次操作都会去获取一次导致当天的API调用次数消耗完毕。

这个只是针对你需要操作微信上的管理功能的时候才用到的,像一般的聊天啥的是没必要获取的,一般只有微信平台的管理后台才会用到这个,一般是在获取第一次之后记录下来防止每次操作都会去获取一次导致当天的API调用次数消耗完毕。


我说的是:微信的网页授权获取用户基本信息;不是微信基础功能接口。。

大概流程是这样的:
1.构造URL地址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

REDIRECT_URI是我自己的网页地址。用户直接访问的是上面的地址,再回调REDIRECT_URI地址,并带参数CODE;这里并没有用户的openid

2.
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code
根据CODE获取access_token,在这里会返回:
{
   "access_token":"ACCESS_TOKEN",
   "expires_in":7200,
   "refresh_token":"REFRESH_TOKEN",
   "openid":"OPENID",
   "scope":"SCOPE"
}
在这一步才有openid,也就是当前访问我这个页面的微信用户的openid
3.
根据openid获取微信用户资料

而问题就在第二步。
我保存access_token,那下一次我不是应该跳过第二步?跳过的话,那我又如何得到openid?没有openid我就不能进行第三步。。

如果不存储access_token,那么每一次微信用户访问网页都要获取一次access_token。太频繁了。。

没有做过这个的吗?

用户的openid保存到数据库,与用户进行绑定
access_token每获取一次,保存到数据库,在使用之前,首先查数据库的access_token有没有过期,二小时过期,过期重新获取再保存,

access_token有访问限制的,如果你不停的获取,最终没法提供服务

用户的openid保存到数据库,与用户进行绑定
access_token每获取一次,保存到数据库,在使用之前,首先查数据库的access_token有没有过期,二小时过期,过期重新获取再保存,

access_token有访问限制的,如果你不停的获取,最终没法提供服务



这个明白。。
但微信的网页授权里,要获取到用户的openid只有通过获取token那一步同时返回。。也就是获取token的时候同时返回token和当前访问网页的微信用户的openid。。这一点上和基础接口里不一样。基础接口里,用户每操作一次都可以获取到用户的openid。。
{
    "access_token":"ACCESS_TOKEN",
   "expires_in":7200,
   "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",//当前访问网页的微信用户的openid
   "scope":"SCOPE"
}
可是没有用户的openid,我即使有token也无法获取到这个用户的用户信息。。


<?phprequire_once("weixin.config.php");class Webweixin{	//APPID 默认是服务号	var $APPID = APPID1;	var $APPSECRET = APPSECRET1;		//用户方信息(存储当前交互用户的操作状态,以及状态时效)	var $_client = array('wx_id'=>'', 'user_id'=>0, 'act'=>'', 'exp'=>0, 'token'=>'','userdata'=>'');	var $wxu_mod;	var $CODE = '';	    function __construct()    {		$this->APPID = APPID1;		$this->APPSECRET = APPSECRET1;				if (isset($_GET['code']))		{			$this->CODE =  $_GET['code'];			$userinfo = $this->getUserInfo();			dump($userinfo);		}    }		public function getUserInfo()	{		$accessToken = $this->getAccessToken();				$cfg['ssl'] = true;		//https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID		$userinfo = $this->__curlOpen("https://api.weixin.qq.com/sns/userinfo?access_token=".$accessToken."&openid=".$this->_client['wx_id'].'&lang=zh_CN', $cfg);		$userinfo = json_decode($userinfo,true);		return $userinfo;	}		/**	 * 获取ACCESS TOKEN	 */	public function getAccessToken($getHTTP = false)	{		$isCurl = true;		/*		$tokenfile = ROOT_PATH . "/temp/TOKEN_WEB";		$token = file_exists($tokenfile)?file_get_contents($tokenfile):'';		if($token)		{			$token = json_decode($token,true);			if( time()-$token['access_time'] < $token['expires_in']){				$isCurl = false;			}		}*/        if($isCurl || $getHTTP)		{			//https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code			$cfg['ssl'] = true;			$token = $this->__curlOpen("https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->APPID."&secret=".$this->APPSECRET."&code=".$this->CODE."&grant_type=authorization_code", $cfg);			$token = json_decode($token,true);			$token['access_time'] = time();			//file_put_contents($tokenfile, json_encode($token), LOCK_EX);		}				$this->_client['wx_id'] = $token['openid'];		$client = $this->wx_user();		if($client){			$this->_client = $client;		}else{			$this->wx_user('add');		}		return $token['access_token'];	}    		public function __curlOpen($url, $cfg)	{		$ch = curl_init();		curl_setopt($ch, CURLOPT_URL, $url);		isset($cfg['post']) && curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");		if($cfg['ssl'])		{			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);		}		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);		isset($cfg['post']) && curl_setopt($ch, CURLOPT_POSTFIELDS, $cfg['post']);		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);				$result = curl_exec($ch);		if (curl_errno($ch))		{			return curl_error($ch);		}		curl_close($ch);		return $result;	}		//微信用户信息操作	public function wx_user($act='')    {		if($this->_client['wx_id'])		{			$this->wxu_mod = &m("weixinuser");			if($act=='add')			{				$this->wxu_mod->add($this->_client);			}elseif($act=='edit'){				$this->wxu_mod->edit("wx_id='".$this->_client['wx_id']."'", $this->_client);			}else{				$client = $this->wxu_mod->get("wx_id='".$this->_client['wx_id']."'");				return $client;			}		}	}	/*$scope : snsapi_base / snsapi_userinfo*/	public function makeStartUrl($url, $state = '', $scope = 'snsapi_userinfo')	{		//https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect		$base_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->APPID}&redirect_uri=";		$base_url .= rawurlencode($url);		$base_url .= "&response_type=code&scope={$scope}&state={$state}#wechat_redirect";				return $base_url;	}}?>
로그인 후 복사

也就是说要得到当前访问网页的微信用户的openid,就要先获取token,才能得到当前访问网页的微信用户的openid。
而这样,就每次都要去获取token。我保存下来也就没有意义了。。


详见:
http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html

或者说是不是第一次获取到token和openid以后,把它们存起来。
再把用户的openid存到cookie里。。
下一次直接读cookie里的openid,和存储的openid对应的token,(相当于跳过获取token那一步),直接去获取用户信息??

但这样的话,如果客户端不支持cookie,结果就还是一样了。。。。

你是建立于什么目的需要进行用户统计的,如果只是为了第三方登录那你只要按照微信的第三方登录文档进行操作即可,如果你是想进行后台用户同步,那你就需要一个公众号啊。

做微信活动。。
这个不需要登陆,只需要每个访问网页的微信用户的openid,就可以了

没戏了。。。。哎

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Laravel의 플래시 세션 데이터로 작업합니다 Laravel의 플래시 세션 데이터로 작업합니다 Mar 12, 2025 pm 05:08 PM

Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법 PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법 Mar 14, 2025 am 11:42 AM

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

Laravel 테스트에서 단순화 된 HTTP 응답 조롱 Laravel 테스트에서 단순화 된 HTTP 응답 조롱 Mar 12, 2025 pm 05:09 PM

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> ​​'Hello World', 'github.com'=> ​​[ 'foo'=> 'bar'], 'forge.laravel.com'=>

Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트 Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트 Mar 13, 2025 pm 12:08 PM

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

PHP에서 늦은 정적 결합의 개념을 설명하십시오. PHP에서 늦은 정적 결합의 개념을 설명하십시오. Mar 21, 2025 pm 01:33 PM

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

프레임 워크 사용자 정의/확장 : 사용자 정의 기능을 추가하는 방법. 프레임 워크 사용자 정의/확장 : 사용자 정의 기능을 추가하는 방법. Mar 28, 2025 pm 05:12 PM

이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다.

프레임 워크 보안 기능 : 취약점 보호. 프레임 워크 보안 기능 : 취약점 보호. Mar 28, 2025 pm 05:11 PM

기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다.

See all articles