最近开发一个 呼叫中心中间件,也可以让用户不懂呼叫系统完成复杂的呼叫业务。
模块里面我集成了 WebSocket RESTFul API 服务器端
ws://192.168.0.250:8092/appid=xxxx&appkey=xxxxx×tamp=时间戳&sign=xxxxxxxxxx
签名规则 sign=md5(appid+appkey+timestamp+"callback") 不含"+"
心跳规则:
客户端发送 {"Request": {type":"HEART_BEAT", "timestamp": "时间戳" } }
服务器返回 {"Response": {type":"HEART_BEAT","timestamp": "时间戳" } }
回拨呼叫
dispcaller 呼叫主叫显示的号码
dispcallee 呼叫被叫显示的号码
caller 主叫号码
callee 被叫号码
callid 呼叫ID 必须唯一 32位或64位
record 是否录音 true|false
timelong 通话时长
userdata 自定义数据
{ "Request": { "dial": {"dispcaller":"9001","dispcallee":"9000", "caller": "9000", "callee": "9001", "callid": "12345657586960", "record": "true", "timelong":"1000" ,"userdata":"test"} } }
#话单返回
callid 呼叫提交的ID
caller_id_number 主叫
dispcaller 呼叫主叫显示的号码
dispcallee 呼叫被叫显示的号码
destination_number 被叫号码
start_stamp 呼叫开始
answer_stamp 呼叫应答
end_stamp 呼叫结束
recordfile 录音文件路径
duration 通话时长
billsec 计费时长
hangup_cause 挂机原因
完整返回:
{"Response": {"appid": "111111","cdr": { "context":"callbak", "caller_id_number":"9001","dispcaller":"9001",,"dispcallee":"9000","destination_number":"9000","start_stamp":"2019-06-11 17:52:07", "answer_stamp":"2019-06-11 17:52:10","end_stamp":"2019-06-11 17:52:19","channel_name":"sofia/internal/9000@192.168.0.137:5060","bridge_channel":"sofia/internal/9001@192.168.0.137:5060","duration":"12","billsec":"9","hangup_cause":"NORMAL_CLEARING","callid":"12345657586960","recordfile":"","userdata":"test"}}}
#呼叫状态异步返回
{"Response": {"appid": "12345678","callstate": {"callbacka_active":"主叫是否接通",state":"EARLY|DIALING|RING_WAIT|ACTIVE","callid": "呼叫ID","timestamp":"时间戳","uuid" : "服务端通话ID" }}}
{"Response": {"appid": "111111","callstate": {"callbacka_active":"false","state":"RINGING","callid": "12345657586960","timestamp":"1560246727","uuid":"1defac04-8727-49b2-b19d-86b60fca7e0d" }}}
{"Response": {"appid": "111111","callstate": {"callbacka_active":"false","state":"ACTIVE","callid": "12345657586960","timestamp":"1560246730","uuid":"1defac04-8727-49b2-b19d-86b60fca7e0d" }}}
{"Response": {"appid": "111111","callstate": {"callbacka_active":"true","state":"RING_WAIT","callid": "12345657586960","timestamp":"1560246730","uuid":"1defac04-8727-49b2-b19d-86b60fca7e0d" }}}
{"Response": {"appid": "111111","callstate": {"callbacka_active":"true","state":"ACTIVE","callid": "12345657586960","timestamp":"1560246732","uuid":"1defac04-8727-49b2-b19d-86b60fca7e0d" }}}
#呼叫控制
uuid cti呼叫状态返回主叫的 通话UUID
1、挂断当前通话
{ "Request": { "hangup": { "uuid": "cc70b4b6-b041-49bf-adc5-ffd51e0ef780"} } }
2、监听某个通话
{ "Request": { "monitor": { "uuid": "ad6ac4ea-0f33-4108-85e2-1586a71a939d","caller":"显示的主叫号码","callee":"监听者的号码"} } }
3、通话转接
{ "Request": { "transfer": { "uuid": "903aee0b-1bc1-45a3-92b0-2c615c21aaa9","caller":"显示的主叫号码","callee":"要转移号码"} } }
4、被叫通话保持
state true 开启 false 关闭
{ "Request": { "hold": { "uuid": "55e27e6d-88ab-4b3e-93f7-d049dd6eba21","state":"true"} } }
http api 中继管理
提交方式:POST
提交数据 Body raw 类型字段
签名规则 sign=md5(appid+appkey+timestamp+"api") 不含"+"
RESTFul API
ip:8092/api/v1/gatewayAdd 增加中继
appid
appkey
timestamp
sign
name 中继名称必须唯一
enable 是否启用
ip 对方IP 地址
port 对方端口
bypass_media 媒体绕过服务器 默认false 否则不能录音
register IP对接:false SIP注册:true goip注册:in 呼叫本地SIP:local
username SIP注册用户名
auth-username IMS认证用户名
userpwd SIP注册用户密码
prefix 拨号前缀
prefix_replace 拨号替换规则
limit_caller 强制主叫号码
from-domain IMS 对接域地址
limit_count 并发限制
ip:8092/api/v1/gatewayDel 删除中继
appid
appkey
timestamp
sign
name 中继名称必须唯一
ip:8092/api/v1/gatewayGet 获取中继
appid
appkey
timestamp
sign
limit 返回的行数
offset 开始的行数
http api SIP用户管理
提交方式:POST
提交数据 Body raw 类型字段
http://192.168.0.250:8092/api/v1/sipuserAdd 增加SIP用户
appid
appkey
timestamp
sign
accountcode SIP账号
secret SIP密码
calltyp 呼叫类别 in:呼入 out:呼出 all:呼入呼出
record 是否录音
http://192.168.0.250:8092/api/v1/sipuserDel 删除SIP用户
appid
appkey
timestamp
sign
accountcode SIP账号
http://192.168.0.250:8092/api/v1/sipuserGet 获取SIP用户
appid
appkey
timestamp
sign
limit 返回的行数
offset 开始的行数