您现在的位置是:网站首页 > 心得笔记
微信公众号开发——网页授权
微信网页授权
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
微信授权的两种方式
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