1.2.11 • Published 2 years ago

npm-infobird-websdk01 v1.2.11

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

##1. 背景

为满足客户在脱离启通宝客户端得情况下也可使用多电话服务,为第三方开发者提供网页开发支持得npm SDK 。 此文档面向网页开发者介绍企通宝npm SDK如何使用及相关注意事项。 支持(PC,H5,Andriod,IOS(11+),IE10+ , Firefox, Google)方式使用

##2. 简介

电话SDK是包含电话服务网页开发工具包,可提高第三方开发者开发效率,实现同启通宝电话服务无缝对接。

##3. 电话渠道使用示例

  • 第一步,下载安装npm包
npm i npm-infobird-websdk01
  • 第二步,实例化呼叫组件对象
let infobirdclient = new InfobirdClient(); //实例化 讯鸟客户端对象
  • 第三步,坐席账号登录
  infobirdclient.login({
    managerID: '***', // 企业id
    account:account,//坐席账号,必填
    password:password,//坐席账号,必填
    appid: 'infobirdtest',//线上默认填写infobird即可 
    success:function(data){
      var datastr = JSON.stringify(data);
      console.log('login',datastr)
})

//登录需要业务端配置跨域转发
Vue 配置如下:
devServer: {
    proxy: {
      '^/api': {
        target: 'https://vcs.infobird.com',
        changeOrigin: true,
        logLevel: 'debug',
        pathRewrite: { '^/api': '/' },
      },
    },
  },

Nginx 配置如下:

location ^~ /api/ {
       proxy_pass https://vcs.infobird.com/proxy/;
}
  • 第四步,登录成功,执行外呼操作
infobirdclient.outdail({
    accountType: '1', // 主叫类型
    calledDevice: currphonenum, // 呼叫phonenum号码
    callType: '0', // 呼叫类型, 0:语音呼叫
});
  • 第五步,通话完成后挂机。
infobirdclient.dropcall({
    accountType: '1', // 主叫类型
    callType: '0', // 呼叫类型, 0:语音呼叫
    success: function() {
        console.log('ok!');
    },
});
  • 第六步,退出当前登录账号,如果不退出,可以继续进行下一次通话。
infobirdclient.logout();      

HTML页面中定义回调函数onmessage接收请求结果,

回调事件声明(客户可以自定义):

window.addEventListener('onMessage', ({
    detail: {
        data
    }
}) => {
    console.log(data);
    var datastr = JSON.stringify(data);
    //状态记时
    if(data.type == 'HeartBeatConf'){

    }else{
      this.clearAll()
      this.timedCount()
    }
    //心跳判断
    switch (data.type) {
      case "ConnectConf":
        if(data.result == 0){
                this.isconnect = 1;
                this.agentstate = "等待"
            }
            break;
        case "DropCallConf":
          this.iscalling = 0;
          this.agentstate = "等待"
          break;
        case "CallReleased":
          this.iscalling = 0;
          this.agentstate = "等待"
            break;
        case "LogoutConf":
          this.agentstate = "未登录"
            break;
        case "MakeCallConf":
          this.agentstate = "呼叫"
            break;
        case "Established":
          this.agentstate = "呼叫"
            break;
        case "EstablishedReal":
          this.agentstate = "通话"
            break;
        case "HeartBeatConf":
            if(data.result == 0){
                this.isconnect = 1
            }else{
               this.init()
            }
            break;
        case "ForceLogout"://强踢
          this.init()
          break;
        default:
            break;
    }
});

客户接收消息后可根据自身开发需求进行处理。也可根据接口描述进行自定义开发。 到此已完成一次呼叫收发消息示例,使用说明介绍完成。

<template>
  <div class="app-container">
    <audio id="remoteAudio" autoplay=""></audio>
    <div class="w_title_bg">
        <div class="w_title">呼叫弹窗</div>
        <a @click="onCancel">
            <img src="../assets/images/cuowu.png" alt="关闭窗口" width="20" height="20" border="0" align="right" class="guanbi_img">
        </a>
    </div>
    <div align="right" style="margin-right:27px;margin-top:10px;">
        <el-button v-if="islogin == 1"
        icon="el-icon-login" 
        type="primary" 
        size="medium"
        @click="onLogout">
        {{button.logout}}
        </el-button>
        <el-button v-else
        icon="el-icon-login" 
        type="primary" 
        size="medium"
        @click="onLogin">
        {{button.login}}
        </el-button>
    </div>
    <el-form  style="margin-top:24px;margin:25px;">
      <el-form-item label="手机号:" prop="phonenum">
        <el-input v-model="currphonenum"/>
      </el-form-item>
      <el-form-item>
        <el-button v-if="iscalling == 1" type="danger" @click="onDropcall">{{button.dropcall}}</el-button>
        <el-button v-else-if="iscalling == 0" type="primary" @click="onOutdail">{{button.makecall}}</el-button>
        <el-button v-else-if="iscalling == 2" type="primary" @click="onAnswerCall">{{button.answercall}}</el-button>

        <el-button v-if="ismute == 0" type="success" round @click="onMute">静音</el-button>
        <el-button v-else-if="ismute == 1" type="danger" round @click="onCancleMute">取消静音</el-button>
       
      </el-form-item>
    </el-form>
    <div class="status_wrapper">
      <div class="status_module">
        <div class="circle__indicator connected" v-if="isconnect == 1"></div>
        <div class="circle__indicator disconnected" v-else></div>
        <div class="text">
          <span class="status" v-if="isconnect == 1">已连接</span>
          <span class="status" v-else>未连接</span>
        </div>
      </div>
      <div class="status_module">
        <div class="circle__indicator connected" v-if="islogin == 1"></div>
        <div class="circle__indicator disconnected" v-else></div>
        <div class="text">
          <span class="status" v-if="islogin == 1">已登录</span>
          <span class="status" v-else>未登录</span>
        </div>
      </div>
        <div class="status_module" style="width:400px">
            <label>坐席状态:</label>
            <div class="text">
          <span class="agentstatus">{{agentstate}}</span>
          <span id="statetime">{{statetime}}</span>
        </div>
        </div>
    </div>
  </div>  
</template>

<script>
import InfobirdClient from 'npm-infobird-websdk01'
export default {
    name: 'Callbox',
    props: {
        account: String,
        password:String,
        currphonenum:String,
    },
    components: {
    },
    data() {
        return {
            infobirdclient:null,//客户端对象
            phonenum:'',
            islogin:0,//登录状态
            iscalling:0,//呼叫状态
            isconnect:0,//连接状态
            ismute:0,//静音
            client:'',//客户端对象
            agentstate:'未登录',//坐席状态
            statetime:'00:00:00',//坐席状态记时
            agentstatetimer:null,//坐席状态记时器
            tc:0,//记时初始值
            button:{
                'login':'登 录',
                'logout':'退 出',
                'dropcall':'挂 断',
                'makecall':'呼 叫',
                'answercall':'接 听',
            },
        }
    },
    watch:{
        client(val, oldVal){//普通的watch监听
            console.log("client: "+val, oldVal);
        },
        islogin(val, oldVal){
            console.log("islogin: "+val, oldVal);
        },
        isconnect(val, oldVal){
            console.log("islogin: "+val, oldVal);
        },
    },
    //挂载
    mounted(){
        this.infobirdclient = new InfobirdClient(); //实例化 讯鸟客户端对象
        this.infobirdclient.init();
        console.log(this.infobirdclient)
      //检查登录状态
        this.$nextTick(function(){
            var _this = this;
            var timer = setInterval(function(){
                if(document.readyState === 'complete'){
                    console.log("页面加载完成");
                    // //初始化页面
                    // _this.initPage()
                    window.clearInterval(timer)
                }
            },500)
        })
    },
    //计算属性
    computed: {
        
    },
    methods: {
      init(){
        this.islogin = 0
        this.iscalling = 0
        this.isconnect = 0
        this.agentstate = "未登录"
        this.statetime = "00:00:00"
      this.tc = 0
      },
      //登录
      onLogin(){
            var self = this;
          let reqdata = {
                managerID: 'bj58082087', // 企业id
                account:this.account,
                password:this.password,
                appid: 'infobirdtest', 
                success:function(data){
                  self.islogin = 1
                  var datastr = JSON.stringify(data);
                  console.log('login',datastr)
                },
            }
            this.infobirdclient.login(reqdata);
      },

      //退出
      onLogout(){
        this.init()
        this.infobirdclient.logout();
      },
      //关闭页签
      onCancel() {
        this.$emit('close-layer')
      },
      //呼叫
      onOutdail(){
        //检查登录状态
        // if(!this.islogin){
        //  this.$message({
        //       message:'账户已退出登录,请您登录后呼叫!',
        //       type:'warning'
        //   })
        //   return
        // }
        // //检查连接状态
        // if(!this.isconnect){
        //  this.$message({
        //       message:'连接未建立,请等待建立连接呼叫!',
        //       type:'warning'
        //   })
        //   return
        // }
        //设置呼叫状态
        this.iscalling = 1;
        this.infobirdclient.outdail({
            accountType: '1', // 主叫类型
            calledDevice: this.currphonenum, // 呼叫phonenum号码
            callType: '0', // 呼叫类型, 0:语音呼叫
        });
      },
      //挂断
      onDropcall(){
        this.iscalling = 0;
        console.log(this.currphonenum)
        this.infobirdclient.dropcall({
            accountType: '1', // 主叫类型
            callType: '0', // 呼叫类型, 0:语音呼叫
            success: function() {
                console.log('ok!');
            },
        });
      },

        //来电接听
        onAnswerCall(){
            var keyword = this.currphonenum;
            this.infobirdclient.answercall({
                callNumber:keyword,// 呼叫类型, 0:语音呼叫
            });
        },

        //静音
        onMute(){
            this.ismute = 1;
            this.infobirdclient.setmute(); //设置静音
        },

        //取消静音
        onCancleMute(){
            this.ismute = 0;
            this.infobirdclient.canclemute(); //取消静音
        },
    

      stopCount() { //停止计时
      clearTimeout(this.agentstatetimer);
    },

    clearAll() { //计时清零
      this.statetime = "00:00:00"
      this.tc = 0
      clearTimeout(this.agentstatetimer);
    },
      //记时
      timedCount(){
      let hour = Math.floor(this.tc / 3600); // 小时数
      if(hour < 10){
        hour = "0" + hour
      }
      let minute = Math.floor(this.tc / 60); // 分钟数
      if(minute >= 60) {
        minute = minute % 60
      }
      if(minute < 10) {
        minute = "0" + minute;
      }
      let second = this.tc % 60;
      if(second < 10)
        second = "0" + second;
        this.statetime = hour + ":" + minute + ":" + second;

        this.tc = this.tc + 1;
        // console.log(this.tc,this.statetime)
        let self = this;
        this.agentstatetimer = setTimeout(function() {
          self.timedCount();
        }, 1000);
      },
  },
  //创建
  created() {
        //注册监听函数onMessage,处理回调数据
        window.addEventListener('onMessage', ({
            detail: {
                data
            }
        }) => {
            console.log(data);
            var datastr = JSON.stringify(data);
            //状态记时
            if(data.type == 'HeartBeatConf'){

            }else{
              this.clearAll()
              this.timedCount()
            }
            //心跳判断
            switch (data.type) {
              case "ConnectConf":
                if(data.result == 0){
                        this.isconnect = 1;
                        this.agentstate = "等待"
                    }
                    break;
                case "DropCallConf":
                  this.iscalling = 0;
                  this.agentstate = "等待"
                  break;
                case "CallReleased":
                  this.iscalling = 0;
                  this.agentstate = "等待"
                    break;
                case "LogoutConf":
                  this.agentstate = "未登录"
                    break;
                case "MakeCallConf":
                  this.agentstate = "呼叫"
                    break;
                case "Established":
                  this.agentstate = "呼叫"
                    break;
                case "Alerting":
                    this.currphonenum = msg['callingDevice']
                    this.iscalling = 2;
                    this.agentstate = "来电"
                    break;
                case "AnswerCallConf":
                    this.iscalling = 1;
                    this.agentstate = "应答"
                    break;    
                case "EstablishedReal":
                  this.agentstate = "通话"
                    break;
                case "HeartBeatConf":
                    if(data.result == 0){
                        this.isconnect = 1
                    }else{
                       this.init()
                    }
                    break;
                case "ForceLogout"://强踢
                  this.init()
                  break;
                default:
                    break;
            }
        });   
        // console.log(res,infobirdclient)
  },
  
}
</script>

<style scoped>
.add-form {
  margin-bottom: 40px;
}

.form-control {
  margin: 20px 0;
}

.form-control label {
  display: block;
}

.form-control input {
  width: 100%;
  height: 40px;
  margin: 5px;
  padding: 3px 7px;
  font-size: 17px;
}

.form-control-check {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.form-control-check label {
  flex: 1;
}

.form-control-check input {
  flex: 2;
  height: 20px;
}
.w_title_bg {
    height: 32px;
    background: url(../assets/images/window.png) repeat-x 0 0;
}
.w_title {
    width: auto;
    font-weight: bold;
    font-size: 15px;
    line-height: 34px;
    float: left;
    padding-left: 15px;
    color: #303030;
}


.login-btn {
    width: 30px;
    height: 30px;
    padding: 3px;
    border-radius: 3px;
    -moz-border-radius: 3px;
    -webkit-border-radius: 3px;
    text-align: center;
    color: #FFF;
    border: none;
    font-family: "Microsoft Yahei";
    cursor: pointer;
    text-decoration: none;
    display: inline;
    letter-spacing: 1px;
    /*margin-left: 10px;*/
}
.bt2:hover {
    background-color: #69c688;
    color: #FFF;
}



.status_module {
    /*border-left: 1px solid #ebebeb;
    border-right: 1px solid #ebebeb;*/
    padding-left: 25px;
    cursor: pointer;
    height: 56px;
    max-width: 250px;
    display: flex;
    flex-direction: row;
    justify-content: flex-start;
    align-items: center;
    float:left;
}
.status_module .circle__indicator {
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center center;
    float: left;
    /*width: 14px;*/
    height: 100%;
    margin-right: 5px;
}
.status_module .text {
    font-size: 16px;
}
.status_module .status {
    font-weight: 700;
    text-transform: uppercase;
    margin: 0 3px;
}
.disconnected{
  width: 14px;
    background-image: url(../assets/images/disconnect.png);
}
.connected{
  width: 10px;
    background-image: url(../assets/images/connect.png);
}
.agentstatus{
  font-size: 14px;
    font-weight: 700;
}
#statetime{    
  margin-left: 8px;
    font-size: 14px;
    background-color: #ddd;
    padding: 10px;
}
</style>
1.2.10

2 years ago

1.2.11

2 years ago

1.2.8

2 years ago

1.2.7

2 years ago

1.2.9

2 years ago

1.2.0

2 years ago

1.2.6

2 years ago

1.2.5

2 years ago

1.2.4

2 years ago

1.2.3

2 years ago

1.2.2

2 years ago

1.2.1

2 years ago

1.1.9

2 years ago

1.1.8

2 years ago

1.1.7

2 years ago

1.1.6

2 years ago

1.1.5

2 years ago

1.1.4

2 years ago

1.1.3

2 years ago

1.1.1

2 years ago

1.1.0

3 years ago

1.0.9

3 years ago

1.0.8

3 years ago

1.1.2

2 years ago

1.0.7

3 years ago

1.0.6

3 years ago

1.0.5

3 years ago

1.0.4

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago