您现在的位置是:网站首页 > 心得笔记

微信公众号开发——网页授权

盛悦2019-02-20596人围观
简介如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

微信网页授权

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。


微信授权的两种方式


1、以snsapi_base为scope发起的基本网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

2、以snsapi_userinfo为scope发起的详细网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。


w7.jpg


网页授权的作用


你进入到我们的第三方页面,我需要知道是谁进来了。如果是浏览器 通过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 —— 公众号的唯一标识


        w8(1).png


    2、REDIRECT_URI —— 授权后重定向的回调链接地址(实际要访问的地址), 请使用 urlEncode 对链接进行处理

        

    $redirect_uri = urlencode('https://blog.blonglee.me/test/getUserOpenId');

        注意:redirect_uri域名与后台配置一定要统一!

        

        后台配置——开发者工具-》公众平台测试账号-》体验接口权限表-》网页帐号-》网页授权后去用户信息-》修改

        

        w9(1).png


3、response_type —— 返回类型,填写code


4、scope —— 授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )


下图为scope等于snsapi_userinfo时的授权页面:


w7.jpg


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_inaccess_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


w10(1).png

效果如下:

w11(1).jpg