# initByCaller(Object req)

> 本接口为异步接口，返回 `Promise` 对象。

发起通话并获取通话房间号。调用此接口后，会创建 VoIP 房间，并且向接听方推送接听提醒。

**建议先阅读[接口介绍](call-intro)。**

## 参数

### Object req

| 属性                  | 类型   | 默认值 | 必填 | 说明                                                                                                                                                                   | 最低版本 |
| --------------------- | ------ | ------ | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| roomType              | string |        | 是   | 通话类型。voice: 音频通话；video: 视频通话                                                                                                                             |          |
| caller                | Object |        | 是   | 拨打方信息                                                                                                                                                             |          |
| caller.id             | string |        | 是   | 拨打方 ID，参考 businessType 的说明                                                                                                                                    |          |
| caller.name           | string |        | 否   | 显示的拨打方名字。设备端发起通话时无效                                                                                                                                 |          |
| caller.cameraStatus   | number | 0      | 否   | 是否启用摄像头。0: 开启；1: 关闭                                                                                                                                       |          |
| listener              | Object |        | 是   | 接听方信息                                                                                                                                                             |          |
| listener.id           | string |        | 是   | 接听方 ID，参考 businessType 的说明                                                                                                                                    |          |
| listener.name         | string |        | 否   | 显示的接听方名字。                                                                                                                                                     |          |
| listener.cameraStatus | number | 0      | 否   | 是否启用摄像头。0: 开启；1: 关闭                                                                                                                                       |          |
| businessType          | number | 0      | 否   | 业务类型。详见 businessType 的说明                                                                                                                                     |          |
| voipToken             | string |        | 否   | 拨打票据，部分情况下必填，参考 businessType 的说明                                                                                                                     |          |
| miniprogramState      | string | formal | 否   | 接听方点击通知时打开的小程序类型。
取值：formal: 正式版; trial: 体验版; developer: 开发版。
2.1.8 起，正式版小程序只能拨打给正式版，设置这一字段无效。         |          |
| customQuery           | string |        | 否   | 接听方点击通知打开小程序时，会作为 query 拼接到插件页面路径后，格式如 `a=1&b=2`。可在接听端小程序内通过 `getPluginOnloadOptions` 或 `getPluginEnterOptions` 接口获取到 |          |
| timeLimit             | number |        | 否   | 最大通话时长，需为 > 0 的数字                                                                                                                                          | 2.3.8    |

## 返回值

**由于历史原因，本接口调用失败可能会抛出异常（一般是参数错误），也可能会返回 `isSuccess: false`（一般是后台错误）。**

接口成功返回后，仍需要使用 `isSuccess` 字段判断调用是否最终成功。

### Object

接口调用成功时，返回如下

| 属性       | 类型    | 说明                                                      | 最低版本 |
| ---------- | ------- | --------------------------------------------------------- | -------- |
| isSuccess  | boolean | 是否调用成功，此时为 true                                 |          |
| roomId     | string  | 本次通话的房间号                                          | 2.4.0    |
| groupId    | string  | 与 roomId 相同                                            |          |
| chargeType | string  | 计费方式。取值：duration: 时长计费；license: license 计费 | 2.3.8    |

调用失败时，接口返回如下：

| 属性      | 类型                      | 说明                                                   | 最低版本 |
| --------- | ------------------------- | ------------------------------------------------------ | -------- |
| isSuccess | boolean                   | 是否调用成功，此时为 false                             |          |
| ~~error~~ | object                    | 错误对象，已废弃。{ err_code: string, errMsg: string } |          |
| errCode   | number                    | 错误码，取值参考[错误码文档](errCode)             |          |
| errMsg    | string                    | 错误信息                                               |          |
| errObj    | [VoipError](errCode) | 错误对象                                               | 2.4.0    |

## 关于 businessType

不同 businessType 对应的部分参数含义不同，参数获取的具体方式请参考对应业务的文档。

| businessType | 业务类型             | caller.id       | listener.id     | voipToken                                                                                                                                                                                                                                                                                   |
| ------------ | -------------------- | --------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1            | 硬件设备呼叫手机微信 | 设备 SN         | 微信用户 openId | 使用[设备认证 SDK](/miniprogram/dev/framework/device/device-register-sdk)注册的设备传入 deviceToken.
使用 [WMPF 注册的设备](/miniprogram/dev/framework/device/device-register-wmpf)不能有这个字段（插件 2.3.0 支持） |
| 2            | 手机微信呼叫硬件设备 | 微信用户 openId | 设备 SN         | 从设备获取的 [pushToken](/doc/oplatform/Miniprogram_Frame/push.md)                                                                                                                                                                                        |

- 发起通话前，需要在提前让 openId 对应的用户在微信客户端的小程序内进行授权，具体流程请参见[授权文档](/miniprogram/dev/framework/device/voip/auth)；
- 传入 id 为 设备 SN 时，name 会强制使用用户授权时的「deviceName」+「modelId 对应设备型号」，不使用开发者传入的 name。
- 本接口 `businessType=2` 仅支持安卓 WMPF，呼叫 Linux 设备请使用 [callDevice](callDevice)。
- 本接口 `businessType=2` 不支持 license 计费，手机微信呼叫安卓 WMPF 建议使用 [callWMPF](callWMPF)。

## 示例代码

```js
const wmpfVoip = requirePlugin('wmpf-voip').default

try {
  const { isSuccess } = await wmpfVoip.initByCaller({
    caller: {
      id: '拨打方 Id',
      name: '拨打方名字',
    },
    listener: {
      id: '接听方 Id',
      name: '接听方名字',
    },
    roomType: 'video',
    businessType: 1,
    voipToken: 'xxxx*****xxxx',
    miniprogramState: 'developer', // 开发阶段建议使用开发版
  })

  if (isSuccess /* && 当前不在插件页面 */) {
    wx.redirectTo({
      url: wmpfVoip.CALL_PAGE_PATH,
    })
  } else {
    wx.showToast({
      title: '呼叫失败',
      icon: 'error',
    })
  }
} catch (e) {
  wx.showToast({
    title: '呼叫失败',
    icon: 'error',
  })
}
```
