多平台微信统一登陆
对各平台登陆和 unionid 获取稍做介绍。时效,权限等问题可在参考链接中了解详情
unionid 机制说明
用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。
如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。
登陆流程 & unionid 获取
微信登陆场景大致分为 app、公众号、小程序和 web pc 端。在流程上除了小程序比较特殊外,其他基本一致。
小程序
登陆 & 敏感数据获取
小程序端调用 wx.login() 获取 临时登录凭证code(有效期五分钟) ,并回传到服务端。
服务端调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
小程序端带上登陆态参数
{withCredentials: true}
调用 wx.getUserInfo() 接口,获取解密时所需的 加密算法的初始向量 iv 和 包括敏感数据在内的完整用户信息的 加密数据 encryptedData,并回传到服务端。需要注意的是,要求此前调用过 wx.login 且登陆态尚未过期,返回的数据才会包含 encryptedData, iv 等信息。
加密数据解密算法
服务端对 加密数据(encryptedData) 进行对称解密,即可获取用户的 openId 和 unionId。解密算法如下:
- 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
- 对称解密的目标密文为 Base64_Decode(encryptedData)。
- 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
- 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。
另外,为了应用能校验数据的有效性,会在敏感数据加上数据水印(watermark)
web pc 端
微信登录基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 需要提前在 微信开放平台 注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的 AppID 和 AppSecret,申请微信登录且通过审核后,可开始接入流程。
获取 code
方式一 跳转到指定链接获取授权
访问 https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 请求 code。 参数来源于开放平台中对网站应用。
方式二 页面内微信登陆二维码
- 在页面中先引入如下JS文件(支持https):
1 | http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js |
- 在需要使用微信登录的地方实例以下JS对象:
1 | var obj = new WxLogin({ |
以上两种方式,用户允许授权后,都将重定向到redirect_uri的网址上,并且带上code和state参数 redirect_uri?code=CODE&state=STATE
access_token & unionid
通过 code 获取 access_token
1 | https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code |
正确的返中即包含 unionid:
1 | { |
拓展 调用微信接口
access_token 是调用授权关系接口的调用凭证,微信提供了许多智能接口,凭借 access_token 即可调用
获取用户信息
1 | http请求方式: GET |
微信智慧接口-语义理解接口
1 | http请求方式: POST(请使用https协议) |
详细可见:微信智能接口
参考链接
微信官方文档 - 小程序 UnionID 机制说明 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
微信官方文档 - 小程序 开放数据校验与解密 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html
微信开放平台 - 网站应用接入 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html