
# 代码使用示例
以协同点击通话（先多媒体文本后点击通话）接口使用代码示例。
#### 操作步骤
1. 请求send接口。 
   ```
   this.$axios({
       method: 'post',
       url: APIfabric域名/apiaccess/ccmessaging/send,
       headers: {
          'Content-Type': 'application/json',
          'x-app-key': c.appKey,
          'Authorization': fabric.token,
          'ccmessaging-token': ccmessaging.token
       },
       data: {
          'channel': 'WEB',
          'content': 'start', 
         'controlType': 'CONNECT',
          'from': userId,
          'mediaType': 'TEXT',
          'sourceType': 'CUSTOMER', 
         'to': channelId
       }
   })
   ```
   根据send接口返回的http status为200，且返回消息体resultCode为0，则成功。
   此时座席侧在线交谈工作台已可以看到接入的用户。
   
   
2. 请求checkClickToCallSupport接口 
   请求之前，请确保以下两点：
   - send接口得到接入成功的返回
   
   - 检查浏览器环境支持WebRTC（请结合WebRTC官方文档查看具体如何检查）
   
   
   检查示例：
   ```
   if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
         return Promise.reject(new Error('WebRTC is not supported'))
   }
   let cam = false
   let mic = false
   let spkr = false
   return navigator.mediaDevices.enumerateDevices().then((deviceInfos) => {
      deviceInfos.forEach(function (d) {
          switch (d.kind) {
               case 'videoinput': 
                cam = true 
                break 
              case 'audioinput':
                 mic = true
                 break
               case 'audiooutput':
                 spkr = true
                 break
             }
     })
     // Chrome supports 'audiooutput', Firefox and Safari do not support.
     if (navigator.webkitGetUserMedia === undefined) {
       spkr = true
     }
     if (!spkr) {
       return Promise.reject(new Error('Missing a speaker! Please connect one and reload'))
     }
     if (!mic) {
       return Promise.reject(new Error('Missing a microphone! Please connect one and reload'))
     }
     return Promise.resolve(cam)
   })
   ```
   1. 在上述检查均通过后，可开始调用checkClickToCallSupport接口。
      ```
      this.$axios({
          method: 'get',
          url: APIfabric域名/apiaccess/ccmessaging/v1/checkClickToCallSupport?channel=WEB,
          headers: {
             'Content-Type': 'application/json',
             'x-app-key': appKey,
             'Authorization': fabric.token,
             'ccmessaging-token': ccmessaging.token
          }
      })
      ```
      
   
   2. 返回消息体：
      ```
      {    "resultCode":"0",
          "resultDesc": ""，
          "webRTCSupported":true,
          "clickToCallSupported":true
      }
      ```
      如httpStatus为200，且resultCode为0，代表请求成功。
      webRTCSupported，代表该租间是否支持webRTC；clickToCallSupported代表该渠道是否支持点击通话。
      上述两个变量均为true时，可进行下一步，创建点击通话。
      
   
   
   
   
3. 请求createClickToCall。 
   ![](https://support.huaweicloud.com/devg-voip-cec/public_sys-resources/notice_3.0-zh-cn.png)
   请确保checkClickToCallSupport返回的webRTCSupported和clickToCallSupported为true，才可调用。
   请求参数中的mediaAbility为0，为发起语音通话；为1，为发起视频通话。
   ```
   this.$axios({
       method: 'post',
       url: APIfabric域名/apiaccess/ccmessaging/v1/createClickToCall,
       headers: {
          'Content-Type': 'application/json',
          'x-app-key': appKey,
          'Authorization': fabric.token,
          'ccmessaging-token': ccmessaging.token
       },
       data: {
          'channel': 'WEB',
          'mediaAbility': '0'
       }
   })
   ```
   返回消息体：
   ```
   {    "resultCode":"0",
       "resultDesc": ""
   }
   ```
   如httpStatus 为200，且resultCode为0，代表请求成功。
   
   
4. 长轮询请求getClickToCallEvents。 
   在createClickToCall调用成功后，开始调用getClickToCallEvents接口。
   ![](https://support.huaweicloud.com/devg-voip-cec/public_sys-resources/note_3.0-zh-cn.png)
   1. 请设置该请求的超时时间为一个较长值；调用该接口请求，处理较缓慢，经常在10秒以上；如上述请求中设置的值为60秒。
   
   2. 该请求为长轮询请求，在请求success后，根据返回事件状态，继续调用该请求。
    
   ```
   this.$axios({
       method: 'get',
       url: APIfabric域名/apiaccess/ccmessaging/v1/getClickToCallEvents?channel=WEB,
       timeout: 60000,
       headers: {
          'Content-Type': 'application/json',
          'x-app-key': appKey,
          'Authorization': fabric.token,
          'ccmessaging-token': ccmessaging.token
       }
   })
   ```
   返回结果如下：
   resultCode为非0时，表示请求失败，请设置重试机制：如客户端请求失败，重试3次后，仍然失败则停止请求重试。
   resultCode为0，eventId为：
   168101：呼叫建立；168102：呼叫排队；168106：呼叫转移；或者轮询时，可能没有事件，eventId是不携带时的情况，客户端需要保持长轮询。
   当呼叫建立时，可从content中获取 webRTC必要参数：
   domain为WebRTC Gateway域名；gwAddresses为WebRTC Gateway通信地址和端口；clickToCallCaller为主叫，accessCode为被叫
   - 呼叫建立
     ```
     {    resultCode:"0",
         resultDesc:"Call connected",
         "eventId": 168101,
         "content"：{
             "domain":"xxx"
             "gwAddresses":["xx1","xx2"]
             "accessCode": "179080000537636"
             "clickToCallCaller":"AnonymousCard"
         }
     }
     ```
     
   
   - 呼叫排队
     ```
     {    resultCode:"0"
         resultDesc:"Call in queue"
         "eventId": 168102
     }
     ```
     
   
   - 呼叫转移
     ```
     {
         resultCode:"0"
         resultDesc:"Call transfered"
         "eventId": 168106
     }
     ```
     
   
   - 呼叫释放
     ```
     {
         resultCode:"0"
         resultDesc:"Call disconnected"
         "eventId": 168110
         "content"：{
             "causeId":  -1
             "causeDesc"： "xxxx"
         }
     }
     ```
     
   
   - 呼叫排队超时
     ```
     {
         resultCode:"0"
         resultDesc:"Call queue timeout"
         "eventId": 168103
         "content"：{
             "causeId":  -1
             "causeDesc"： "xxxx"
         }
     }
     ```
     
   
   - 呼叫失败
     ```
     {
         resultCode:"0"
         resultDesc:"Call failed"
         "eventId": 168105
         "content"：{
             "causeId":  -1
             "causeDesc"： "xxxx"
         }
     }
     ```
     
   
   - 没有获取到事件
     ```
     {
         resultCode:"0"
         resultDesc:"ClickToCall polled without any events"
     }
     ```
     
   
   
   
   
5. 主动挂断时，调用dropClickToCall接口。 
   ```
   this.$axios({
       method: 'post',
       url: APIfabric域名/apiaccess/ccmessaging/v1/dropClickToCall,
       headers: {
          'Content-Type': 'application/json',
          'x-app-key': appKey,
          'Authorization': fabric.token,
          'ccmessaging-token': ccmessaging.token
       },
       data: {
          'channel': 'WEB'
       }
   })
   ```
   返回消息体：
   如httpStatus为200，且resultCode为0，代表请求成功；
   ```
   {
       "resultCode":"0",
       "resultDesc": ""
   }
   ```
   
   
 
