# 电话客户端

客户端登录后，设置相关账号登录后拨打电话

# 新页面



# sip客户端 - 电话软件下载

# Windows SIP 客户端

## 软件简介

本软件是一款运行于 Windows 平台的 SIP 语音客户端，
用于连接 SIP 服务器，实现账号注册、语音呼叫及通话管理等功能。

## 主要功能

- SIP 账号注册
- 呼入/呼出
- 通话接听与挂断
- 麦克风及扬声器语音通信
- SIP 服务器地址及端口配置
- 账号注册状态显示

## 运行环境

- Windows 10 / Windows 11
- 可正常访问 SIP 服务器的网络环境
- 麦克风及扬声器/耳机

## SIP 账号配置

使用前需要配置 SIP 账号信息：

- SIP Server：SIP 服务器地址
- Username：SIP 用户名/分机号
- Password：SIP 账号密码

配置完成后进行注册，注册成功即可进行呼入和呼出。

## 基本使用

1. 启动 SIP 客户端。
2. 填写 SIP 服务器及账号信息。
3. 确认账号注册成功。
4. 输入被叫号码发起呼叫。
5. 通话结束后点击挂断。

## 注意事项

如出现注册失败或无法通话，请检查：

- SIP 服务器地址及端口是否正确。
- SIP 用户名和密码是否正确。
- 当前网络是否可以访问 SIP 服务器。
- Windows 防火墙是否限制程序网络访问。
- 麦克风和扬声器设备是否正常。

# sip客户端 - 电话接口文档

# SIP 客户端前端调用接口说明

适用版本：3.22.16

## 1. 调用方式

前端通过 Windows 自定义 URL 协议唤起客户端，不是 HTTP 接口。

| 客户端 | 协议名称 |
| --- | --- |
| InfinitySip | `infinitySip://` |

网页中可使用以下方式调用：

```javascript
window.location.href = 'infinitySip://answer';
```


### 返回数据

所有接口均无返回数据。调用属于“发送命令后不等待结果”的方式：

- 不返回 HTTP 状态码。
- 不返回 JSON、通话状态或错误信息。
- 不提供 Promise、回调函数或浏览器事件。
- 前端无法根据协议唤起结果判断呼叫、接听或挂机是否成功。

因此，前端调用后只能提示“已提交到客户端”，不应直接提示“呼叫成功”或“操作成功”。如需获取最终通话结果，应通过服务端通话事件、CDR 或其他业务接口查询。

## 2. 发起呼叫

### 接口地址

```text
infinitySip://call?calleeNumber=1001&customerId=C8899&businessId=B20260925001&traceId=550e8400-e29b-41d4-a716-446655440000
```

### 参数说明

| 参数 | 必填 | 含义 | 最大长度 | SIP 中的用途 |
| --- | --- | --- | --- | --- |
| `calleeNumber` | 是 | 被叫号码，例如分机号或电话号码 | 3-16 位；仅允许数字、字母及 `+ * # . _ - @` | 作为呼叫目标 |
| `customerId` | 否 | 客户标识，用于关联客户资料 | 64 个字符 | 写入 `X-Customer-Id` 请求头 |
| `businessId` | 否 | 业务标识，例如订单号、工单号 | 128 个字符 | 写入 `X-Business-Id` 请求头 |
| `traceId` | 否 | 本次呼叫的链路追踪标识 | 64 个字符 | 写入 `X-Trace-Id` 请求头 |

完整协议地址最多为 2048 个字符。四个参数均不允许重复，也不接受未在表中定义的参数。三个可选标识不能包含冒号、换行或控制字符。超过限制或格式不合法时，客户端不会发起呼叫，并会显示“Call request rejected”提示；自定义 URL 协议本身仍不会向网页返回错误数据。

只传必填参数的示例：

```text
infinitySip://call?calleeNumber=1001
```

JavaScript 示例：

```javascript
const LIMITS = {
  calleeNumber: 16,
  customerId: 64,
  businessId: 128,
  traceId: 64,
  url: 2048,
};
const CALLEE_PATTERN = /^[0-9A-Za-z+*#._@-]+$/;
const CALLEE_MIN_LENGTH = 3;
const INVALID_HEADER_PATTERN = /[:\u0000-\u001f\u007f]/;

const params = new URLSearchParams({
  calleeNumber: '1001',
  customerId: 'C8899',
  businessId: 'B20260925001',
  traceId: crypto.randomUUID(),
});

for (const [name, value] of params) {
  if (value.length > LIMITS[name]) throw new Error(`${name} 参数过长`);
  if (name === 'calleeNumber' && value.length < CALLEE_MIN_LENGTH) {
    throw new Error('calleeNumber 不能少于 3 位');
  }
  if (name === 'calleeNumber' && !CALLEE_PATTERN.test(value)) {
    throw new Error('calleeNumber 包含不支持的字符');
  }
  if (name !== 'calleeNumber' && INVALID_HEADER_PATTERN.test(value)) {
    throw new Error(`${name} 包含冒号、换行或控制字符`);
  }
}

const url = `infinitySip://call?${params.toString()}`;
if (url.length > LIMITS.url) throw new Error('协议地址不能超过 2048 个字符');
window.location.href = url;
```

## 3. 接听来电

无参数。接听当前正在振铃的来电；没有来电时不会产生通话。

```text
infinitySip://answer
```

## 4. 挂断通话

无参数。结束当前全部活动通话或正在振铃的来电。

```text
infinitySip://hangup
```

## 5. 开启免打扰

无参数。开启并保存客户端免打扰状态，后续来电将按免打扰规则处理。

```text
infinitySip://dnd/on
```

## 6. 关闭免打扰

无参数。关闭并保存客户端免打扰状态，客户端恢复正常接听来电。

```text
infinitySip://dnd/off
```

## 7. 使用说明

- 参数值应使用 UTF-8 URL 编码，建议使用 `URLSearchParams` 生成查询参数。
- 参数名称不区分大小写，建议固定使用文档中的写法。
- 仅支持 `calleeNumber`、`customerId`、`businessId` 和 `traceId`，未知或重复参数会被拒绝。
- 未传递的可选参数不会生成对应的 SIP 请求头。
- 前端应在唤起客户端前完成长度与字符校验，并向用户展示具体原因。
- 自定义协议没有返回值，前端调用后不能直接获得通话结果。
- 首次从浏览器调用时，Windows 或浏览器可能提示用户确认打开客户端。
- 调用前应确保对应品牌客户端已经安装并完成账号配置。