发起呼叫
您的 PBX向中继的 SIP 域发送 SIP INVITE,以发起呼叫。Bird 检查请求,将其路由到运营商,并转发音频。本页介绍前提条件、请求字段、身份验证和费用。
要从应用程序通过 HTTP 发起呼叫,请使用创建呼叫指南。此方式会在接听后运行已发布的 Bird 序列。
发起呼叫前
设置 SIP 中继按顺序介绍如何完成双向中继的全部设置。
需要准备好四项条件,顺序不限,其中三项由您设置:
- 可接受您的流量的中继。 创建一个 SIP 中继并启用出站呼叫。添加设备的 IP 地址范围、允许使用的 API 密钥,或同时添加两者。无法保存长期密钥的客户端可以使用会话凭据。
- 符合条件的主叫号码。 使用已分配给此工作区的 Bird 号码,或注册外部号码并完成验证呼叫。如果 CLI 不是通过 Bird 购买的号码,验证并不保证 CLI 的端到端传递或呼叫接通。请参阅 CLI 验证与传递免责声明。
- 已启用目的地国家/地区。 在 Destinations 页面启用您提供服务的国家/地区。
- 工作区已配置路由。 Bird 会为您完成此设置,选择由哪些运营商为哪些目的地提供服务。配置完成前,呼叫会被拒绝,并返回
routing_not_configured。被拒绝的呼叫介绍的原因中包含此项。
Bird 对 INVITE 的要求
通过中继的一个受支持端口,将请求发送到该中继的 SIP 域名。Bird 会读取请求中的三个部分:
| 部分 | Bird 如何使用该部分 |
|---|---|
| Request-URI 主机部分 | 用于识别您的中继。必须使用从中继页面完整复制的中继 SIP 域名 |
| Request-URI 用户部分 | 被叫号码。Bird 根据号码所属国家/地区选择运营商并确定通话价格。将 To 设置为同一号码 |
From | 您向被叫方显示的主叫号码。必须是此工作区中符合条件的 Bird 号码或已验证的外部主叫号码 |
号码使用国际 E.164 格式,以 + 开头,后接国家/地区代码和国内号码。Bird 也接受用 00 替代 + 的同一号码,或以国家/地区代码开头的纯数字号码。对于不带 + 或 00 的数字,Bird 会将开头部分视为国家/地区代码,因此使用国内格式的号码会被解析为不同于您预期的号码。不要在被叫号码前添加技术前缀。
除此之外,这就是普通的 SIP 通话,无需发送任何自定义头。
在 SDP 提议中提供 G.711(A-law 或 µ-law)。将按键音(DTMF)作为 RFC 4733 电话事件发送。Bird 会从发送给运营商的提议中移除其他编解码器,例如 G.729 或 Opus,因此每次提议都要包含 G.711。
媒体使用未加密的 RTP,不支持 SRTP。端口 5061 上的 TLS 会加密信令,但音频仍不加密。
对每次呼叫进行身份验证
呼叫需要经过哪些步骤,取决于中继的接入方式:
- 仅使用 IP 允许列表。 只需一次请求。Bird 将来源地址与列表进行匹配,然后路由呼叫,无需应答质询。
- 仅使用允许的 API 密钥。 Bird 先通过 SIP 摘要认证交互要求呼叫方提供密码。
- 同时使用两者。 使用允许的 API 密钥的呼叫也必须来自列表中的地址。启用会话凭据后,还可通过下述独立方式接入。
- 启用会话凭据。 无论呼叫来自哪里,即使来源地址不在允许列表中,Bird 都会发出质询,由几分钟前签发的凭据应答。如果中继未配置允许的密钥,已通过允许列表获准接入的设备仍可直接连接,无需应答质询。
如果中继配置了允许的 API 密钥,您的电话系统会使用 API 密钥机密值的哈希值应答,而非机密值本身。这就是 SIP 摘要认证的工作方式:
- 您的 PBX 发送
INVITE。 - Bird 返回
407 Proxy Authentication Required,针对中继提供的每种算法各附一行质询,默认先列SHA-256,再列MD5。 - 您的 PBX 重新发送
INVITE,附带Proxy-Authorization请求头。该请求头使用用户名bird和作为密码的 API 密钥机密值计算得出。 - Bird 验证响应并继续路由呼叫。
预先发送的 Proxy-Authorization 头先于质询发出,因此您的设备必须选择中继提供的算法。使用 API 密钥认证时,如果中继设有 IP 允许列表,请求仍必须来自列表中的地址。
Bird 在 SIP 层响应握手失败,因此平台在创建呼叫记录之前就会拒绝该次尝试。如果呼叫日志中完全没有您的呼叫,请检查凭据,而不是路由。
呼叫认证
拨打美国和法国的呼叫带有 STIR/SHAKEN 认证。运营商在标记呼叫时使用此签名。Bird 默认采用 B 级,无需额外配置。如需 A 级,请联系支持团队。
呼叫被拒绝时
Bird 在向运营商发起呼叫之前,会检查主叫号码、目的地、限额和钱包余额。您的电话系统会收到 SIP 503 拒绝响应;具体原因保留在需要通过身份验证才能查看的呼叫记录中。在呼叫日志中打开该呼叫,或参阅被拒绝的呼叫,了解各项原因和解决方法。
重试之前,先解决记录中的问题。例如,在您降低呼叫发起速率之前,calls_per_second_exceeded 会持续出现。
对于 Bird 已记录的呼叫,响应会携带 X-BIRD-CALL-ID 头,其中包含呼叫的 Leg ID(vcl_…)。这也包括已记录拒绝原因的 503 响应。使用 GET /v1/voice/legs/{leg_id} 读取记录,或向支持团队提供该 ID。
不承载紧急呼叫
Bird Voice 不承载拨打紧急服务的呼叫。 无论使用哪个中继、位于哪个国家,拨打 112、911、999 或任何其他紧急号码的呼叫都会被拒绝。您的电话系统必须通过其他路由接通紧急服务。
此行为不受套餐、余额或目的地影响。请配置电话系统,通过支持紧急呼叫的服务路由此类呼叫,例如本地 PSTN 线路、本地部署的网关或其他提供商,并测试该路由。Bird 对被拒绝的紧急呼叫返回 503,让拨号计划中配置了其他路由的电话系统可以尝试该路由。
紧急服务依赖主叫方登记的位置,但 Bird 不为中继存储此信息。请勿依赖 Bird 路由拨打紧急电话。
费用与计费
与其他渠道一样,语音采用预付费方式,从组织的钱包中扣款:
- 计费时长从接听开始,到通话结束为止,不受接听前响铃时长的影响。通话记录中会同时显示计费时长和 Total duration,后者从 Bird 收到呼叫时开始计算。
- 费率取决于目的地国家。 费率表以钱包币种列出各国的价格。每项费率规定最低计费时长,以及超出该时长后使用的计费增量。例如,最低计费时长为 1 分钟、计费增量为 6 秒的费率,会将 10 秒的通话按 1 分钟计费。
- 向运营商发起呼叫前,系统会检查钱包余额。 如果余额不足以支付通话费用,系统会直接拒绝呼叫并返回
insufficient_balance,而不是事后收费。请预留充足余额,或开启自动充值。 - 语音支出设有每日限额。 超过限额后,系统会拒绝呼叫并返回
daily_spend_exceeded,直到下一个 UTC 日开始。工作区还可以在 Voice > Destinations 下为每个目的地国家设置每日限额,呼叫必须同时满足这两项限额。限额金额取决于您的套餐。 - 费用会在计价后显示在通话记录中,保留完整精度,且不含税。
要查看各通话的费用,请参阅用量、支出与账单。Legs CSV 导出文件包含通话时长和计费时长,但没有费用列。