調用阿里雲短信服務平臺API實現ERP系統短信發送功能
1,發送短信工具類 SendSMSUtil
package sms;
import java.util.List;
/**
* 應用策略模式,方便以後擴展短信發送功能
* @title SendSMSUtil
* @description 阿里雲短信發送util
* @author RenYY
*/
public class SendSMSUtil {
/**
* @description 短信發送接口
* @param sendSMS
* @return
* @author RenYY
* @date 2016年12月29日
*/
public static boolean sendSMS(ISendSMS sendSMS){
return sendSMS.sendSMS();
}
}
2,發送短信接口 ISendSMS
package sms;
import java.util.List;
/**
* @title ISendSMS
* @description 阿里雲短信服務平臺 發送短信接口
* @author RenYY
*/
public interface ISendSMS {
public boolean sendSMS();
}
3,發送短信實現類 SendSMS
package sms;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sms.model.v20160927.SingleSendSmsRequest;
import com.aliyuncs.sms.model.v20160927.SingleSendSmsResponse;
import com.pxjy.puxin.kernel.utils.LoadProperties;
/**
* @title SendSMS
* @description 短信發送實現類,完成短信發送動作
* @author RenYY
*/
public class SendSMS implements ISendSMS {
private final static Logger log = Logger.getLogger(SendSMS.class);
private static String aliyun_sms_region_id = ""; //阿里雲regionId
private static String aliyun_sms_access_key_id = ""; //阿里雲 accessKeyId
private static String aliyun_sms_access_key_secret = ""; //阿里雲 accessKeySecret
private static String aliyun_sms_end_point_name = ""; //阿里雲end_point_name
private static String aliyun_sms_product = ""; //阿里雲產品
private static String aliyun_sms_domain = ""; //阿里雲調用短信服務平臺接口域名
private String signName; //阿里雲短信簽名
private String templateCode; //阿里雲短信模板Code
private String paramString; //阿里雲短信模板參數字符串
private String recNum; //發送短信手機號
static{
aliyun_sms_region_id = LoadProperties.readValue("aliyun_sms_region_id");
aliyun_sms_access_key_id = LoadProperties.readValue("aliyun_sms_access_key_id");
aliyun_sms_access_key_secret = LoadProperties.readValue("aliyun_sms_access_key_secret");
aliyun_sms_end_point_name = LoadProperties.readValue("aliyun_sms_end_point_name");
aliyun_sms_product = LoadProperties.readValue("aliyun_sms_product");
aliyun_sms_domain = LoadProperties.readValue("aliyun_sms_domain");
}
/**
* @description 方法描述
* @param signName 如果signName爲null或者空串,則取集團短信簽名; 否則取signName值
* @param templateId 1:驗證短信模板, 2:通知短信模板, 3:推廣短信模板
* @param paramMap 短信模板中參數名爲key,參數值爲value
* @param phoneNum 手機號數組,例:{"18888888888","19999999999"}
* @author RenYY
* @date 2016年12月29日
*/
public SendSMS(String signName, int templateId,Map<String, String> paramMap, String[] phoneNum) {
super();
//短信簽名: 如果signName爲null或者空串,則取集團短信簽名; 否則去signName值
this.signName = (null == signName || "".equals(signName)) ? DictSMS.SIGN_NAME_PUXIN : signName;
//短信模板
switch (templateId) {
case 1: this.templateCode = DictSMS.TEMPLATE_CODE_OF_VALIDATE; break;//驗證短信模板
case 2: this.templateCode = DictSMS.TEMPLATE_CODE_OF_INFORM; break;//通知短信模板
case 3: this.templateCode = DictSMS.TEMPLATE_CODE_OF_PROMOTION; break;//推廣短信模板
default:this.templateCode = DictSMS.TEMPLATE_CODE_OF_PROMOTION; break;//以上三種均不匹配時,默認爲 推廣短信模板
}
//模板參數
this.paramString = JSON.toJSONString(paramMap);
//構造手機號字符串,多個手機號之間逗號分隔
StringBuffer recNumSB = new StringBuffer();
for(int i = 0; i < phoneNum.length; i++){
if(i == phoneNum.length -1){
recNumSB.append(phoneNum[i]);
}else{
recNumSB.append(phoneNum[i] + ",");
}
}
this.recNum = recNumSB.toString();
}
/**
* @description 發送短信
* @return 發送成功返回 true,否則返回 false
* @author RenYY
* @date 2016年12月29日
*/
@Override
public boolean sendSMS() {
boolean isSendSuccess = false;
try {
IClientProfile profile = DefaultProfile.getProfile(aliyun_sms_region_id, aliyun_sms_access_key_id, aliyun_sms_access_key_secret);
DefaultProfile.addEndpoint(aliyun_sms_end_point_name, aliyun_sms_region_id, aliyun_sms_product,aliyun_sms_domain);
IAcsClient client = new DefaultAcsClient(profile);
SingleSendSmsRequest request = new SingleSendSmsRequest();
request.setSignName(signName);
request.setTemplateCode(templateCode);
request.setParamString(paramString);
request.setRecNum(recNum);
SingleSendSmsResponse response = client.getAcsResponse(request);//短信發送
isSendSuccess = true;
} catch (Exception e) {
e.printStackTrace();
log.error("*aliyun_sms_begin*");
log.error(e.getMessage());
log.error("*aliyun_sms_end*");
}finally{
return isSendSuccess;
}
}
}
4,短信簽名及短信模板CODE字典類
package com.pxjy.puxin.kernel.sms;
public class DictSMS {
public final static String SIGN_NAME_PUXIN = "SIGN_NAME_PUXIN"; //集團短信簽名
public final static String TEMPLATE_CODE_OF_VALIDATE = "TEMPLATE_CODE_OF_VALIDATE"; //驗證短信模板CODE
public final static String TEMPLATE_CODE_OF_INFORM = "TEMPLATE_CODE_OF_INFORM"; //通知短信模板CODE
public final static String TEMPLATE_CODE_OF_PROMOTION = "TEMPLATE_CODE_OF_PROMOTION"; //推廣短信模板CODE
}
5,項目屬性文檔讀取工具類
package utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 配置文件讀取類
* @title LoadProperties
* @description 描述
* @author RenYY
*/
public class LoadProperties {
/**
* 通過key值獲取配置文件中value值
* @description 方法描述
* @param key 配置文件中key值
* @return
* @author xuzihu
* @date 2015年9月9日
*/
public static String readValue(String key) {
String fileName = "/application.properties";
Properties props = new Properties();
InputStream in = null;
String value = "";
try {
in = LoadProperties.class.getResourceAsStream(fileName);
props.load(in);
value = props.getProperty(key);
return value;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return value;
}
}
6,項目屬性配置文檔 application.properties
#### 阿里雲短信服務平臺 begin add by RenYY,20161227 ####
aliyun_sms_region_id=cn-hangzhou
aliyun_sms_access_key_id=aliyunsmsaccesskeyid
aliyun_sms_access_key_secret=aliyunsmsaccesskeysecret
aliyun_sms_end_point_name=cn-hangzhou
aliyun_sms_product=Sms
aliyun_sms_domain=sms.aliyuncs.com
#### 阿里雲短信服務平臺 end add by RenYY,20161227 ####
7,引入阿里雲依賴jar包
添加maven庫
<repositories>
<repository>
<id>sonatype-nexus-staging</id>
<name>Sonatype Nexus Staging</name>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
添加依賴jar包
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-sms</artifactId>
<version>3.0.0-rc1</version>
</dependency>
<dependencies>
8,接口調用中拋出異常信息: java.lang.RuntimeException: Unsupported algorithm: HmacSHA1
解決方案爲:修改項目依賴 JDK 版本爲 1.6或1.7,至於爲什麼目前不支持1.8有點迷惑