Webhook
1.Webhook简介
DM Hub 平台提供了各种 Open API 供外部系统调用,但在某些情况下,可能需要 DM Hub 在合适的时刻能够主动推送消息给外部系统,例如在自动流程执行到特定步骤时,能推送消息给客户的各种终端系统。
Webhook 功能就是 DM Hub 提供的消息推送机制,能够给在 DM Hub 平台上注册过的接口推送消息。
例:某客户在小程序中提交了一个订单,且订单中包含主推商品A,但是提交订单后20分钟未支付,此时可以发消息提醒客户完成支付,同时可以通过Webhook推送发券指令给到小程序,触发小程序主动灌券给该客户,触成交易的完成。(此例中小程序提交订单行为及商品信息等需要通过自定义事件、埋点等方式来打通数据,详情参考小程序埋点)
2.创建Webhook
点击 【设置】-【系统设置】-【Webhook】进入Webhook列表页,点击右上角的【新建】按钮创建新的Webhook。
2.1参数说明
名称:给Webhook取一个有意义的名称,方便后续查看和更改。
消息接收地址:Webhook消息的接收地址。该地址必须是合法的完整地址,包含使用的协议(如 http 或 https)。
鉴权方式:为了防止非授信主体访问消息接收地址,消息接收地址的提供方需要提供一定的鉴权机制。DM Hub支持用以下鉴权机制来访问消息接收地址,具体内容参见 Webhook鉴权
- 秘钥:DM Hub在发送消息的时候会使用该密钥对消息内容进行签名,消息接收地址在接收到消息时进行验签,从而保证消息来源以及消息内容没有被篡改过。
- 基本认证: DM Hub发送消息时,使用HTTP基本认证访问消息接收地址。
- OAuth2:DM Hub发送消息时,使用OAuth2的客户端凭证方式(client crendentials)访问消息接收地址。
- 无:DM Hub发送消息时,不使用任何鉴权方式。
触发类型
自定义: 可在自动流程中作为一个动作组件,或手动圈选人群推送消息。选择此触发类型,需设置消息类型和消息体。
事件订阅:指定事件发生后,该事件的内容会被发送给消息接收地址。DM Hub支持如下事件的订阅:客户事件、会员事件、客户属性变更、客户身份变更和营销活动属性变更。当订阅多个事件时,多个事件会分别逐条发送给消息接收地址,而不是一次性发送给消息接收地址。事件订阅的消息格式参见Webhook触发类型说明
异常通知: 创建供自动流、智能群组和智能标签等功能发生异常时的通知地址。详情请见该选项下的帮助链接。
消息类型: 可选择以JSON或者文本格式发送消息。如果消息类型为JSON格式,则HTTP header中的Content-Type为application/json,如果为文本格式,则Content-Type为text/plain
消息体:可自定义消息内容,并可选择插入内容变量。内容变量有两种:
- 一种是消息发送时的上下文变量,即消息发送时对应客户的属性、会员属性,事件属性(当Webhook由事件触发时存在)。
- 另一种是场景参数。比如用自动流发送优惠券,可以在自动流的Webhook节点里插入优惠券的ID,这样在发送消息时,就可以将优惠券ID插入到消息内容中发送给下游系统。设置场景参数后,可以在自动流的Webhook节点、表单提交后的Webhook动作、批量群发时设置场景参数值。
- 自动重试:如果推送失败,会自动进行重试。自动重试开启后,DM Hub会最多重试3次:分别为发送后的30分钟,60分钟和90分钟。
3.Webhook鉴权
3.1秘钥
对于设置了秘钥的 Webhook,DM Hub 向消息接收地址发送请求时,会使用秘钥生成消息内容的 hmac sha256 hex 摘要签名,携带在 header 的 X-Clab-Hmac-Signature 中。
在接收消息的代码中,使用相同的秘钥生成接收到的 payload 的 hmac sha256 hex 摘要签名,并与 header 中的签名进行比对,如果两者一致,则验签通过,表明消息来源可靠且消息内容没有被篡改过。
生成 hmac sha256 hex 摘要签名: 使用的 jar 包:
com.google.code.gson:gson:2.8.1
commons-codec:commons-codec:1.10
生成签名代码示例:
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import org.apache.commons.codec.digest.HmacUtils
String sign(Map payload, String secret) {
Gson gson = new GsonBuilder().create();
String str = gson.toJson(payload);
return HmacUtils.hmacSha256Hex(secret, str.replaceAll("\\s+", ""));
}
3.2基本认证
对于设置了基本身份认证的 Webhook, DM Hub向消息地址发送请求时,会在HTTP header中添加Authorization请求头。示例代码如下:
String content = username + ":" + password;
String token = "Basic " + Base64.getEncoder().encodeToString(content("utf-8"));
httpPost.setHeader("Authorization", token);
接收Webhook消息的服务可以用相同的方法验证请求的完整性。
3.3OAuth2
对于设置了OAuth2认证的 Webhook, DM Hub首先会向token获取地址请求并获取access_token,然后携带access_token参数向消息接收地址发送消息。
3.3.1获取token的方式如下:
GET https://{token获取地址}?appid={appid}&secret={secret}&grant_type=client_credentials
3.3.2发送消息时的参数名为access_token,如:
POST https://{消息接收地址}?access_token={access_token}
3.4不使用任何鉴权方式
如果Webhook鉴权设置无,则不做任何鉴权,直接访问接受消息地址
4.Webhook消息格式
Webhook支持如下几类消息:自定义消息、客户事件、客户属性变更、客户身份变更和会员事件。下面分别对各种消息的格式一一做说明
4.1自定义消息
自定义消息在手动发送、自动流程和提交表单时发送的Webhook中会使用。Webhook发送的消息格式会按照用户定义的格式发送,同时会替换里面的变量。
示例:
自定义JSON消息体:
{
"姓名":"${name!\"\"}",
"公司":"Convertlab"
}
Webhook消息接收地址接收到的消息内容:
{
"姓名": "DM Hub",
"公司": "Convertlab",
"MESSAGEID": "6f883839ec224526a1ecbb59ca8f5277"
}
JSON消息还会随消息携带一个MESSAGEID
,用于定位问题。
自定义TEXT消息体:
${name!\"顾客\"}, 你好!
TEXT消息内容:
顾客, 你好!
自定义消息支持的变量 除了可以在界面中插入的变量,如客户变量,会员变量等。自定义消息还支持如下变量:
- tenantId: 发送消息的租户ID
- customerId: 对应的客户ID
- campaign: 对应的营销活动编码
- webhookId: 对应的Webhook Id
- batchId: 该次发送的批次号(不一定有)
自动流发送的Webhook还可以使用如下变量:
- flowId: 自动流程ID
- flowVersion: 自动流程版本号
- flowStep: 自动流程的步骤ID
4.2客户事件
对于订阅了客户事件的Webhook,在客户事件发生时,DM Hub会将事件的内容发送给消息接收地址。Webhook可以订阅系统事件和自定义客户事件。当Webhook订阅了多个客户事件时,多条事件会依次发送给接收地址,而不是一次性发送多条。下面以点击微信菜单事件为例来说明消息的格式。
示例:
事件类型:点击微信菜单事件 事件关键字:click_menu 消息内容:
{
"MESSAGEID": "ce735894be7a4366a5ec905e2ec4b14c",
"topic": "customerEvent",
"data": {
"event": {
"createdDate": "2020-08-18T08:14:31.548Z",
"type": "created"
},
"object": {
"id": "784697835080734720",
"tenantId": 1,
"customerId": "577610832247089152",
"channelType": "wechat",
"channelAccount": "1234",
"event": "click_menu",
"targetId": "kdfb9nho734l6",
"targetName": "会员福利",
"date": "2020-08-18T08:14:29.285Z",
"userId": "okY_5jvvwjyrGzEFrHgSCIJ96GgY",
"identityType": "wechat",
"identityValue": "okY_xxxj_openid",
"lastUpdated": "2020-08-18T08:14:31.432Z"
}
}
}
字段说明:
字段 | 说明 |
---|---|
MESSAGEID | 本次发送的消息ID,用于调试 |
topic | 本次消息发送的类型,客户事件的topic都为customerEvent |
data | webhook的消息内容 |
data.event | 事件的类型和发生的事件,对于客户事件Webhook消息,类型都是created |
data.object | 客户事件的内容,具体参照客户事件 |
4.3客户属性变更
对于订阅了客户属性变更的Webhook,在客户属性发生变更时,DM Hub会将发生变更的属性内容发送给消息接收地址。Webhook可以订阅系统事件和自定义客户事件。下面以客户公司属性发生变更为例来说明消息的格式。
示例:
消息内容:
{
"MESSAGEID": "ce735894be7a4366a5ec905e2ec4b14c",
"data": {
"event": {
"createdDate": "2020-08-18T08:14:31.548Z",
"type": "updated"
},
"object":{
"customerId": "577610832247089152",
"name": "张三",
"company": "百度",
"id": 1999
}
},
"topic": "customer"
}
字段说明:
字段 | 说明 |
---|---|
MESSAGEID | 本次发送的消息ID,用于调试 |
topic | 本次消息发送的类型,客户属性变更的topic都为customer |
data | webhook的消息内容 |
data.event | 事件的类型和发生的事件,对于客户事件Webhook消息,类型可以是created,updated,deleted |
data.object | 客户属性的内容,具体参照查询客户 |
4.4客户身份变更
对于订阅了客户身份变更的Webhook,在系统客户发生增删改变更时,DM Hub会将事件的客户内容发送给消息接收地址。
示例:
消息内容:
{
"MESSAGEID": "ce735894be7a4366a5ec905e2ec4b14c",
"data": {
"event": {
"createdDate": "2020-08-18T08:14:31.548Z",
"type": "deleted"
},
"object":{
"id": 2850786358,
"version": 1,
"type": "wechat-unionid",
"value": "ombkt1FfCsqV91SQZ-p5-HfXqDVY",
"name": "小情绪",
"tenant_id": 4209,
"date_created": "2020-08-19 07:23:15",
"last_updated": "2020-08-19 07:23:15",
"customer_id": 785396805977360400
}
},
"topic": "customerIdentity"
}
字段说明:
字段 | 说明 |
---|---|
MESSAGEID | 本次发送的消息ID,用于调试 |
topic | 本次消息发送的类型,客户属性变更的topic都为customer |
data | webhook的消息内容 |
data.event | 事件的类型和发生的事件,对于客户身份变更Webhook消息,类型可以是created,deleted |
data.object | 客户身份相关信息 |
data.object.id | 事件ID |
data.object.version | 版本号 |
data.object.type | 客户来源类型 |
data.object.value | 变更后的值 |
data.object.name | 姓名 |
data.object.tenant_id | tenantId |
data.object.date_created | 创建时间 |
data.object.last_updated | 更新时间 |
data.object.customer_id | 客户ID |
data.object.value_md5 | value_md5 |
4.5会员事件
对于订阅了会员事件的Webhook,在会员事件发生时,DM Hub会将事件的内容发送给消息接收地址。Webhook目前支持以下5种会员相关事件。
示例:
事件类型:会员等级升级事件 事件关键字:loyalty/membership_level_up 消息内容:
{
"MESSAGEID": "4e7eed8aceef464db0a60205808dd726",
"customerId": "785402304818944000",
"date": "2020-08-19T07:34:15Z",
"event": "loyalty/membership_level_up",
"membershipId": "119857345",
"newLevel": "LV1",
"newLevelId": 3441,
"oldLevel": "LV0",
"oldLevelId": 3433,
"tenantId": 306
}
字段说明:
字段 | 说明 |
---|---|
MESSAGEID | 本次发送的消息ID,用于调试 |
customerId | 客户ID |
tenantId | tenantId |
event | 事件关键字 |
membershipId | 会员 ID |
date | 事件发生的时间 |
oldLevelId | 原等级 ID |
newLevelId | 新等级 ID |
oldLevel | 原等级名称 |
newLevel | 新等级名称 |
事件类型:会员等级降级事件 事件关键字:loyalty/membership_level_down 消息内容:
{
"MESSAGEID": "4e7eed8aceef464db0a60205808dd726",
"customerId": "785402304818944000",
"date": "2020-08-19T07:34:15Z",
"event": "loyalty/membership_level_down",
"membershipId": "119857345",
"newLevel": "LV1",
"newLevelId": 3446,
"oldLevel": "LV2",
"oldLevelId": 3434,
"tenantId": 306
}
字段说明:
字段 | 说明 |
---|---|
MESSAGEID | 本次发送的消息ID,用于调试 |
customerId | 客户ID |
tenantId | tenantId |
event | 事件关键字 |
membershipId | 会员 ID |
date | 事件发生的时间 |
oldLevelId | 原等级 ID |
newLevelId | 新等级 ID |
oldLevel | 原等级名称 |
newLevel | 新等级名称 |
事件类型:系统发放优惠券事件 事件关键字:loyalty/loyalty_dispatch_coupon 消息内容:
{
"batchId": "flow-446065_6_false@@14",
"couponCode": "784637477225773056",
"couponId": "eoaQZWQ2mdPL7G3eRhm2",
"couponName": "【2020年8月】茶机300元优惠券",
"customerId": "778129594954950656",
"date": "2020-08-18T06:14:36Z",
"endDate": "2020-08-31T15:59:59Z",
"event": "loyalty/loyalty_dispatch_coupon",
"membershipId": "117743425",
"startDate": "2020-07-26T16:00:00Z",
"tenantId": 1209
}
字段说明:
字段 | 说明 |
---|---|
tenantId | tenantId |
event | 事件关键字 |
membershipId | 会员 ID |
date | 事件发生的时间 |
couponId | 优惠券 ID |
couponName | 优惠券名称 |
batchId | 批次号 |
couponCode | 优惠券 code(该客户的唯一 code) |
startDate | 起始有效日期 |
endDate | 截止有效日期 |
事件类型:领取优惠券事件 事件关键字:loyalty/membership_draw_coupon 消息内容:
{
"couponId": "0m_YTifBat76AfDCf0zX",
"couponName": "Chubbsafes集宝保柜100元优惠券",
"couponCode": "780350791910176800",
"startDate": "2020-08-11T16:00:00Z",
"endDate": "2020-09-10T15:59:59Z",
"customerId": null,
"membershipId": "117741857",
"event": "loyalty/membership_draw_coupon",
"tenantId": 1223,
"date": "2020-08-12T08:17:43Z"
}
字段说明:
字段 | 说明 |
---|---|
tenantId | tenantId |
event | 事件关键字 |
membershipId | 会员 ID |
date | 事件发生的时间 |
couponId | 优惠券 ID |
couponName | 优惠券名称 |
couponCode | 优惠券 code(该客户的唯一 code) |
startDate | 起始有效日期 |
endDate | 截止有效日期 |
事件类型:核销优惠券事件 事件关键字:loyalty/membership_redeem_coupon 消息内容:
{
"couponId": "eoaQZWQ2mdPL7G3eRhm2",
"couponName": "【2020年8月】茶机300元优惠券",
"couponCode": "782694747738224640",
"customerId": "782694697842884608",
"membershipId": "118793137",
"event": "loyalty/membership_redeem_coupon",
"tenantId": 1209,
"date": "2020-08-15T13:56:33Z"
}
字段说明:
字段 | 说明 |
---|---|
tenantId | tenantId |
event | 事件关键字 |
membershipId | 会员 ID |
date | 事件发生的时间 |
couponId | 优惠券 ID |
couponName | 优惠券名称 |
couponCode | 优惠券 code(该客户的唯一 code) |
5.消息发送
5.1测试发送
在针对群组进行群发Webhook之前,可选择某个用户来发送单条消息以进行测试
测试步骤:
- 在Webhook列表中选择需要群发的Webhook,点击发送消息按钮。
- 选择测试发送
- 在输入框中输入客户姓名、微信昵称或者手机号码。
- 如果设置了场景参数,此时可以设置场景参数的值。
5.2群发
Webhook创建完成后,如果该Webhook的触发类型为自定义触发,需要进行手动群发。
发送步骤:
- 在Webhook列表中选择需要群发的Webhook,点击发送消息按钮。
- 选择群发
- 在发送至群组的下拉列表中选择群组。
- 选择发送时间. 如果选择定时发送则系统会在指定的时间开始发送Webhook消息。
- 如果设置了场景参数,此时可以设置场景参数的值。
5.3查看群发结果
在webhook列表中可查看webhook发送的结果。
如果是测试消息,可查看到消息发送的详情,包括消息体、消息头以及服务器的响应结果 如果是群发的webhook消息,可以在发送列表页上看到该消息的发送状态:发送中、已完成等。
5.4接收自动流消息
如下图所示,在创建自动流程时,可以添加 Webhook 动作节点,用以将相关的上下文信息通过 Webhook 推送给外部系统。如果Webhook设置了场景参数,此处可以设置场景参数的值。
5.5接收表单提交相关消息
如下图所示,在表单中,可以设置提交表单后触发 Webhook,用以将相关的上下文信息通过 Webhook 推送给外部系统。如果Webhook设置了场景参数,此处可以设置场景参数的值。
5.6发送记录
给客户发送webhook后系统会在客户时间轴记录“系统发送Webhook消息”事件,并在事件属性中记录Whbhook ID、Whbhook 名称。