webhooks.md 3.9 KB

入站 Webhook(xlyInterface

xlyInterface 是三个 Spring Boot WAR 中最小的一个。它的职责是接收第三方系统推送进来的 HTTP 请求,例如微信、伙伴工厂、供应商门户,并把它们路由到 xly 处理器。入口类为 xlyInterface/src/main/java/com/xly/InterfaceApplicationBoot.java,context-path 为 /xlyInterface

这是三个服务里唯一内置 Swagger UI 的服务,因为面向伙伴的受众最适合使用可交互的试调文档。构建依赖 io.springfox:springfox-swagger-ui:2.9.2io.springfox:springfox-swagger2:2.9.2。服务运行后,UI 使用 SpringFox 默认地址:

http://<host>/xlyInterface/swagger-ui.html

等价的 JSON 描述位于 http://<host>/xlyInterface/v2/api-docs

注意: 项目拉取了 SpringFox jar,但没有注册 Docket bean(xly-src 中没有 @EnableSwagger2,也没有 @Bean Docket api())。swagger-ui.html shell 会从 jar 的静态资源中被服务出来,但 /v2/api-docs 返回的描述基本为空。这里的 UI 是“依赖自带页面”,不是“已填充的 try-it-out 控制台”。如果维护人员希望列出真实 API,需要补一个 Docket bean。

数据驱动接收器:/interfaceDefine/*

它和外部 API 的 /api/invoke 模式对应,但用于入站调用:

端点 方法 用途
/interfaceDefine/invoke/{interfaceInvoke} POST 将入站载荷分发给 {interfaceInvoke} 命名的处理器。
/interfaceDefine/callthirdparty/{interfaceInvoke} POST 转发到已配置的出站端点。同一个 URL 在 xlyApiInterfaceController 上也存在;这种重复是有意的,两个服务共享数据驱动分发器模式。

处理器:xlyInterface/src/main/java/com/xly/web/InterfaceController.java

{interfaceInvoke} 路径变量会查找一条元数据行,该行声明要运行的 SQL 或存储过程、参数映射和响应形状。它和 xly 其他部分一样遵循数据驱动思路:新增入站端点靠插入数据行,而不是写 Java。

硬编码的供应商接收器

少量接收器不会经过 /interfaceDefine,因为它们必须匹配合作方固定的 URL 规格。

端点 方法 用途
/Push POST 供应商(微信 / 类似系统)推送接收器。
/Pull POST 供应商拉取模式接收器。
/getKey/{key} GET 按伙伴命名的 key 获取公钥。
/getKeyTest GET /getKey 的测试模式变体。
/send/sendQw POST 企业微信出站消息。当前分支是空实现SendQwController 中方法体只是 return "ok";;已搭好 token 获取脚手架,但未完成。

处理器:xlyInterface/src/main/java/com/xly/web/WX_VendorWeb.javaxlyInterface/src/main/java/com/xly/wechat/test/SendQwController.java

认证

Webhook 认证方式按伙伴而异。这里没有统一的 token 签发端点(不同于 xlyApi)。每个处理器选择自己的方案:签名 header、查询参数 secret,或基于 sysapibrand 的预共享 key 校验。接入前需要阅读对应控制器。

元数据放在哪里

/interfaceDefine/* 分发器会查询命名入站处理器的元数据行。可检查 sysapi 表族(sysapisysapibrandsysapithirdparty)以及当前 schema 自动目录中的任何 interface* 表。账本信息和外部 API 有重叠:两个服务共享 API 定义数据,只是暴露在不同 URL 上。

这个服务不是什么

  • 不是用 xly 的 session cookie 认证。 第三方调用方没有用户 session。认证是每个处理器自己的事情,不是框架级统一机制。
  • 不是出站调用通道。 出站分发(xly 调用伙伴)走 xlyApi/interfaceDefine/callthirdparty/*/thirdparty/* 控制器。这里有重复是有意为之:入站和出站有完全不同的安全姿态。