REST API文档
XSwitch 与声网对接
该接口实现RTC 与 SIP 互转,PSTN 对接落地。支持声网转 SIP、SIP 转声网。
系统架构
系统总体架构如下图所示:
系统集成逻辑如下图所示:
其中,业务侧的 App 集成声网 SDK,App 连接自己的后台服务器(上图中的“业务侧服务器”)。后台服务器与 XSwitch 交互控制相关呼叫逻辑。详细呼叫流程如下节所述。
呼叫流程
有 SIP 参与的基本呼叫流程如下。
声网呼 SIP
声网 App 客户端呼叫 SIP。
- App 从业务侧服务器后台获取声网 token、channel、uid 等信息,(在调试模式下,token 的值也可以填 App ID 的值)。
- App 加入 channel。
- App 通知服务器呼叫手机。
- 服务器调用外呼 API,呼叫手机。
- XSwitch 收到外呼请求,将声网模块加入与 App 相同的 channel。
- XSwitch 通过 SIP 模块呼叫运营商。
- 手机振铃接听。
- App 与手机通话。
注:声网 App 侧可能是任何的声网 SDK 客户端,如果没有现成的客户端,可以使用如下在线网页测试:
SIP 呼叫声网 App
- 手机呼叫一个 PSTN 号码或其他设备 SIP 呼叫进入 XSwitch。
- XSwitch 根据号码找到对应的路由送到路由中指定的URL服务(业务侧服务器提供回调地址)。
- 业务侧服务器返回声网 token、channel、uid 等信息。
- XSwitch 将声网模块加入对应的 channel。
- 业务服务器通知 App 加入相关的 channel。
注:以上最后三步的顺序可根据自己的业务逻辑调整。
挂机流程
在一对一通话中,当通话建立后,会生成一个唯一的通话UUID
,可以通过 REST API 的DELETE
接口,挂断指定UUID
对应的通话。
系统也支持“自动”挂机:
当 XSwitch 侧的声网 Linux SDK 加入一个channel
后,如果检测到另一个uid
加入相同的channel
并离开,当前channel
中只剩下 Linux SDK 时,XSwitch 侧的 Linux SDK 会自动退出channel
,SIP 侧挂机。
在实际使用时,App 侧也可以使用相同的逻辑,检测到channel
中的uid
数从2
变成1
时自动挂机。
接口
获取 Token 接口
- 请求 URL:
/api/sessions
- 请求方式:
POST
- 消息头:
参数 | 必选 | 类型 | 备注 |
---|---|---|---|
Content-Type | 是 | string | application/json 或 application/x-www-form-urlencoded |
- Body 信息:
参数 | 必选 | 类型 | 备注 |
---|---|---|---|
login | 是 | string | 用户名 |
password | 是 | string | 密码 |
- 返回值:
正常返回一个 Object。
返回字段 | 必选 | 类型 | 备注 |
---|---|---|---|
code | 是 | int | 结果码 |
token | 是 | string | Token (即 X-XTRA-AUTH-ID) |
如果出错,返回 HTTP 状态码如403
等,详见HTTP 状态码参考及JSON 返回格式参考。
- 其它说明:
首先,用用户名和密码获取一个 Token,参数的提交方式有两种,一种是基于 URL 字符串(www-form-urlencoded
),如:
curl -XPOST -d 'login=1007&password=$VeryGoodPassw0rd' 192.168.1.100:8081/api/sessions
也可以提交一个 JSON 请求,如:
curl -XPOST -d '{"login": "1007", "password": "$VeryGoodPassw0rd"}' \ -H "Content-Type: application/json" \ 192.168.1.100:8081/api/sessions
返回:
状态码 | 说明 | 返回值 |
---|---|---|
200 | 成功 | {"code": 200, "token": "cde1f2e1-4930-41c1-a883-0bca35de7ea6"} |
403 | 鉴权失败 | {code = 403, text = "Wrong username or password"} |
{ "system_roles": { "senior_roles_str": "()", "roles_str": "()" }, "extn": "1001", "code": 200, "currentAuthority": "admin", "expires": 1652290471, "user_id": 3, "token": "cde1f2e1-4930-41c1-a883-0bca35de7ea6" }
后续所有的请求(包括注销)都需要使用该token
。例如
curl -H "X-XTRA-AUTH-ID: 62dd0173-4916-4b1c-b958-546e4d7c91fe" \ 192.168.1.100:8081/api/agora/callPSTN
外呼接口
通过接口呼叫 PSTN,采用 JSON 格式。当发起外呼时,需客户侧提供 domain、token、channel、uid、destNumber 必选参数。
- 请求 URL:
/api/agora/callPSTN
- 请求方式:
POST
- 消息头:
Content-Type: application/json
- Body 信息:
字段 | 必选 | 类型 | 备注 |
---|---|---|---|
domain | 否 | string | 域,可选,与系统域相同 |
appid | 是 | string | 字符串,声网 AppId |
token | 是 | string | 加密的 Agora Token,生成方式为0+频道名 |
channel | 是 | string | 必选,字符串 |
uid | 是 | string | 声网 uid |
destNumber | 是 | string | 被叫号码 |
cidName | 否 | string | 主叫名称 |
cidNumber | 否 | string | 主叫号码 |
uuid | 否 | UUIDv4 | 呼出的 SIP Channel 的 UUID,可用于跟业务侧的呼叫 ID 关联 |
areaCode | 否 | string | 区域码对应的 INT 值 |
encryptMode | 否 | string | 加密模式对应的 INT 值 |
encryptKey | 否 | string | 如果指定了加密模式,则必须指定加密 Key |
encryptSalt | 否 | string | 加密 Salt,部分加密模式不需要 Salt |
dialPhoneFirst | 否 | bool | true 表示先呼叫 SIP 端,呼通之后再进入声网侧 |
video | 否 | bool | true 表示视频呼入声网 |
请求示例:
curl --request POST \ --url https://vip.xswitch.cn/api/agora/callPSTN \ --header 'X-XTRA-AUTH-ID: 01942ada-6d5d-708xxxxxxxx' \ --header 'content-type: application/json' \ --data '{ "destNumber": "15666xxxxx", "token": "f53a9b52579b48dbbxxxxx", "cidName": "test", "cidNumber": "test", "channel": "3000", "domain": "vip.xswitch.cn" }'
成功返回:data 中@
前的数值为通话通道 UUID
{ "code": 200, "message": "success", "data": "01959245-455d-7169-bf20-83478cdf7ecf@L43ODbLUMNB" }
返回 JSON 说明:
code
:代码,成功返回200
。message
:信息描述,成功为success
。data
:SIP 通话 UUID@hash_str,可用于挂机接口的uuid
参数。
呼入接口
呼入接口由业务侧提供 URL。即业务方根据如下接口约定提供所需 Agora 信息接口用于呼入。
SIP 呼入后根据路由设置,XSwitch 向业务侧发起回调,发送 POST 请求,数据使用 JSON 格式。所有字符串均使用 UTF-8 编码(如下所示例子)。
请求参数:
uuid
:当前通话唯一 IDcidName
:字符串,主叫名称cidNumber
:字符串,主叫号码destNumber
:字符串,被叫号码remoteAddr
:远端 IP 地址
返回 JSON:
token
:必选,加密的 Agora Token 或不加密的 App IDchannel
:必选,字符串uid
:字符串,可选,如不存在或为空则自动选择(缺省设置为cidName
主叫名称)cidName
:可选,字符串,覆盖主叫用户名称cidNumber
:可选,字符串,覆盖主叫用户号码
希望业务侧URL返回参数如下(后续可根据需求修改):
返回 JSON:
token
:必选,加密的 Agora Token 或不加密的 App IDchannel
:必选,字符串uid
:字符串,可选,如不存在或为空则自动选择(缺省设置为cidName
主叫名称)cidName
:可选,字符串,覆盖主叫用户名称cidNumber
:可选,字符串,覆盖主叫用户号码
agora
客户接口模拟测试(其中agora-call-in
为业务侧自主提供的接口 URL):
curl -XPOST -H "Content-Type: application/json" -d '{"uuid":"fbb53115-f52d-625xxxxx","cidName":"test","cidNumber":"10010","destNumber":"777",,"remoteAddr": "192.168.1.7"}' http://localhost:8088/api/agora-call-in
DTMF按键发送接口
- 请求 URL:
/api/agora/dtmf
- 请求方式:
POST
- 消息头:
Content-Type: application/json
- Body 信息:
字段 | 必选 | 类型 | 备注 |
---|---|---|---|
channel_uuid | 是 | string | 通话UUID |
data | 是 | string | 按键数值 |
请求示例:
curl --request POST \ --url https://vip.xswitch.cn/api/agora/dtmf \ --header 'X-XTRA-AUTH-ID: 01942ada-6d5d-708xxxxxxxx' \ --header 'content-type: application/json' \ --data '{ "channel_uuid": "01959245-455d-7169-bf20-83478cdf7ecf", "data": "1" }'
成功返回:data 中@
前的数值为通话通道 UUID
{ "code": 200, "msg": "OK" }
挂断接口
根据通道 UUID 挂断当前通话,url 中的:channel_uuid@hash_str
来自 callPSTN 接口的返回值`。
请求 URL:
/api/agora/calls/:channel_uuid
请求方式:
POST
消息头:
Content-Type: application/json
Body 信息:
hangup_cause
:可选,默认为NORMAL_CLEARING
hangup_cause
可用的值可参考:https://docs.xswitch.cn/xpedia/hangup-cause/ 。
示例
curl -XDELETE http://localhost:8081/api/agora/calls/0bee39f2-..... \ -H 'Content-Type: application/json' \ -H 'X-XTRA-AUTH-ID: xxxxxy...' \ -d '{ "hangup_cause": "NORMAL_CLEARING" }'