1. 项目概述
短信验证码是现代应用中最基础的安全验证手段之一。作为后端开发者,我们经常需要对接第三方短信平台实现验证码发送功能。在Node.js环境下,由于异步I/O的特性,如何正确处理短信发送的异步流程和回调处理就显得尤为重要。
我最近刚完成了一个电商项目的短信模块开发,踩了不少坑也积累了些经验。今天就来详细聊聊Node.js中实现短信验证码接口的全流程,包括异步发送、回调处理、防刷策略等关键环节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与准备
2.1 短信平台选择
国内常见的短信平台有阿里云短信、腾讯云短信、云片等。我最终选择了阿里云短信,主要基于以下几点考虑:
- 文档完善,API设计规范
- 到达率和稳定性有保障
- 提供详细的发送记录和统计报表
- 支持签名和模板审核
提示:选择短信平台时,除了考虑价格因素,更要关注到达率和稳定性。有些小平台价格便宜但到达率可能只有70%-80%,这对验证码场景是不可接受的。
2.2 项目依赖安装
我们需要安装以下npm包:
bash复制npm install alibabacloud/dysmsapi-20170525 # 阿里云短信SDK
npm install redis # 用于存储验证码
npm install express # Web框架
npm install body-parser # 解析请求体
3. 核心实现流程
3.1 初始化短信客户端
首先创建sms.js文件初始化短信客户端:
javascript复制const Dysmsapi = require('@alicloud/dysmsapi-20170525');
const Config = require('./config');
const clientConfig = {
accessKeyId: Config.accessKeyId,
accessKeySecret: Config.accessKeySecret,
endpoint: 'dysmsapi.aliyuncs.com'
};
const client = new Dysmsapi(clientConfig);
3.2 发送验证码接口实现
创建/sendCode接口处理验证码发送:
javascript复制const express = require('express');
const router = express.Router();
const redis = require('redis');
const client = redis.createClient();
router.post('/sendCode', async (req, res) => {
const { phone } = req.body;
// 1. 生成随机验证码
const code = Math.floor(100000 + Math.random() * 900000);
// 2. 存储到Redis,设置5分钟过期
await client.setEx(`sms:${phone}`, 300, code);
// 3. 发送短信
const sendSmsRequest = new SendSmsRequest({
phoneNumbers: phone,
signName: '你的签名',
templateCode: '你的模板ID',
templateParam: `{"code":"${code}"}`
});
try {
const result = await client.sendSms(sendSmsRequest);
if (result.body.Code === 'OK') {
res.json({ success: true });
} else {
throw new Error(result.body.Mes
