微信小程序如何实现通过邮箱验证修改密码功能

发布于:2025-06-25 ⋅ 阅读:(13) ⋅ 点赞:(0)

        基于腾讯云开发(Tencent Cloud Base)实现小程序邮箱验证找回密码功能的完整逻辑说明及关键代码实现。结合安全性和开发效率,方案采用 ​​云函数 + 小程序前端​​ 的架构,使用 ​​Nodemailer​​ 发送邮件。Nodemailer 是一个专为 Node.js 设计的开源邮件发送库,用于在服务端高效、灵活地处理电子邮件发送任务。它通过简化邮件传输协议(如 SMTP)的复杂性,为开发者提供了强大的邮件管理能力。

一、实现原理

用“快递站”比喻来解释这个流程:​

  1. ​快递站代发包裹(系统统一发验证码)​
    公司搭了个快递站(系统邮箱),专门代发验证码“包裹”。用户填个收件地址(邮箱),站长立刻打包发出📮。

  2. ​用户只管收件(注册流程)​
    用户啥也不用干,留完地址就坐等收件。拆开包裹填个验证码,立马进门(完成验证)✅。

  3. ​站长领把钥匙(管理员配一次)​
    给快递站申请个专属钥匙(获取QQ邮箱授权码)🔑;把钥匙存进公司保险柜(更新数据库)。 从此站长随时能开门发件,永不失效!

二、功能逻辑流程图如下所示:

三、JavaScript代码

Page({
  data: {
    account: '',
    email: '',
    code: '',
    newPassword: ''
  },

  // 输入绑定
  onAccountInput(e) { this.setData({ account: e.detail.value }); },
  onEmailInput(e) { this.setData({ email: e.detail.value }); },
  onCodeInput(e) { this.setData({ code: e.detail.value }); },
  onPwdInput(e) { this.setData({ newPassword: e.detail.value }); },

  // 发送验证码
  async sendCode() {
    const { account, email } = this.data;
    try {
      const res = await wx.cloud.callFunction({
        name: 'sendEmailCode',
        data: { account, email }
      });
      wx.showToast({ title: '验证码已发送至邮箱' });
    } catch (err) {
      wx.showToast({ title: '发送失败', icon: 'error' });
    }
  },

  // 重置密码
  async resetPassword() {
    const { account, email, code, newPassword } = this.data;
    try {
      await wx.cloud.callFunction({
        name: 'verifyCodeAndReset',
        data: { account, email, code, newPassword }
      });
      wx.showToast({ title: '密码重置成功' });
    } catch (err) {
      wx.showToast({ title: '验证码错误或已过期', icon: 'error' });
    }
  }
});

四、云函数实现(Node.js)

1. 发送验证码云函数 (sendEmailCode)
const cloud = require('wx-server-sdk');
const nodemailer = require('nodemailer');
cloud.init();

// 配置QQ邮箱(需开启SMTP并获取授权码)
const transporter = nodemailer.createTransport({
  host: 'smtp.qq.com',
  port: 465,
  secure: true,
  auth: {
    user: 'your_email@qq.com', // 发件邮箱
    pass: 'your_authorization_code' // QQ邮箱授权码
  }
});

exports.main = async (event) => {
  const { account, email } = event;
  const db = cloud.database();

  // 校验账号和邮箱是否匹配
  const user = await db.collection('users').where({
    account,
    email
  }).get();

  if (user.data.length === 0) {
    throw new Error('账号或邮箱不匹配');
  }

  // 生成6位随机验证码
  const code = Math.random().toString().slice(2, 8);
  
  // 存储验证码(有效期5分钟)
  await db.collection('verificationCodes').add({
    data: {
      account,
      code,
      email,
      createdAt: new Date()
    }
  });

  // 发送邮件
  const mailOptions = {
    from: 'your_email@qq.com',
    to: email,
    subject: '密码重置验证码',
    html: `<p>您的验证码是:<b>${code}</b>,5分钟内有效</p>`
  };

  await transporter.sendMail(mailOptions);
  return { success: true };
};

2.验证并重置密码云函数 (verifyCodeAndReset)

exports.main = async (event) => {
  const { account, email, code, newPassword } = event;
  const db = cloud.database();
  const now = new Date();
  
  // 查询有效验证码(5分钟内)
  const codeRecord = await db.collection('verificationCodes')
    .where({
      account,
      email,
      code
    })
    .orderBy('createdAt', 'desc')
    .get();

  // 验证码校验
  if (codeRecord.data.length === 0 || 
      now - codeRecord.data[0].createdAt > 5 * 60 * 1000) {
    throw new Error('验证码错误或已过期');
  }

  // 更新密码(需加密存储)
  const hashedPassword = require('crypto')
    .createHash('md5')
    .update(newPassword)
    .digest('hex');

  await db.collection('users').where({ account }).update({
    data: { password: hashedPassword }
  });

  // 删除已用验证码
  await db.collection('verificationCodes').doc(codeRecord.data[0]._id).remove();
  return { success: true };
};

五、安全增强建议

  1. ​邮箱授权码管理​​:将授权码存入腾讯云​​环境变量​​(process.env.EMAIL_AUTH_CODE),避免硬编码。
  2. ​验证码时效性​:数据库存储验证码时记录时间戳,校验时检查是否超过5分钟。
  3. ​防刷机制​:限制同一邮箱/账号的发送频率(如1分钟1次),可在云函数中增加频率校验逻辑。
  4. ​密码加密​:使用 ​​MD5/SHA256​​ 对新密码加密存储(示例中使用了MD5)。

 六、注意事项

  1. ​QQ邮箱配置​
    • 需登录QQ邮箱网页版 → 设置 → 账户 → 开启 ​​SMTP服务​​ → 获取16位授权码。
  2. ​云函数依赖安装​
    • 在云函数目录下执行 npm install nodemailer 安装邮件模块。
  3. ​真机测试​
    • 微信开发者工具中可能无法调用云函数发送邮件,需使用真机测试。


网站公告

今日签到

点亮在社区的每一天
去签到