概述
神策智能运营可以根据一定规则实时或批量生成对用户的触达行为,这些行为包括发送短信、App 推送和 Webhook,前两者是由神策智能运营调用第三方平台(如极光、个推)API,而 Webhook 则是将消息封装成 JSON 通过 HTTP 请求发送到您提供的服务接口。
本文将结合我们提供的工具类演示如何快速启动一个接收 Webhook 请求的 Server,若希望了解更多关于神策智能运营 Webhook 协议的细节,可以点击 参考文档 。
引入工具类
对于 Java 开发者,我们提供了对 Webhook 协议的简单封装,让您可以更关心如何处理 Webhook 的业务逻辑。引入工具类可以通过以下两种方式:
通过 Maven 添加 dependency:
dependency
<dependency> <groupId>com.sensorsdata.focus</groupId> <artifactId>webhook-helper</artifactId> <version>0.2.8</version> </dependency>
XML- 通过代码引入。该工具相关代码开源在 github:https://github.com/sensorsdata/sf-webhook-helper
实现消息处理器
实现一个神策智能运营 Webhook 消息处理器,即定义一个类实现 SfWebhookProcessor 接口,该接口定义如下:
public interface SfWebhookProcessor {
void handleWebhookEntries(List<SfWebhookEntry> entries);
}
例如我希望接到一个 Webhook 请求后,只做“将请求内容打印出来”,那么代码非常简单:
public void handleWebhookEntries(List<SfWebhookEntry> entries) {
for (SfWebhookEntry entry : entries) {
System.out.println("触发的用户设备 ID: " + entry.getRequest().getUserProfile().getFirstId());
System.out.println("触发的用户登录 ID: " + entry.getRequest().getUserProfile().getSecondId());
Map<String, String> params = entry.getRequest().getParams();
System.out.println("用户的年龄:" + params.get("age"));
System.out.println("用户的等级:" + params.get("level"));
entry.getResponse().succeeded();
}
}
在这里可以结合业务实现更复杂的代码逻辑,如将“用户信息写入数据库”、“给用户发放代金券”、“给用户推送站内信”、“基于数据发起一个新的对其他系统的 API 请求”等。
启动服务
可以用我们封装的 Bootstrap 类启动一个接收和处理请求的服务,完整代码如下:
import com.sensorsdata.webhook.Bootstrap;
import com.sensorsdata.webhook.entry.SfWebhookEntry;
import com.sensorsdata.webhook.processor.SfWebhookProcessor;
import com.sensorsdata.webhook.server.EndpointServer;
import java.util.List;
import java.util.Map;
public class TestSfServer {
public static void main(String[] args) throws Exception {
EndpointServer endpointServer = Bootstrap.builder()
.localPort(12345)
.webhookProcessor(new SfWebhookProcessor() {
@Override
public void handleWebhookEntries(List<SfWebhookEntry> entries) {
for (SfWebhookEntry entry : entries) {
System.out.println("触发的用户设备 ID: " + entry.getRequest().getUserProfile().getFirstId());
System.out.println("触发的用户登录 ID: " + entry.getRequest().getUserProfile().getSecondId());
Map<String, String> params = entry.getRequest().getParams();
System.out.println("用户的年龄:" + params.get("age"));
System.out.println("用户的等级:" + params.get("level"));
entry.getResponse().succeeded();
}
}
}).build().startServer();
endpointServer.join();
}
}
其中 localPort 传的参数为在本地监听的端口,例子中是 12345。
至此您已经可以启动一个用于处理神策智能运营 Webhook 请求的服务。
更多关于工具类说明可以参考 Webhook Java 工具类 API 。
调试
可以通过 curl 或其他调试工具触发对服务的请求,一个样例请求如下:
curl -v http://127.0.0.1:12345 --data '[
{
"project_name":"test_project",
"sf_version":"0.3",
"user_profile":{
"user_id":-78979787987987789,
"first_id":"ABC",
"second_id":"123"
},
"receipt_properties":{
"sf_msg_id":"76463a60-2aab-47d4-8f40-0f5492d070d4",
"sf_plan_id":3,
"sf_plan_audience_id": 5,
"sf_plan_strategy_id": 4,
"sf_strategy_unit_id": null,
"sf_plan_type": "运营计划"
},
"plan_info":{
"cname": "会员发券",
"type": "SIMPLE",
“schedule_type”: "FIXED_TIME",
"finish_time": 1625037472000,
"component_cname": "是否购买",
}
"plan_info":{
"cname": "会员发券",
"type": "SIMPLE",
“schedule_type”: "FIXED_TIME",
"finish_time": 1625037472000,
"component_cname": "是否购买",
}
"params":{
"name":"张三",
"age":"20",
"level":"vip-1"
}
},
{
"project_name":"test_project",
"sf_version":"0.3",
"user_profile":{
"user_id":8789789848456687,
"first_id":"DEF",
"second_id":"456"
},
"receipt_properties":{
"sf_msg_id":"bd813f28-55d4-44d7-95be-8d2bf8d8bf9a",
"sf_plan_id":3,
"sf_plan_audience_id": 5,
"sf_plan_strategy_id": 4,
"sf_strategy_unit_id": null,
"sf_plan_type": "运营计划"
},
"params":{
"name":"李四",
"age":"26",
"level":"vip-2"
}
}
]'
可以观察到服务端控制台输出:
触发的用户设备 ID: ABC
触发的用户登录 ID: 123
用户的年龄:20
用户的等级:vip-1
触发的用户设备 ID: DEF
触发的用户登录 ID: 456
用户的年龄:26
用户的等级:vip-2