阿里云短信

创建key和秘钥

在这里插入图片描述

在短信控制台申请签名和短信模板(要先开通短信服务,购买额度),拿到签名名称模板CODE,发送短信要用

java发送短信

  • 引入依赖
        <!-- 阿里云短信 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.0</version>
        </dependency>
  • 工具类
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.wzw.entity.SmsConfigEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class SmsUtil {

    /**
     * 发送短信方法
     * @param smsConfig 短信服务配置信息(包含密钥、签名等)
     * @param phone 接收短信的手机号码
     * @param templateParam 模板参数,用于替换短信模板中的变量
     * @return 返回短信发送结果的 JSON 对象
     */
    public JSONObject sendSms(SmsConfigEntity smsConfig, Long phone, Map<String,String> templateParam) {

        try {
            // 设置 HTTP 请求连接和读取的超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");

            // 创建 DefaultProfile 实例,用于初始化客户端配置
            DefaultProfile profile = DefaultProfile.getProfile(
                "cn-hangzhou", 
                smsConfig.getAccessKeyId(), 
                smsConfig.getAccessKeySecret()
            );

            // 创建 IAcsClient 实例,用于发起 API 请求
            IAcsClient client = new DefaultAcsClient(profile);

            // 创建 CommonRequest 实例,用于构造请求参数
            CommonRequest request = new CommonRequest();

            // 设置请求方式为 POST
            request.setSysMethod(MethodType.POST);

            // 配置 Endpoint。中国站请使用dysmsapi.aliyuncs.com
            request.setSysDomain(smsConfig.getEndpoint());

            // 设置 API 版本号
            request.setSysVersion("2017-05-25");

            // 设置要调用的 API 接口名称:发送短信
            request.setSysAction("SendSms");

            // 设置接收短信的手机号码(序列化为 JSON 字符串)
            request.putQueryParameter("PhoneNumbers", JSON.toJSONString(phone));

            // 设置短信签名名称,控制太申请的签名名称
            request.putQueryParameter("SignName", smsConfig.getSignName());

            // 设置短信模板参数(序列化为 JSON 字符串),这里是键值对,templateParam是{"code":"1234"},模板:
您的验证码${code},该验证码5分钟内有效,请勿泄漏于他人!
            request.putQueryParameter("TemplateParam", JSON.toJSONString(templateParam));

            // 设置区域 ID(固定值)
            request.putQueryParameter("RegionId", "cn-hangzhou");

            // 设置短信模板编码,就是模板CODE
            request.putQueryParameter("TemplateCode", smsConfig.getTemplateCode());

            // 发起请求并获取响应
            CommonResponse response = client.getCommonResponse(request);

            // 解析返回的 JSON 数据
            JSONObject responseJSONObject = JSONObject.parseObject(response.getData());

            // 获取返回状态码
            String code = responseJSONObject.get("Code").toString();

            // 记录日志:返回码
            log.info("SMS code:{}", code);

            // 记录日志:手机号及模板参数
            log.info("手机号: {},{}", JSON.toJSONString(phone), JSON.toJSONString(templateParam));

            // 根据返回码判断发送结果
            switch (code) {
                case "OK":	// 短信发送成功
                    log.info("短信发送成功");
                    break;
                case "isv.OUT_OF_SERVICE":
                    log.error("短信发送失败,原因:业务停机!");
                    break;
                case "isv.ACCOUNT_NOT_EXISTS":
                    log.error("短信发送失败,原因:账户不存在!");
                    break;
                case "isv.ACCOUNT_ABNORMAL":
                    log.error("短信发送失败,原因:账户异常!");
                    break;
                case "isp.SYSTEM_ERROR":
                    log.error("短信发送失败,原因:系统错误!");
                    break;
                case "isv.MOBILE_NUMBER_ILLEGAL":
                    log.error("短信发送失败,原因:非法手机号!");
                    break;
                case "isv.BUSINESS_LIMIT_CONTROL":
                    log.error("短信发送失败,原因:业务限流!");
                    break;
                case "isv.AMOUNT_NOT_ENOUGH":
                    log.error("短信发送失败,原因:账户余额不足!");
                    break;
                default:
                    log.error("短信发送失败: {}", JSON.toJSONString(responseJSONObject));
            }

            // 返回解析后的 JSON 响应对象
            return responseJSONObject;
        } catch (Exception e) {
            // 捕获异常并记录日志
            log.error("SendSmsUtils sendSms error:{}", e.getMessage());
            // 返回异常信息的 JSON 表示
            return JSONObject.parse(e.getMessage());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值