上一篇
使用Java短信验证码接口需先集成服务商SDK或调用HTTP API,配置账号密钥后,通过代码生成随机验证码并调用发送方法,传入手机号、验证码内容及模板ID,最后处理返回结果验证发送状态。
短信验证码接口核心原理
- 业务流程
用户请求发送 → 服务器生成随机码 → 调用短信API → 用户接收 → 提交验证 → 服务器比对 - 技术组成
- 短信服务商(如阿里云、酷盾)
- API密钥(AccessKey)
- SDK/HTTP请求工具
- 服务器端Session或Redis存储
具体实现步骤(以阿里云为例)
步骤1:前期准备
- 注册服务商账号
- 阿里云官网开通短信服务
- 完成企业实名认证(个人账户限测试)
- 获取关键参数
AccessKey ID: LTAI5t******Qj8mZ AccessKey Secret: KZo168DFrg******g8jK 短信签名: "阿里云" (需审核) 模板ID: SMS_154950909 (示例:验证码${code},5分钟有效)
步骤2:项目集成SDK
Maven依赖

<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
步骤3:Java发送代码实现
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.*;
import com.aliyun.teaopenapi.models.*;
public class SmsUtil {
// 创建API客户端
public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret);
config.endpoint = "dysmsapi.aliyuncs.com"; // 固定Endpoint
return new Client(config);
}
// 发送短信方法
public static void sendVerificationCode(String phone, String code) throws Exception {
Client client = createClient("LTAI5t******Qj8mZ", "KZo168DFrg******g8jK");
SendSmsRequest request = new SendSmsRequest()
.setPhoneNumbers(phone) // 目标手机号
.setSignName("阿里云") // 审核通过的签名
.setTemplateCode("SMS_154950909") // 模板ID
.setTemplateParam("{"code":"" + code + ""}"); // 动态参数
SendSmsResponse response = client.sendSms(request);
if ("OK".equals(response.getBody().getCode())) {
System.out.println("短信发送成功,验证码:" + code);
} else {
throw new RuntimeException("短信发送失败: " + response.getBody().getMessage());
}
}
// 生成6位随机验证码
public static String generateCode() {
return String.valueOf((int)((Math.random() * 9 + 1) * 100000));
}
// 示例调用
public static void main(String[] args) throws Exception {
String code = generateCode();
sendVerificationCode("13800138000", code); // 替换实际手机号
}
}
步骤4:服务端验证逻辑
// 使用Redis存储验证码(推荐)
redisTemplate.opsForValue().set(
"sms:13800138000", // Key格式:sms:手机号
code,
5, TimeUnit.MINUTES // 5分钟有效期
);
// 用户提交后验证
String storedCode = redisTemplate.opsForValue().get("sms:13800138000");
if (code.equals(storedCode)) {
System.out.println("验证成功");
redisTemplate.delete("sms:13800138000"); // 立即清除
} else {
System.out.println("验证码无效或过期");
}
关键安全措施
- 防刷机制
- 单IP/手机号60秒内限1次(使用Redis记录发送时间)
- 每日单手机号上限5次
- 验证码安全
- 6位以上数字+字母组合
- 服务端校验后立即销毁
- 传输加密
- HTTPS协议调用API
- AccessKey Secret严禁前端暴露
常见问题解决
| 问题现象 | 原因 | 解决方案 |
|---|---|---|
isv.BUSINESS_LIMIT_CONTROL |
频率超限 | 检查1小时/天发送量 |
isv.INVALID_PARAMETERS |
模板参数错误 | 检查JSON格式和变量名 |
| 收不到短信 | 运营商拦截 | 申请免拦截签名 |
| 延时>10秒 | 服务商队列拥堵 | 接入多通道冗余(如酷盾备用) |
推荐服务商对比
| 服务商 | 免费额度 | 特点 | 适用场景 |
|---|---|---|---|
| 阿里云 | 200条/月 | 高并发稳定,文档完善 | 企业级应用 |
| 酷盾 | 100条/月 | 与微信生态集成好 | 社交类应用 |
| 容联云 | 无 | 专属通道,三网直达 | 金融等高安全需求 |
法律合规要求
- 用户手机号需经明确授权(GDPR/《个人信息保护法》)需包含退订方式(如“回T退订”)
- 禁止发送营销内容(验证码模板需通过服务商审核)
引用说明:本文代码示例基于阿里云官方SDK 2.1.0版本编写,安全规范参考《信息安全技术 个人信息安全规范》(GB/T 35273-2020),实际开发请以各平台最新文档为准:
- 阿里云短信API文档
- 酷盾短信Java SDK
通过以上步骤,开发者可快速实现安全可靠的短信验证码功能,重点在于:严格管控发送频率、验证码生命周期≤5分钟、敏感信息全链路加密,企业用户建议购买独享通道提升到达率。


