之前做過網易雲信和無極限提供的SMS服務,有需要可以參考下:Java使用網易雲信短信驗證 demo(完整教程)
因項目需要,需利用阿里雲SMS服務實現短信服務。下面給初次使用的朋友們分享記錄一下。
幫助文檔
- 阿里雲官網 >>
- 阿里雲短信服務文檔使用指引 >>
- 短信簽名與短信模板審覈標準 >>
- 官方文檔 >>
- 官方SDK&Dome下載 >>
操作實現
- 1、開通短信服務 >>
- 2、創建AccessKey >>
- 3、AccessKey ID 和 AccessKeySecret >>
- 4、添加簽名 >>
- 5、添加模板 >>
- 6、Maven導入jar包 >>
- 7、封裝工具類 >>
- 8、調用測試 >>
- 9、PostMan測試結果 >>
1、開通短信服務
2、創建AccessKey
3、AccessKey ID 和 AccessKeySecret
注意:保存AccessKeySecret,頁面關閉後將無法再次獲取信息 !
4、添加簽名
5、添加模板
審覈通過基本上就配置好了,接下來看下如何實現
6、Maven導入jar包
<dependency>
<groupId>aliyun.java.sdk</groupId>
<artifactId>core</artifactId>
<version>3.3.1</version>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/aliyun-java-sdk-core-3.3.1.jar</systemPath>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>aliyun.java.sdk</groupId>
<artifactId>dysmsapi</artifactId>
<version>1.0.0</version>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/aliyun-java-sdk-dysmsapi-1.0.0.jar</systemPath>
<scope>compile</scope>
</dependency>
7、封裝工具類
package com.giantfind.common.util;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @Package: com.giantfind.common.util
* @ClassName: SmsUtils
* @Author: liuyaolong
* @Description: 短信API
* @Date: 2019/11/9 0009上午 10:49
* @Version: 1.0
*/
public class SmsUtils {
static final String system_name = "xxx系統";
//產品名稱:雲通信短信API產品,開發者無需替換
static final String product = "Dysmsapi";
//產品域名,開發者無需替換
static final String domain = "dysmsapi.aliyuncs.com";
static final String accessKeyId = "生成的accessKeyId";
static final String accessKeySecret = "生成的accessKeySecret";
private static int newcode;
public static int getNewcode() {
return newcode;
}
public static void setNewcode() {
newcode = (int) (Math.random() * 9999) + 100;
}
/**
* 發送手機驗證碼
* @param telephone
* @return
* @throws ClientException
*/
public static Map<String,String> sendSms(String telephone) throws ClientException {
Map<String,String> map = new HashMap<>();
map.put("telephone",telephone);
setNewcode();
String code = Integer.toString(getNewcode());
map.put("code",code);
//可自助調整超時時間
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(telephone);
//必填:短信簽名-可在短信控制檯中找到
request.setSignName("輸入簽名名稱");
//必填:短信模板-可在短信控制檯中找到
request.setTemplateCode("輸入短信模板CODE");
//可選:模板中的變量替換JSON串,如模板內容爲"您的驗證碼爲${code}"時,您正在登錄${product}。此處的值爲
request.setTemplateParam("{\"code\":\""+code+"\",\"product\":\""+system_name+"\"}");
//選填-上行短信擴展碼(無特殊需求用戶請忽略此字段)
//request.setSmsUpExtendCode("90997");
//可選:outId爲提供給業務方擴展字段,最終在短信回執消息中將此值帶回給調用者
//request.setOutId("yourOutId");
//hint 此處可能會拋出異常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
map.put("result",sendSmsResponse.getCode());
return map;
}
/**
* "短信明細查詢接口
* @param bizId (sendSms 返回 sendSmsResponse 裏)
* @return
* @throws ClientException
*/
public static QuerySendDetailsResponse querySendDetails(String bizId) throws ClientException {
//可自助調整超時時間
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("15000000000");
//可選-流水號
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;
}
}
8、調用測試
package com.giantfind.business.web;
import com.aliyuncs.exceptions.ClientException;
import com.giantfind.business.model.sms.TelephoneInfo;
import com.giantfind.common.message.RequestMsg;
import com.giantfind.common.message.ResponseHead;
import com.giantfind.common.message.ResponseMsg;
import com.giantfind.common.util.SmsUtils;
import com.giantfind.common.util.ValidationUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @Package: com.giantfind.business.web
* @ClassName: SmsController
* @Author: liuyaolong
* @Description: 短信消息推送
* @Date: 2019/11/9 0009下午 2:38
* @Version: 1.0
*/
@RestController
@RequestMapping("sms")
public class SmsController {
private static final Logger logger = Logger.getLogger(SmsController.class);
/**
* 發送手機短信驗證碼
* @param in
* @return
*/
@PostMapping("sendSms")
public ResponseMsg<Map<String,String>> sendSms(@RequestBody RequestMsg<TelephoneInfo> in) throws ClientException {
ResponseMsg<Map<String,String>> response = new ResponseMsg<>();
//自定義效驗手機號
if(StringUtils.isBlank(in.getData().getTelephone())){
response.setHead(ResponseHead.buildFailedHead("手機號碼不能爲空!"));
return response;
}
if(in.getData().getTelephone().length() != 11){
response.setHead(ResponseHead.buildFailedHead("手機號碼應爲11位數!"));
return response;
}
if(ValidationUtils.isPhone(in.getData().getTelephone()) == false){
response.setHead(ResponseHead.buildFailedHead("手機號碼有誤!"));
return response;
}
Map<String,String> map = SmsUtils.sendSms(in.getData().getTelephone());
String code = map.get("result");
if(code!= null && code.equals("OK")){
response.setHead(ResponseHead.buildSuccessHead());
}else {
response.setHead(ResponseHead.buildFailedHead("短信發送失敗!"));
}
response.setData(map);
return response;
}
}
9、PostMan測試結果
"data": {
"result": "OK",
"code": "5165",
"telephone": "13302943855"
}
以上就是本文的全部內容,希望對大家的學習有所幫助,歡迎評論交流。能get到知識點不要忘了關注點個贊~ 拒絕白嫖從我們做起hh~