1.SMSUtils 發送短信工具類
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.apache.commons.codec.binary.Base64;
import com.alibaba.fastjson.JSON;
import cn.com.jandar.common.dto.SendReq;
import cn.com.jandar.common.dto.SendRes;
public class SMSUtils {
private static String apId="smsmas";
private static String secretKey="123456";
private static String ecName = "xxxxxx"; //集團名稱
private static String sign = "xxxx"; //網關簽名編碼
private static String addSerial = ""; //拓展碼 填空
public static String url = "http://112.35.1.155:1992/sms/norsubmit";//請求url
/**
* 多用戶發送短信信息
* @param mobiles 手機號碼逗號分隔
* @param content 短信內容
* @return 返回1表示成功,0表示失敗
* @throws IOException
*/
public static int sendMsg(String mobiles,String content) throws IOException{
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowDatestr = sdf.format(calendar.getTimeInMillis());
content += nowDatestr; //短信內容後跟個日期時間(可有可無),需求要求
SendReq sendReq = new SendReq();
sendReq.setApId(apId);
sendReq.setEcName(ecName);
sendReq.setSecretKey(secretKey);
sendReq.setContent(content);
sendReq.setMobiles(mobiles);
sendReq.setAddSerial(addSerial);
sendReq.setSign(sign);
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(sendReq.getEcName());
stringBuffer.append(sendReq.getApId());
stringBuffer.append(sendReq.getSecretKey());
stringBuffer.append(sendReq.getMobiles());
stringBuffer.append(sendReq.getContent());
stringBuffer.append(sendReq.getSign());
stringBuffer.append(sendReq.getAddSerial());
//System.out.println(stringBuffer.toString());
sendReq.setMac(Md5Util.MD5(stringBuffer.toString()).toLowerCase());
//System.out.println(sendReq.getMac());
String reqText = JSON.toJSONString(sendReq);
String encode = Base64.encodeBase64String(reqText.getBytes("UTF-8"));
//System.out.println(encode);
String resStr = sendPost(url,encode);
System.out.println("發送短信結果:"+resStr);
SendRes sendRes = JSON.parseObject(resStr,SendRes.class);
if(sendRes.isSuccess() && !"".equals(sendRes.getMsgGroup()) && "success".equals(sendRes.getRspcod())){
return 1;
}else{
return 0;
}
}
/*
//main方法測試發送短信,返回1表示成功,0表示失敗
public static void main(String[] args) throws IOException{
String msg = "這是發送短信的內容!";
int result = sendMsg("183xxxx65xx,183xxxx12xx",msg);
System.out.println("==="+result);
}*/
/**
* 向指定 URL 發送POST方法的請求
*
* @param url
* 發送請求的 URL
* @param param
* 請求參數
* @return 所代表遠程資源的響應結果
*/
private static String sendPost(String url, String param) {
OutputStreamWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
URLConnection conn = realUrl.openConnection();
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("contentType","utf-8");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.setDoOutput(true);
conn.setDoInput(true);
out = new OutputStreamWriter(conn.getOutputStream());
out.write(param);
out.flush();
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += "\n" + line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
2.發送短信請求實體
public class SendReq {
private String ecName; //集團客戶名稱
private String apId; //用戶名
private String secretKey; //密碼
private String mobiles; //手機號碼逗號分隔。(如“18137282928,18137282922,18137282923”)
private String content; //發送短信內容
private String sign; //網關簽名編碼,必填,簽名編碼在中國移動集團開通帳號後分配,可以在雲MAS網頁端管理子系統-SMS接口管理功能中下載。
private String addSerial; //擴展碼,根據向移動公司申請的通道填寫,如果申請的精確匹配通道,則填寫空字符串(""),否則添加移動公司允許的擴展碼。
private String mac; //API輸入參數簽名結果,簽名算法:將ecName,apId,secretKey,mobiles,content ,sign,addSerial按照順序拼接,然後通過md5(32位小寫)計算後得出的值。
//get()和set()方法
}
3.發送短信響應實體
public class SendRes {
private String rspcod; //響應狀態碼
private String msgGroup; //消息批次號,由雲MAS平臺生成,用於驗證短信提交報告和狀態報告的一致性(取值msgGroup)注:如果數據驗證不通過msgGroup爲空
private boolean success; //數據校驗結果
//get()和set()方法
}
4.MD5解密工具類
import java.security.MessageDigest;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
* MD5加密/驗證工具類
*
* @author bluesky
*
*/
public class Md5Util {
static final char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
/**
* 生成MD5碼
*
* @param plainText
* 要加密的字符串
* @return md5值
*/
public final static String MD5(String plainText) {
try {
byte[] strTemp = plainText.getBytes("UTF-8");
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
/**
* 生成MD5碼
*
* @param plainText
* 要加密的字符串
* @return md5值
*/
public final static String MD5(byte[] plainText) {
try {
byte[] strTemp = plainText;
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
/**
* 先進行HmacSHA1轉碼再進行Base64編碼
* @param data 要SHA1的串
* @param key 祕鑰
* @return
* @throws Exception
*/
public static String HmacSHA1ToBase64(String data, String key) throws Exception {
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
return Base64.encodeBase64String(rawHmac);
}
/**
* 校驗MD5碼
*
* @param text
* 要校驗的字符串
* @param md5
* md5值
* @return 校驗結果
*/
public static boolean valid(String text, String md5) {
return md5.equals(MD5(text)) || md5.equals(MD5(text).toUpperCase());
}
/**
*
* @param params
* @return
*/
public static String MD5(String... params) {
StringBuilder sb = new StringBuilder();
for (String param : params) {
sb.append(param);
}
return MD5(sb.toString());
}
}
5.簽名下載:導出全部用戶的簽名數據
6.配置好後對應的用戶名,企業號,簽名等可直接調用