短信平台接口协议(V3.2)

1. 概述

1.1. 协议说明

本协议是商户和短信平台之间的接口协议,该协议采用主流的http协议,商户通过发送http请求实现短信的发送,状态报告、上行短信的获取等。

1.2. 适用范围

本协议适用于商户和短信平台的对接。

1.3. 约定

编码:若无特殊说明,则所有内容或字段一律以UTF-8编码,若某个字段有特殊说明,以特殊说明为准。
字节序:通信过程中的数据类型全部采用网络字节序。
命名风格:java命名风格,即常量采用全部大写,多个单词用下划线隔开。字段当只有一个单词后,采用全部小写形式,如果大于或等于2个单词,则第二个单词开始首字母小写形式,如userName。
大小写敏感:如无特殊说明,则所有内容均是大小写敏感的,比如username和userName表示不同的单词。


1.4. 数据类型

类型 字节长度 说明
Byte 定长1 1字节有符号整数,取值范围 -128 ~ 127
Integer 定长4 4字节有符号整数
Long 定长8 8字节有符号长整数
String 定长或变长 如果后面带有括号说明,则为定长字符串,长度为括号内的数据。位数不足时,应左对齐,并右补二进制0,即ascii码值为0的字符。例如:String(8),当内容为abc时,应右补5个二进制0.没有括号则为变长字符串
JSONArray 变长 JSON格式的数组
JSON 变长 JSON对象



1.5. 参考资料

(无)


2. 通信流程

短信平台接入商户通过http协议的POST方式发送短信时,应设置http Header里的Content-Type 为application/x-www-form-urlencoded;charset=UTF-8, 所有的http响应均返回一个JSON格式的字符串。


3. HTTP的消息定义

3.1. 商户向短信平台提交短信


3.1.1. 请求地址和注意事项

请求地址: http://sms.whdrawing.com/api/v3/sendSms
appId、appSecret等参数信息请联系管理人员索取

3.1.2. 请求报文示例

用户获得的各项参数如下:
appId=BfxdjhBApaBQQsTP
appSecret=zigkDmERCfMqWvZqemAFpLAxICbDWE
phone=13080612932
templateCode=SMS_135485028
模板内容:您的验证码是${code}。如非本人操作,请忽略本短信

那么对应的请求报文如下:
POST /api/v3/sendSms HTTP/1.1
Content-Length: 222
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host:
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.4.1 (Java/1.7.0_75)
Accept-Encoding: gzip,deflate

nonce=2018071118461437&signName=test&phone=13080612932&appId=BfxdjhBApaBQQsTP&sign=A4A99F9F411E18EBBA36C7B3E1FF10A6&templateParam={“code”:”5895632”}&outId=20180702142850&templateCode=SMS_135485028&nonce=13080612932&sendTime=20180702142850&timestamp=20180702142850

3.1.3. 请求参数及解释

参数 必填 长度 描述
timestamp 14 当前时间的时间戳,格式为YYYYMMDDHHMMSS
nonce 不超过 32 位 随机数用于防止重放攻击,建议使用UUID
appId 16 短信平台分配给商户的用于接口通讯的应用编号
sign 32 签名。算法为:时间戳与应用编号与应用秘钥进行字符串拼接的md5值的大写形式。
即 sign = md5( nonce + timestamp +appId + appSecret)。
appSecret是短信平台分配给商户的与appId配套的密码。
例如:假设nonce为2018071118461437,密码为123456,时间戳为20180702144319,
appId为123456那么生成的md5为:24C893EB3406585D0E96B9979F9E241F
phone 11 用户手机号,不含86,一般手机号为11位。
outId 不超过 36 位 外部流水扩展字段,商户平台能唯一标识此条短消息的id,
短信平台会原封不动地返回此字段值。id长度不超过36个字符
sendTime 不超过 14 位 如果为空,表示短信平台收到短信后立即发送给用户。
如果不为空,则表示短信的发送时间的时间戳,格式为YYYYMMDDHHMMSS,
例如: 20150501123000并且timedSend参数为1
表示短信将于2015年5月1号12点30分整发送给用户。
如需要延时发送短信需要配合sendDelay参数(设置为1)
sendDelay 1 0 表示立即发送短信;
1 或其他表示延时发送,发送时间为sendTime
orgCode 不超过 16 位 商户内部的组织机构编号,最长不超过16个字符。短信平台不维护此编号,商户应自己来区分和维护该值,例如abc代表一个组织机构,def代表另一个组织机构。强烈建议商户为每个组织机构取个有意义和规律的名字,例如组织机构首字母缩写等。该字段可为空。
signName 不超过 10 位 短信签名如 世纪科技 短信平台会自动加上【】
templateCode 13 短信模板编号,商户可以从模板管理里申请模板,审核通过后可以获得模板相关信息
templateParam 无限制 短信模板参数,没有动态参数时没有此字段,如果有动态参数格式为json 如:
sp 1 商户自己指定号码的运营商,1 移动 2 联通 3 电信,不传由系统判断
extSubNum 不超过 10 位 用户自定义扩展码



3.1.4. 响应参数

返回值是一个json对象,json对象的属性如下:

参数 类型 描述
result Integer 0表示成功,其余表示失败,失败代码含义见4.2
desc String 接口错误码描述
body JSON 当result 不等于0 时为空json对象,当result为0时为一个json对象,对象属性见下表。

body中的元素属性为:

参数 类型 描述
phone String 手机号
outId String 商户请求时带过来的outId
bizId String 短信平台生成的唯一标识此条短信的id,最长不超过36个字节



3.1.5. 响应报文举例

正确响应报文举例:
{“result”:0,”desc”:”“,”body”:{“bizId”:”BfxdjhBApaBQQsTP-180702101109-380253”,”phone”:”13080612932”,”outId”:”20180702101111”}}
失败响应报文举例:
{“result”:301,”desc”:”短信签名不能为空”,”body”:null}

3.2. 商户主动查询状态报告


3.2.1.请求地址和注意事项

请求地址: http://sms.whdrawing.com/api/v3/queryMsgReport
appId、appSecret等参数信息请联系管理人员索取

3.2.2.请求报文示例

用户获得的各项参数如下:
appId=BfxdjhBApaBQQsTP
appSecret=zigkDmERCfMqWvZqemAFpLAxICbDWE

那么请求示例报文如下:
POST /api/v3/queryMsgReport HTTP/1.1
Content-Length: 222
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: sms.whdrawing.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.4.1 (Java/1.7.0_75)
Accept-Encoding: gzip,deflate

nonce=2018071118461437&sign=F07BDECE091C662346872867FF2964C8&timestamp=20180702144201&appId=BfxdjhBApaBQQsTP

3.2.3.请求参数及解释

参数 描述
timestamp 当前时间的时间戳,格式为YYYYMMDDHHMMSS
appId 短信平台分配给商户的用于接口通讯的用户名
nonce 随机数
sign 签名。算法为:时间戳与应用编号与应用秘钥进行字符串拼接的md5值的大写形式。
即 sign = md5( nonce + timestamp +appId + appSecret)。
appSecret是短信平台分配给商户的与appId配套的密码。
例如:
假设nonce为2018071118461437,密码为123456,
时间戳为20180702144319,appId为123456那么生成的md5为:
24C893EB3406585D0E96B9979F9E241F



3.2.4.响应参数

返回值是一个json对象,json对象的属性如下:

参数 类型 描述
result Integer 0表示成功,其余表示失败,失败代码含义见4.2.
desc String 接口错误码描述
body JsonArray 当result 不等于0时为空json数组,当result为0时为一个json数组,每个元素是个json对象,对象属性见下表。


body中元素的对象属性

参数 类型 描述
bizId String 短信平台的消息id
outId String 商户提交给短信平台的消息标识
phone String 手机号
rptStatus Integer 0 成功,其余失败,状态报告错误码定义请参看4.3
rptStat String 状态报告的字符串描述,请参看4.4



3.2.5.响应报文举例

正确响应报文举例:

{
    "result": 0,
    "desc": "",
    "body": [{
        "phone": "13080612935",
        "outId": "20180627151335",
        "bizId": "BfxdjhBApaBQQsTP-180702090241-320987",
        "rptStatus": 9,
        "rptStat": "12"
    },
    {
        "phone": "13080612935",
        "outId": "20180627151335",
        "bizId": "BfxdjhBApaBQQsTP-180702090241-320988",
        "trtStatus": 9,
        "rptStat": "12"
    }]
}

失败响应报文举例:

{
    "result": 999,
    "desc": "服务器未知错误",
    "body": []
}



3.3. 商户主动查询上行短信


3.3.1.请求地址和注意事项

请求地址: http://sms.whdrawing.com/api/v3/queryMsgReceive
appId、appSecret等参数信息请联系管理人员索取



3.3.2.请求报文示例

用户获得的各项参数如下:
appId=BfxdjhBApaBQQsTP
appSecret=zigkDmERCfMqWvZqemAFpLAxICbDWE

那么请求示例报文如下:
POST /smtp/v1/queryMsgReceive HTTP/1.1
Content-Length: 222
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: sms.whdrawing.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.4.1 (Java/1.7.0_75)
Accept-Encoding: gzip,deflate

nonce=2018071118461437&sign=F07BDECE091C662346872867FF2964C8&timestamp=20180702144201&appId=BfxdjhBApaBQQsTP



3.3.3.请求参数及解释

参数 描述
timestamp 当前时间的时间戳,格式为YYYYMMDDHHMMSS
appId 短信平台分配给商户的用于接口通讯的用户名
nonce 随机数
sign 签名。算法为:时间戳与应用编号与应用秘钥进行字符串拼接的md5值的大写形式。
即 sign = md5( nonce + timestamp +appId + appSecret)。
appSecret是短信平台分配给商户的与appId配套的密码。
例如:
假设nonce为2018071118461437,密码为123456,
时间戳为20180702144319,appId为123456那么生成的md5为:
24C893EB3406585D0E96B9979F9E241F



3.3.4.响应参数

返回值是一个json对象,json对象的属性如下:

参数 类型 描述
result Integer 0表示成功,其余表示失败,失败代码含义见4.2.
desc String 接口错误码描述
body JsonArray 当result 不等于0时为空json数组,当result为0时为一个json数组,每个元素是个json对象,对象属性见下表。


body中元素的对象属性

参数 类型 描述
sp Integer 1 表示是移动上行短信
2表示是联通上行短信
3表示是电信上行短信
spNumber String 用户上行的目标号码,也就是商户的接入行号,如10690499…等。
bizId String 短信平台的此条上行短信的id
phone String 用户手机号
msgContent String 用户上行的短信内容



3.3.5.响应报文举例

正确响应报文举例:

{
    "result": 0,
    "desc": "",
    "body": [{
        "sp": 2,
        "phone": "13080612932",
        "spNumber": "999901",
        "buzId":"BfxdjhBApaBQQsTP-180702090241-321038",
        "msgContent": "短信上行测试vtb"
    },
    {
        "sp": 2,
        "phone": "13080612932",
        "spNumber": "999901",
        "buzId":"BfxdjhBApaBQQsTP-180702090241-321037",
        "msgContent": "短信上行测试bLy"
    }]
}

失败响应报文举例:

{
    "result": 999,
    "desc": "服务器未知错误",
    "body": []
}




4. 常量定义

4.1. 错误码定义

错误码 描述
0 无错误,命令正确接收
201 timestamp参数不能为空
202 appId参数不能为空
203 短信签名参数不能为空
204 appId 不存在或无效
205 签名错误(appId 或 app_secret错误)
206 没有对应的商户
301 短信签名不能为空
302 手机号不能为空
303 短信模板编号不能为空



4.2. 状态报告错误码定义(rptStatus字段)

错误码 描述
0 无错误,短消息已经投递到用户手机
1 短消息已过期
2 短消息已被删除
3 短消息无法投递
4 等待发送中
5 短消息处于非法状态中
6 短消息被拒收
9 其他错误,当错误码为9时,根据rptStat字段来识别出错信息



4.3. 状态报告错误字符串描述(rptStat字段)

rptStat 描述
0 短信正常投递到用户手机
DELIVRD 短消息投递成功
EXPIRED 短消息超过有效期
DELETED 短消息已经被删除
UNDELIV 短消息是不可转发的
ACCEPTD 短消息已经被最终用户接收
UNKNOWN 未知短消息状态
DTBLACK 目的号码是黑名单号码
REJECTD 短消息被拒绝
MI00000 消息在短信中心过期
MI00020 短信下发手机终端失败Error in MS
MI00022 手机终端内存满
MI00029 手机终端不在服务区
MI00030 手机终端忙,短信中心下发短信失败
MI00036 网络/协议 失败
MI00063 短信中心查询HLR超时
MI00064 短信中心查询MSC/SGSN超时
MK00001 手机终端是空号
MK00011 手机终端没有短信业务
MK00013 手机终端停机
MN00001 手机终端是空号
MN00013 目的号码不在白名单过滤中被拦截
11 节点忙,指本节点存储队列满或其他原因,暂时不能提供服务的情况
-43 状态报告超时
43 用户关机
-74 手机欠费停机