一步一步实现自己的小程序:实现后台登录

3,189 阅读3分钟

导语

为了方便为用户提供个性化的功能和服务,需要针对性的传送数据给前端,为了实现这一点,我们需要获取用户的登录状态,并且在我们的服务器端对这一状态进行管理和维护。相信很多同学都明白这一点,但是实现起来又摸不着头脑,不知道如何管理和维护登录状。通过本文和实例来实现在业务里如何接入和维护微信登录态。

接入流程

我们先看一下官方给的登录接入流程图时序图,我们根据该流程一步一步实现。

看到这张图,我们发现一共有三个角色:小程序开发者服务器(下面称:服务器)微信接口服务,我们来搞清楚这三者之间的联系,授权登录问题就迎刃而解了。

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发送到开发者服务器,也就是我们自己的后台。 这里我们需要明白为什么要发送到我们的服务器?而不是直接在接下来的代码中请求微信服务器呢?官方是这样告诉我们的。

  1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
  2. 临时登录凭证 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 校验登录换取 OpenIdsession_key -->
  • 向小程序返回结果

其中,1和2 步骤是在小程序内完成,3和4是在我们的服务器中完成,现在我们就可以确定登录状态维护的就是我们拿到的 OpenIdsession_key,剩下的操作可以围绕检验有没有这个标识来展开,有则是登录,无则是没有登录。

这里有个操作是不可取的,那就是`OpenId` 和 `session_key`不可直接返回给小程序,需要加密处理后返回,在后续的文章中会对此进行整改,请大家注意这一点,如果是练手的项目你可以不在乎。

推荐阅读

一步一步实现自己的小程序:登录,授权,获取用户信息