WebService 接口说明
一、接口定义
a) SendMessage 批量发送短信方法 (不支持同一userID的多线程调用) i. public SendState SendMessage(string UserId, string Password, string Msg, string
Destnumbers) ii. 参数说明: 参数 UserId Password Msg Destnumbers 描 述 用户Id(平台识别的用户号码), 49字节以内。 密码, 99字节以内 短信内容, 159字节以内 目标号码,用分号(;)分隔,在一万条以内。 iii. 返回值
public class SendState { public int state; public string WrongNumbers; public string YDGroupId; // 发送到移动的短信的批次号 public string LTGroupId; // 发送到联通的短信的批次号 }
state 0: success
2: 失败需要重发 4: 内容不合法 5: 身份验证错误 6: 服务器错误 8: 短信数超过可用数
12: 该用户不允许使用子用户ID 13: 错误的号码格式
WrongNumbers 为错误的目标号码,用分号分隔,目前只是按移动和联通进行过滤。即不属于联通或移动的号码会被放入这里。 YDGroupId, LTGroupId 发送的短信所属的批次号,用于以后查询短信的发送状态。
b) SendMessageWithSub 发送短信时带有子号码 (不支持同一userID的多线程调用) i. public SendState SendMessageWithSub(string UserId, string SubId, string
Password, string Msg, string Destnumbers) ii. 参数说明 参数 UserId SubId 描 述 用户Id(平台识别的用户号码),49字节以内。 子用户号码 (14位 以内), 14字节以内 Password Msg Destnumbers iii. 返回值
同SendMesseage
密码, 90字节以内 短信内容,159字节以内 目标号码,用分号(;)分隔,一万条以内
c) QueryFailedMessage 查询失败短信 i. public MessageStateResponse QueryFailedMessage(string UserId, string Password,
int groupId) ii. 参数说明 参数 UserId Password groupId 描 述 用户Id(平台识别的用户号码) ,49字节以内。 密码,99字节以内。 发送的短信所属的批次号
iii. 返回值
public class MessageStateResponse { public int state; // 0 表示正常, 5表示身份验证错
// 10: 没有找到相应的GroupId
public string subuserid;
public int totalCount; // 总数 public string content; // 短信内容 public MessageState[] MsgState; // 具体消息的状态, 这里仅包含失败短信的状态 }
public class MessageState { public string DestNumber; // 目标号码 public int state; // -1 表示失败 public string SendTime; // 发送时间 }
d) QueryMessageState 查询短信的发送状态 i. public MessageStateResponse QueryMessageState(string UserId, string Password,
int groupId) ii. 参数说明 参数 UserId Password groupId 描 述 用户Id(平台识别的用户号码) ,49字节以内。 密码,99字节以内。 发送的短信所属的批次号
iii. 返回值
public class MessageStateResponse {
public int state; // 0 表示正常, 5表示身份验证错 // 10: 没有找到相应的GroupId public string subuserid; public int totalCount; // 总数 public string content; // 短信内容 public MessageState[] MsgState; // 具体消息的状态,这里包含失败和成功。 }
public class MessageState { public string DestNumber; // 目标号码 public int state; // -1 表示失败 1表示成功的 (这里实际的成功需要根据计费方式判断,有实时性) public string SendTime; // 发送时间 }
e) QueryUserState 查询用户短信余量 i. public UserState QueryUserState(string UserId, string Password) ii. 参数说明 参数 UserId Password 描 述 用户Id(平台识别的用户号码) ,49字节以内。 密码,99字节以内。 iii. 返回值
public class UserState { public int state; //执行状态 0 为成功 public int total; //用户短信发送总额 public int dailyTotal; // 当天发送总额 public int remained; // 总的余额 public int todayRemained; // 今天的余额 }
二、查询短信状态和发送短信的关系
a) 发送短信后返回的批次号的意义 i. 系统提供批量发送短信的能力,由于,确认短信的接收状态有一定的延迟性,
所以先返回批次号,查询时使用该号码确认需要查询的短信所属的批次。 ii. 由于有两个手机短信运营商,移动和联通,对短信的处理有所不同,因此在发
送前,将对号码进行分类。相同运营商一次发送的短信所属的批次将是一样的。如果号码中包含两种类型,那么将得到两个批次号。
b) 如何使用批次号查询 i. 可以通过批次号一批短信(不管是联通还是移动),所以查询时直接发送批次
号即可。 ii. 查询状态的延迟性。确认手机接收情况有一定的延迟性,比如手机用户暂时关
机。每次查询只能得到当前已知的返回状态。 如果需要获取全部的失败短信
状态,又需要尽可能快的重发失败短信,则需要多次查询。建议查询的时间安排为2,4,8,12,24,48
iii. QueryMessageState 和 QueryFailedMessage 差别:
1. QueryMessageState同时返回当前已知的成功和失败的短信状态(以属性
标示)
2. QueryFailedMessage只返回失败的短信状态(当前已知的)
三、通过Web方式被动接收上行消息
a) 使用被动方式接收上行消息时,需要提供一个可以处理消息的url。 b) 被动方式的提交格式: i. 服务器端将向该Url使用POST方式提交数据,其包含的字段为:
1. userId 用户ID
2. passwd 接收端密码,可以用来屏蔽非法访问。该密码不是用户密码,
需要跟管理员协商确定。接收端可以忽略该字段。但在防止黑客攻击时,比较有用。
3. messages 上行的短信。使用UrlEncode方式Encode过,处理前需要解码
(Decode)。
每条短信内字段间以 “\\t” (制表符) 分隔, 每条短信以 “\\n” 结尾(换行符) 短信中字段意义按顺序如下: 字段 UserId 子用户ID 来源手机号码 接收时间 短信内容 描 述 上行短信的目标用户ID 客户自定义子用户ID。如果不是使用客户定义子用户发送的短信,该字段为空。 短信来源的手机号码 服务器端接收到短信的时间 上行短信的内容。
c) 接收方的返回值 i. 接收方只需要在接收处理成功时返回字符串SUCCESS即可(必须大写)。发
送方将会把发送过的短信置为已读而不会重复发送。 四、Url
五、常见问题或者错误
a) 使用SendMessage和SendMessageWithSub时,目标号码应该用分号分隔。
b) 使用SendMessageWithSub 时应该用代理商ID 作为UserId, 然后在subUserId里
填充用户自己的子用户ID。 不可以为30-49的代理商在系统中建立子用户。将会被过滤。
c) Delphi中需要使用UTFString做调用参数。
d) 在接收上行短信时,返回的不是大写的SUCCESS,导致上行的短信重复发送。 e) 处理message字段内数据前,需要对整个字段内容进行解码。
f) 使用多线程,同一帐号使用多线程调用SendMessage 或者 SendMessageWithSub,
会发生冲突,发送效率反而降低,甚至给服务器造成额外负担。