[关闭]
@jiangyifen 2017-02-26T14:34:04.000000Z 字数 12359 阅读 679

RSMW 2 API 文档

中间件 API

作者:江毅奋
手机:13391026171
邮箱:jiangyifen@rssoft.cc
QQ:1072661132


1. 阅读方法

2. 基本约定

2.1 通信方式

2.2 URL 及 HTTP POST JSON格式

  1. http(s)://${IP}:${PORT}/rsmw/api/${API_VERSION}/?sign=${sign}

例:

  1. http(s)://192.168.100.100:18080/rsmw/api/2.0?sign=371d58f95967f0c87b95376b39ec2552

注意,HTTP 请求头部的 Content-Type 必须 如下设置

  1. Content-Type: text/plain;charset=UTF-8
  1. {
  2. "timestamp":"1478321775260",
  3. "command":"${commandName}"
  4. "${keyX}":"${valueX}"
  5. }
  1. {
  2. "timestamp":"1478321782349",
  3. "errCode":"${errCode}",
  4. "errMsg":"${errMsg}",
  5. "${keyX}":"${valueX}"
  6. }
  1. {
  2. "timestamp":"1478321785359",
  3. "event":"${event_name}",
  4. "${KEY-X}":"${VALUE-X}"
  5. }
  1. System.currentTimeMillis()

2.3 API的调用者

2.4 英文字母大小写

2.5 编码


3. API认证

RSMW通过“校验签名”的方法对调用者的身份进行认证。

当你的应用需要向RSMW服务器端发送jsonString时,先获整个jsonString的sign:

String sign = RsmwSignUtil.sign(jsonString, apiSecret);

然后把sign在URL中带上,供rsmw服务器端校验:

String url = "http://192.168.100.100/rsmw/api/2.0?sign=" + sign;
  1. http://192.168.100.100/rsmw/api/2.0?sign=371d58f95967f0c87b95376b39ec2552
  2. {
  3. "timestamp":"1478321782349",
  4. "command":"orignate",
  5. "xxxx":"yyyy"
  6. }

Java签名工具类:

  1. import java.security.MessageDigest;
  2. public class RsmwSignUtil {
  3. private static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
  4. private static final String md5(String s) {
  5. try {
  6. byte[] btInput = s.getBytes();
  7. // 获得MD5摘要算法的 MessageDigest 对象
  8. MessageDigest mdInst = MessageDigest.getInstance("MD5");
  9. // 使用指定的字节更新摘要
  10. mdInst.update(btInput);
  11. // 获得密文
  12. byte[] md = mdInst.digest();
  13. // 把密文转换成十六进制的字符串形式
  14. int j = md.length;
  15. char str[] = new char[j * 2];
  16. int k = 0;
  17. for (int i = 0; i < j; i++) {
  18. byte byte0 = md[i];
  19. str[k++] = hexDigits[byte0 >>> 4 & 0xf];
  20. str[k++] = hexDigits[byte0 & 0xf];
  21. }
  22. return new String(str);
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. return null;
  26. }
  27. }
  28. public static final String sign(String jsonString, String apiSecret){
  29. String result = md5(jsonString + apiSecret);
  30. return result;
  31. }
  32. }

4. Quick Start

4.1 API 配置

4.2 测试

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"helloWorld"
  4. }

RSMW 会向你返回

  1. {
  2. "timestamp":1478321782349,
  3. "errCode":"0",
  4. "errMsg":"Hello World!"
  5. }

4.3 订阅Event

勾选需要订阅的Event

5. API Command

5.1 【新增Agent】/【删除Agent】/【获取所有Agent】

用途:Agent(座席)一般对应于第三方应用的“用户”概念。第三方的用户与RSMW的Agent需要用此接口实现同步。
调用时机:第三方应用新增用户、删除用户时

字段 说明 类型 长度 必填
agentAid 第三方应用中用户的唯一标识,一般是id或用户名 String 64
agentName 姓名 String 64
agentJobNumber 工号 Long 64

- 【新增Agent】

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"agentSave",
  4. "agentAid":"1001",
  5. "agentName":"张三",
  6. "agentJobNumber":1001
  7. }

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"agentDelete",
  4. "agentAidList":["1001","1002"]
  5. }

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"agentListAll"
  4. }

Response:

  1. {
  2. "timestamp": 1478321782349,
  3. "errCode": "0",
  4. "errMsg": "SUCCESS",
  5. "result": [
  6. {
  7. "agentName": "张三",
  8. "aid": "1001",
  9. "extColumns": {},
  10. "id": 1,
  11. "jobNumber": 1001
  12. },
  13. {
  14. "agentName": "李四",
  15. "aid": "1002",
  16. "extColumns": {},
  17. "id": 2,
  18. "jobNumber": 1002
  19. }
  20. ]
  21. }

5.2 【绑定】/【解绑】

字段 说明 类型 长度 必填
agentAid 第三方应用中用户的唯一标识,一般是id或用户名 String 64
sipPhoneName 所要绑定的SIPPHONE的分机号 String 64

- 【绑定】
Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"bind",
  4. "agentAid":"1001",
  5. "sipPhoneName":"8001"
  6. }
  1. {
  2. "timestamp":"1478321782349",
  3. "command":"unBind",
  4. "agentAid":"1001"
  5. }
  1. {
  2. "timestamp":"1478321782349",
  3. "command":"unBind",
  4. "sipPhoneName":"8001"
  5. }

5.3 【绑定关系查询】

字段 说明 类型 长度 必填
agentAid 第三方应用中用户的唯一标识,一般是id或用户名 String 64
sipPhoneName 所要绑定的SIPPHONE的分机号 String 64

- Request:

  1. {
  2. "command":"getBindInfo",
  3. "agentAid":"1001"
  4. }
  1. {
  2. "command":"getBindInfo",
  3. "sipPhoneName":"8001"
  4. }
  1. {
  2. "timestamp":"1478321782349",
  3. "errCode":"0",
  4. "errMsg":"SUCCESS",
  5. "agentAid":"1001",
  6. "sipPhoneName":"8001"
  7. }

5.4 【置忙】和【置闲】

字段 说明 类型 长度 必填
queueMemberInterface 技能组成员所使用的设备拨号字符串,格式为:SIP/${sipPhoneName} String 64
reason 置忙原因 String 64

- 【置忙】
Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"queueMemberPause",
  4. "queueMemberInterface":"SIP/8001",
  5. "reason":"开会"
  6. }
  1. {
  2. "timestamp":"1478321782349",
  3. "command":"queueMemberUnPause",
  4. "queueMemberInterface":"SIP/8001"
  5. }

5.5 【实时并发数查询】

字段 说明 类型 长度 必填
channels 实时通道数 Integer 64
calls 实时通话数 Integer 64

说明:“通道”指一个设备(话机或网关)和RSMW之间的一个连接;“通话”指“一通电话”,可能包含多个“通道”
例如:8001分机呼叫8002分机(产生1个“通道”:SIP/8001-XXXXXXXX,1个通话),8002振铃(产生第2个通道:SIP/8002-XXXXXXXX),8002接起。此时系统中共有2个“通道”,1个“通话”。

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"getChannelCount"
  4. }

Response:

  1. {
  2. "timestamp":"1478321782349",
  3. "errCode":"0",
  4. "errMsg":"SUCCESS",
  5. "channels":201,
  6. "calls":100,
  7. }

5.6 【发起呼叫】

字段 说明 类型 长度 必填
absoluteTimeout 通话超时时间(秒)。超时后自动挂断 Integer 32
src 第一路呼叫的号码 String 64
srcGateway 第一路呼叫所需要走的gateway。若src为内部分机号,则此字段无需填写 String 64
srcAccessNumber 第一路呼叫所需要用的主叫号。若src为内部分机号,则此字段无需填写 String 64
srcAnnounceMediaUrl 第一路呼叫接通后所听到的提示音 String 64
dst 第二路呼叫的号码 String 64
dstGateway 第二路呼叫所需要走的gateway。若dst为内部分机号,则此字段无需填写 String 64
dstAccessNumber 第二路呼叫所需要用的主叫号。若dst为内部分机号,则此字段无需填写 String 64
dstAnnounceMediaUrl 第二路呼叫接通后所听到的提示音 String 64
queueLength RSMW 内部呼叫队列中,当前排队的呼叫请求数量 Integer 64

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"originate",
  4. "absoluteTimeout":300,
  5. "src":"13391026171",
  6. "srcGateway":"myGatewayName1",
  7. "srcAccessNumber":"60172133",
  8. "srcAnnounceMediaUrl":"http://ip:port/path",
  9. "dst":"13761488223",
  10. "dstGateway":"myGatewayName2",
  11. "dstAccessNumber":"60172133",
  12. "dstAnnounceMediaUrl":"http://ip:port/path"
  13. }

Response:

  1. {
  2. "timestamp":"1478321782349",
  3. "errCode":"0",
  4. "errMsg":"SUCCESS",
  5. "queueLength":10
  6. }

5.7 【获取指定SipPhone的当前Channel】

字段 说明 类型 长度 必填
sipPhoneName sipPhone的分机号 String 64
channel sipPhone的channel String 64
connectedChannel 正与sipPhone接通的对方channel String 64

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"getChannel",
  4. "sipPhoneName":"8001"
  5. }

Response:

  1. {
  2. "timestamp":"1478321782349",
  3. "errCode":"0",
  4. "errMsg":"SUCCESS",
  5. "channel":"SIP/8001-XXXXXXXX",
  6. "connectedChannel":"SIP/gw1-XXXXXXXX"
  7. }

5.8 【转接Channel】

字段 说明 类型 长度 必填
channel 希望转接的channel名称 String 64
exten 希望将channel转接到的目标分机号 String 64

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"redircet",
  4. "channel":"SIP/8001-XXXXXXXX",
  5. "exten":"13391026171"
  6. }

5.9 【挂断Channel】

字段 说明 类型 长度 必填
channel 希望挂断的channel名称 String 64

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"hangup",
  4. "channel":"SIP/8001-XXXXXXXX"
  5. }

5.10 【获取所有SipPhone状态】

用途:查询所有的sipPhone状态

字段 说明 类型 长度 必填
online sipPhone是否注册在线 Boolean
regStatus sipPhone当前注册状态描述 String 64
currentChannel sipPhone当前channel名称 String 64
channelState sipPhone当前通话状态【READY,RINGING,RING,UP】 String 64
connectedChannel 正与sipPhone接通的对端channel名称 String 64
agent 当前绑定该sipPhone的坐席 Object
agent.id agent的id Long 64
agent.aid agent的aid String 64
agent.agentName agent的姓名 String 64
agent.jobNumber agent的工号 Long 64
sipPhone sipPhone对象 Object
sipPhone.id sipPhone的id Long 64
sipPhone.name sipPhone的分机号 String 64
sipPhone.secret sipPhone注册密码 String 64
sipPhone.callerIdNumber sipPhone主叫号 String 64
sipPhone.canLdd 允许呼叫本地号码 Boolean
sipPhone.canDdd 允许呼叫国内长途 Boolean
sipPhone.canIdd 允许呼叫国际长途 Boolean

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"getSipPhoneStatus"
  4. }

Response:

  1. {
  2. "timestamp": 1486974877553,
  3. "errMsg": "SUCCESS",
  4. "errCode": "0",
  5. "result": {
  6. "8001": {
  7. "online": true,
  8. "currentChannel": "",
  9. "channelState": "READY",
  10. "regStatus": "OK (29 ms)",
  11. "connectedChannel": "",
  12. "agent": {
  13. "id": 1,
  14. "aid": "1001",
  15. "agentName": "1001",
  16. "jobNumber": 1001,
  17. "extColumns": {}
  18. },
  19. "sipPhone": {
  20. "id": 1,
  21. "name": "8001",
  22. "secret": "aaa111",
  23. "callerIdNumber": "",
  24. "canLdd": true,
  25. "canDdd": true,
  26. "canIdd": false,
  27. "extColumns": {}
  28. }
  29. },
  30. "8002":{
  31. ...
  32. }
  33. }
  34. }

5.11 【查询归属地】

用途:查询手机号归属地信息

字段 说明 类型 长度 必填
mobilePhoneNumber 手机号 String 64
areaCode 区号 String 64
province String 64
city String 64
operator 运营商 String 64

Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "command":"getMobileInfo",
  4. "mobilePhoneNumber":"13391026171"
  5. }

Response:

  1. {
  2. "timestamp": 1486974877553,
  3. "errMsg": "SUCCESS",
  4. "errCode": "0",
  5. "areaCode":"021",
  6. "province":"上海",
  7. "city":"上海",
  8. "operator":"电信"
  9. }

6. API Event

6.1 【bridgeEvent】

触发时机:两个channel接通或断开时

字段 说明 类型 长度 必填
bridge 接通或挂断(true,false) Boolean 64
areaCode 区号 String 64
province String 64
city String 64
operator 运营商 String 64
  1. {
  2. "timestamp":"1478321782349",
  3. "event":"bridgeEvent",
  4. "bridge":true,
  5. "channel1":"SIP/8001-XXXXXXXX",
  6. "uniqueId1":"1486973220.28",
  7. "callerIdNumber1":"8001",
  8. "channel2":"SIP/gw1-XXXXXXXX",
  9. "uniqueId2":"1486973221.00",
  10. "callerIdNumber2":"13391026171"
  11. }

6.2 【newStateEvent】

触发时机:channel的状态改变时

字段 说明 类型 长度 必填
channel 通道名称 String 64
uniqueId 通道id String 64
channelState 通道状态【RING,RINGING,UP,DOWN】 String 64
callerIdName 主叫号callerIdName String 64
callerIdNumber 主叫名callerIdNumber String 64
connectedLineName 对端主叫号 String 64
connectedLineNumber 对端主叫名 String 64
  1. {
  2. "timestamp":"1478321782349",
  3. "event":"newStateEvent",
  4. "channel":"SIP/8001-XXXXXXXX",
  5. "uniqueId":"1486973220.28",
  6. "channelState":"RINGING",
  7. "callerIdName":"8001",
  8. "callerIdNumber":"8001",
  9. "connectedLineName":"13391026171",
  10. "connectedLineNumber":"13391026171"
  11. }

6.3 【channelRouteEvent】

触发时机:channel被路由到新的exten时

字段 说明 类型 长度 必填
accessDate 日期 String 64
uniqueId channel唯一标识 String 64
channel channel名称 String 64
callerIdNumber 主叫号 String 64
srcGateway 本channel的来源网关 String 64
srcAccessNumber 本channel的来源接入号 String 64
dstGateway 本channel的目标网关 String 64
dstAccessNumber 本channel的目标接入号 String 64
exten 本channel当前路由到的分机号 String 64
extenType 本channel当前路由到的分机号类型 String 64
extenDescription 本channel当前路由到的分机号描述 String 64
  1. {
  2. "timestamp":"1478321782349",
  3. "event":"channelRouteEvent",
  4. "accessDate":"2017-11-22 01:23:45",
  5. "uniqueId":"1486973220.28",
  6. "channel":"SIP/gw1-XXXXXXXX",
  7. "callerIdNumber":"13391026171",
  8. "srcGateway":"gw1",
  9. "srcAccessNumber":"60000000",
  10. "dstGateway":"gw2",
  11. "dstAccessNumber":"61111111",
  12. "exten":"7001",
  13. "extenType":"QUEUE",
  14. "extenDescription":"客服组"
  15. }

6.4 【cdrEvent】

触发时机:通话结束时

字段 说明 类型 长度 必填
startTime 通话开始时间 String 64
answerTime 通话应答时间 String 64
endTime 通话结束时间 String 64
answered 是否应答 Boolean
duration 持续时长 Integer 64
billSeconds 接通时长 Integer 64
callDirection 呼叫方向【INNER, OUTER, INBOUND, OUTBOUND, ORIGINATE】 String 64
callerId 主叫字符串(包括callerIdNumber和callerIdName) String 64
src 主叫 String 64
srcGateway 主叫网关 String 64
srcAccessNumber 主叫接入号 String 64
srcAgentAid 主叫agentAid String 64
srcAgentname 主叫agent姓名 String 64
srcChannel 主叫channel String 64
dst 被叫 String 64
dstGateway 被叫网关 String 64
dstAccessNumber 被叫接入号 String 64
dstAgentAid 被叫agentAid String 64
dstAgentname 被叫agent姓名 String 64
dstChannel 被叫channel String 64
serverId 产生本话单的服务器id String 64
recordUrl 录音相对路径 String 64
uniqueId 本通话的唯一标识 String 64
  1. {
  2. "timestamp":1486972748511,
  3. "event":"cdrEvent",
  4. "startTime":"2017-02-13 15:58:59",
  5. "answerTime":"",
  6. "endTime":"2017-02-13 15:59:07",
  7. "answered":false,
  8. "duration":8,
  9. "billSeconds":0,
  10. "callDirection":"INNER",
  11. "callerId":"8002 <8002>",
  12. "src":"8002",
  13. "srcGateway":"",
  14. "srcAccessNumber":"",
  15. "srcAgentAid":"",
  16. "srcAgentname":"",
  17. "srcChannel":"SIP/8002-00000010",
  18. "dst":"8001",
  19. "dstGateway":"",
  20. "dstAccessNumber":"",
  21. "dstAgentAid":"",
  22. "dstAgentName":"",
  23. "dstChannel":"SIP/8001-00000011",
  24. "dstContext":"SIPPHONE",
  25. "serverId":"asterisk1",
  26. "recordUrl":"/2017/02/13/1486972739.26.wav",
  27. "uniqueId":"1486973220.28"
  28. }

7. API Route

7.1 说明

【API 路由】用来让第三方应用决定呼入通话的路由:RSMW会在有电话呼入时向第三方URL发起请求,告知关键参数。第三方应用可以通过这些参数结合自身的业务数据来决定将该通电话路由到哪里。
“API路由”功能在“呼入路由”或“IVR”中进行配置

7.2 请求

字段 说明 类型 长度 必填
channel 通道名称 String 64
src 主叫 String 64
srcAccessNumber 主叫接入号 String 64
ivrExten 当前IVR分机号 String 64
ivrKeyPressed IVR中的按键 String 64

- Request:

  1. {
  2. "timestamp":"1478321782349",
  3. "event":"apiRoute",
  4. "channel":"SIP/8002-00001111",
  5. "src":"13391026171",
  6. "srcAccessNumber":"60172133",
  7. "ivrExten":"6001",
  8. "ivrKeyPressed":"654321"
  9. }

7.3 响应

路由到内部Exten或自定义Dialplan的Exten

字段 说明 类型 长度 必填
dst 目标号码(希望把该通电话路由到哪里去 String 64
dstGateway 目标网关(如果dst需要从网关呼出,则从该网关呼出) String 64
dstAccessNumber 目标接入号(如果dst需要从网关呼出,则用该号码作为主叫) String 64

- Response:

  1. {
  2. "timestamp":"1478321782349",
  3. "errCode":"0",
  4. "dst":"8001"
  5. }

路由到外部号码

  1. {
  2. "timestamp":"1478321782349",
  3. "errCode":"0",
  4. "dst":"13391026171",
  5. "dstGateway":"gw1",
  6. "dstAccessNumber":"60172133"
  7. }

附录1:SDK

Git: https://git.oschina.net/jiangyifen/rsmw-java


附录2:调试工具

我们推荐使用Chrome或Firefox上的HTTP插件:

Chrome上的Postman:postman

Firefox上的REST Client:REST Client

他们会简化你的调试工作。

当然,你完全可以直接写代码调试


附录3:RSMW 集群部署方案

联系江毅奋(13391026171)获取商业支持


附录4:常见问题

  1. Content-Type: text/plain;charset=UTF-8

参考 【2.2 URL 及 HTTP POST JSON格式】

联系江毅奋(13391026171)获取商业支持

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注