上节课我们讲了 nodejs 操作 redis,今天我们来讲解微信小程序登录。

代码

微信服务端接口文档地址

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

简而言之,小程序前端调用 wx.login 获取 code, 传给服务端。服务端携带 code 和 appid,secret 发给微信服务器,获取到用户 openid 和 sessionkey。

新增小程序的配置文件

routes/user.js

1
2
3
router.post('/wechatlogin',function (ctx, next) {
  return userApi.wechatLogin(ctx)
})

config/miniapp.js

1
2
3
4
5
6
const appid = ''
const secret = ''

module.exports={
    appid,secret
}

api/user.js 文件,里面写用户 api 的相关方法。model/usermodel.js 文件,里面写用户模型相关方法。

api/user.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
const miniappConfig = require('../../config/miniapp')
const koa2Req = require('koa2-request')
const response = require('../core/response')
const userModel = require('../model/usermodel')
const request = require('koa2-request')
const { md5 } = require('../util/cryp')
const Redis = require('../model/redis')
const redis = new Redis()
const resp = new response()

const wechatLogin = async (ctx) => {

    const code = ctx.request.body.code
    const body = await wxUser(code)

    if (body.errcode > 0) {
        ctx.body = resp.fail(10001, body.errmsg)
        return
    }
    let userId = await userModel.getUserByOpenid(body.openid)
    if(userId == 0){
        userId = await userModel.createUser(body.openid)
    }
    const token = md5(body.openid)
    redis.set(token,{ "openid": body.openid,"userId":userId })
    ctx.body = resp.setData({ "token": token })
    return
}
const wxUser = async (code) => {
    const appid = miniappConfig.appid
    const secret = miniappConfig.secret
    const loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code"
    const wxresult = await koa2Req(loginUrl).catch((err) => {
        console.log("err", err);
    });
    return JSON.parse(wxresult.body)
}

model/usermodel.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const mysql = require("./mysql")

const getUserByOpenid = async(openid)=>{
    let sql = "select id from user where openid=?"
    return await mysql.exec(sql,[openid])
}
const createUser= async(openid)=>{
    let sql = "insert into `user` (openid)values(?) "
    const insertData = await mysql.exec(sql,[openid])
    return insertData.insertId
}
module.exports = {
    getUserByOpenid,createUser
}

运行

1
2
3
4
5
POST http://localhost:3000/user/wechatlogin

{
    "code":""
}

token 是客户端调用用户相关接口需要携带的凭据,服务端通过 token 识别用户身份信息,相当于 session。

总结

微信小程序登录就讲完了,你掌握了吗?有问题欢迎到群里和志同道合的小伙伴一起交流。

下节课我们讲解手机号登录,继续加油吧,Let’s go!