登录流程
- 三个角色:
- 小程序端
- 微信自己的服务器
- 公司的服务器
appId 作用说明
- appid 是微信账号的唯一标识,这个是固定不变的;
如果了解微信公众号开发的就需要注意一下,小程序的appid 和 公众号的appid 是不一致的
openid
- openid:每一个微信用户的唯一标识
openid一般不保存在客户端,一般保存在服务器端。
我们自己的服务器会和微信的服务器进行通信。到时候微信的服务器就会返回一个session_key和openid,到时候我们的服务器会把这个openid存到数据库中。
session_key 功能说明
- 微信客户端通过wx.getUserInfo()获取用户的信息
后台有时候也需要获取微信客户端的用户信息,因此,就需要利用session_key这个秘钥来从微信平台中获取 - 签名校验以及数据加解密涉及用户的会话密钥 session_key。 开发者应该事先通过 wx.login 登录流程获取会话密钥 session_key 并保存在服务器。为了数据不被篡改,开发者不应该把 session_key 传到小程序客户端等服务器外的环境。
- 后台如果想要获取用户的信息,就一定要知道session_key,如果session_key 过期,就需要客户端完成一次登录的流程
登录的过程:
我们的小程序端先调用接口 wx.login(),向微信的服务器发送请求,获取到一个code,这个code在我们的客户端是没有用的。
1.1 这个code的作用是发送到我们自己的服务器
1.2 微信小程序端通过调用wx.request()将code发送到我们的服务器
1.3 服务器拿到code和appid(一开始申请到的)和appsecret
1.4 appsecret是怎么获取的:在小程序控制台,和appid在一个地方,可以重置。
我们的服务器与微信的服务器进行一次沟通,将code+appid+appsecret这三个东西传递给微信的服务器,
微信的服务器会返回session_key和openid。服务器就拿到了openid,不会传给客户端,而是将openid存到服务器。
3.1 有时候,公司希望不仅能用微信登录,还可以用用户名+密码登录小程序。
3.2 一般用账号+密码登录的时候,会在第一步,先让用户输入用户和密码,服务器验证通过以后,再将账号+密码+code发送给微信的服务器,换取openid;之后将openid+账号+密码存储在数据库的某个表中(t_user)。
服务器端验证通过之后,会向客户端返回一个token,登录状态。客户端会把token保存起来。小程序中有个storage,一般将token保存在storage中。
下次再打开小程序的时候,就可以先从缓存中拿出token来,发送给服务器,验证一下是否过期,不用每次打开都登录一下了。如果过期了再登录,没过期的话就直接使用这个。
以后客户端向服务器发送请求(请求需要在登录的状态下才会返回结果时),会携带token。服务器会根据token查询openid或者session_key和其他数据。然后将数据返回给客户端。
简化后的流程:
调用wx.login获取code
调用wx.request发送code到我们自己的服务器(我们自己的服务器会返回一个登录状态的标识,比如token)
将登录状态的标识token进行存储,以便下次使用
请求需要登录状态的接口时,带上这个token。
登录流程图
获取用户信息
- wx.getUserInfo(OBJECT)
withCredentials:true
当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;当 withCredentials 为 false 时,不要求有登录态,返回的数据不包含 encryptedData, iv 等敏感信息。
wx.getUserInfo({
lang:'zh_CN',
withCredentials:true, //withCredentials 为 true 时需要先调用wx.login接口
success: function(res) {
console.log(res)
}
})
- 返回参数
// iv 解密后为 用户的session-key
HyVFkGl5F5OQWJZZaNzBBg==
// encryptedData 解密后为以下 json 结构
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark":
{
"appid":"APPID",
"timestamp":TIMESTAMP
}
}
静默授权
- 小程序静默注册登录+授权
- 要授权就要token,下面教你怎么获取koken
1.wx.login API 可以获得随机的code码,这个code码可以在后台获取token。
拿api工厂为例,这个code码传给后台就能拿到token
wx.login({
success: function(res) {
// 获取到 code 将code 传过去请求接口
// 接口返回 token 和 openid
uni.setStorageSync('token ', res.data.data.token);
uni.setStorageSync('openid', res.data.data.openid);
}
})
2.获取完token后台会生成一个匿名信息,这时候调用
wx.getUserProfile 获取你的wx个人信息
详见:wxAIP文档
把个人信息和生成的tonken传给后台的修改接口就可以把你用tonken生成的匿名信息补全
AIP工厂的修改接口如下:
user/modify
这一步就完成了授权
修改完以后再去后台请求用户信息的接口,这样请求的接口就是完整的,就可以渲染到页面了