1、用appkey换取code
访问https://目标网站.com/authorize?appkey=xxxxxx&redirect_uri=https://我们的网站(第三方).com/callback_url&response_type=code&state=STATE
检测发现用户没有登录的情况下,引导用户到授权页面去授权,这个地址是位于目标网站的一个网址,带入了我们的appkey,以及我们的回调地址redirect_uri。
2、用code换取token
用户授权完了以后,会跳到我们的刚才填的回调地址,也就是我们的网站,他是这样的https://我们的网站(第三方).com/callback_url?code=xxxx直接在url里把参数带过来。
我在页面里获取这个code就可以了,比如:
if(null != $this->input->get('code'))
{
$code = $this->input->get('code');
$url = "https://目标网站.com/access_token?appkey=xxxxxx&secret=xxxxxx&code=".$code."&grant_type=authorization_code";
$this->load->library('CurlRequest');
$res = $this->curlrequest->https_request($url);
echo $res;
}else
{
exit("获取code失败!");
}
这里其实是我们在后台,访问了一个url,这个url里我们把appkey,secret,code都传进去,会返回来一个json,这个json里面有token的全部信息。这个操作其实是我们在后台进行的一个api访问,这个叫做curl操作。
返回的信息包括:
{"result":
{"access_token":"72fe7c5a8f0466b870f66c53c9d6409600062487ef",//token
"expire_in":90000,//过期时间
"refresh_token":"ffff",//刷新token
"openid":"111111",
"shop_name":"xxx",
"scope":3,
"shop_logo":"http://xx.jpg?w=250&h=250&cp=1"},
"status":{"status_code":0,"status_reason":"success"}
}
3、使用token
这个access_token就是我们所需要的,每次通过api查询用户相关信息需要附带进去的一个key,expire_in是access_token的过期时间,refresh_token是用来刷新access_token的token。refresh_token一般有效期比较长,比如说有一个月。
一般是这样使用的:定期通过refresh_token刷新access_token,这样保证access_token在过期前得到刷新。这样access_token就可以一直使用到refresh_token过期前。
refresh_token过期了就没办法了,只能用户重新去授权。
一些关键的知识点:
<1>用户每次登录授权,如果access_token没有过期他是不会主动去更新的。
如果现在的access_token没有过期,那么再次登录授权,返回的access_token和refresh_token都没有改变。
如果现在的access_token已经过期,那么再次登录授权,会返回新的access_token和refresh_token。
<2>refresh_token没办法提前续期。
因为刚才说的第一点的特点,登录授权的时候他只有过期了才变,刷新的时候倒是刷一次变一次,但是没有提供刷新refresh_token的api,那么refresh_token是没办法提前续期让他平滑一直有效的,只能是过期了再去授权。