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

1,先看pc端的解决方案

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

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

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

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

请求参数说明:

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

如果请求正确,返回值:

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

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

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

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

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

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

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

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

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

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

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

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

获取公众号全局唯一access_token

            $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);

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

 {"access_token":"ACCESS_TOKEN","expires_in":7200}

 参数                    说明
access_token 获取到的凭证
expires_in 凭证有效时间,单位:秒

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

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

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

 {
"subscribe": 1,
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "广州",
"province": "广东",
"country": "中国", "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4 eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time": 1382694957,
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark": "", "groupid": 0, "tagid_list":[128,2]
} 参数说明
参数 说明
subscribe 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
openid 用户的标识,对当前公众号唯一
nickname 用户的昵称
sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
city 用户所在城市
country 用户所在国家
province 用户所在省份
language 用户的语言,简体中文为zh_CN
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
subscribe_time 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
remark 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
groupid 用户所在的分组ID(兼容旧的用户分组接口)
tagid_list 用户被打上的标签ID列表

 3,总结

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


微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别的更多相关文章

  1. 获取网页URL地址及参数等的两种方法(js和C#)

    转:获取网页URL地址及参数等的两种方法(js和C#) 一 js 先看一个示例 用javascript获取url网址信息 <script type="text/javascript&q ...

  2. linux尝试登录失败后锁定用户账户的两种方法

    linux尝试登录失败后锁定用户账户的两种方法 更新时间:2017年06月23日 08:44:31   作者:Carey    我要评论   这篇文章主要给大家分享了linux尝试登录失败后锁定用户账 ...

  3. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  4. tensorflow中的函数获取Tensor维度的两种方法:

    获取Tensor维度的两种方法: Tensor.get_shape() 返回TensorShape对象, 如果需要确定的数值而把TensorShape当作list使用,肯定是不行的. 需要调用Tens ...

  5. APP自动化测试获取包名的两种方法

    获取包名的两种方法: 一.通过aapt获取 1.进入aapt.exe所在路径 2.在地址栏输入cmd回车,打开dos命令窗口. 3.在命令窗口输入 aapt dump badging 拖入apk 回车 ...

  6. docker inspect获取详细参数的两种方法

    docker inspect xx 返回的是一个json格式的数据 以下为部分返回值 [ { "Id": "706813b0da107c4d43c61e3db9da908 ...

  7. Spring Security获取已登录的用户信息的两种方法

    第一种是直接从session中手动拿: @RequestMapping(value = "/user", method = RequestMethod.GET)public Res ...

  8. thinkphp获取特定字段的两种方法

    thinkphp getField( )和field( ) 2014年10月05日 ⁄ 综合 ⁄ 共 1509字 ⁄ 字号 小 中 大 ⁄ 评论关闭 做数据库查询的时候,比较经常用到这两个,总是查手册 ...

  9. js获取url参数的两种方法

    js获取参数,在以前我都是用正在去拆分,然后获取,这种方式感觉是最简单的 方式1: function QueryString(item) { var sValue=location.search.ma ...

随机推荐

  1. Javascript面向对象类文章目录

    1.javaScript的原型继承与多态性 2.JavaScript的继承实现方式 3.JS中 call() 与apply 方法

  2. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  3. 前端学HTTP之字符集

    前面的话 HTTP报文中可以承载以任何语言表示的内容,就像它能承载图像.影片或任何类型的媒体那样.对HTTP来说,实体主体只是二进制信息的容器而已.为了支持国际性内容,服务器需要告知客户端每个文档的字 ...

  4. Java多态性——分派

    一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...

  5. ASP.NET中画图形验证码

    context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...

  6. WebLogic的安装和配置以及MyEclipse中配置WebLogic

    WebLogic 中间件: 是基础软件的一大类,属于可复用软件的范畴,顾名思义,中间件属于操作系统软件与应用软件的中间,比如:JDK,框架,weblogic. weblogic与tomcat区别 : ...

  7. error C4430:missing type specifier 解决错误

    错误    3    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int ...

  8. Postman - 功能强大的 API 接口请求调试和管理工具

    Postman 是一款功能强大的的 Chrome 应用,可以便捷的调试接口.前端开发人员在开发或者调试 Web 程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的 Fi ...

  9. 海鑫智圣:物联网漫谈之MQTT协议

    什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...

  10. 跟我一起数据挖掘(23)——C4.5

    C4.5简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C4.5的目 ...