当前位置: 首页 > 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.dtcms.com/a/335854.html

相关文章:

  • 判断回文数的两种高效方法(附Python实现)
  • Webflux核心概念、适用场景分析【AI Chat类项目选型优势】
  • 数据链路层(2)
  • MySQL的事务基础概念:
  • 显式编程(Explicit Programming)
  • 深入解析函数指针及其数组、typedef关键字应用技巧
  • Go面试题及详细答案120题(21-40)
  • Pycharm Debug详解
  • C++ vector的使用
  • 自动驾驶中的传感器技术34——Lidar(9)
  • 前端项目练习-王者荣耀竞赛可视化大屏 -Vue纯前端静态页面项目
  • Springboot项目3种视图(JSP、Thymeleaf、Freemarker)演示
  • 图解直接插入排序C语言实现
  • 3.逻辑回归:从分类到正则化
  • pyecharts可视化图表组合组件_Grid:打造专业数据仪表盘
  • 矿物分类案列 (一)六种方法对数据的填充
  • C#WPF实战出真汁13--【营业查询】
  • 《设计模式》工厂方法模式
  • 数据结构与算法之 leetcode 98. 验证二叉搜索树 (前序,中序,后序遍历)
  • 影刀 RAP 迁移华为云备忘录数据到得到笔记
  • GitHub Copilot:AI编程助手的架构演进与真实世界影响
  • mac电脑开发嵌入式基于Clion(stm32CubeMX)
  • 深入了解linux系统—— 线程控制
  • IDE/去读懂STM32CubeMX 时钟配置图(有源/无源晶振、旁路/晶振模式、倍频/分频)
  • 三、k8s 1.29 之 安装2
  • 重温k8s基础概念知识系列三(工作负载)
  • 什么是GD库?PHP中7大类64个GD库函数用法详解
  • Kafka 面试题及详细答案100道(23-35)-- 核心机制2
  • 基础IO_系统文件IO | 重定向【Linux】
  • 《程序员修炼之道》第三四章读书笔记