推送状态/上行(加密版)

推送说明

  • Content-Type: application/json;charset=utf-8
  • 编码: UTF-8
  • 推送地址: 客户需提供状态报告以及上行推送地址
  • 推送频次: 推送失败将会在1分钟、5分钟、10分钟和1小时后再次尝试推送
  • 推送结果: 客户正常处理后返回0。返回其他任何数据系统都会识别为推送失败
  • 推送方式: 单条推送

请求样例

  {
    "account": "api003",
    "ts": "1698632973036",
    "bizContent": "10e18d2ebaebdb485cae33dca2604e10706cfa2ba255ba0bedb7ec9f7099",
    "sign": "1f55c5a8b38bc37706bbed532940ae4190814a5c96fe2c3"
}

请求参数说明

参数数据类型是否必填字段解释
accountString对接账号(短信平台提供)
tsString时间戳。单位:毫秒
bizContentString加密后的请求内容。原始数据对象先转为json字符串,然后使用AES进行加密。AES使用AES/ECB/PKCS5Padding模式加密,密钥长度128位。AES加密参考 AesUtil.java
signString数字签名。 说明:参数(account,ts,appSecret,bizContent)按照升序拼接,再使用SHA256生成签名。

数字签名

数字签名实现

import com.google.common.base.Joiner;
import org.apache.commons.codec.digest.DigestUtils;

public static String generateSign(String account, String ts, String  bizContent, 
                                            String appSecret) throws Exception {
    Map<String, String> params = new TreeMap<>();
    params.put("account", account);
    params.put("appSecret", appSecret);
    params.put("ts", ts);
    params.put("bizContent", bizContent);

    String str = Joiner.on("&").withKeyValueSeparator("=").join(params);
    return DigestUtils.sha256Hex(str);
}

数字签名样例

原始内容拼接:

account=api003&appSecret=ba92fa4836984eb98156e6ec8a6b2454&bizContent=10e18d2ebaebdb485cae33dca2&ts=1698632973036

签名结果:

1f825da81826e47c4dbff9a5c785cb8c141dcb1a5343d3650bfe6794879ef400

原始数据

状态报告(Report)参数

{
    "stat": 6,
    "smsId": "03e2c9e81a54416ba2a046eac6f52b63",
    "phoneNumber": "17530663764",
    "statDes": "REJECTD",
    "revTime": 1698636405820
}
参数数据类型是否必填字段解释
phoneNumberString手机号
smsIdString消息Id
statInt状态。0:成功,其他为失败
statDesString发送失败错误码
revTimeInt64接收时间,毫秒

上行(Deliver)参数

{
    "phoneNumber": "17530663764",
    "content": "R",
    "subCode": "123",
    "smsId": "8b8a8939d5424bd0ad60aea59e995434"
}
参数数据类型是否必填字段解释
phoneNumberString手机号
contentString上行内容
subCodeString扩展码
smsIdString上行对应的短信消息ID。 更新于2025-03-14