导语
为了方便为用户提供个性化的功能和服务,需要针对性的传送数据给前端,为了实现这一点,我们需要获取用户的登录状态,并且在我们的服务器端对这一状态进行管理和维护。相信很多同学都明白这一点,但是实现起来又摸不着头脑,不知道如何管理和维护登录状。通过本文和实例来实现在业务里如何接入和维护微信登录态。
接入流程
我们先看一下官方给的登录接入流程图时序图,我们根据该流程一步一步实现。
看到这张图,我们发现一共有三个角色:小程序 ,开发者服务器(下面称:服务器),微信接口服务,我们来搞清楚这三者之间的联系,授权登录问题就迎刃而解了。
1.wx.login()获取code
onLaunch: function () {
wx.login({
success(res) {
if (res.code) {
//发起网络请求
//wx.request()
console.log(res.code)
} else {
//登录请求失败
console.log('登录失败!' + res.errMsg)
}
}
})
},
结果如下:
code: "061qqQCk0tO5Ko1zFMDk0NsLCk0qqQCk"
非常好! 我们已经拿到了code
,成功迈出了第一步,在接下来我们将获取的code
发送到开发者服务器,也就是我们自己的后台。
这里我们需要明白为什么要发送到我们的服务器?而不是直接在接下来的代码中请求微信服务器呢?官方是这样告诉我们的。
- 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
- 临时登录凭证 code 只能使用一次
原来是出于安全考虑。好的我们继续。
2.wx.request()发送code
小程序:
wx.request({
url: 'http://127.0.0.1:8000/wx/api/v1/user/login',
data:{code:res.code},
success:(res)=>{
console.table(res.data)
}
})
以上这个请求是发往我们自己的服务器上的,参数code
就是第一步中获取的到的。注意
:这个请求是在wx.login()成功的回调方法中执行(注释掉的伪代码),后面列出完整代码,现在理清楚流程就行。
3.登录凭证校验接口 appId+secret+code
服务器:
登录凭证校验,获得临时登录凭证 code
后调用微信小程序登录校验接口完成登录流程。
- 获取小程序发送过来的
code
- 调用登录校验接口,用
code
向微信服务器换取 用户唯一标识OpenId
和 会话密钥session_key
接口请求地址
GET https://api.weixin.qq.com/sns/jscode2session
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
appid | string | 是 | 小程序 appId | |
secret | string | 是 | 小程序 appSecret | |
js_code | string | 是 | 登录时获取的 code | |
grant_type | string | 是 | 授权类型,此处只需填写 authorization_code |
具体如下:
import requests
from django.views.decorators.http import require_http_methods
from weixin_backend import http
url = 'https://api.weixin.qq.com/sns/jscode2session'
@require_http_methods(["GET"])
def login(request):
try:
code = http.getParams(request, 'code')['code']
m_params = {
"appid": 'wx1be08eb3dc6f',
"secret": '4e6cb8b63265838a76b3869d391',
"js_code": code,
"grant_type": 'authorization_code'
}
res = requests.get(url, params=m_params)
return http.ok(res)
except TypeError as e:
return http.fail(str(e))
注意:以上 appid 与 secret 是伪造的值,替换成你们自己的
结果如下:
code: 1
data: {
session_key: "BkTyB5d8YxsP3xKu8D2APw==",
openid: "opy4h5b_FG31DKP9TCtk_NANHyAs"
}
msg: "success"
小结
好了,到目前为止我们走完了以下流程:
- 微信小程序在内部获取
code
--> - 发送
code
到服务器 --> - 服务器用
code
校验登录换取OpenId
和session_key
--> - 向小程序返回结果
其中,1和2 步骤是在小程序内完成,3和4是在我们的服务器中完成,现在我们就可以确定登录状态维护的就是我们拿到的 OpenId
和 session_key
,剩下的操作可以围绕检验有没有这个标识来展开,有则是登录,无则是没有登录。
这里有个操作是不可取的,那就是`OpenId` 和 `session_key`不可直接返回给小程序,需要加密处理后返回,在后续的文章中会对此进行整改,请大家注意这一点,如果是练手的项目你可以不在乎。