微信静默登录功能的实现和获取用户身份的原理

914 阅读3分钟

背景:

在微信相关的业务开发过程中,我们经常需要获取用户的相关信息,比如最最常见的一个场景——

在_微信用户端_中,我们打开一款公众号或者小程序中 ,点击其中的一个外链接(比如加在文章的外链或者公众号消息),跳转到第三方Web。这个时候我们希望微信用户端能通过微信网页的授权机制,去获取用户信息,以便实现业务逻辑。

1.微信第三方的静默登录

在这里我们给静默登录下一个定义:

微信第三方静默登录即开发者调用wx.login的API,成功调用后,会返回一个code, 这个code代表_用户登录凭证。_

wx.login的API相关说明,在详见下面的信息:developers.weixin.qq.com/miniprogram…

let code;
wx.login({
    success:(res)=>{
        code = res.code
    }
})

在我们获取code后,再次调用开发者服务器的接口,把code作为参数传递给开发者服务器

const response = await wx.request({
    url: // 开发者服务器的API
    data:{
        code: code // 将code作为参数传递给开发者服务器
    }
})

开发者服务器接收到code以后,再次调用auth.code2Session的接口,该接口的相关文档如下:developers.weixin.qq.com/miniprogram…

const js_code = code // 从前端获取的登录凭证
const appid // 小程序的appId,用于标识这个小程序或者公众号
const secret // 小程序的appSecret,解密数据专用
const grant_type  // 授权类型
const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${ appid }&secret=${ secret }&js_code=${js_code}&grant_type=${authorization_code}`

上面的接口会返回用户的相关信息,我们可以根据需要获取其中的openId或者其他相关信息,然后我们可以把需要的信息返回给前端。

2.微信识别用户的机制

在以上的步骤全部完成后,我们就能获取用户的相关信息了,接口返回的信息如下——

// 返回的用户信息相关的数据
{
openid //用户唯一标识session_key//会话密钥unionid //用户在开放平台的唯一标识符详见 errcode //错误码errmsg//错误信息
}

其中的openId和unionId ,就是微信识别用户的2种机制。

  • openId

  • unionId

在这里我们浅浅地讲一下_微信号,openId 和 unionId_ 的关系。

假设,我们每个用户有且仅有一个微信号,这个微信号是我们的唯一标识符

当我们会获取用户信息的时候,_微信官方不会把微信号_直接返回给我们。

因为这涉及到网络安全问题,试想,当你的微信号可以被暴露出去的时候,是不是随便什么人都可以加你好友呢?

所以用微信号作为唯一标识符的做法是违背安全法则的,所以我们需要一个安全的方案设计,那么是什么呢?

这个时候我们就需要使用openId

openId的定义如下:

当我们在微信客户端中,去打开一个****小程序或者公众号的时候,我们会生成一个唯一的标识符,这个标识符跟用户是否授权登录无关,只要访问了这个小程序或者公众号,就会生成。

它的计算方式如下——

openId = secret(微信号 + appId)

其中,微信号是用户自己的,appid是公众号或者小程序的唯一标识符sercet是该公众号或者小程序的加密算法。

但是接下来就会出现另外一个问题了,假如某个公众平台,既有公众号也有小程序,同一个微信号进入之后,在公众号生成了openId , 在小程序又生成了一个openId ,岂不是同一个用户变成了2人?

这个时候就引入了第二个概念unioinId。

unionId在同一个微信开放平台下的所有应用中,都是相同的

简单点说,当同一个微信公众号,在同一个公众平台,既进入了小程序,也进入了公众号,它的unionId都是不变的。

openId可以不同,但是onionId一定相同,就可以识别用户了。