公众号可以通过微信网页授权机制,那么这两种

2019-09-26 17:24 来源:未知

方法二:以snsapi_base为scope发起网页授权,先用公众号的appid和secret获取微信公众号的全局唯一凭证access_token,然后用拿到的access_token调用公众号的“用户管理接口”中的“获取用户信息接口”获得unionID。

参数说明

如果请求正确,返回值:

正确的JSON返回结果:

获取公众号全局唯一access_token

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

            $curl = new Curl();            $curl->setOption(CURLOPT_SSL_VERIFYPEER, false);            $tokenresult = $curl->get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $secret);

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

用户无论从pc端登录网站还是从微信浏览器中访问网站,我们都能获取unionID,从而实现了多点登录的用户识别。

 "headimgurl":    "

这种方法在微信浏览器中的体验并不好,因为当用户在微信浏览器中浏览网页时点击了某个网页触发登录功能时会弹出授权窗口,而比较好的体验应该是,用户触发登录功能时应该是无感知的,下面的方法二就可以实现这种需求。

1 第一步:用户同意授权,获取code

如果请求正确的话,返回值:

{"errcode":40029,"errmsg":"invalid code"} 

返回值就不详细写了,其中就有用户的unionID。

1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息; 

然后用拿到的access_token和openid获取unionID:

请求方法

用户授权登录后重定向到网站A的登录页,并带回code和state参数。先拿code获取网页授权access_token:

以snsapi_login为scope发起网页授权,先拿网站应用的appid和secret用授权接口获取“网页授权access_token”,再利用“网页授权access_token”通过“拉取用户信息的api接口”拉取用户信息从而获得unionId。

关于特殊场景下的静默授权

调用公众号“获取用户信息接口”:

返回说明

方法一:以snsapi_userinfo为scope发起网页授权,获取unionID过程与pc端的相同,但要用到微信公众号中的服务号appid和secret获取网页授权access_token。

3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可 

此方法适合场景:在不使用微信公众号的情况下,通过微信开放平台下的网站应用来实现pc端网站的微信扫码登录功能。这个场景需求相对来说比较简单,可参考按照微信开放平台的技术文档“网站应用”--“微信登录功能”一节来实现编码,下面只把用户扫描二维码授权微信登录(用户扫描二维码并在微信客户端弹出的授权窗口点击确认登录后)后如何获取unionID的方法和过程描述下。

5 附:检验授权凭证(access_token)是否有效

1 参数          是否必须    说明2 appid          是    应用唯一标识,在微信开放平台提交应用审核通过后获得3 secret         是    应用密钥AppSecret,在微信开放平台提交应用审核通过后获得4 code           是    填写第一步获取的code参数5 grant_type     是    填authorization_code

3 第三步:刷新access_token(如果需要)

1,先看pc端的解决方案

第一步:用户同意授权,获取code


关于UnionID机制

{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN","openid":"OPENID", "scope":"SCOPE" }参数             说明access_token    接口调用凭证expires_in      access_token接口调用凭证超时时间,单位refresh_token   用户刷新access_tokenopenid          授权用户唯一标识scope           用户授权的作用域,使用逗号分隔

若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。 

3,总结

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

1                 $response = $curl->get('https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $token . '&openid=' . $wxresult->openid . '&lang=zh_CN');

{ "errcode":40003,"errmsg":"invalid openid"}

 1 { 2    "subscribe": 1, 3    "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 4    "nickname": "Band", 5    "sex": 1, 6    "language": "zh_CN", 7    "city": "广州", 8    "province": "广东", 9    "country": "中国",10 11    "headimgurl":  "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ412 13 eMsv84eavHiaiceqxibJxCfHe/0",14   "subscribe_time": 1382694957,15   "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"16   "remark": "",17 18   "groupid": 0,19 20   "tagid_list":[128,2]21 }22 23 参数说明24 参数    说明25 subscribe    用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。26 openid    用户的标识,对当前公众号唯一27 nickname    用户的昵称28 sex    用户的性别,值为1时是男性,值为2时是女性,值为0时是未知29 city    用户所在城市30 country    用户所在国家31 province    用户所在省份32 language    用户的语言,简体中文为zh_CN33 headimgurl    用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。34 subscribe_time    用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间35 unionid    只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。36 remark    公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注37 groupid    用户所在的分组ID(兼容旧的用户分组接口)38 tagid_list    用户被打上的标签ID列表
参数 是否必须 说明
appid 公众号的唯一标识
secret 公众号的appsecret
code 填写第一步获取的code参数
grant_type 填写为authorization_code   
1 {"access_token":"ACCESS_TOKEN","expires_in":7200}2 3 参数                    说明4 access_token           获取到的凭证5 expires_in            凭证有效时间,单位:秒

{ "access_token":"ACCESS_TOKEN",    

1             header('Location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid2                 . '&redirect_uri=http%3A%2F%2Fwww.host.com%2Fsite%2Fcallback'3                 . '&response_type=code&scope=snsapi_base&state=state#wechat_redirect');4             exit;

{    "openid":" OPENID",  

1         $curl = new Curl();2         $wxresponse = $curl->get('https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid3             . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code');4         $wxresult = json_decode($wxresponse);

正确时返回的JSON数据包如下:

1     //获取用户个人信息2     $response = $curl->get('https://api.weixin.qq.com/sns/userinfo?access_token=' . $wxresult->access_token3         . '&openid=' . $wxresult->openid);

 "refresh_token":"REFRESH_TOKEN",    

1              // 用户是从微信访问此页面,直接调用微信验证2              header('Location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid3                 . '&redirect_uri=http%3A%2F%2Fwww.host.com%2Fsite%2Fcallback'4                 . '&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect');5              exit;

code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 

请求参数说明:

2 第二步:通过code换取网页授权access_token

可以看到除access_token外,还可以获得openid。

错误时的JSON返回示例:

如果正确的话,返回值示例:

 "refresh_token":"REFRESH_TOKEN",   

假设网站A有以下功能需求:1,pc端微信扫码登录;2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点识别用户。那么这两种需求下用户的unionID该如何获取呢?

scope为snsapi_base

发起授权请求,因为以snsapi_base为scope发起网页授权请求,所以授权是静默的,用户是无感知的,微信公众平台开发文档网页授权一节中有说明。

错误时微信会返回JSON数据包如下(示例为openid无效):

请求方法

2,再看手机端微信浏览器的解决方案

尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。 

请求方法

{"errcode":40029,"errmsg":"invalid code"} 

 "scope":"SCOPE" } 

请求方法

code&scope=snsapi_userinfo&state=STATE#wechat_redirect 

参数说明

 "country":"COUNTRY",    

3、如果需要,开发者可以刷新网页授权access_token,避免过期 

{ "access_token":"ACCESS_TOKEN",  

参数说明

www.129028.com 1

scope为snsapi_userinfo 

  • 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 

参考链接(请在微信客户端中打开此链接体验): 

1、引导用户进入授权页面同意授权,获取code 

4eMsv84eavHiaiceqxibJxCfHe/46",  

www.129028.com,获取第二步的refresh_token后,请求以下链接获取access_token:  

参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔

 "expires_in":7200,    

参数 是否必须 说明
appid 公众号的唯一标识
grant_type 填写为refresh_token
refresh_token 填写通过access_token获取到的refresh_token参数  

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

参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
openid 用户的唯一标识
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
scope 用户授权的作用域,使用逗号(,)分隔

 "openid":"OPENID",    

TAG标签:
版权声明:本文由www.129028.com-澳门金沙唯一官网www129028com发布于编程新闻,转载请注明出处:公众号可以通过微信网页授权机制,那么这两种