nodejs实现微信小程序

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"

  }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值