跳至主要內容

Webhook API

大约 8 分钟

Webhook API

接口文档变更记录

第几次变更变更内容变更人
11、增加客服号上下线记录接口陈超
21、增加接口加密逻辑说明(header方式)陈超

一、 接口接入规范

注意: 要接入webhook API,请联系客户成功人员(提供对应的配置webhook的地址、类型)进行配置。

1、交互流程

webhook回调业务时序图

2、接口安全规范

  • 联系管理员获取秘钥(SalesEpoch管理后台获取)

  • 接口请求加密方式-1

此接口加密方式,加密字段是放到接口的请求体( body) 里面。

1、把 tenant_id+timestamp+密钥当做签名字符串(access_token),使用 HmacSHA256 算法计算签名。

    String appSecret = "f9a40a4780f5e1306c46f1c8daecee3b";
    String tenantId = "500975";
    String timestamp = "1666942813620";
    String message = tenantId + timestamp ;
    String access_token = HmacSHA256Util.hmacSHA256(appSecret,message);
    // 小写
    // str = df98eda524132837317c5ea7e4f67ef4224dedc3f01548b6cb211b08eb0328c5
  • 接口请求加密方式-2

此接口加密方式,加密字段是放到请求头( header) 里面。

1、把 tenant_id+timestamp+密钥当做签名字符串(access_token),使用 HmacSHA256 算法计算签名。

    String appSecret = "f9a40a4780f5e1306c46f1c8daecee3b";
    String tenantId = "500975";
    String timestamp = "1666942813620";
    String message = tenantId + timestamp ;
    String access_token = HmacSHA256Util.hmacSHA256(appSecret,message);
    // 小写
    // str = df98eda524132837317c5ea7e4f67ef4224dedc3f01548b6cb211b08eb0328c5

注: 202406之后的新接口全部使用第二种加密方式(请求头传递参数)。

java HmacSHA256加密,可以引用common-codec(1.15)包。

    public static String hmacSha256(String message, String secretKey) {
        return (new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secretKey.getBytes(StandardCharsets.UTF_8))).hmacHex(message.getBytes(StandardCharsets.UTF_8));
    }

3、HTTP 状态码

均以 code 为准

Code描述详细解释
200oksuccess!

4、公共参数

参数名类型是否必填备注
accessTokenString签名字符串 token
tenantIdint公司 id
timestampLong毫秒时间戳

二、 接口列表

1、用户画像信息修改通知

描述 pc 端客户修改用户画像(基本信息、扩展字段)

  • 请求参数

    参数名类型是否必填备注
    accessTokenString签名字符串 token
    tenantIdint公司 id
    timestampLong毫秒时间戳
    dataList格式[{},{}],详细如下(数量 0-50 条)
    • data 详细参数:
    参数名类型是否必填备注
    idString数据 id 标识(uuid)
    userNameString坐席登录账号
    typeint类型 1、用户画像修改 2、写跟进
    friendWhatsIdString修改对象客服号
    fieldString修改字段项,扩展字段为字段名称 如:扩展-附件
    fieldTypeint字段类型 0、基本字段 1、扩展字段
    fieldConfigint字段配置 1、单行文本 2、多行文本 3、单选 4、多选 5、数值 6、日期 7、时间 8、附件
    sourceValueString修改原值
    targetValueString修改结果
    updateAtString修改时间
    • 示例请求参数:
    {
      "accessToken": "83293d01dddd628e3b457142f8a48a0cf4dae3b587e7febea7effea6bdcfd344",
      "tenantId": 500975,
      "timestamp": 1667293135274,
      "data": [
        {
          "id": "a0cb1ad15ed24e618b4b12d9cdff1ad4",
          "type": 1,
          "userName": "张三",
          "friendWhatsId": "8615601882491",
          "field": "Address",
          "fieldType": 0,
          "fieldConfig": 1,
          "sourceValue": "",
          "targetValue": "123123",
          "updateAt": "2022-09-29 20:34:58"
        },
        {
          "id": "81c968134be648e19187db83efa60152",
          "type": 1,
          "userName": "张三",
          "friendWhatsId": "8615601882491",
          "field": "Gender",
          "fieldType": 0,
          "fieldConfig": 3,
          "sourceValue": "MALE",
          "targetValue": "FEMALE",
          "updateAt": "2022-10-02 20:34:58"
        },
        {
          "id": "4d8ac8a3a5164ab2b066dcf8fac5bd45",
          "type": 2,
          "userName": "张三",
          "friendWhatsId": "33758618170",
          "field": "Follow up records",
          "fieldType": 0,
          "fieldConfig": 1,
          "sourceValue": "",
          "targetValue": "{\"data\":{\"text\":\"你好\",\"url\":[]},\"dataTypeMap\":{\"writeFollow\":\"写跟进\"}}",
          "updateAt": "2022-10-31 17:44:06"
        }
      ]
    }
    
    • 写跟进(Follow up records):

      fieldType、fieldConfig、fieldType 以上都是初始值

      写跟进 sourceValue、 targetValue 为固定格式 data: 数据(text:跟进文本,url:上传文件地址) 、dataTypeMap(value 固定格式) 类型

    • field 说明

      fieldConfig:是我方标识的数据 value 类型、可选择不接收、不是必要字段

fieldfieldConfig说明(sourceValue ->targetValue)
Name(姓名)单行文本字符串 如:小明 ->小王
Gender(性别)单选字符串 可选值(MALE、FEMALE、UNKOWNN) 如:MALE -> FEMALE
DOB(生日)日期字符串 格式(yyyy-MM-dd) 如:2022-12-01-> 2022-12-02
Address(地址)单行文本字符串 如:上海-> 北京
Email(邮箱)单行文本字符串 如: 123@qq.com-> 123@163.com
Position(职业)单行文本字符串 如: 运营->销售
Income(收入)单行文本字符串 如: 1 万->2 万
Description(备注)多行文本字符串 (包含换行符 \n) 如: 1\n2\n3 -> 1\n2\n3\n4
From(客户来源)单选字符串 根据后台客户管理-设置 如:默认 -> 自挖掘
State(阶段)单选字符串 根据后台客户管理-设置 如:新客户 -> 需求匹配
Language(客户语言)单选字符串 根据后台客户管理-设置 如:auto -> am
Tags(标签)多选数组字符串 根据后台客户管理-设置 如:[标签 1] -> [标签 1,标签 2]
多选(扩展字段以自定义名称为准)多选数组字符串 根据后台客户管理-设置 如:[多选 1] -> [多选 1,多选 2]
时间(扩展字段以自定义名称为准)时间字符串 格式(HH:mm:ss) 如:17:26:59-> 17:27:35
附件(扩展字段以自定义名称为准)附件字符串 格式(,http 分隔) 如:http://123.img,http://456.img
  • 返回值

    参数名类型是否必填备注
    codeint状态码
    messageString描述
    dataString数据
    • 举例如下:
    {
      "code": 200,
      "message": "",
      "data": ""
    }
    

2、消息同步

  • 描述

    客户端收发消息同步

  • 请求参数说明

    参数名类型是否必填备注
    accessTokenString签名字符串 token
    tenantIdint公司 id
    timestampLong毫秒时间戳
    dataList格式[{},{}],详细如下(数量 0-50 条)

    data 参数说明:

    参数名类型是否必填备注
    idString数据 id 标识(uuid)
    messageIdString消息 id
    userNameString坐席登录账号
    whatsIdString消息发送whatsapp( 个人指谁发送的消息,群聊指群里谁发送的消息)
    friendWhatsIdString好友whatsapp (当类型为群聊的时候是群名称)
    currentWhatsIdString当前客服号
    actionTypeint行为类型 1、发消息 2、 收消息
    chatTypeint聊天性质 1、普通聊天 2、 群聊
    messageStatusint消息状态 1、已发送(客户端) 3、已到达 4、已读
    contentString内容(详细如下)
    contentTypeint内容类型 0、普通文字 1、图片 2、视频 3、音频 4、文件
    sendTimeString消息聊天时间
    originTypeint来源 1、pc 2、app 3、web
    userProfileobject好友用户画像

data 参数 messageStatus 发生变更时会重新同步状态,其他内容不变

  • content 参数说明:

    参数名类型是否必填备注
    filenameString文件名称
    urlString文件地址
    mimeTypeStringmime 类型
    captionString文件说明
    • 当内容类型为 1,2,3,4 时:

    1 图片: image/jpeg、image/png、image/webp

    2 视频: video/mp4

    3 音频: audio/aac、audio/m4a、audio/amr、audio/mpeg、audio/ogg; codecs=opus、codecs=opus

    4 文件: application/pdf、application/msword、application/ppt、application/xls

  • userProfile 参数说明

    参数名类型是否必填备注
    idLong客户id
    nameString客户昵称
    whatsAppString客户whastapp
    usernameString负责人名字
    incomeString收入
    professionString职业
    descString备注
    tagsarray标签
    emailString邮箱地址
    addressString地址
    extendsMapString扩展信息(json字符串)
  • 请求示例:

{
    "accessToken": "e6e18763d8212d26ced4f92512881c63c468d5a756d45c01486d7ad6742152ac",
    "tenantId": 1238,
    "timestamp": 1667295870936,
    "data": [
        {
            "id": "30e873ab8f4840e2b610c414fe967327",
            "messageId": "7a324c7b5512468cb7a9296af0f8379b",
            "userName": "gdkj002",
            "whatsId": "8617633819542@c.us",
            "friendWhatsId": "8615601882491@c.us",
            "currentWhatsId": "8617633819542@c.us",
            "actionType": 1,
            "chatType": 1,
            "messageStatus": 1,
            "content": "再见",
            "contentType": 0,
            "originType": 1,
            "sendTime": "2022-10-31 16:25:42",
            "userProfile":{
                "id":8423922419416375296,
                "name":"好友1",
                "whatsApp":"447759820897",
                "username":"testlsl001",
                "extendsMap":"{\"单行文本\":\"caseId009\",\"多选\":\"[]\",\"日期\":\"\"}",
                "income":"",
                "profession":"",
                "desc":"",
                "tags":[
                    "测试",
                    "测试000000000000000000",
                    "11111"
                ],
                "email":"",
                "address":"北京"
            }
        },
        {
            "id": "31057e55b9f842b4becf4a9ff699b64e",
            "messageId": "82bfefadceb948428fd3f3ef659e14b3",
            "userName": "gdkj002",
            "whatsId": "8617633819542@c.us",
            "friendWhatsId": "8615601882491@c.us",
            "currentWhatsId": "8617633819542@c.us",
            "actionType": 1,
            "chatType": 1,
            "messageStatus": 1,
            "content": "{"caption":"","filename":"","mimetype":"video/mp4","url":"https://image.whatsappscrm.com/client/603704/chat_history/1665198225749_video"}",
            "contentType": 2,
            "originType": 1,
            "sendTime": "2022-10-31 16:25:42",
            "userProfile":{
                "id":8423922419416375296,
                "name":"好友2",
                "whatsApp":"447759820897",
                "username":"testlsl001",
                "extendsMap":"{\"单行文本\":\"caseId007\",\"多选\":\"[]\",\"日期\":\"\"}",
                "income":"100002",
                "profession":"IT",
                "desc":"备注",
                "tags":[
                    "测试",
                    "测试000000000000000000",
                    "11111"
                ],
                "email":"",
                "address":"北京"
            }
        }
    ]
}
  • 返回参数说明

    参数名类型是否必填备注
    codeint状态码
    messageString描述
    dataString数据
  • 响应示例:

    {
      "code": 200,
      "message": "success!",
      "data": ""
    }
    

3、群行为埋点通知

当 whatsapp 触发加群退群动作时,主动推送通知成员加群、退群的日志

3.1 推送数据

  • 请求参数说明
字段类型是否必填备注
accessTokenString签名字符串 token
tenantIdint公司 id
timestampLong毫秒时间戳
dataList格式[{},{}],详细如下(数量 0-50 条

data 参数说明

字段类型是否必填备注
idString数据 id 标识(uuid)
friendWhatsIdStringwhatsapp 手机号
actionTypeint1 进群 2 退群
createTimeString操作时间,进群时间或者退群时间
groupWhatsIdString群 ID
groupLinkString群链接
dataTypeint是否是虚拟数据 数据类型 1 真实 2 虚拟
  • 请求示例
{
  "accessToken": "e6e18763d8d5a756d45c01486d7ad6742152ac",
  "callBackUrl": "host/wscrm-bus-api/part/callback/groupAction",
  "tenantId": 1238,
  "timestamp": 1667295870936,
  "data": [
    {
      "id": "30e873ab8f4840e2b610c414fe967327",
      "friendWhatsId": "8617633819542",
      "actionType": 1,
      "create_time": "2023-02-01 00:00:00",
      "groupWhatsId": "120xxxxx",
       "dataType": 1,
      "groupLink": "https://chat.xxx.com/CEwwCoiy7Qa1MVKex3x4p4"
    }
  ]
}
  • 响应示例
{
  "code": 200,
  "message": "Success",
  "data": ""
}

4、客服号上下线通知

注: 接口加密规则使用header头的方式!!!

  • 类型

    WebHook

  • URI

    /api/callback/whatsapp/onlineStatus

  • 请求方式

    POST、Content-Type: application/json

  • 请求参数说明

字段类型是否必填备注
whatsAppListList格式[{},{}],详细如下(数量 0-50 条
  • whatsAppList 参数说明
字段类型是否必填备注
whatsIdStringwhatsapp 手机号
statusint状态 10、在线 20、掉线 30、离线 40、死号
detailStatusint详细状态 (具体请查看下面注释)
accountString坐席账号
platformTypeint平台类型 1、pc 2、android
timeString时间 2024-06-27 19:52:12

详细状态介绍: 11、PC扫码登录 12、PC上线 21、PC掉线 31、PC关闭客户号离线 32、PC关闭客户端离线33、PC触发监控下线41、封号

  • 请求示例
[
    {
      "whatsId": "8617633819542",
      "status": 1,
      "detailStatus": 11,
      "account":"",
      "time":"2024-07-03 15:27:00",
      "platformType":1
    },
    {
      "whatsId": "8617633819542",
      "status": 1,
      "detailStatus": 11,
      "account":"",
      "time":"2024-07-03 15:27:00",
      "platformType":1
    }
  ]
}
  • 响应示例
{
  "code": 200,
  "message": "Success",
  "data": ""
}

三、常见问题

  • 通知失败重试次数

    说明:通知进行同步后,不响应或不为 200 的状态码均为失败,5 次以上将关闭该类型的 WebHook 配置信息.

  • 配置关闭如何处理

    说明:关闭配置后,仍进行数据的采集但不进行同步,当配置打开后以 10 分钟为间隔进行一次检测,检测到打开

    后进行同步所有的历史数据。

  • 时区

    UTC+8

上次编辑于:
贡献者: 罗英杰,kubrick,罗英杰,kubrick,zhangzhuangzhuang