【SpringBoot集成阿里云短信服务实现短信验证码发送功能】 教学指南
事前准备
阿里云密钥申请-需要此密钥来绑定你的阿里云账号
- 登录阿里云官网,找到RAM控制台申请密钥,此密钥为子密钥,不是你的账号主密钥,虽然主密钥有最高权限,但是不推荐使用主账号,避免泄露风险
2.3. 短信服务购买,根据自己情况,价格很便宜,如果你账号有余额,应该不买也行,发送短信会自动从余额扣款,我就没有买扣的账户里的钱
4. 短信签名和模版申请 - 就是你的短信最后会以什么样式来发送
个人学习选择测试和学习就可以了,一般来说一个多小时就可以审核通过了,不要起名太官方,写明自己是测试使用的,除非你是商用,有执照
模版申请同理
SpringBoot集成短信服务
pom.xml
<properties>
<spring-boot.version>2.4.5</spring-boot.version>
<java.version>1.8</java.version>
<mysql-connector-java.version>8.0.16</mysql-connector-java.version>
<druid-spring-boot-starter.version>1.2.15</druid-spring-boot-starter.version>
<mybatis-spring-boot-starter.version>1.3.5</mybatis-spring-boot-starter.version>
<mybatis-generator-maven-plugin.version>1.3.2</mybatis-generator-maven-plugin.version>
<lombok.version>1.18.22</lombok.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<aliyun-java-sdk-core.version>4.5.16</aliyun-java-sdk-core.version>
<aliyun-java-sdk-dysmsapi.version>1.1.0</aliyun-java-sdk-dysmsapi.version>
<fastjson.version>1.2.15</fastjson.version>
<apache-httpcomponents.httpclient.version>4.5.14</apache-httpcomponents.httpclient.version>
<apache-httpcomponents.httpcore.version>4.4.4</apache-httpcomponents.httpcore.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>${aliyun-java-sdk-core.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>${aliyun-java-sdk-dysmsapi.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${apache-httpcomponents.httpclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>${apache-httpcomponents.httpcore.version}</version>
</dependency>
</dependencies>
Java代码实现
@Slf4j
@Component
public class AlibabaSendMessageService {
// cn-beijing
@Value("${aliyun.region.id}")
private String regionId;
// 你自己的密钥
@Value("${aliyun.access.key.id}")
private String accessKeyId;
// 你自己的密钥
@Value("${aliyun.secret}")
private String secret;
/**
* @param phoneNumber 手机号 要发给谁
* @param code 验证码 自己代码生成
* @param templateCode 你申请的模版code
* @param signName 你申请的签名
*/
public ResultDTO<Boolean> sendMessage(String phoneNumber, String code, String templateCode, String signName) {
// 参数校验
if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(code) || StringUtils.isBlank(templateCode) || StringUtils.isBlank(signName)) {
String errorMsg = CommonErrorEnum.PARAMETER_VALIDATION_ERROR.getErrorMessage()
+ ", please check if the following parameters are passed: phoneNumber,code,templateCode,signName";
return ResultDTO.error(CommonErrorEnum.PARAMETER_VALIDATION_ERROR.getErrorCode(), errorMsg);
}
SendSmsRequest request = new SendSmsRequest();
// 接收短信的手机号码
request.setPhoneNumbers(phoneNumber);
// 短信签名名称
request.setSignName(signName);
// 短信模板CODE
request.setTemplateCode(templateCode);
// 短信模板变量对应的实际值 模版当中${code}, 必须以json格式传递请注意!!!
String jsonParam = "{\"code\":" + code + "}";
request.setTemplateParam(jsonParam);
try {
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, secret);
IAcsClient client = new DefaultAcsClient(profile);
SendSmsResponse response = client.getAcsResponse(request);
if (CommonConstant.MessageResponse.OK.equals(response.getCode())) {
return ResultDTO.success(true);
} else {
String errorMsg = CommonErrorEnum.SEND_MESSAGE_ERROR.getErrorMessage() + " responseCode = "
+ response.getCode() + " requestId = " + response.getRequestId()
+ " requestParam = " + JSON.toJSONString(request);
log.error(errorMsg);
return ResultDTO.error(CommonErrorEnum.SEND_MESSAGE_ERROR.getErrorCode(),
CommonErrorEnum.SEND_MESSAGE_ERROR.getErrorMessage());
}
} catch (Exception e) {
log.error(CommonErrorEnum.COMMON_UNKNOWN_ERROR.getErrorCode()
+ " requestParam = " + JSON.toJSONString(request), e);
return ResultDTO.error(CommonErrorEnum.COMMON_UNKNOWN_ERROR.getErrorCode(),
CommonErrorEnum.COMMON_UNKNOWN_ERROR.getErrorMessage());
}
}
}
我直接将代码抽成服务了,@Value是读取的application.properties,由于是我自己的密钥不方便展示了,测试也可以直接写成main方法也可以
服务引入方式参考
启动项目测试
访问8080端口调用服务
测试成功