持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
微信登录-流程分析
目标
了解微信登录流程
微信登录流程
- 直接在前端调用微信接口登录,一般需要code(api获取),AppID(小程序ID),AppSecret(小程序密钥)访问微信服务器,成功返回:1. openid是用户标识 2. session_key是解密用的(UnionID解密等) 不建议客户端直接调用微信接口登录(不安全)。
- 调用自己的服务器接口(会对接微信服务器)
名词解释:
code临时登录凭证, 有效期五分钟, 通过wx.login()获取session_key会话密钥, 服务端通过 code2Session 获取openId用户在该小程序下的用户唯一标识, 永远不变, 服务端通过 code 获取unionId用户在同一个微信开放平台帐号(公众号, 小程序, 网站, 移动应用)下的唯一标识, 永远不变appId小程序唯一标识appSecret小程序的 app secret, 可以和 code, appId 一起换取 session_key
其他名词
rawData不包括敏感信息的原始数据字符串,用于计算签名encryptedData包含敏感信息的用户信息, 是加密的signature用于校验用户信息是否无篡改iv加密算法的初始向量
扩展阅读:微信登录
微信登录-实操
目标
获取微信用户信息登录
接口:/api/public/v1/users/wxlogin
步骤
- 通过getUserProfile方法,获取微信用户信息
- 使用微信用户信息来调用ugo的接口登录,获取token
- 根据登录接口文档所需参数,调用接口
/packone/auth/index.vue
<view>
<button
+ @click="getUserInfo"
type="primary">
微信登录
</button>
</view>
async getUserInfo () {
const [error, userInfo] = await uni.getUserProfile({ desc: '获取微信用户信息' })
if (!error) {
console.log(userInfo)
this.login(userInfo)
}
},
// 调用接口登录
async login(user) {
// 登录所需参数
const { encryptedData, iv, rawData, signature } = user;
// 微信用户登录凭证=》code
const [err, data] = await uni.login();
if (!err) {
let res = await this.request({
url: "/api/public/v1/users/wxlogin",
method: "post",
data: {
encryptedData,
iv,
rawData,
signature,
code: data.code
}
});
console.log(res);
}
}
注意⚠️:
查看调用结果是400,无效的登录凭证code
如果登录失败
登录需要的后端接口appid: wx38d8faffac4d34d2(需要该appid拥有者添加开发者权限)
调用失败,是由于当前开发者AppID和服务器端使用的不一致造成
实际工作中,开发小程序=》向公司提供自己的微信号,管理员添加开发者权限=》使用公司的
appId进行小程序的开发
需要使用和后端接口一致的 appid
微信登录-保存token
目标
微信登录成功存储token
步骤
- 存储token到本地
- 返回到上一页
/packone/auth/index.vue
- 获取code
async onLoad () {
const [error, data] = await uni.login()
if (!error) {
console.log(data)
// code参数存储到this
this.code = data.code
}
},
- 传入用户信息和code登录
// 调用接口登录·
async login (user) {
// 登录所需参数
const { encryptedData, iv, rawData, signature } = user
// 微信用户登录凭证=》code
// const [err, data] = await uni.login()
let { msg, data } = await this.request({
url: "/api/public/v1/users/wxlogin",
method: "post",
data: {
encryptedData,
iv,
rawData,
signature,
code: this.code
}
})
// 存储token,返回上次访问页面
uni.setStorageSync("token", data.token)
uni.navigateBack()
}
注意⚠️:如果出现Error: Illegal Buffer错误说明
导致问题的原因是:session_key没有及时更新
在调用wx.login()之前调用了wx.getUserInfo()。在调用getUserInfo()时将获取到 iv 和encryptedData 传给后台,而后调用login(),此时的session_key可能会被新的session_key覆盖,就会导致后台在对数据解密时使用新的session_key去解密旧的encryptedData,如此就会Illegal Buffer报错。
解决:提前调用uni.login()