当前位置: 首页 > news >正文

Java项目中短信的发送

在 Java 项目中实现发送短信功能,通常需要借助第三方短信服务提供商(如阿里云、腾讯云、华为云等)的 API 接口,而非直接操作硬件设备。这些服务商会提供成熟的 SDK 和接口文档,简化开发流程。以下是详细实现步骤:

一、实现思路概述

发送短信的核心流程是:通过第三方服务商的 API 接口,将短信内容、接收号码等参数传递给服务商服务器,由服务商完成短信的实际下发。具体步骤如下:

  1. 选择第三方短信服务商并完成注册配置;
  2. 获取调用 API 所需的凭证(如 AccessKey、密钥等);
  3. 在项目中引入服务商提供的 SDK 或通过 HTTP 请求调用 API;
  4. 编写代码封装发送逻辑(参数校验、请求构建、响应处理);
  5. 处理异常情况(网络错误、参数错误、余额不足等)。

二、选择第三方短信服务商

主流的短信服务商包括:

  • 阿里云 SMS:国内市场占有率高,接口稳定,文档完善;
  • 腾讯云 SMS:与微信生态兼容,适合社交类应用;
  • 华为云 SMS:全球化覆盖较好,适合海外业务;
  • 百度云 SMS:性价比高,适合中小规模应用。

本文以阿里云 SMS为例进行讲解(其他服务商流程类似,仅 SDK 和参数略有差异)。

三、准备工作(阿里云为例)

1. 注册并开通服务
  • 登录阿里云官网,注册账号并完成实名认证;
  • 进入短信服务控制台,开通 “短信服务”(首次开通有免费额度)。
2. 获取访问凭证
  • 进入阿里云 AccessKey 控制台,创建 AccessKey ID 和 AccessKey Secret(API 调用的身份凭证,需妥善保管)。
3. 配置短信签名和模板

短信发送必须使用审核通过的 “签名” 和 “模板”(服务商为防止垃圾短信的强制要求):

  • 签名:短信发送者的标识(如公司名称、APP 名称),需提交资质审核;
  • 模板:短信内容的固定格式(如验证码模板:“您的验证码是,有效期分钟),需指定变量(如{code}`),审核通过后会获得 “模板 CODE”。

四、项目配置(Maven 为例)

pom.xml中引入阿里云 SMS 的 SDK 依赖(版本以官网最新为准):

<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.6.0</version> <!-- 核心SDK -->
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>2.1.0</version> <!-- 短信服务SDK -->
</dependency>

五、代码实现

1. 封装配置参数

将 AccessKey、签名、模板等参数抽取为配置类(或通过配置文件读取),避免硬编码:

public class SmsConfig {// 阿里云AccessKey IDpublic static final String ACCESS_KEY_ID = "your_access_key_id";// 阿里云AccessKey Secretpublic static final String ACCESS_KEY_SECRET = "your_access_key_secret";// 短信签名(需审核通过)public static final String SIGN_NAME = "你的签名";// 短信模板CODE(需审核通过)public static final String TEMPLATE_CODE = "SMS_123456789"; // 示例模板CODE// 阿里云短信API的端点(固定)public static final String DOMAIN = "dysmsapi.aliyuncs.com";
}
2. 编写短信发送工具类

核心逻辑:初始化阿里云客户端 -> 构建发送请求 -> 调用 API -> 处理响应结果。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;/*** 阿里云短信发送工具类*/
public class SmsSender {/*** 发送短信* @param phoneNumbers 接收短信的手机号(多个用逗号分隔,如"13800138000,13900139000")* @param templateParam 短信模板参数(JSON格式,如{"code":"123456"})* @return 发送结果(成功/失败原因)*/public static String sendSms(String phoneNumbers, String templateParam) {try {// 1. 初始化客户端(指定地域,阿里云短信服务默认使用"cn-hangzhou")IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", SmsConfig.ACCESS_KEY_ID, SmsConfig.ACCESS_KEY_SECRET);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", SmsConfig.DOMAIN, SmsConfig.DOMAIN);IAcsClient client = new DefaultAcsClient(profile);// 2. 构建发送请求SendSmsRequest request = new SendSmsRequest();request.setPhoneNumbers(phoneNumbers); // 接收手机号request.setSignName(SmsConfig.SIGN_NAME); // 短信签名request.setTemplateCode(SmsConfig.TEMPLATE_CODE); // 模板CODErequest.setTemplateParam(templateParam); // 模板参数(JSON)// 3. 调用API发送短信SendSmsResponse response = client.getAcsResponse(request);// 4. 处理响应结果(阿里云返回码:"OK"表示成功)if ("OK".equals(response.getCode())) {return "短信发送成功,消息ID:" + response.getRequestId();} else {return "短信发送失败:" + response.getMessage() + "(错误码:" + response.getCode() + ")";}} catch (ClientException e) {// 捕获客户端异常(如网络错误、参数错误等)return "发送异常:" + e.getMessage() + "(异常码:" + e.getErrCode() + ")";}}// 测试方法public static void main(String[] args) {// 发送验证码示例(模板参数为{"code":"123456"})String phone = "13800138000"; // 目标手机号String templateParam = "{\"code\":\"123456\"}"; // 模板参数(需与模板变量对应)String result = sendSms(phone, templateParam);System.out.println(result);}
}
3. 代码说明
  • 客户端初始化:通过DefaultAcsClient创建客户端,需传入地域(阿里云短信固定为cn-hangzhou)、AccessKey;
  • 请求参数
    • PhoneNumbers:接收手机号(支持多个,用逗号分隔);
    • SignName:审核通过的短信签名;
    • TemplateCode:审核通过的模板 CODE;
    • TemplateParam:模板变量的 JSON 字符串(需与模板中的变量名一致,如模板中的${code}对应参数{"code":"123456"});
  • 响应处理SendSmsResponsecode字段为OK表示发送成功,其他值表示失败(具体错误信息可参考阿里云错误码文档)。

六、异常处理

实际开发中需处理以下常见异常:

  1. ClientException:客户端异常(如网络超时、AccessKey 错误、参数格式错误);
  2. 余额不足:服务商返回isv.INSUFFICIENT_BALANCE错误码,需提醒用户充值;
  3. 频率限制:短时间内发送过多短信会触发限流(错误码isv.SMS_TEMPLATE_ILLEGAL等),需控制发送频率;
  4. 模板 / 签名未审核:错误码isv.SIGNATURE_NOT_FOUNDisv.TEMPLATE_NOT_FOUND,需检查配置。

七、注意事项

  1. AccessKey 安全:AccessKey 是 API 调用的凭证,切勿泄露(建议使用子账号 AccessKey,并限制权限);
  2. 模板变量校验:确保TemplateParam的 JSON 格式正确,且变量名与模板完全一致;
  3. 发送频率控制:根据服务商规定设置发送间隔(如同一手机号 1 分钟内最多发 1 条,1 小时内最多 5 条),避免被判定为垃圾短信;
  4. 生产环境配置:正式环境中,AccessKey、签名等参数应通过配置文件(如application.properties)或配置中心(如 Nacos)管理,而非硬编码;
  5. 日志记录:记录短信发送的详细日志(时间、手机号、结果),便于问题排查。

八、扩展:其他服务商适配

若切换为腾讯云、华为云等服务商,核心流程类似:

  1. 注册账号并获取对应凭证(如腾讯云的 SecretId/SecretKey);
  2. 引入对应 SDK 依赖;
  3. 替换客户端初始化和请求构建的代码(参考服务商官方文档)。

例如,腾讯云 SMS 的核心代码片段:

// 腾讯云SMS示例(需引入腾讯云SDK)
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
// ...(其他 imports)public class TencentSmsSender {public static void send() {// 初始化客户端Credential cred = new Credential("secretId", "secretKey");SmsClient client = new SmsClient(cred, "ap-guangzhou");// 构建请求SendSmsRequest req = new SendSmsRequest();req.setPhoneNumberSet(new String[]{"+8613800138000"}); // 手机号(带国家码)req.setSmsSdkAppId("1400xxxxxx"); // 应用IDreq.setSignName("你的签名");req.setTemplateId("SMS_12345678");req.setTemplateParamSet(new String[]{"123456"}); // 模板参数// 发送请求client.SendSms(req);}
}

通过以上步骤,即可在 Java 项目中快速实现短信发送功能。关键在于理解第三方 API 的调用逻辑,并做好参数校验和异常处理。

http://www.lryc.cn/news/623928.html

相关文章:

  • 密码学系列 - 零知识证明(ZKP) - 多种承诺方案
  • Java ConcurrentHashMap 深度解析
  • 【LeetCode 热题 100】(八)二叉树
  • EC11编码器
  • 集成电路学习:什么是SIFT尺度不变特征变换
  • 43 C++ STL模板库12-容器4-容器适配器-堆栈(stack)
  • 基于DSP+ARM+FPGA架构的储能协调控制器解决方案,支持全国产化
  • 电子电气架构 --- 自动驾驶汽车的下一步发展是什么?
  • 下降路径最小和
  • 【网络通信】TCP/IP 协议全方位解析​
  • java如何把字符串数字转换成数字类型
  • OpenCV 图像处理核心技术:边界填充、算术运算与滤波处理实战
  • android aidl相关学习
  • 常用的SQL语句
  • java16学习笔记
  • topographic terrain
  • AMBA-AXI and ACE协议详解(七)
  • 计算机网络---跳板机与堡垒机
  • 如何理解事件循环和JS的异步?
  • Oracle查看历史会话信息视图介绍
  • 深入理解QFlags:Qt中的位标志管理工具
  • Springboot项目3种视图(JSP、Thymeleaf、Freemarker)演示
  • 【SpringBoot】SpringBoot的异步任务、邮件发送、定时任务
  • Spring Bean 的生命周期:从创建到销毁的完整旅程​
  • 好看的个人导航系统多模板带后台
  • React端到端测试
  • 通达信【牛股妖股埋伏】副图+选股指标
  • Shell脚本-while循环应用案例
  • nn.Module模块介绍
  • 计算机视觉(一):nvidia与cuda介绍