说明
数据库使用 mysql
使用sequelize操作mysql
流程说明
根据用户请求,拿到code,去请求微信接口获取openid,拿到后查询数据库是否存在该用户openid,存在 则将该用户的uuid放入token,返回token给用户,如果不存在,则创建该用户,将该用户的uuid放入token,并返回token。
·---------------------------------------------------------------
wxuser表模型
const Sequelize = require('sequelize');
let sequelize = require('../db/db')
let moment = require('moment');
const wxUser = sequelize.define('wxuser', {
// timestamps: false,
uuid: {
type: Sequelize.UUID,
primaryKey: true
},
session_key: {
type: Sequelize.STRING
},
openid: {
type: Sequelize.STRING
},
createdAt: {
type: Sequelize.DATE,
defaultValue: Sequelize.NOW,
get() {
return moment(this.getDataValue('ServiceTime')).format('YYYY-MM-DD HH:mm:ss');
}
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
get() {
return moment(this.getDataValue('ServiceTime')).format('YYYY-MM-DD HH:mm:ss');
}
}
});
// 创建完表后注释一下方法*******************************
// force: true 如果表已经存在,将会丢弃表
// wxUser.sync({force: true}).then(() => {
// // 表已创建
// return;
// });
module.exports = wxUser
·------------------------------------------------
数据库模型
let axios = require('axios')
let {wxapp} = require('../utils/wxConfig')
let wxUser = require('../model/wxUser')
const jwt = require('jsonwebtoken');
// 秘钥
const {secret} = require('../utils/jwtKey')
let wxLogin = (req, res) => {
let code = req.body.code
// console.log(wxapp.appId,wxapp.appSecret,code)
// 根据请求的code,调用微信接口获取openid
axios.get(`https://api.weixin.qq.com/sns/jscode2session?appid=${wxapp.appId}&secret=${wxapp.appSecret}&js_code=${code}&grant_type=authorization_code`).then(result => {
// 根据openid查询数据库
let data = result.data
wxUser.findOne({
where: {
openid: data.openid
}
}).then(rest => {
// 数据库没有该用户openid,则创建并返回token
if(!rest) {
wxUser.create({uuid: require('../utils/util').uuid,session_key: data.session_key, openid: data.openid}).then(resul =>{
let userInfo={
uuid: resul.uuid
}
const token = jwt.sign(userInfo, secret, { expiresIn: '1day' })
res.json({token: token})
// 删除uuid缓存,否则每次会取到相同的uuid
delete require.cache[require.resolve("../utils/util")]
}).catch(err => {
// console.log(err)
res.json({
msg: err
})
})
} else {
// 存在该用户,直接返回token
let userInfo={
uuid: rest.uuid
}
const token = jwt.sign(userInfo, secret, { expiresIn: '1day' })
res.json({token: token})
}
})
}).catch(err=>{
// console.log(err)
res.json({
msg: err
})
})
}
module.exports = {
wxLogin
}