wx.login 接口获得临时登录凭证 code,服务端验证code生成Token

2023-12-13 08:45:05

功能描述

调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台账号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

wx.login({
  success (res) {
    if (res.code) {
      //发起网络请求
      wx.request({
        url: 'https://example.com/onLogin',
        data: {
          code: res.code
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

请添加图片描述

  1. 通过wx.login获取code
  2. 将code发送给我们自己的服务器
  3. 我们自己的服务器需要将appid+appsecret+code,三者结合到一起发送给微信服务器(appsecret的获取后面会说)
  4. 当微信服务器拿到appid+appsecret+code,会返回给我们的服务器一些信息包括session_key和openid
  5. 项目服务器将session_key和openid保存下来生成token并返回给客户端
  6. 客户端调把token保存下来,以后每一次发送请求必须携带token

AppID和appsecret获取

项目服务器端需要整合appid+appsecret+code三个信息,去微信服务器端换取session_key和openid,所以说我们需要一个微信服务区的接口

请求数据示例

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 

返回数据示例

{
"openid":"xxxxxx",
"session_key":"xxxxx",
"unionid":"xxxxx",
"errcode":0,
"errmsg":"xxxxx"
}

通过验证临时登录凭证code,生成Token

前端请求

wx.login({
  success: res => {
    // 发送 res.code 到后台换取 openId, sessionKey, unionId
    // 1. 拿到code
    console.log('code'+ res.code)
    const code = res.code
    // 2. 将code发送给服务器,这里就需要我们的接口了
    const token = wx.request({
      url: '/getopenid',
      data:code
    })
    // 3. 将token存入storge
    wx.setStorageSync('token', token);
  }
})

服务器端接口

router.get('/getopenid',async (ctx,next)=>{
  // 得到前台出来的code
  const code = ctx.query.code
  //整合三者
  const appId = '	wx43cf35f51c3f8fe9'
  const appSecret = 'a9001166ca156245dbbbd3709a062a64'

  const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`

  let result = await fly.get(url)
  const userinfo = result.data
  // 生成token(自定义登录状态),返回给前端
  const token = jwt.sign({user},'hahahae')
  ctx.body = token
})

文章来源:https://blog.csdn.net/m0_38013946/article/details/134848293
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。