短信平台接口协议(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×tamp=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×tamp=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×tamp=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 | 手机欠费停机 |