通信方式
?????? 采用http1.1通信方式,数据以post方式提交
?????? http 头设置:application/json
签名
?????? 采用MD5加密方式, 源字符串采用字段拼接方式
?????? 签名中appSecret是平台分配密码
?????? 签名方法:
?????? 如:String sign=md5(param1param2param3…paramN)
发送接口
地址: http://ip:port/api/sms/air/send
描述:?? 客户平台==>大业务平台
1. 请求方式post; http头设置application/json; 字符集UTF-8
?????? 2. http响应数据为json格式
请求参数:
字段 | 名称 | 类型 | 说明 |
appKey | 账户名 | String(32) | 统一分配 |
timestamp | 时间戳 | long | 毫秒值 自UTC时间1970-1-1起的毫秒值 |
mobile | 用户号码 | String(11,11999) | 多个提交逗号分隔; 一次最多1000个号码 |
content | 内容长度 | String(402) | 短消息内容长度,67*6条 |
spNumber | 扩展号码 | String(10) | 扩展长号码 |
sendTime | 定时时间 | String(0,14) | yyyyMMddHHmmss 定时发送时间, 默认为空值 |
reportUrl | 报告回调地址 | String(100) | 状态报告回调的URL地址 默认为空 若使用查询接口(接口6)方式,为空值 |
moUrl | 上行地址 | String(100) | 用户上行URL地址 默认空 |
attach | 附加值字段 | String(100) | 附加数据, 客户根据自身业务逻辑添加 默认为空值 |
sign | 数字签名 | String(32) | sign=MD5(appKey+timestamp+mobile+content+spNumber+sendTime+appSecret) 顺序以此为准 其中appSecret为平台分配账户时提供 |
响应参数:
字段 | 名称 | 类型 | 说明 |
status | 状态码 | int(4) | ?见附表
其他失败 |
message | 消息描述 | String(32) | |
taskId | 任务ID | long(8) |
数据样例:
请求json:
{ ??? "appKey": "10001", ??? "timestamp": "1546589422955", ??? "mobile": "13800138001", ??? "content": "【签名测试】这是一条测试短信", ??? "spNumber": "234", ??? "sendTime": "", "reportUrl": "", “moUrl”:””, ?? ?"attach": "", ??? "sign": "4b38b34fb70fcc4c49e180fbd5a9854b" } |
响应Json:
{ ??? "message": "提交成功", ??? "taskId": 6468846578735812608, ??? "status": 1 } 或失败 { ??? "message": "提交数据错误", ??? "status": 2 } |
/**
* 发送短信
*
* @param smsModule 模块名称
* @param phone 手机号
* @param receiveName 接收人姓名
* @param message 发送内容
* @return
*/
public ActionResult sendSms(String smsModule, String phone, String receiveName, String message) {
Request request = null;
ActionResult actionResult = ActionResult.fail("发送短信失败");
LogSmsMessageVo logSmsMessageVo = new LogSmsMessageVo();
String status = "1";
try {
//平台提供的appKey
appKey = x.getDictValue();
//平台提供的appSecret
appSecret = x.getDictValue();
//平台提供的发送短信url
sendUrl = x.getDictValue();
} catch (Exception e) {
log.error("查询发送短信参数异常,异常信息" + e);
}
Response resp = null;
String taskId = "";
String sendStat = "";
try {
request = Request.newHttpRequestBuilder().uri(sendUrl).timeout(5000).charset("utf-8").method(Request.POST)
.contentType(Request.ContentType.JSON).build();
//1. 构建数据包对象
SendSmsEntity sendEntity = this.buildSendEntity(phone, message);
//2. 转化对象为json字符串数据
String data = JSONObject.toJSONString(sendEntity);
//3. 字符串url编码,防止特殊字符被客户端强行改变,譬如+会被浏览器或者其他客户端变更为空格
String encodeData = URLEncoder.encode(data, "UTF-8");
//4. 发送
resp = request.send(sendUrl, encodeData);
log.info("发送短信,手机号:" + phone + ",发送内容:" + message + ",返回结果:" + resp.content());
JSONObject jsonObject = JSONObject.parseObject(resp.content());
if (ObjectUtils.isNotEmpty(jsonObject)) {
actionResult.setMsg(jsonObject.get("message") + "");
actionResult.setData(jsonObject.get("message") + "");
}
//解析发送结果
if (200 == resp.status()) {
if ("1".equals(jsonObject.get("status") + "")) {
log.info("发送短信成功");
status = "0";
sendStat = "2";
taskId = jsonObject.get("taskId") + "";
actionResult.setCode(200);
} else {
//数据提交失败,发送必然失败
sendStat = "0";
log.info("发送短信失败,失败原因" + jsonObject.get("message"));
}
} else {
if (resp.content() != null) {
taskId = jsonObject.get("taskId") + "";
log.info("发送短信返回失败,返回内容" + resp.content());
} else {
log.info("发送短信失败,返回响应内容为空");
}
sendStat = "0";
}
} catch (Exception e) {
log.error("发送短信异常,异常信息" + e.getMessage());
} finally {
request.release();
}
return actionResult;
}
查询报告接口
地址: http://ip:port/api/sms/air/report
描述:客户平台 ==> 大业务平台
请求:
字段 | 名称 | 类型 | 说明 |
appKey | 接入账户 | String(32) | 平台分配 |
sign | 签名 | String(32) | md5(appKey+ appSecret) appSecret为平台分配接入账户的密钥 |
数据响应:
字段 | 名称 | 类型 | 说明 |
status | 状态码 | int(4) | ?1 – 提交成功;其他-失败 |
message | 错误描述 | String(32) | ?错误描述 |
data | 数据字段 | JSONArray | ?报告数据放入此字段中 |
data内容描述:
字段 | 名称 | 类型 | 说明 |
id | 数据包标识 | String(20) | 固定值:report |
taskId | 任务ID | long(8) | 任务ID+用户号码=唯一性 |
batchNo | 批次序号 | int | 默认1, 当提交的为长短信时,该字段匹配内容序号;如一条短信分隔为3条,该字段范围1,2,3 |
mobile | 用户号码 | String(20) | ?用户号码 |
stat | 状态码 | int(4) | ?1 – 成功;其他-失败 |
statMsg | 状态描述 | String(32) | ?状态描述 |
attach | 附加值字段 |
数据样例:
请求:
{ ??? "appKey": "90001", ??? "sign": "2cff25eaa14b0f5c54a4f56e26e7c517" } |
响应:
{ ??? "data": [ ??? { ??????? "batchNo": 1, ??????? "stat": 1, ??????? "statMsg": "成功", ??????? "mobile": "13800138000", ??????? "id": "report", ??????? "attach": "", ??????? "taskId": 6479258452121862144 ??? }, ??? { ??????? "batchNo": 1, ??????? "stat": 1, ?? ?????"statMsg": "成功", ??????? "mobile": "13800138000", ??????? "id": "report", ??????? "attach": "", ??????? "taskId": 6479266612358397952 ??? }], ??? "message": "提交成功", ??? "status": 1 } |
回调报告接口
描述:大业务平台 ==> 客户平台
请求接口:
字段 | 名称 | 类型 | 说明 |
id | 数据包标识 | String(20) | 固定值:report |
taskId | 任务ID | long(8) | 任务ID+用户号码=唯一性 |
batchNo | 批次序号 | int | 默认1, 当提交的为长短信时,该字段匹配内容序号;如一条短信分隔为3条,该字段范围1,2,3 |
mobile | 用户号码 | String(20) | ?用户号码 |
stat | 状态码 | int(4) | ?1 – 成功;其他-失败 |
statMsg | 状态描述 | String(32) | ?状态描述 |
attach | 附加值字段 | String(100) | ?请求时携带客户数据字段 |
响应:
字段 | 名称 | 类型 | 说明 |
status | 状态码 | int(4) | ?1 – 成功接收;其他-失败 失败尝试3次发送,超过3次放弃 |
数据样例:
请求:
[ ??? { ??????? "batchNo": 1, ??????? "stat": 1, ??????? "statMsg": "成功", ??????? "mobile": "13800138000", ??????? "id": "report", ??????? "attach": "", ??????? "taskId": 6479258452121862144 ??? }, ??? { ??????? "batchNo": 1, ??????? "stat": 1, ??????? "statMsg": "成功", ??????? "mobile": "13800138000", ??????? "id": "report", ??????? "attach": "", ???? ???"taskId": 6479266612358397952 ??? }] |
响应:
{ ?????? "status": 1, //状态成功 } |