一、官网下载对接文档
http://mas.10086.cn/login
二、登录云平台配置账户
管理–>接口管理–>新建短信接口建立自己的用户信息
三、建立好账户后导出证书(用于对接)
四、编写Java对接代码
1.application.yml
#短信验证码
smscode:
#apid
apId: xxxx
#密码
secretKey: xxxx
#集团名称
ecName: xxxx
#网关签名编码
sign: xxxx
#请求url
url: https://112.35.10.201:28888/sms/submit
注:网关签名编码既第三步导出签名的编码
2.SMSUtils
import lombok.Data;
import org.apache.commons.codec.binary.Base64;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
@Component
@ConfigurationProperties("smscode")
@Data
public class SMSUtils {
private String apId;
private String secretKey;
private String ecName; // 集团名称
private String sign; // 网关签名编码
private String addSerial; // 拓展码 填空
public String url; // 请求url
/**
* 多用户发送短信信息
*
* @param mobiles 手机号逗号分隔
* @param content 短信内容
* @return int 返回1表示成功,0表示失败
* @author xiaoyafeng
* @date 2021/11/17 17:48
*/
public int sendMsg(String mobiles, String content) throws IOException {
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());
sendReq.setMac(Md5Util.MD5(stringBuffer.toString()).toLowerCase());
String reqText = JSON.toJSONString(sendReq);
String encode = Base64.encodeBase64String(reqText.getBytes("UTF-8"));
//此处使用hutool工具包httpRequest工具类发送https请求
String resStr = HttpRequest.post(url)
.header("contentType", "utf-8")
.body(encode)
.execute()
.body();
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;
}
}
}
3.Md5Util
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
/**
* @author xiaoyafeng
*/
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());
}
}
4.SendReq
import lombok.Data;
/**
* @author xiaoyafeng
*/
@Data
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位小写)计算后得出的值。
}
5.SendRes
import lombok.Data;
/**
* @author xiaoyafeng
*/
@Data
public class SendRes {
private String rspcod; //响应状态码
private String msgGroup; //消息批次号,由云MAS平台生成,用于验证短信提交报告和状态报告的一致性(取值msgGroup)注:如果数据验证不通过msgGroup为空
private boolean success; //数据校验结果
}