Spring Boot中集成阿里云短信发送

以下是在 Spring Boot 中集成阿里云短信服务发送短信的完整步骤:



 1. 阿里云控制台配置
 1.1 开通短信服务
 登录 [阿里云控制台](https://home.console.aliyun.com/)
 搜索并开通 短信服务(SMS)

 1.2 创建 AccessKey
 进入 AccessKey 管理 页面
 创建 AccessKey(保存 AccessKey ID 和 AccessKey Secret)

 1.3 申请短信签名
 进入短信服务控制台
 导航至 国内消息 > 签名管理
 添加签名(需企业资质审核,测试时可选择类型为“验证码”)

 1.4 申请短信模板
 导航至 国内消息 > 模板管理
 创建模板(如验证码模板):
  plaintext
  模板内容:您的验证码为${code},有效期5分钟。
  



 2. Spring Boot 项目集成
 2.1 添加依赖
xml
<! 阿里云短信 SDK >
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyunjavasdkcore</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyunjavasdkdysmsapi</artifactId>
    <version>2.1.0</version>
</dependency>


 2.2 配置参数 (application.yml)
yaml
aliyun:
  sms:
    accesskeyid: youraccesskeyid
    accesskeysecret: youraccesskeysecret
    signname: 你的短信签名     控制台申请的签名名称
    templatecode: SMS_123456789   控制台申请的模板CODE
    regionid: cnhangzhou       默认杭州区域


 2.3 短信服务工具类
java
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;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class SmsService {

    @Value("${aliyun.sms.accesskeyid}")
    private String accessKeyId;

    @Value("${aliyun.sms.accesskeysecret}")
    private String accessKeySecret;

    @Value("${aliyun.sms.signname}")
    private String signName;

    @Value("${aliyun.sms.templatecode}")
    private String templateCode;

    @Value("${aliyun.sms.regionid}")
    private String regionId;

    public SendSmsResponse sendSms(String phoneNumber, String code) throws ClientException {
        // 初始化客户端
        IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        DefaultProfile.addEndpoint(regionId, regionId, "Dysmsapi", "dysmsapi.aliyuncs.com");
        IAcsClient client = new DefaultAcsClient(profile);

        // 构建请求
        SendSmsRequest request = new SendSmsRequest();
        request.setPhoneNumbers(phoneNumber);       // 目标手机号(多个用逗号分隔)
        request.setSignName(signName);              // 短信签名
        request.setTemplateCode(templateCode);     // 短信模板CODE
        request.setTemplateParam("{\"code\":\"" + code + "\"}"); // 模板参数(JSON格式)

        // 发送请求
        return client.getAcsResponse(request);
    }
}




 3. 发送短信示例
 3.1 在 Controller 中调用
java
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SmsController {

    private final SmsService smsService;

    public SmsController(SmsService smsService) {
        this.smsService = smsService;
    }

    @GetMapping("/sendSms")
    public String sendSms(@RequestParam String phone, @RequestParam String code) {
        try {
            SendSmsResponse response = smsService.sendSms(phone, code);
            return "发送成功,请求ID: " + response.getRequestId();
        } catch (Exception e) {
            return "发送失败: " + e.getMessage();
        }
    }
}




 4. 测试短信发送
 4.1 调用 API
使用 Postman 或浏览器访问:
plaintext
GET http://localhost:8080/sendSms?phone=13812345678&code=123456


 4.2 验证结果
 若返回 OK 或 发送成功,检查手机是否收到短信。
 登录阿里云控制台,查看 短信服务 > 统计分析 > 发送记录。



 5. 常见问题解决
 5.1 错误码 isv.SMS_SIGNATURE_ILLEGAL
 签名未审核通过,需确保签名状态为 已审核。

 5.2 错误码 isv.INVALID_PARAMETERS
 模板参数格式错误,需确保参数为 JSON 格式(如 {"code":"123456"})。

 5.3 手机号格式问题
 国内手机号需以 +86 开头(如 +8613812345678)。

 5.4 权限不足
 确认 AccessKey 有短信服务权限(建议使用子账号并授权 AliyunDysmsFullAccess 策略)。



 6. 安全建议
 敏感信息保护:将 AccessKey Secret 存储在环境变量或配置中心(如 Nacos、Apollo)。
 限流控制:阿里云默认每秒 100 条短信,需根据业务调整配额。
 验证码防刷:在服务端增加 IP/手机号限流逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值