多平台微信统一登陆

对各平台登陆和 unionid 获取稍做介绍。时效,权限等问题可在参考链接中了解详情

unionid 机制说明

用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。

登陆流程 & unionid 获取

微信登陆场景大致分为 app、公众号、小程序和 web pc 端。在流程上除了小程序比较特殊外,其他基本一致。

小程序

登陆 & 敏感数据获取

  1. 小程序端调用 wx.login() 获取 临时登录凭证code(有效期五分钟) ,并回传到服务端。

  2. 服务端调用 auth.code2Session 接口,换取 用户唯一标识 OpenID会话密钥 session_key

  3. 小程序端带上登陆态参数 {withCredentials: true} 调用 wx.getUserInfo() 接口,获取解密时所需的 加密算法的初始向量 iv 和 包括敏感数据在内的完整用户信息的 加密数据 encryptedData,并回传到服务端。需要注意的是,要求此前调用过 wx.login 且登陆态尚未过期,返回的数据才会包含 encryptedData, iv 等信息。

加密数据解密算法

服务端对 加密数据(encryptedData) 进行对称解密,即可获取用户的 openId 和 unionId。解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  4. 对称解密算法初始向量 为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。 参数来源于开放平台中对网站应用。

方式二 页面内微信登陆二维码
  1. 在页面中先引入如下JS文件(支持https):
1
http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js
  1. 在需要使用微信登录的地方实例以下JS对象:
1
2
3
4
5
6
7
8
9
10
var obj = new WxLogin({
self_redirect: true, // true:手机点击确认登录后可以在 iframe 内跳转到 redirect_uri,false:手机点击确认登录后可以在 top window 跳转到 redirect_uri。默认为 false。
id: "login_container", // 【必填】 第三方页面显示二维码的容器id
appid: "", // 【必填】应用唯一标识,在微信开放平台提交应用审核通过后获得
scope: "", // 【必填】应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
redirect_uri: "", // 【必填】重定向地址,需要进行UrlEncode
state: "", // 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
style: "", // 提供"black"、"white"可选,默认为黑色文字描述。
href: "" // 自定义样式链接,第三方可根据实际需求覆盖默认样式。
});

以上两种方式,用户允许授权后,都将重定向到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
2
3
4
5
6
7
8
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

拓展 调用微信接口

access_token 是调用授权关系接口的调用凭证,微信提供了许多智能接口,凭借 access_token 即可调用

获取用户信息
1
2
http请求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
微信智慧接口-语义理解接口
1
2
3
4
5
6
7
8
9
10
11
http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/semantic/semproxy/search?access_token=YOUR_ACCESS_TOKEN
POST数据格式:JSON
POST数据例子:
{
"query":"查一下明天从北京到上海的南航机票",
"city":"北京",
"category": "flight,hotel",
"appid":"wxaaaaaaaaaaaaaaaa",
"uid":"123456"
}

详细可见:微信智能接口

参考链接

微信官方文档 - 小程序 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

作者

朷北

发布于

2020-03-09

更新于

2021-04-15

许可协议

评论