您现在的位置是:网站首页 > 心得笔记
微信公众号开发——网页授权
微信网页授权
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
微信授权的两种方式
1、以snsapi_base为scope发起的基本网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的详细网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

网页授权的作用
你进入到我们的第三方页面,我需要知道是谁进来了。如果是浏览器 通过cookie和session 微信是通过openid来标识
openID如何获取
openID就是通过网页授权来获取的。
网页授权流程
第一步:用户同意授权,获取code
访问接口
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
将参数一一对应
1、APPID —— 公众号的唯一标识

2、REDIRECT_URI —— 授权后重定向的回调链接地址(实际要访问的地址), 请使用 urlEncode 对链接进行处理
$redirect_uri = urlencode('https://blog.blonglee.me/test/getUserOpenId');注意:redirect_uri域名与后台配置一定要统一!
后台配置——开发者工具-》公众平台测试账号-》体验接口权限表-》网页帐号-》网页授权后去用户信息-》修改

3、response_type —— 返回类型,填写code
4、scope —— 授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
下图为scope等于snsapi_userinfo时的授权页面:

5、state —— 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
第二步:通过code换取网页授权access_token
公众号可通过下述接口来获取网页授权access_token
获取code后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
将参数一一对应
1、appid—— 公众号的唯一标识
2、secret—— 公众号的appsecret
3、code—— 步骤一中获取到的code参数
4、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 | 用户授权的作用域,使用逗号(,)分隔 |
注意:如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止!!!
第三步:拉取用户信息(需scope为 snsapi_userinfo)
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
请求方法
http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明
| 参数 | 描述 |
|---|---|
| access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
| openid | 用户的唯一标识 |
| lang | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
返回说明
正确时返回的JSON数据包如下:
{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
| 参数 | 描述 |
|---|---|
| openid | 用户的唯一标识 |
| nickname | 用户昵称 |
| sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
| province | 用户个人资料填写的省份 |
| city | 普通用户个人资料填写的城市 |
| country | 国家,如中国为CN |
| headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
| privilege | 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) |
| unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 |
代码实现网页授权
在之前几篇代码基础上添加方法:
//微信网页授权——基本授权
public function getBaseInfo () {
//1、获取code
$appid = 'wx9886cbdb96107616';
$redirect_uri = urlencode('https://blog.blonglee.me/test/getUserOpenId');
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.
'&redirect_uri='.$redirect_uri .'&response_type=code&scope=snsapi_base&state=123#wechat_redirect';//获取code后,将code发送到url回调函数$redirect_uri code返回类型code scope授权域 两种类型 state随意定义 带一些参数过去
header('location:'.$url);
}
public function getUserOpenId () {
//2、获取网页授权access_token
$appid = 'wx9886cbdb96107616';
$appsecrect = 'cf51fd33152723d3408420fea54fabcd';
$code = $_GET['code'];
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecrect.'&code='.$code.'&grant_type=authorization_code';
$res = $this->http_curl($url, 'get', '', '');
var_dump($res);
$openid = $res['openid'];
//同样可以拿到用户进入页面的时间,比如说一天限制同一用户抽奖3次,那么进来一次少一次 统计为3次时 提示用户 抽奖机会用完了
//写我们自己的模板页面(比如用户想访问/front/act/show,它会先进入到getBaseInfo()中跳转到url页面授权页面,如果用户同意授权,再带着code和state参数跳转到redirect_uri真正访问的页面)
}//微信网页授权——详细授权
public function getUserDetail () {
//1、获取code
$appid = 'wx9886cbdb96107616';
$redirect_uri = urlencode('https://blog.blonglee.me/test/getUserInfo');
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.
'&redirect_uri='.$redirect_uri .'&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect';//获取code后,将code发送到url回调函数$redirect_uri code返回类型code scope授权域 两种类型 state随意定义 带一些参数过去
header('location:'.$url);
}
public function getUserInfo () {
//2、获取网页授权access_token
$appid = 'wx9886cbdb96107616';
$appsecrect = 'cf51fd33152723d3408420fea54fabcd';
$code = $_GET['code'];
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecrect.'&code='.$code.'&grant_type=authorization_code';
$res = $this->http_curl($url, 'get', '', '');
$access_token = $res['access_token'];
$openid = $res['openid'];
//3、拉取用户openid
$url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
$res = $this->http_curl($url, 'get', 'json', '');
var_dump($res);
}注意:网页授权机制只能在微信里面,所以我们这里通过一个变通的方法——转为二维码,通过微信扫描,我这里使用的是草料二维码生成器https://cli.im/text

效果如下:

上一篇:微信公众号开发——模板消息接口
下一篇:微信公众号开发——JS-SDK