const db = require("../db/index");
const EasyWechat = require('node-easywechat');
const crypto = require('crypto');
先下载依赖
npm install -S node-easywechat // crypto下载可能会有问题,最好去npm官网查看
exports.login = async (req, res) => {
try {
//前端使用的是一键登录
const { code, iv, data } = req.body;
const config = {
app_id: '小程序id',
secret: '在开发管理可以查看',
};
const createtime = Math.floor(new Date().getTime() / 1000);
const app = new EasyWechat.Factory.MiniProgram(config);
const session = await app.auth.session(code);
if (!session || !session.openid) {
return res.status(400).json({ error: 'Invalid code' });
}
//拿到信息后的操作
const sql = 'SELECT user_id FROM pet_third WHERE openid = ? LIMIT 1';
const params = [session.openid];
const loginip = ip.address();
db.query(sql, params, (err, result) => {
if (err) {
return res.status(400).json(err);
}
const have = result[0];
const source = '微信';
if (have) {
const updateSql = 'UPDATE pet_third SET access_token = ? WHERE openid = ?';
const updateParams = [session.session_key, session.openid];
db.query(updateSql, updateParams, async (err, result) => {
if (err) {
return res.status(400).json(err);
}
const user_info = await getUserinfo(have.user_id);
user_info.token = session.session_key
const updateSql2 = `UPDATE pet_user SET updatetime = '${createtime}' WHERE id = '${user_info.id}'`;
db.query(updateSql2,(err2,result)=>{
if (err2) return res.status(400).json(err2);
return res.json({ message: '登陆成功l', data: user_info ,code:1 });
})
});
} else {
const phone = getUserPhone(session.session_key, data, iv);
const phoneData = JSON.parse(phone);
// 保存用户信息
let user_id;
if (!Array.isArray(phoneData)) {
const insertUserSql = 'INSERT INTO pet_user (mobile, status, source, nickname, avatar,loginip,createtime) VALUES (?, ?, ?, ?, ?,?,?)';
const insertUserParams = [phoneData.phoneNumber, 'normal', source, nickname, avatarUrl,loginip,createtime];
db.query(insertUserSql, insertUserParams, (err, result) => {
if (err) {
return res.status(400).json(err);
}
user_id = result.insertId;
const insertThirdSql = 'INSERT INTO pet_third (user_id, openid, access_token) VALUES (?, ?, ?)';
const insertThirdParams = [user_id, session.openid, session.session_key];
db.query(insertThirdSql, insertThirdParams, async (err, result) => {
if (err) {
return res.status(400).json(err);
}
// console.log(result[0]);
const userinfo = await getUserinfo(user_id);
userinfo.token = session.session_key
if (userinfo) {
return res.json({ message: 'true', data: userinfo,code:1 });
} else {
return res.status(500).json({ error: '登录失败',code:0 });
}
});
});
}
}
});
} catch (error) {
return res.status(500).json({ error: '登录失败' });
}
};
获取手机号解密方法,这是node,在php的合集里好像自带,我在node里没找到,,
function getUserPhone(sessionKey, encryptedData, iv) {
const appid = '小程序id';
if (sessionKey.length !== 24) {
return 'sessionKey错误';
}
//sessionKey 密钥 在小程序开发管理里
const aesKey = Buffer.from(sessionKey, 'base64');
if (iv.length !== 24) {
return 'iv错误';
}
const aesIV = Buffer.from(iv, 'base64');
const aesCipher = Buffer.from(encryptedData, 'base64');
const decipher = crypto.createDecipheriv('aes-128-cbc', aesKey, aesIV);
let result = decipher.update(aesCipher, 'binary', 'utf8');
result += decipher.final('utf8');
const dataObj = JSON.parse(result);
if (!dataObj) {
return '3';
}
if (dataObj.watermark.appid !== appid) {
return '4';
}
return result;
}
下载依赖的话,如果出问题,就去npm官网查查,当时的命令忘了,
这是我的package.json文件
"dependencies": {
"alipay-sdk": "^3.6.0", //这是支付宝的
"bcryptjs": "^2.4.3",
"cors": "^2.8.5",
"crypto": "^1.0.1",
"esm": "^3.2.25",
"express": "^4.17.1",
"image-size": "^1.0.2",
"ip": "^1.1.8",
"jsonwebtoken": "^8.5.1",
"md5": "^2.3.0",
"mkdirp": "^3.0.1",
"multer": "^1.4.5-lts.1",
"mysql": "^2.18.1",
"node-easywechat": "^2.12.5", //微信
"node-fetch": "^2.6.12",
"path": "^0.12.7",
"qrcode": "^1.5.3",
"qrcode-terminal": "^0.12.0",
"request": "^2.88.2",
"request-promise": "^4.2.6",
"svg-captcha": "^1.4.0",
"wechaty": "^1.20.2"
}