一、代码
1、请求实体
@Data
public class SubmitReq {
private String ecName; // 企业名称
private String apId; // 接口账号用户名
private String secretKey; // 密钥
private String mobiles; // 收信手机号码,英文逗号分隔,每批次限5000个号码
private String params; // 密钥
/**
* 在云MAS平台『管理』→『接口管理』→『短信接入用户管理』获取。
*/
private String sign; // 签名编码
/**
* 在云MAS平台创建模板,路径:『短信』→『模板短信』→『模板管理』,创建后提交审核,审核通过将获得模板ID。
*/
private String templateId; // 模板ID
/**
* 依据申请开户的服务代码匹配类型而定,
* 如为精确匹配,此项填写空字符串("");
* 如为模糊匹配,此项可填写空字符串或自定义的扩展码,注:服务代码加扩展码总长度不能超过20位。
*/
private String addSerial; // 扩展码
/**
* 将ecName、apId、secretKey、templateId、mobiles、params、sign、addSerial按序拼接(无间隔符),通过MD5(32位小写)计算出的值
*/
private String mac; // 参数校验序列
}
2、构建请求参数工具类
@Slf4j
public class ParamUtil {
private static final String SMS_ECNAME = "";
private static final String SMS_APID = "";
private static final String SMS_SECRET_KEY = "";
private static final String SMS_SIGN = "";
private static final String SMS_TEMPLATEID = "";
public static String buildSmsParam(String tel, String verificationCode) throws Exception {
SubmitReq submitReq = new SubmitReq();
submitReq.setEcName(SMS_ECNAME);
submitReq.setApId(SMS_APID);
submitReq.setSecretKey(SMS_SECRET_KEY);
submitReq.setMobiles(tel);
submitReq.setParams("[" + verificationCode + "]");
submitReq.setSign(SMS_SIGN);
submitReq.setTemplateId(SMS_TEMPLATEID);
submitReq.setAddSerial("");
submitReq.setMac(calculateMAC(submitReq));
String reqText = JSON.toJSONString(submitReq);
return Base64.encodeBase64String(reqText.getBytes(StandardCharsets.UTF_8));
}
/**
* 将ecName、apId、secretKey、templateId、mobiles、params、sign、addSerial
* 按序拼接(无间隔符),通过MD5(32位小写)计算出的值
*/
private static String calculateMAC(SubmitReq submitReq) throws Exception {
String sb = submitReq.getEcName() +
submitReq.getApId() +
submitReq.getSecretKey() +
submitReq.getTemplateId() +
submitReq.getMobiles() +
submitReq.getParams() +
submitReq.getSign() +
submitReq.getAddSerial();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(sb.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String hex = Integer.toHexString(0xFF & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
String mac = hexString.toString().toLowerCase();
log.debug("拼接后的mac:{}", sb);
log.debug("MD5后的mac:{}", mac);
return mac;
}
/**
* 可以先将main方法输出的加密字符串放到postman进行调试
*/
public static void main(String[] args) throws Exception {
SubmitReq submitReq = new SubmitReq();
submitReq.setEcName("某某公司测试");
submitReq.setApId("yhm");
submitReq.setSecretKey("yhmm");
submitReq.setMobiles("173540456789");
submitReq.setParams("[" + "123456" + "]");
submitReq.setSign("wdqm");
submitReq.setTemplateId("wdmbid");
submitReq.setAddSerial("");
submitReq.setMac(calculateMAC(submitReq));
String reqText = JSON.toJSONString(submitReq);
System.out.println(reqText);
System.out.println(Base64.encodeBase64String(reqText.getBytes(StandardCharsets.UTF_8)));
}
}
3、发送请求工具类
@Slf4j
public class HttpUtil {
private static final OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(20, TimeUnit.SECONDS)// 设置连接超时时间为20秒
.readTimeout(20, TimeUnit.SECONDS)
.build();
public static JSONObject sendPost(String url, String content) {
JSONObject jsonResponse = new JSONObject();
try {
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, content);
Request request = new Request.Builder()
.url(url)//http://112.35.1.155:1992/sms/norsubmit
.method("POST", body)
.addHeader("Content-Type", "text/plain")
.build();
// 创建请求
Response response = client.newCall(request).execute();
// 获取响应体
ResponseBody responseBody = response.body();
if (responseBody != null) {
// 将响应体转换为字符串
String responseString = responseBody.string();
jsonResponse = JSONObject.parseObject(responseString);
}
// 关闭响应体
responseBody.close();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
// 打印响应结果
log.debug("中国移动云MAS平台短信发送结果:{}", jsonResponse);
}
return jsonResponse;
}
}
最终接收到的短信示例:【某某公司测试】您好,您的验证码是123456
二、参数
名称 |
类型 |
说明 |
ecName |
String |
企业名称。 |
apId |
String |
接口账号用户名。 |
secretKey |
String |
接口账号用户密码。 |
sign |
String |
签名编码。在云MAS平台『管理』→『接口管理』→『短信接入用户管理』获取。 |
templateId |
String |
模板ID。在云MAS平台创建模板,路径:『短信』→『模板短信』→『模板管理』,创建后提交审核,审核通过将获得模板ID。 |
mobiles |
String |
收信手机号码。英文逗号分隔,每批次限5000个号码,例:“13800138000,13800138001,13800138002”。 |
params |
String |
模板变量。格式:[“param1”,“param2”],无变量模板填[""]。 |
addSerial |
String |
扩展码。依据开户时申请的服务代码匹配类型而定,如为精确匹配,此项填写空字符串("");如为模糊匹配,此项可填写空字符串或自定义的扩展码,注:服务代码加扩展码总长度不能超过20位。 |
mac |
String |
参数校验序列,生成方法:将ecName、apId、secretKey、templateId、mobiles、params、sign、addSerial按序拼接(无间隔符),通过MD5(32位小写)计算出的值。 |
1、获取ecName、apId、secretKey
2、获取sign
路径:『管理』→『接口管理』→『短信接入用户管理』,直接点击『签名下载』获取签名信息。
3、获取templateId
路径:『短信』→『模板短信』→『模板管理』,创建后提交审核,审核通过将获得模板ID。
三、响应结果
名称 |
类型 |
说明 |
rspcod |
String |
响应状态,详见下表。 |
mgsGroup |
String |
消息批次号,由云MAS平台生成,用于关联短信发送请求与状态报告,注:若数据验证不通过,该参数值为空。如:{ "msgGroup": "", "rspcod": "NOT_WHITE_IP", "success": false} |
success |
boolean |
数据校验结果。 |
rspcod |
说明 |
NOT_WHITE_IP |
添加白名单(如果服务器在内网,需添加外网ip,自行调试) |
InvalidUsrOrPwd |
检查ecName、apId、secretKey |
IllegalSignId |
检查sign |
IllegalTemplateId |
检查templateId |
IllegalMac |
检查mac生成方法 |
InvalidMessage |
非法消息,请求数据解析失败。 |
NoSignId |
未匹配到对应的签名信息。 |
TooManyMobiles |
手机号数量超限(>5000),应≤5000。 |
success |
数据验证通过。 |
平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_67747978/article/details/146075592