引入依赖
< dependency>
< groupId> com.aliyun</ groupId>
< artifactId> aliyun-java-sdk-core</ artifactId>
< version> 4.6.3</ version>
</ dependency>
< dependency>
< groupId> com.aliyun</ groupId>
< artifactId> aliyun-java-sdk-dysmsapi</ artifactId>
< version> 2.2.1</ version>
</ dependency>
配置文件
sms :
aliyun :
enabled : true
endpoint : cn- hangzhou
access-key-id : xxxxxxxx
access-key-secret : xxxxxxxx
sign-name : xxxxxxxx
template-code : xxxxxxxx
属性类
package com. qiangesoft. sms. config ;
import lombok. Data ;
import org. springframework. boot. context. properties. ConfigurationProperties ;
@Data
@ConfigurationProperties ( prefix = "sms.aliyun" )
public class AliyunSmsProperties {
private boolean enabled = true ;
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String signName;
private String templateCode;
}
配置类
package com. qiangesoft. sms. config ;
import com. aliyuncs. DefaultAcsClient ;
import com. aliyuncs. IAcsClient ;
import com. aliyuncs. profile. DefaultProfile ;
import com. aliyuncs. profile. IClientProfile ;
import org. springframework. beans. factory. annotation. Autowired ;
import org. springframework. boot. autoconfigure. condition. ConditionalOnMissingBean ;
import org. springframework. boot. autoconfigure. condition. ConditionalOnProperty ;
import org. springframework. boot. context. properties. EnableConfigurationProperties ;
import org. springframework. context. annotation. Bean ;
import org. springframework. context. annotation. Configuration ;
@Configuration
@EnableConfigurationProperties ( AliyunSmsProperties . class )
@ConditionalOnProperty ( prefix = "sms.aliyun" , name = "enabled" , havingValue = "true" )
public class AliyunSmsConfiguration {
private static final String PRODUCT = "Dysmsapi" ;
private static final String DOMAIN = "dysmsapi.aliyuncs.com" ;
@Autowired
private AliyunSmsProperties aliyunSmsProperties;
@Bean
@ConditionalOnMissingBean
public IAcsClient acsClient ( ) {
String endPoint = aliyunSmsProperties. getEndpoint ( ) ;
String accessKeyId = aliyunSmsProperties. getAccessKeyId ( ) ;
String accessKeySecret = aliyunSmsProperties. getAccessKeySecret ( ) ;
IClientProfile profile = DefaultProfile . getProfile ( endPoint, accessKeyId, accessKeySecret) ;
DefaultProfile . addEndpoint ( endPoint, PRODUCT , DOMAIN ) ;
return new DefaultAcsClient ( profile) ;
}
}
短信发送实现
package com. qiangesoft. sms. handler ;
import org. apache. commons. lang3. StringUtils ;
import java. util. Collection ;
import java. util. Collections ;
import java. util. Map ;
public interface SendHandler {
boolean send ( Collection < String > phones, Map < String , Object > param) ;
default boolean send ( String phone, Map < String , Object > param) {
if ( StringUtils . isBlank ( phone) ) {
return false ;
}
return send ( Collections . singletonList ( phone) , param) ;
}
boolean send ( Collection < String > phones, String templateCode, Map < String , Object > param) ;
default boolean send ( String phone, String templateCode, Map < String , Object > param) {
if ( StringUtils . isBlank ( phone) ) {
return false ;
}
return send ( Collections . singletonList ( phone) , param) ;
}
}
package com. qiangesoft. sms. handler ;
import com. alibaba. fastjson2. JSONObject ;
import com. aliyuncs. IAcsClient ;
import com. aliyuncs. dysmsapi. model. v20170525. SendSmsRequest ;
import com. aliyuncs. dysmsapi. model. v20170525. SendSmsResponse ;
import com. aliyuncs. http. MethodType ;
import com. qiangesoft. sms. config. AliyunSmsProperties ;
import lombok. RequiredArgsConstructor ;
import lombok. extern. slf4j. Slf4j ;
import org. apache. commons. lang3. StringUtils ;
import org. springframework. stereotype. Service ;
import java. util. Collection ;
import java. util. Map ;
@Slf4j
@RequiredArgsConstructor
@Service
public class AliyunSendHandler implements SendHandler {
private final IAcsClient acsClient;
private final AliyunSmsProperties aliyunSmsProperties;
@Override
public boolean send ( Collection < String > phones, Map < String , Object > param) {
return this . send ( phones, aliyunSmsProperties. getTemplateCode ( ) , param) ;
}
@Override
public boolean send ( Collection < String > phones, String templateCode, Map < String , Object > param) {
SendSmsRequest request = new SendSmsRequest ( ) ;
request. setSysMethod ( MethodType . POST ) ;
request. setPhoneNumbers ( StringUtils . join ( phones, "," ) ) ;
request. setSignName ( aliyunSmsProperties. getSignName ( ) ) ;
request. setTemplateCode ( aliyunSmsProperties. getTemplateCode ( ) ) ;
request. setTemplateParam ( JSONObject . toJSONString ( param) ) ;
try {
SendSmsResponse sendSmsResponse = acsClient. getAcsResponse ( request) ;
if ( "OK" . equals ( sendSmsResponse. getCode ( ) ) ) {
return true ;
}
log. debug ( "send fail[code={}, message={}]" , sendSmsResponse. getCode ( ) , sendSmsResponse. getMessage ( ) ) ;
} catch ( Exception e) {
log. debug ( e. getMessage ( ) , e) ;
}
return false ;
}
}
测试
package com. qiangesoft. sms. controller ;
import com. qiangesoft. sms. handler. SendHandler ;
import org. springframework. beans. factory. annotation. Autowired ;
import org. springframework. web. bind. annotation. GetMapping ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. RestController ;
import java. util. HashMap ;
import java. util. Map ;
@RequestMapping ( "/sms" )
@RestController
public class SmsController {
@Autowired
private SendHandler sendHandler;
@GetMapping ( "/send" )
public Boolean send ( ) {
Map < String , Object > param = new HashMap < > ( ) ;
param. put ( "name" , "张三" ) ;
param. put ( "jds" , 111 ) ;
param. put ( "adds" , "顶顶顶帆帆" ) ;
return sendHandler. send ( "15222222222" , param) ;
}
}