一、工程搭建
(1)創建工程模塊:tensquare_sms,pom.xml引入依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
(2)創建application.yml
server:
port: 9009
spring:
application:
name: tensquare-sms #指定服務名
rabbitmq:
host: 192.168.192.130
(3)com.tensquare.sms 包下創建啓動類
@SpringBootApplication
public class SmsApplication {
public static void main(String[] args) {
SpringApplication.run(SmsApplication.class, args);
}
}
二、消息監聽類
(1)創建短信監聽類,獲取手機號和驗證碼
/**
* 短信監聽類
*/
@Component
@RabbitListener(queues = "sms")
public class SmsListener {
/**
* 發送短信
* @param message
*/
@RabbitHandler
public void sendSms(Map<String,String> message){
System.out.println("手機號:"+message.get("mobile"));
System.out.println("驗證碼:"+message.get("code"));
}
}
(2)運行SmsApplication類,控制檯顯示手機號和驗證碼
三、發送短信
- 阿里雲通信簡介
阿里雲通信(原名–阿里大於)是 阿里雲旗下產品,融合了三大運營商的通信能
力,通過將傳統通信業務和能力與互聯網相結合,創新融合阿里巴巴生態內容,全力爲
中小企業和開發者提供優質服務阿里大於提供包括短信、語音、流量直充、私密專線、
店鋪手機號等個性化服務。通過阿里大於打通三大運營商通信能力,全面融合阿里巴巴
生態,以開放 API 及 SDK 的方式向開發者提供通信和數據服務,更好地支撐企業業務發
展和創新服務。 - 準備工作
(1)在阿里雲官網 www.alidayu.com 註冊賬號
(2)手機下載”阿里雲“APP,完成實名認證
(3)登陸阿里雲,產品中選擇”短信服務“
(4)申請簽名(需要審覈時間)
(5)申請模板(需要審覈時間)
(6)創建 accessKey (注意保密!)
(7)充值 (沒必要充太多,一條短信0.045,所以1至2元足矣,土豪請隨意~) - 代碼編寫
(1)pom.xml引入依賴
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.2.5</version>
</dependency>
(2)修改application.yml ,增加配置
aliyun:
sms:
accessKeyId: 替換成自己的
accessKeySecret: 替換成自己的
template_code: 替換成自己申請的
sign_name: 替換成自己申請的
(3)創建短信工具類SmsUtil
/**
* 短信工具類
* @author Administrator
*
*/
@Component
public class SmsUtil {
//產品名稱:雲通信短信API產品,開發者無需替換
static final String product = "Dysmsapi";
//產品域名,開發者無需替換
static final String domain = "dysmsapi.aliyuncs.com";
@Autowired
private Environment env;
// TODO 此處需要替換成開發者自己的AK(在阿里雲訪問控制檯尋找)
/**
* 發送短信
* @param mobile 手機號
* @param template_code 模板號
* @param sign_name 簽名
* @param param 參數
* @return
* @throws ClientException
*/
public SendSmsResponse sendSms(String mobile,String template_code,String sign_name,String param) throws ClientException {
String accessKeyId =env.getProperty("aliyun.sms.accessKeyId");
String accessKeySecret = env.getProperty("aliyun.sms.accessKeySecret");
//可自助調整超時時間
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暫不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//組裝請求對象-具體描述見控制檯-文檔部分內容
SendSmsRequest request = new SendSmsRequest();
//必填:待發送手機號
request.setPhoneNumbers(mobile);
//必填:短信簽名-可在短信控制檯中找到
request.setSignName(sign_name);
//必填:短信模板-可在短信控制檯中找到
request.setTemplateCode(template_code);
//可選:模板中的變量替換JSON串,如模板內容爲"親愛的${name},您的驗證碼爲${code}"時,此處的值爲
request.setTemplateParam(param);
//選填-上行短信擴展碼(無特殊需求用戶請忽略此字段)
//request.setSmsUpExtendCode("90997");
//可選:outId爲提供給業務方擴展字段,最終在短信回執消息中將此值帶回給調用者
request.setOutId("yourOutId");
//hint 此處可能會拋出異常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
public QuerySendDetailsResponse querySendDetails(String mobile,String bizId) throws ClientException {
String accessKeyId =env.getProperty("accessKeyId");
String accessKeySecret = env.getProperty("accessKeySecret");
//可自助調整超時時間
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暫不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//組裝請求對象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
//必填-號碼
request.setPhoneNumber(mobile);
//可選-流水號
request.setBizId(bizId);
//必填-發送日期 支持30天內記錄查詢,格式yyyyMMdd
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
request.setSendDate(ft.format(new Date()));
//必填-頁大小
request.setPageSize(10L);
//必填-當前頁碼從1開始計數
request.setCurrentPage(1L);
//hint 此處可能會拋出異常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
return querySendDetailsResponse;
}
}
(4)修改消息監聽類,完成短信發送
/**
* 短信監聽類
*/
@Component
@RabbitListener(queues = "sms")
public class SmsListener {
@Autowired
private SmsUtil smsUtil;
@Value("${aliyun.sms.template_code}")
private String template_code;//模板編號
@Value("${aliyun.sms.sign_name}")
private String sign_name;//簽名
@RabbitHandler
public void sendSms(Map<String,String> map){
System.out.println("手機號:"+map.get("mobile"));
System.out.println("驗證碼:"+map.get("code"));
try {
smsUtil.sendSms(map.get("mobile"),template_code,sign_name,"{\"number\":\""+ map.get("code") +"\"}");
} catch (ClientException e) {
e.printStackTrace();
}
}
}