微信公众平台开发-OAuth2.0网页授权(含源码)
微信公众平台开发-OAuth2.0网页授权接口、网页授权接口详解(含源码)
作者: 孟祥磊-《微信公众平台开发实例教程》
在微信开发的高级应用中,几乎都会使用到该接口,因为通过该接口,可以获取到用户的微信基础信息,其中的用户唯一标识OpenID是微信应用中最长用到的参数之一,近期有很多学员一直咨询,所以我写下这篇文章。
1.网页授权接口的作用
开发者通过网页授权接口,可获取到用户的基本信息,包括OpenID、昵称、用户资料填写的省份、城市、国家以及头像地址,以实现业务逻辑。
与同样是获取用户基本信息的用户管理中的“获取用户信息”接口相比,网页授权接口无论用户是否关注了公众号,都可以正常获取到用户信息,而用户管理中的“获取用户信息”接口则必须关注公众号才可获取。
2.网页授权接口模式介绍
微信公众平台网页授权接口有两种模式,分别是scope为snsapi_base和scope为snsapi_userinfo,根据微信应用的不同需求,会用到不同的模式,两种模式各有利弊。
(1)以snsapi_base为scope发起的网页授权。
l 优点:静默授权,直接跳转到到回调页,不会弹出“确认登陆”页面,用户感知较好
l 缺点:仅可获取到用户的OpenID,在需要获取其他用户信息时不适用
(2)以snsapi_userinfo为scope发起的网页授权。
l 优点:除用户OpenID外,还可以获取到用户的,昵称、用户资料填写的省份、城市、国家以及头像地址
l 缺点:用户进入页面时会弹出“确认登陆”也就是同意授权的页面,单击“确认登陆”按钮后,才会跳转到回调页,用户感知较差
注意:对于已关注该公众号的用户,如果从公众号的回话或者自定义菜单进入本公众号的网页授权页,即使是以snsapi_userinfo为scope发起的网页授权,也是静默授权,不会弹出“确认”登陆界面。
3.数据传输流程解析
以snsapi_base为scope发起的网页授权,当用户进入使用网页授权的网页时,会带上code参数,通过该参数,并调用接口,可获取到一个特殊的access_token以及用户的OpenID,程序可根据该参数继续运行,流程如图所示。

以snsapi_userinfo为scope发起的网页授权,与以snsapi_base为scope发起的网页授权不同的是,首先会进入“确认登陆”,也就是授权页面,用户同意授权后,会跳转到回调页,并带上code参数,通过该参数,并调用接口,可获取到一个特殊的access_token以及用户的OpenID,此时,scope为snsapi_userinfo时,即可通过access_token和OpenID获取用户的基本信息了。
4.网页授权接口注意事项
(1)网页授权接口暂时只支持认证后的服务号调用。
(2)在微信公众号调用用户网页授权接口之前,开发者需要先到公众平台官网中的“开发 → 接口权限 → 网页服务 → 网页帐号 → 网页授权获取用户基本信息”的配置选项中,配置授权回调域名,如图所示。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头。

(3)授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,如图所示,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权。
(4)回调页面域名需使用字母、数字及“-”的组合,不支持IP地址、端口号及短链。填写的域名需与实际回调URL中的域名相同。填写的域名须通过ICP备案的验证。

5.scope参数为snsapi_base的网页授权接口调用实例
步骤
(1)获取code
(2)通过code换取access_token以及OpenID
(1)获取code
在确保微信公众账号拥有授权作用域scope参数为snsapi_base的前提下,引导微信用户打开如下格式页面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。
参数说明,如表所示:
scope为snsapi_base时接口调用参数说明
|
参数 |
是否必须 |
说明 |
|
appid |
是 |
公众号的唯一标识 |
|
redirect_uri |
是 |
授权后重定向的回调链接地址,请使用urlencode对链接进行处理 |
|
response_type |
是 |
返回类型,请填写code |
|
scope |
是 |
应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid) |
|
state |
否 |
重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
|
#wechat_redirect |
是 |
无论直接打开还是做页面302重定向时候,必须带此参数 |
访问该链接后,会跳转到回调页,即redirect_uri/?code=CODE&state=STATE,如果回调页是“http://www.xxx.qq/test.php”,code是微信自动分配的,也就是上面链接中获取到的response_type的值,每次访问都不同,假设code为“031cEhnA1qGrf10uzzoA1n3jnA1cEhn1”回调页即为:
“http://www.xxx.qq/test.php/?code=031cEhnA1qGrf10uzzoA1n3jnA1cEhn1&state=STATE”。
(2)通过code换取access_token以及OpenID
回调页带上的code参数可通过GET方式获取,即$_GET[‘code’];并通过指定接口地址获取access_token以及OpenID。
接口调用地址:
调用参数说明,如表所示:
获取access_token以及OpenID调用参数说明
|
参数 |
是否必须 |
说明 |
|
appid |
是 |
公众号的唯一标识 |
|
secret |
是 |
公众号的appsecret |
|
code |
是 |
填写第一步获取的code参数 |
|
grant_type |
是 |
填写为authorization_code |
返回说明:
正常情况下,微信会返回JSON数据包给公众号:
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
返回参数说明:
返回参数说明
|
参数 |
描述 |
|
access_token |
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
|
expires_in |
access_token接口调用凭证超时时间,单位(秒) |
|
refresh_token |
用户刷新access_token |
|
openid |
用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID |
|
scope |
用户授权的作用域,使用逗号(,)分隔 |
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
5.程序
<?php
/*
以snsapi_base为scope发起的网页授权
获取access_token,openid
*/
require('wei_function.php');
$appid="wx78478e595939c538";
$secret="5540e8ccab4f71dfad752f73cfb85780";
$code=$_GET['code'];
$OAuthurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
$OAuthinfo=json_decode(getdata($OAuthurl),true);
//print_r($OAuthinfo);
$access_token=$OAuthinfo['access_token'];
$openid=$OAuthinfo['openid']; echo "获取到的access_token:<br />".$access_token."<br />";
echo "获取到的用户openid:<br />".$openid;
?>
代码解析
require('wei_function.php');该函数文件可以购买《微信公众平台开发实例教程》,在该书中第95页有详细讲解。
$appid="xxx";
$secret="xxx";
分别将公众号的AppID和AppSecret赋值给变量$appid和$secret;
$OAuthurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
$OAuthinfo=json_decode(getdata($OAuthurl),true);
$access_token=$OAuthinfo['access_token'];
$openid=$OAuthinfo['openid'];
将接口地址中的appid、secret和code参数替换,并通过getdata()函数(该函数在wei_function.php文件中,可直接被使用)请求该接口地址,并将返回的JSON数据通过json_decode()函数处理为数组,之后单独输出access_token和openid。
访问该程序的网址为:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx78478e595939c538&redirect_uri=http://www.xxx.com/OAuth2.0.php&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
appid为公众号的appid,且需与上面的$appid的值相同,否则会提示{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: z3H9UA0717ns83 ]"}这样的错误信息,其代表的意思是不合法的oauth_code。
OAuth2.0.php为该程序文件。
运行效果如图所示。

6.scope参数为snsapi_userinfo的网页授权接口调用实例
步骤
(1)获取code
(2)通过code换取access_token以及OpenID
(4)拉取用户信息
(1)获取code
在确保微信公众账号拥有授权作用域scope参数为snsapi_userinfo的前提下,引导微信用户打开如下格式页面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。
该链接格式与以snsapi_userinfo为scope发起的网页授权不同的仅仅是scope不同,其余相同。
调用参数说明,如所示:
scope为snsapi_userinfo时接口调用参数说明
|
参数 |
是否必须 |
说明 |
|
appid |
是 |
公众号的唯一标识 |
|
redirect_uri |
是 |
授权后重定向的回调链接地址,请使用urlencode对链接进行处理 |
|
response_type |
是 |
返回类型,请填写code |
|
scope |
是 |
应用授权作用域,snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息) |
|
state |
否 |
重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
|
#wechat_redirect |
是 |
无论直接打开还是做页面302重定向时候,必须带此参数 |
(2)通过code换取access_token以及OpenID
该步骤与以snsapi_userinfo为scope发起的网页授权流程一致,参考其调用方法即可。
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
refresh_token在(2)通过code换取access_token以及OpenID中与access_token和OpenID一同获取,获取代码为$refresh_token=$OAuthinfo['refresh_token'];。
(4)拉取用户信息
<?php
/*
以snsapi_base为scope发起的网页授权
获取access_token,openid
*/
require('wei_function.php');
$appid="wx78478e595939c538";
$secret="5540e8ccab4f71dfad752f73cfb85780";
$code=$_GET['code'];
$OAuthurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
$OAuthinfo=json_decode(getdata($OAuthurl),true);
//print_r($OAuthinfo);
$access_token=$OAuthinfo['access_token'];
$openid=$OAuthinfo['openid']; $user_url="https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
$user_info=json_decode(getdata($user_url),true);
//print_r($user_info);
echo "OpenID:".$user_info['openid'];
echo "<br />";
echo "昵称:".$user_info['nickname'];
echo "<br />";
echo "性别:".$user_info['sex'];
echo "<br />";
echo "资料填写城市:".$user_info['city'];
echo "<br />";
echo "资料填写省份:".$user_info['province'];
echo "<br />";
echo "资料填写国家:".$user_info['country'];
echo "<br />";
echo "用户头像地址:".$user_info['headimgurl'];
echo "<br />";
echo "unionid:".$user_info['unionid'];
?>
效果如图所示:

点此购买《微信公众平台开发实例教程》
微信公众平台开发-OAuth2.0网页授权(含源码)的更多相关文章
- 黄聪:微信公众平台开发OAuth2.0网页授权(转)
微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使 ...
- 微信公众平台开发 OAuth2.0网页授权认证
一.什么是OAuth2.0 官方网站:http://oauth.NET/ http://oauth.Net/2/ 权威定义:OAuth is An open protocol to allow s ...
- 用chrome模拟微信浏览器访问需要OAuth2.0网页授权的页面
现在很流行微信网页小游戏,用html5制作的小游戏移过来,可以放到微信浏览器中打开,关键是可以做成微信分享朋友圈的形式,大大提高游戏的传播,增强好友的游戏互动. 微信浏览器中打开网页游戏效果还不错,对 ...
- [转]用chrome模拟微信浏览器访问需要OAuth2.0网页授权的页面
FROM : http://blog.csdn.net/gavin_luo/article/details/40620217 现在很流行微信网页小游戏,用html5制作的小游戏移过来,可以放到微信浏览 ...
- 微信公众平台开发(71)OAuth2.0网页授权
微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使 ...
- 微信公众平台开发(71)OAuth2.0网页授权-摘抄
微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友 ...
- 微信公众平台开发教程--方培工作室,PHP语言版本
准备工作 微信公众平台的注册 介绍如何注册一个微信公众账号. 入门教程 微信公众平台开发入门教程 内容:1.申请SAE作为服务器; 2.启用开发模式; 3.微信公众平台PHP SDK; 4.接收发送消 ...
- ***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称.头像.性别.国家.省份.城市.语言.本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息, ...
- 微信公众平台OAuth2.0网页授权
微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使用这个的时候失败了或者无法理解其内容,希望我出个教程详细讲解一下,于是便有了这篇文章. 一. ...
随机推荐
- iOS 界面 之 EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具
http://blog.csdn.net/fatherhui iOS开发,EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具 EALa ...
- python with用法
python中with可以明显改进代码友好度,比如: with open('a.txt') as f: print f.readlines() 为了我们自己的类也可以使用with, 只要给这个类增加两 ...
- PHP新手之学习数组声明
数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式.这些按序排列的同类数据元素的集合称为数组.下面介绍PHP中的数组声明. 一.数组的概述 1.数组的本质:管理 ...
- Angular - - ngApp、ngBind、ngBindHtml、ngNonBindable
对于ng-系列的指令,每篇文章写2-5个吧,不然显得文章好短.... ngApp 使用这个指令自动启动一个AngularJS应用.ngApp指令指定了应用程序的根节点,通常会将ngApp放置在网页的根 ...
- MySQL批量导出以某数字或字母开头的表
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1852178 情景:我 ...
- JavaScript特效制作经典精讲(案例入门详解、可直接粘贴拷贝运行、史上最牛案例)
技巧一.添加链接提示 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...
- CocosBuilder 多分辨率基础
最近两个项目大量使用了CocosBuilder, 对于开发效率提高是巨大的. 一直计划写一篇博客谈谈CocosBuilder的多分辨率问题, 懒病加上一些疙疙瘩瘩的小事情, 拖延了一个多月, 才终于下 ...
- doubango(6)--Doubango协议栈中对RTP的管理
相关数据结构 1. tsip_dialog_invite_t 描述: 一个invite_dialog代表了一个invite期间的所有的信令流程,因此,它首先是一个普遍的dialog的特殊化结构, ...
- 故障排查实战案例——某电器ERP系统日志暴增
前言 本篇文章写在新春佳节前夕,也是给IT运维朋友一个警醒,在春节长假前请妥善体检自己的系统安心过个年. 千里之堤毁于蚁穴,一条看似简单的语句就能拖垮整个系统,您的SQL Server很久没体检了吧? ...
- 最简单的Linux虚拟机磁盘扩容方法
思路:1.虚拟机增加磁盘容量: 2.将增加的磁盘容量增加到系统分区中: 准备阶段: 下载Gparted软件:https://sourceforge.net/projects/gparted/files ...