springboot——集成阿里短信服务

本文详细介绍如何使用Java调用阿里云短信服务,包括快速入门步骤、Maven依赖配置、核心Java代码实现及缓存机制,助您快速上手短信验证功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、快速入门

1、注册账号;
2、进入短信服务,点击新手引导;
新手引导
3、申请国内短信签名 和 申请国内短信模版;
4、点击AccessKey创建AccessKey;
创建AccessKey
5、点击OpenAPI Explorer进入,选择“SendSms”
在这里插入图片描述
在这里插入图片描述

二、pom.xml配置

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter</artifactId>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
	</dependency>
	<dependency>
		<groupId>com.aliyun</groupId>
		<artifactId>aliyun-java-sdk-core</artifactId>
		<version>4.1.0</version>
	</dependency>
	<dependency>
		<groupId>com.google.guava</groupId>
		<artifactId>guava</artifactId>
		<version>28.1-jre</version>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
		<version>3.4</version>
	</dependency>
</dependencies>

三、Java代码

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.gson.Gson;
import org.apache.commons.lang3.RandomStringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * 短信服务
 */
@Service
public class SMSManagerImpl implements SMSManager {
    private static final Logger logger = LoggerFactory.getLogger(SMSManagerImpl.class);

    @Value("${aliyun.message.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyun.message.accessKeySecret}")
    private String accessKeySecret;
    @Value("${aliyun.message.signName}")
    private String signName;

    @Override
    public boolean sendSmsRegisterCode(String phoneNumber){
        String code = getRandomCode();
        boolean success = false;
        try {
            success = isSuccess(sendSms(phoneNumber, "SMS_170800227", code));
            if (success) {
                numberCodeMapping.put(phoneNumber, Optional.of(code));
            }
        } catch (ClientException e) {
            logger.error("发送短信异常:", e);
        }
        return success;
    }

    @Override
    public boolean validateRegisterCode(String phoneNumber, String code) {
        Optional<String> optional = getValue(phoneNumber);
        return optional.filter(s -> Objects.equals(code, s)).isPresent();
    }

    /**
     * 判断是否成功
     *
     * @param response
     * @return
     */
    private boolean isSuccess(CommonResponse response) {
        boolean success = response.getHttpStatus() == 200;
        if (!success) {
            logger.error("短信发送失败:" + response.getData());
        } else {
            Map map = new Gson().fromJson(response.getData(), Map.class);
            success = Objects.equals("OK", map.get("Code"));
        }
        return success;
    }

    private IAcsClient getClient() {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        return new DefaultAcsClient(profile);
    }

    /**
     * 发送短信验证码
     *
     * @param phoneNumber
     * @param templateCode
     * @param code
     * @return
     */
    private CommonResponse sendSms(String phoneNumber, String templateCode, String code) throws ClientException {
        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", phoneNumber);
        request.putQueryParameter("SignName", signName);
        request.putQueryParameter("TemplateCode", templateCode);
        request.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}");
        return getClient().getCommonResponse(request);
    }

    //============================================
    // 验证码缓存
    //============================================
    // 手机号<->验证码映射
    private LoadingCache<String, Optional<String>> numberCodeMapping = CacheBuilder.newBuilder()
            .concurrencyLevel(50).expireAfterAccess(15, TimeUnit.MINUTES)
            .build(new CacheLoader<String, Optional<String>>() {
                @Override
                public Optional<String> load(String key) throws Exception {
                    return Optional.empty();
                }
            });
    /**
     * 获取随机码
     *
     * @return
     */
    private String getRandomCode() {
        return RandomStringUtils.randomNumeric(6);
    }

    private Optional<String> getValue(String key) {
        try {
            return numberCodeMapping.get(key);
        } catch (ExecutionException e) {
            logger.error("获取缓存出错:", e);
        }
        return Optional.empty();
    }
}

四、参考链接

  1. Java实现短信验证码–(完整教程)
  2. Java调用阿里云短信通道服务【千锋出品】
  3. Java实现短信验证码(阿里云短信服务)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值