一、阿里云短信模板配置(获取SignName[签名名称]、TemplateCode[模板CODE])
1. 进入阿里云首页直接搜索短信服务
,并点击国内消息
进入国内文本短信管理页面
2. 选择签名管理
点击添加签名
填写签名信息并提交
注:下面的签名来源
如项目未上线可选择测试或学习
(我上面的一个签名就是测试的)。
3. 选择模板管理
点击添加模板
填写模板信息
注:因签名与模板的审核都需要时间,且模板依赖于签名,如有需要可直接提交两个签名申请,减少连续等待的审核时间。
利用上面的审核时间我们就可以继续配置其他信息。
二、阿里云AccessKey配置(获取AccessKeyId、AccessKeySecret)
1. 创建专用于短信服务访问的RAM用户,导航栏搜索RAM用户
,并点击创建用户
2. 填写RAM用户信息
3.保存AccessKeyId、AccessSecret
4. 为创建的用户添加权限
以上便可让我们获取到accessKeyId、accessKeySecret、signName、templateCode用于项目部署的配置
三、Springboot的配置
1. application.yml文件添加配置信息
#阿里云短信发送配置信息
sms:
AccessKeyId:
accessKeySecret:
signName:
templateCode:
doMain:dysmsapi.aliyuncs.com
regionId:cn-hangzhou
2. pom.xml文件添加依赖
https://mvnrepository.com/
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
<!--这个springboot是有自动集成的-->
<!-- <dependency>-->
<!-- <groupId>com.google.code.gson</groupId>-->
<!-- <artifactId>gson</artifactId>-->
<!-- <version>2.8.5</version>-->
<!-- </dependency>-->
然后重新加载Maven下载依赖。
3. Controller控制层
package com...business.controller;
import com.hy.erp.business.service.SendSmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@RequestMapping("/sms")
public class SendSmsController {
@Autowired
private SendSmsService sendSmsService;
@ResponseBody
@RequestMapping(value = "/sendSms")
public String sendSms() {
String message = SendSmsController.randomCode(4).toString();
boolean sendFlag = sendSmsService.sendSms("183****6666",message);
if (sendFlag){
return "短信发送成功,请注意查收。";
}else {
return "短信发送失败!";
}
}
//随机生成指定位数验证码
public static StringBuffer randomCode(int number){
//验证码内容集
final char[] CHARS = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
StringBuffer stringBuffer=new StringBuffer();
Random r=new Random();
for(int i=0;i<number;i++){
stringBuffer.append(CHARS[r.nextInt(CHARS.length)]);
}
return stringBuffer;
}
}
4. Service业务层
package com.hy.erp.business.service;
public interface SendSmsService {
/**
* 发送短信的接口
*
* @param phoneNum 手机号
* @param message 消息
* @return
*/
boolean sendSms(String phoneNum, String message);
}
5. 实现层
package com.hy.erp.business.service.impl;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.hy.erp.business.service.SendSmsService;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
@Data
public class SendSmsServiceImpl implements SendSmsService {
private static final Logger logger = LoggerFactory.getLogger(SendSmsServiceImpl.class);
//application.yml文件里配置的sms
@Value("${sms.accessKeyId}")
private String accessKeyId;
@Value("${sms.accessKeySecret}")
private String accessKeySecret;
//短信api的请求地址 固定的 dysmsapi.aliyuncs.com
@Value("${sms.doMain}")
private String doMain;
//指定地域名称 短信API固定的 cn-hangzhou
@Value("${sms.regionId}")
private String regionId;
//您的申请签名
@Value("${sms.signName}")
private String signName;
//你的模板
@Value("${sms.templateCode}")
private String templateCode;
/**
* 发送短信接口
*
* @param phoneNum 手机号
* @param message 消息
* @return
*/
@Override
public boolean sendSms(String phoneNum, String message) {
// 指定地域名称 短信API的就是 cn-hangzhou 不能改变 后边填写您的 accessKey 和 accessKey Secret
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
// 创建通用的请求对象
CommonRequest request = new CommonRequest();
// 指定请求方式
request.setSysMethod(MethodType.POST);
// 短信api的请求地址 固定
request.setSysDomain(doMain);
//签名算法版本 固定
request.setSysVersion("2017-05-25");
//请求 API 的名称
request.setSysAction("SendSms");
//指定地域名称
request.putQueryParameter("RegionId", regionId);
// 要给哪个手机号发送短信 指定手机号
request.putQueryParameter("PhoneNumbers", phoneNum);
// 您的申请签名
request.putQueryParameter("SignName", signName);
// 您申请的模板 code
request.putQueryParameter("TemplateCode", templateCode);
Map<String, Object> params = new HashMap<>();
//这里的code就是短信模板中的 ${code},可能会有多个参数
params.put("code", message);
// 放入参数 需要把 map转换为json格式 使用fastJson进行转换
request.putQueryParameter("TemplateParam", JSON.toJSONString(params));
try {
CommonResponse response = client.getCommonResponse(request);
logger.info(JSON.parseObject(response.getData(), Map.class).get("Message").toString());
return response.getHttpResponse().isSuccess();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
到这里配置好手机号就可以启动项目啦
6.项目启动
如果签名是正确的,后台出现如下信息那便是发送成功
2023-02-09 09:21:18.736 INFO 26032 --- [nio-8888-exec-2] c.h.e.b.service.impl.SendSmsServiceImpl : 只能向已回复授权信息的手机号发送
可以在阿里云平台配置测试接收信息的手机号
7. 启动问题
- NoSuchMethodError
java.lang.NoSuchMethodError: com.google.gson.JsonParser.parseString(Ljava/lang/String;)Lcom/google/gson/JsonElement;
- NoClassDefFoundError
java.lang.NoClassDefFoundError: Could not initialize class com.aliyuncs.endpoint.LocalConfigRegionalEndpointResolver
首次执行会触发第一种报错,后面执行的都会触发第二种。
开始以为是gson类的问题,找了很久也重新在pom文件后面补上了依赖,后面发现springboot已经自动集成了。
最后发现是aliyun-java-sdk-core的版本问题,我用的4.6.0就会报错,改为4.5.16就运行正常了,你们可以试试其他的。
好了以上都是自己实操后又再走一遍记录下来的,共勉!