开发——OAuth2.0授权
公众平台最近新推出认证,认证后可以获得⾼级接⼝权限,其中⼀个是OAuth2.0⽹页授权,很多朋友在使⽤这个的时候失败了或者⽆法理解其内容,希望我出个教程详细讲解⼀下,于是便有了这篇⽂章。
⼀、什么是OAuth2.0
权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.
OAuth是⼀个开放协议,允许⽤户让第三⽅应⽤以安全且标准的⽅式获取该⽤户在某⼀⽹站、移动或桌⾯应⽤上的私密的资源(如⽤户个⼈信息、照⽚、视频、联系⼈列表),⽽⽆需将⽤户名和密码提供给第三⽅应⽤。
OAuth 2.0是OAuth协议的下⼀版本,但不向后兼容OAuth 1.0。 OAuth 2.0关注客户端开发者的简易性,同时为Web应⽤,桌⾯应⽤和⼿机,和起居室设备提供专门的认证流程。OAuth允许⽤户提供⼀个令牌,⽽不是⽤户名和密码来访问他们存放在特定服务提供者的数据。每⼀个令牌授权⼀个特定的⽹站(例如,视频编辑⽹站)在特定的时段(例如,接下来的2⼩时内)内访问特定的资源(例如仅仅是某⼀
相册中的视频)。这样,OAuth允许⽤户授权第三⽅⽹站访问他们在另外的服务提供者上的信息,⽽不需要分享他们的访问许可或他们数据的所有内容。
新浪微博API⽬前也使⽤OAuth 2.0。
⼆、公众平台OAuth2.0授权
公众平台OAuth2.0授权详细步骤如下:
1. ⽤户关注公众账号。
2. 公众账号提供⽤户请求授权页⾯URL。
3. ⽤户点击授权页⾯URL,将向发起请求
4. 询问⽤户是否同意授权给公众账号(scope为snsapi_base时⽆此步骤)
5. ⽤户同意(scope为snsapi_base时⽆此步骤)
6. 将CODE通过回调传给公众账号
7. 公众账号获得CODE
8. 公众账号通过CODE向请求 Token
9. 返回 Token和OpenID给公众账号
10. 公众账号通过 Token向请求⽤户信息(scope为snsapi_base时⽆此步骤)
11. 将⽤户信息回送给公众账号(scope为snsapi_base时⽆此步骤)
使⽤的AppId和Aecret在开发者中⼼-开发者ID中,可以到。
1. 配置授权回调页⾯域名
代码转换进⼊公众平台后台后,依次进⼊开发者中⼼-权限表,到⽹页授权获取⽤户基本信息,
这⾥我们填写⽅倍⼯作室的⼀个百度应⽤⼆级域名为 mascot.duapp
如果你的⽹址没有被列⼊过⿊名单,就会在顶部出现
然后,域名配置就成功了。
2. ⽤户授权并获取code
在域名根⽬录下,新建⼀个⽂件,命名为oauth2.,其内容为
<?
if (isset($_GET[‘code‘])){
echo $_GET[‘code‘];
}else{
echo "NO CODE";
}
>
先了解下请求授权页⾯的构造⽅式:
open.weixin./connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数说明
参数必
说明
appid是的唯⼀标识
redirect_uri是授权后重定向的回调链接地址
response_type是返回类型,请填写code
scope是应⽤授权作⽤域,snsapi_base (不弹出授权页⾯,直接跳转,只能获取⽤户openid),snsapi_userinfo (弹出授权页⾯,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要⽤户授权,也能获取其信息)
state否重定向后会带上state参数,开发者可以填写任意参数值
#wechat_redirect否直接在打开链接,可以不填此参数。做页⾯302重定向时候,必须带此参数
应⽤授权作⽤域:由于snsapi_base只能获取到openid,意义不⼤,所以我们使⽤snsapi_userinfo。
回调地址:填写为刚才上传后的oauth2.的⽂件地址,
state参数:随便⼀个数字,这⾥填1
构造请求url如下:
open.weixin./connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=mascot.duapp/oauth2.&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
把这个链接发送到中,以便在中打开,这⾥使⽤A链接封装如下:
欢迎关注【近宝】,它能让你更加⽅便寻在你附近合你⼼意的餐饮、服装、百货、美容美发店铺。
<a href="open.weixin./connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=mascot.duapp/oauth2.&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">点击这⾥绑定</a>技术⽀持⽅倍⼯作室
在中显⽰如下
点击绑定后,弹出应⽤授权界⾯
选择允许,点击
跳转到auth2.页⾯,执⾏
echo $_GET[‘code‘]
界⾯上显⽰的就是code,这时候通过右上⾓按钮中的复制链接,得到链接如下:
mascot.duapp/oauth2.?code=00b788e3b42043c8459a57a8d8ab5d9f&state=1
我们成功得到了code了。
注意:如果在绑定的时候出现这样的界⾯,就说明参数不对,需要回头检查⼀下参数
3. 使⽤code换取_token
换取⽹页授权_token页⾯的构造⽅式:
api.weixin./sns/oauth2/_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数说明
参数是否必须说明
appid是的唯⼀标识
secret是的aecret
code是填写第⼀步获取的code参数
grant_type是填写为authorization_code
code:在这⾥填写为上⼀步获得的值
构造请求url如下:
api.weixin./sns/oauth2/_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code
可以在中直接执⾏这条语句:
(
这⾥是关键,就是通过上⾯的url获取on数据的代码
    $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    // 要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_HEADER, 0); // 不要http header 加快效率
curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/5.0 (compatible; MS 5.01;  NT 5.0)‘);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    // https请求不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$output = curl_exec($ch);
curl_close($ch);
$jsondecode = json_decode($output); //对JSON格式的字符串进⾏编码
$array = get_object_vars($ondecode);//转换成数组
    //红⾊两⾏是重点,针对https的,让我纠结了⼀天多
echo $array;
)
得到如下on数据:
{
"_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
"expires_in": 7200,
"refresh_token": "OezXcEiiBSKSxW0eoylAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
"openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
"scope": "snsapi_userinfo,"
}
数据格式解读如下:
参数描述
_token⽹页授权接⼝调⽤凭证,注意:此access_token与基础⽀持的_token不同
expires_in_token接⼝调⽤凭证超时时间,单位(秒)
refresh_token⽤户刷新_token
openid⽤户唯⼀标识,请注意,在未关注时,⽤户访问的⽹页,也会产⽣⼀个⽤户和唯⼀的OpenID
scope⽤户授权的作⽤域,使⽤逗号(,)分隔
于是,我们成功的通过code换取到了_token,以及refresh_token。
刷新_token
官⽅⽂档中提到了刷新_token的功能,但这不是必须要做的,初次使⽤可以先忽略。
url请求⽅法如下:
api.weixin./sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
参数说明
参数是否必须说明
appid是的唯⼀标识
grant_type是填写为refresh_token
refresh_token是填写通过_token获取到的refresh_token参数
构造如下:
api.weixin.qq/sns/oauth2/refresh_token?appid=wx8888888888888888&grant_type=refresh_token&refresh_token=OezXcEiiBSKSxW0eoylAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z 在中执⾏得到前⾯同样格式的on数据
4. 使⽤_token获取⽤户信息
请求⽅法:
api.weixin./sns/userinfo?access_token=_TOKEN&openid=OPENID
参数说明
参数描述
_token⽹页授权接⼝调⽤凭证,注意:此access_token与基础⽀持的_token不同
openid⽤户的唯⼀标识
构造url如下:
api.weixin./sns/userinfo?_token=OezXcEiiBSKSxW0eoylAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=o 可以在中直接执⾏这条语句:
得到如下on数据:
{
"openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
"nickname": "⽅倍",
"sex": 1,
"language": "zh_CN",
"city": "Shenzhen",
"province": "Guangdong",
"country": "CN",
"headimgurl": "wx.qlogo/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
"privilege": []
}
参数解读:
参数描述
openid⽤户的唯⼀标识
nickname⽤户昵称
sex⽤户的性别,值为1时是男性,值为2时是⼥性,值为0时是未知
province⽤户个⼈资料填写的省份
city普通⽤户个⼈资料填写的城市
country国家,如中国为CN
headimgurl⽤户头像,最后⼀个数值代表正⽅形头像⼤⼩(有0、46、64、96、132数值可选,0代表640*640正⽅形头像),⽤户没有头像时该项为空
privilege⽤户特权信息,on 数组,如沃卡⽤户为(chinaunicom)
这与我个⼈的信息是⼀致的
⾄此,在不输⼊我的账号及密码的情况下,公众账号近宝获得了我的个⼈信息,这些信息包括昵称、性别、国家、省份、城市、个⼈头像以及特权列表。
⼀个完整的OAuth2认证就完成了。
三、详细演⽰
关注⽅倍⼯作室(⼆维码见下图),回复“授权”,返回图⽂消息,点击图⽚
在确认页⾯,点击“允许”
弹出获取到的结果(图⽚做了防盗处理,所以不能直接显⽰出来,可以下载到本地再来显⽰)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。