背景 📘

最近公司某个项目需要接入阿里云短信服务,整体而言对接难度不大,但是闲暇之余也看了一些博客,发现一个问题就是有的博客确实贴了大量的代码以及各种网址,但细心的我发现看着很全的代码,为什么复制粘贴到自己的代码中就用不了了呢?

弯弯绕绕走了一圈才知道代码是给了,但是没有给全。于是本着一颗开源分享的心 💖,把完整代码贴出来。

上代码 🔻

1️⃣ pom.xml文件 添加对应的依赖

 <!-- 阿里云短信服务 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>tea-openapi</artifactId>
            <version>0.3.6</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>tea-console</artifactId>
            <version>0.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>tea-util</artifactId>
            <version>0.2.23</version>
        </dependency>

2️⃣ application.yml 文件

# 阿里云短信服务
aliyun:
  sms:
    accessKeyId: 配置你的accessKeyId
    accessKeySecret: 配置你的accessKeySecret
    endpoint: dysmsapi.aliyuncs.com #这个不需要改
    signName: 配置你的signName
    smsCodeTemplateCode: 配置你的smsCodeTemplateCode

3️⃣ SmsClientConfig.java

package 这里替换成你自己的package

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import com.aliyun.teaopenapi.models.Config;

/**
 * 阿里云短信服务配置类
 */
@Component
public class SmsClientConfig {

    //阿里云账号的accessKeyId
    @Value("${aliyun.sms.accessKeyId}")
    private String accessKeyId;

    //阿里云账号的accessKeySecret
    @Value("${aliyun.sms.accessKeySecret}")
    private String accessKeySecret;

    //短信服务访问的域名
    @Value("${aliyun.sms.endpoint}")
    private String endpoint;

    @Bean("smsClient")
    public com.aliyun.dysmsapi20170525.Client createClient() throws Exception{
        Config config = new Config().setAccessKeyId(accessKeyId)
                .setAccessKeySecret(accessKeySecret);
        config.endpoint = endpoint;
        return new com.aliyun.dysmsapi20170525.Client(config);
    }
}

4️⃣ 编写SendCodeService.java

package 这里替换成你自己的package

/**
 * 阿里云短信服务Service接口
 *
 * @author yicheng
 * @date 2024-11-25
 */
public interface SendCodeService {
    /**
     * 发送短信验证码
     *
     * @param phoneNumber 手机号
     */
    void sendSmsCode(String phoneNumber, String randomCode);
}

5️⃣ 编写SendCodeServiceImpl实现类

package 这里替换成你自己的package

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponseBody;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teautil.models.RuntimeOptions;
import com.google.common.collect.Maps;
import 这里替换成你自己的
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import java.util.HashMap;

/**
 * 阿里云短信服务Service接口
 *
 * @author yicheng
 * @date 2024-11-25
 */
@Slf4j
@Service
public class SendCodeServiceImpl implements SendCodeService {

    @Resource
    private com.aliyun.dysmsapi20170525.Client smsClient;

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

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

    @Override
    public void sendSmsCode(String phoneNumber, String randomCode) {
        HashMap<Object, Object> templateParamMap = Maps.newHashMap();
        templateParamMap.put("code", randomCode);
      
        SendSmsRequest sendSmsRequest = new SendSmsRequest();
        sendSmsRequest.setPhoneNumbers(phoneNumber);
        sendSmsRequest.setSignName(signName);
        sendSmsRequest.setTemplateCode(smsCodeTemplateCode);
        sendSmsRequest.setTemplateParam(JSONUtil.toJsonStr(templateParamMap));
        try {
            SendSmsResponse sendSmsResponse = smsClient.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
            // 200为成功
            SendSmsResponseBody body = sendSmsResponse.getBody();
            // code和message为OK成功
            String code = body.getCode();
            String message = body.getMessage();
            if (StrUtil.equals("OK", code) && StrUtil.equals("OK", message)) {
                log.info("向 手机号:{} 用户发送短信验证码成功!验证码为:{}", phoneNumber, randomCode);
            } else {
                log.warn("向 手机号:{} 用户发送短信验证码失败!验证码为:{}", phoneNumber, randomCode);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

写在最后 🐝

通过以上代码,可以根据项目的实际需求进行使用。⭕️以上内容也可根据实际情况进行裁剪选择使用,切勿一成不变。


The end.

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐