1: 項目位址
https://gitee.com/itliulei/sms-aliyun-demo.git
對接阿裡短信服務,首先需要準備的有SignName ,TemplateCode ,AccessKeyId,AccessSecret,前面兩個是在阿裡短信服務裡面建立的,一個是短信簽名名稱,一個是短信要使用的模闆id,後面兩個我了解的意思就是擷取權限,給你登入的賬号密碼差不多,準備好這些,就可以寫java的背景對接邏輯了
注意:如果你時間比較急,那就重點研究SmsClient 和SmsAliYunClient ,就這倆在其作用,其他的隻是把調用發送短信流程補充完整
項目的目錄(這就是我寫的一個專門測試阿裡短信起的一個項目)
下面分運作順序進行代碼粘貼
loginController
@RestController
@RequestMapping("/sys")
public class loginController {
@Autowired
private SmsClient smsClient;
//調用本接口測試調用阿裡接口
@GetMapping("/getVerificationCode")
public Result getVerificationCodeOfMember(@RequestParam String mobile){
Result result=new Result();
result.setSuccess(false);
String code= RandomUtil.randomNumbers(4);
for (;;){
if (!code.startsWith("0")){
break;
}
code=RandomUtil.randomNumbers(4);
}
if (StringUtils.isEmpty(mobile)){
result.setMessage("手機号不能為空");
return result;
}
VerificationCode verificationCode=new VerificationCode();
verificationCode.setCode(code);
//這裡就是調用好發送
smsClient.singleSendVerificationCode(mobile,code);
return Result.ok(verificationCode);
}
}
SmsClient (短信平台)接口
public interface SmsClient {
//單一發送驗證碼 2:尋找接口
SendResult singleSendVerificationCode(String mobile, String code);
@Data
@Accessors(chain = true)
class SendResult {
public static final int SUCCESS_CODE = 0;
public static final int ERROR_CODE = 1;
public static final String SUCCESS_MESSAGE = "SUCCESS";
/**
* 錯誤碼
*/
private Integer code;
/**
* 錯誤資訊
*/
private String message;
/**
* 是否成功
*/
private Boolean isSuccess;
}
/**
* 短信發送 - 單個
*
* @param mobile 手機号
* @param sign 簽名
* @param templateCode 短信模闆code
* @param template 短信模闆
* @param templateParams 短信模闆 params
* @return 發送後資訊
*/
SendResult singleSend(String mobile, String sign, String templateCode,
String template, Map<String, String> templateParams);
/**
*
* @param mobile
* @param templateParams
* @return
*/
SendResult singleSendMsg(String mobile, Map<String, String> templateParams);
/**
* 短信發送 - 批量
*
* @param mobileList 手機号
* @param sign 簽名
* @param templateCode 短信模闆 code
* @param template 短信模闆
* @param templateParams 短信模闆params
* @return 發送後資訊
*/
SendResult batchSend(List<String> mobileList, String sign, String templateCode,
String template, Map<String, String> templateParams);
}
SmsAliYunClient 短信平台接口實作類
public class SmsAliYunClient implements SmsClient {
private static final Logger LOGGER = LoggerFactory.getLogger(SmsAliYunClient.class);
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
private static final String SUCCESS_CODE = "OK";
private static final String SUCCESS_MESSAGE = "OK";
/**
* 阿裡雲短信 - 批量推送最大數 500,支援 1000
*/
private static final int MAX_BATCH_SIZE = 500;
@Value("${sms.aliYun.accessKeyId?:'default_value'}")
private String accessKeyId;
@Value("${sms.aliYun.accessSecret?:'default_value'}")
private String accessSecret;
@Accessors(chain = true)
@Data
public static class Result {
/**
* 發送回執ID,可根據該ID在接口QuerySendDetails中查詢具體的發送狀态。
*/
private String BizId;
/**
* 請求狀态碼。
*
* - OK 蔡成功
*/
private String Code;
/**
* 狀态碼的描述。
*/
private String Message;
/**
* 請求ID。
*/
private String RequestId;
}
@Data
private class VerificationCode{
private String mobile;
private String code;
public VerificationCode(String mobile, String code) {
this.mobile = mobile;
this.code = code;
}
}
//單一發送驗證碼 3:接口的實作類
@Override
public SendResult singleSendVerificationCode(String mobile,String code) {
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain(DOMAIN);
request.setVersion("2017-05-25");
request.setAction("SendSms");
request.putQueryParameter("PhoneNumbers", mobile);//接收短信的手機号碼。
request.putQueryParameter("SignName","然***" ); //短信簽名名稱。請在控制台簽名管理頁面簽名名稱一列檢視。說明 必須是已添加、并通過稽核的短信簽名。
request.putQueryParameter("TemplateCode", "S*S_15*******5");//短信模闆ID。請在控制台模闆管理頁面模闆CODE一列檢視。
request.putQueryParameter("TemplateParam", "{code:"+code+"}");//短信模闆變量對應的實際值,JSON格式。
// 發送請求
return doSend(request);
}
@Override
public SendResult singleSend(String mobile, String sign, String templateCode,
String template, Map<String, String> templateParams) {
// params
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain(DOMAIN);
request.setVersion("2017-05-25");
request.setAction("SendSms");
request.putQueryParameter("PhoneNumbers", mobile);
request.putQueryParameter("SignName", sign);//短信簽名名稱。請在控制台簽名管理頁面簽名名稱一列檢視。說明 必須是已添加、并通過稽核的短信簽名。
request.putQueryParameter("TemplateCode", templateCode);//短信模闆ID。請在控制台模闆管理頁面模闆CODE一列檢視。
request.putQueryParameter("TemplateParam", JSON.toJSONString(templateParams));//短信模闆變量對應的實際值,JSON格式。
// 發送請求
return doSend(request);
}
@Override
public SendResult singleSendMsg(String mobile, Map<String, String> templateParams) {
// params
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain(DOMAIN);
request.setVersion("2017-05-25");
request.setAction("SendSms");
request.putQueryParameter("PhoneNumbers", mobile);
request.putQueryParameter("SignName", "然***");
request.putQueryParameter("TemplateCode", "SMS_15********5");
request.putQueryParameter("TemplateParam", JSON.toJSONString(templateParams));
// 發送請求
return doSend(request);
}
@Override
public SendResult batchSend(List<String> mobileList, String sign, String templateCode,
String template, Map<String, String> templateParams) {
// 最大發送數為 1000,我們設定為 500 個, 分段發送
int maxSendSize = MAX_BATCH_SIZE;
int maxSendSizeCount = mobileList.size() % maxSendSize == 0
? mobileList.size() / maxSendSize
: mobileList.size() / maxSendSize + 1;
SendResult sendResult = null;
for (int i = 0; i < maxSendSizeCount; i++) {
// 分批發送
List<String> batchSendMobile = mobileList
.subList(i * maxSendSize, (i + 1) * maxSendSize);
// params
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain(DOMAIN);
request.setVersion("2017-05-25");
request.setAction("SendBatchSms");
request.putQueryParameter("PhoneNumberJson", JSON.toJSONString(batchSendMobile));
request.putQueryParameter("SignNameJson", JSON.toJSONString(Collections.singletonList(sign)));
request.putQueryParameter("TemplateCode", templateCode);
request.putQueryParameter("TemplateParamJson", JSON.toJSONString(Collections.singletonList(templateParams)));
// 發送請求
sendResult = doSend(request);
}
return sendResult;
}
//單一發送驗證碼 4:調用發送方法
private SendResult doSend(CommonRequest request) {
// 擷取 client
IAcsClient client = getClient();
try {
CommonResponse response = client.getCommonResponse(request);
Result result = JSON.parseObject(response.getData(), Result.class);
if (!SUCCESS_CODE.equals(result.getCode())) {
LOGGER.info("發送驗證碼失敗 params {} res {}", JSON.toJSON(request), JSON.toJSON(result));
// 錯誤發送失敗
return new SendResult()
.setIsSuccess(false)
.setCode(SendResult.ERROR_CODE)
.setMessage(result.getMessage());
} else {
LOGGER.info("發送驗證碼成功 params {} res", JSON.toJSON(request), JSON.toJSON(result));
// 發送成功
return new SendResult()
.setIsSuccess(true)
.setCode(SendResult.SUCCESS_CODE)
.setMessage(result.getMessage());
}
} catch (ClientException e) {
LOGGER.error("發送驗證碼異常 {}", ExceptionUtils.getMessage(e));
return new SendResult()
.setIsSuccess(false)
.setCode(SendResult.ERROR_CODE)
.setMessage(ExceptionUtils.getMessage(e));
}
}
/**
* 擷取 client
*
* @return
*/
//AccessKeyId和AccessSecret在阿裡雲的RAM通路控制添加AccessKey擷取
//拿到AccessKeyId(主賬号AccessKey的ID。示例:LTAIP00vvvvvvvvv) 和 AccessSecret
private IAcsClient getClient() {
return new DefaultAcsClient(DefaultProfile.getProfile("default", "LTA************NJ8", "qJdL******************3Kiv"));
}
用到的一個實體類
@Data
public class VerificationCode {
private String code;
}
用到的傳回結果分裝類
Result
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 成功标志
*/
private boolean success = true;
/**
* 傳回處理消息
*/
private String message = "操作成功!";
/**
* 傳回代碼
*/
private Integer code = 0;
/**
* 傳回資料對象 data
*/
private T result;
/**
* 時間戳
*/
private long timestamp = System.currentTimeMillis();
public Result() {
}
public Result<T> error500(String message) {
this.message = message;
this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
this.success = false;
return this;
}
public Result<T> success(String message) {
this.message = message;
this.code = CommonConstant.SC_OK_200;
this.success = true;
return this;
}
public static Result<Object> ok() {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setMessage("成功");
return r;
}
public static Result<Object> ok(String msg) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setMessage(msg);
return r;
}
public static Result<Object> ok(Object data) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setResult(data);
return r;
}
public static Result<Object> error(String msg) {
return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);
}
public static Result<Object> error(int code, String msg) {
Result<Object> r = new Result<Object>();
r.setCode(code);
r.setMessage(msg);
r.setSuccess(false);
return r;
}
/**
* 無權限通路傳回結果
*/
public static Result<Object> noauth(String msg) {
return error(CommonConstant.SC_JEECG_NO_AUTHZ, msg);
}
}
使用的依賴
<!--調用阿裡短信使用的依賴-->
<properties>
<java.version>1.8</java.version>
<!--調用阿裡短信使用的依賴版本-->
<commons.version>2.6</commons.version>
<aliyun-java-sdk-core.version>4.1.0</aliyun-java-sdk-core.version>
<aliyun-java-sdk-dysmsapi.version>1.0.0</aliyun-java-sdk-dysmsapi.version>
<!--調用阿裡短信使用的依賴版本-->
</properties>
<dependencies>
<!-- 阿裡雲短信 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>${aliyun-java-sdk-dysmsapi.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>${aliyun-java-sdk-core.version}</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--随機數-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.11</version>
</dependency>
<!-- commons -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.version}</version>
</dependency>
<!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!--調用阿裡短信使用的依賴-->
</dependencies>
阿裡擷取簽名等的截圖