菜单

Webhook Java 快速入门

概述

神策智能运营可以根据一定规则实时或批量生成对用户的触达行为,这些行为包括发送短信、App 推送和 Webhook,前两者是由神策智能运营调用第三方平台(如极光、个推)API,而 Webhook 则是将消息封装成 JSON 通过 HTTP 请求发送到您提供的服务接口。

本文将结合我们提供的工具类演示如何快速启动一个接收 Webhook 请求的 Server,若希望了解更多关于神策智能运营 Webhook 协议的细节,可以点击 参考文档 。

引入工具类

对于 Java 开发者,我们提供了对 Webhook 协议的简单封装,让您可以更关心如何处理 Webhook 的业务逻辑。引入工具类可以通过以下两种方式:

  1. 通过 Maven 添加 dependency:

    dependency

    <dependency>
        <groupId>com.sensorsdata.focus</groupId>
        <artifactId>webhook-helper</artifactId>
        <version>0.2.8</version>
    </dependency>
    XML
  2. 通过代码引入。该工具相关代码开源在 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
上一个
Webhook 通道接入
下一个
Webhook Java 工具类 API
最近修改: 2024-12-27