一、說明
本文講的是boot結合阿里大於短信服務,關於如何接入阿里大於短信服務下面有鏈接
阿里大於短信服務接入地址:https://blog.csdn.net/weixin_42083036/article/details/102463595
不多廢話直接開始
步驟
1、導入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 添加jedis客戶端 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Alibaba Cloud SDK for Java核心庫-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-ecs</artifactId>
<version>4.11.0</version>
</dependency>
<!--阿里fastjson工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<!-- JSONObject對象依賴的jar包 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>net.sf.ezmorph</groupId>
<artifactId>ezmorph</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.3</version>
<classifier>jdk15</classifier><!-- 指定jdk版本 -->
</dependency>
yml文件配置
#msg
aliyunSms:
AccessKeyID: 自己的
AccessKeySecret: 自己的
#address
eureka:
client:
serviceUrl:
defaultZone: http://47.97.188.93:8761/eureka/
#server port
server:
port: 8888
servlet:
context-path: /sms
#server name
spring:
application:
name: sms-server
#redis
redis:
database: 2
host: 47.97.188.93
jedis:
pool:
max-active: 8
max-idle: 5
max-wait: -1
password: xxx
port: 6379
timeout: 10000
配置類用於獲取配置
* @description 短信配置類 用於配置ak
**/
@Component
@PropertySource(value="classpath:application.yml")
public class SmsConfig {
@Value("${aliyunSms.AccessKeyID}")
public String accessKeyID;
@Value("${aliyunSms.AccessKeySecret}")
public String AccessKeySecret;
public String getAccessKeyID() {
return accessKeyID;
}
public void setAccessKeyID(String accessKeyID) {
this.accessKeyID = accessKeyID;
}
public String getAccessKeySecret() {
return AccessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.AccessKeySecret = accessKeySecret;
}
}
request
@Component
public class SmsRequest {
private static Log logger= LogFactory.getLog(SmsRequest.class);
public static CommonRequest generateSmsRequest(String phone,Integer verificationCode,String templateCode){
return GenerateCommonRequest.generateCommonRequest(templateCode,verificationCode,(model, code)->{
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",phone );
request.putQueryParameter("SignName", ResponseConstant.SIGN_NAME);
request.putQueryParameter("TemplateCode", model);
request.putQueryParameter("TemplateParam", "{\"code\":\""+code+"\"}");
logger.info(request);
return request;
});
}
}
@Component
public class SmsResponse implements Serializable {
/**
* 時間格式
*/
private String dateTimeFormatter = "yyyyMMdd";
private static Log logger = LogFactory.getLog(SmsResponse.class);
@Autowired
private SmsConfig smsConfig;
/**
* 發送手機短信
* @param phone
*/
@Async("asyncPromiseExecutor")
public void sendSms(String phone,Integer code,String templateCode){
GenerateCommonResponse.getCommonResponse(phone,code,templateCode,(x,y,z)->{
DefaultProfile profile = generateDefaultProfile();
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = SmsRequest.generateSmsRequest(x,y,z);
try {
CommonResponse response = client.getCommonResponse(request);
logger.info(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
});
}
/**
* JSONObject jsonObject = JSONObject.parseObject(msg);
* jsonObject.get("Code")=OK;
* @return
*/
public String getMsg(String phone) {
DefaultProfile profile = generateDefaultProfile();
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("QuerySendDetails");
request.putQueryParameter("PhoneNumber", phone);
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("SendDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateTimeFormatter)));
request.putQueryParameter("PageSize", "1");
request.putQueryParameter("CurrentPage", "1");
String msg = null;
try {
CommonResponse response = client.getCommonResponse(request);
msg = response.getData();
logger.info(msg);
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return msg;
}
/**
* 工廠模式創建 DefaultProfile 實例
* @return
*/
private DefaultProfile generateDefaultProfile(){
Supplier supplier = ()->{
return DefaultProfile.getProfile("cn-hangzhou", smsConfig.accessKeyID, smsConfig.AccessKeySecret);
};
return (DefaultProfile)supplier.get();
}
}
測試類
/**
* @author 王博淵
* @version 1.0
* @date 2019/11/4 13:27
* @description
**/
@RestController
@RequestMapping("/api")
public class TestSend implements SendSmsFeign {
/**
* 消息狀態碼
*/
private final static String SEND_SUCCESS ="OK";
@Autowired
private SmsResponse smsResponse;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
@RequestMapping(value = "send",method = RequestMethod.GET)
public RetResult sendLoginSms(@RequestParam(value = "phone")String phone){
JSONObject jsonObject = JSONObject.parseObject(smsResponse.getMsg(phone));
Integer code = (int)Math.floor((Math.random()*9+1)*100000);
smsResponse.sendSms(phone,code,ResponseConstant.LOGIN_TEMPLATE_CODE);
if(SEND_SUCCESS.equals(jsonObject.get(ResponseConstant.CODE))){
stringRedisTemplate.opsForValue().set(phone,code.toString());
return RetResponse.makeRsp("200","短信發送成功",code);
}
return RetResponse.makeErrRsp();
}
@Override
@RequestMapping(value = "sendRegister",method = RequestMethod.GET)
public RetResult sendRegisterSms(@RequestParam(value = "phone")String phone){
JSONObject jsonObject = JSONObject.parseObject(smsResponse.getMsg(phone));
Integer code = (int)Math.floor(Math.random()*1000000);
smsResponse.sendSms(phone,code,ResponseConstant.REGISTER_TEMPLATE_CODE);
if(SEND_SUCCESS.equals(jsonObject.get(ResponseConstant.CODE))){
stringRedisTemplate.opsForValue().set(phone,code.toString());
return RetResponse.makeRsp("200","短信發送成功",code);
}
return RetResponse.makeErrRsp();
}
@Override
@RequestMapping(value = "sendModify",method = RequestMethod.GET)
public RetResult sendModifySms(@RequestParam(value = "phone")String phone){
JSONObject jsonObject = JSONObject.parseObject(smsResponse.getMsg(phone));
Integer code = (int)Math.floor(Math.random()*1000000);
smsResponse.sendSms(phone,code,ResponseConstant.MODIFIED_TEMPLATE_CODE);
if(SEND_SUCCESS.equals(jsonObject.get(ResponseConstant.CODE))){
stringRedisTemplate.opsForValue().set(phone,code.toString());
return RetResponse.makeRsp("200","短信發送成功",code);
}
return RetResponse.makeErrRsp();
}
}