Python 适合快速验证,Java 适合把机器人做成长期运行的企业服务。本文不讲入门概念,直接按 Spring Boot 项目的标准分层,给出一套可落地的 WTAPI 工程化接入结构:配置收口、回调快响应、发送异步化、结果可判定。(接口路径与字段以官方文档 https://weiti.apifox.cn 为准)

一、项目分层结构

wxbot/
├── config/      WtapiProperties(凭证与地址统一配置)
├── controller/  WebhookController(承接平台回调)
├── service/     WtapiClient(HTTP 调用封装)、ReplyService(业务逻辑)
└── async/       回调事件的线程池异步处理

好处很直接:凭证不散落代码、业务与通道解耦、后续接 AI 或 CRM 只动 service 层。

二、配置收口:凭证放 yml,不硬编码

wtapi:
  base-url: https://wx.chuapi.com
  finder-token: 你的平台Token
  auth-token: 你的鉴权凭证
  app-id: 你的appId
  instance-id: 你的实例ID
@ConfigurationProperties(prefix = "wtapi")
@Component
@Data
public class WtapiProperties {
    private String baseUrl;
    private String finderToken;
    private String authToken;
    private String appId;
    private String instanceId;
}

三、HTTP 调用封装:统一请求头、必传参数、成功判定

@Service
public class WtapiClient {

    private final RestClient restClient;
    private final WtapiProperties props;

    public WtapiClient(WtapiProperties props) {
        this.props = props;
        this.restClient = RestClient.builder()
                .baseUrl(props.getBaseUrl())
                .defaultHeader("X-finder-TOKEN", props.getFinderToken())
                .defaultHeader("Authorization", "Bearer " + props.getAuthToken())
                .defaultContentType(MediaType.APPLICATION_JSON)
                .build();
    }

    /** body 只传业务参数,appId/instanceId 在此统一注入 */
    public boolean call(String path, Map<String, Object> body) {
        Map<String, Object> full = new HashMap<>(body);
        full.put("appId", props.getAppId());
        full.put("instanceId", props.getInstanceId());

        WtapiResponse resp = restClient.post()
                .uri(path)                       // 路径以官方文档为准
                .body(full)
                .retrieve()
                .body(WtapiResponse.class);
        return "1000".equals(resp.getCode());    // 全站统一成功约定
    }
}

四、Webhook 回调:先 ACK,业务异步处理

回调最怕"处理太慢导致超时"。标准做法是收到事件立刻提交线程池、马上返回:

@RestController
@RequestMapping("/webhook")
public class WebhookController {

    private final ThreadPoolExecutor pool = new ThreadPoolExecutor(
            4, 16, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2000),
            new ThreadPoolExecutor.CallerRunsPolicy());

    @PostMapping
    public Map<String, Object> receive(@RequestBody Map<String, Object> event) {
        pool.execute(() -> replyService.handle(event));  // 耗时业务异步化
        return Map.of("code", 1000);                      // 立即响应
    }
}

五、业务层:规则回复的标准写法

@Service
public class ReplyService {

    private final WtapiClient wtapi;

    public void handle(Map<String, Object> event) {
        String content = String.valueOf(event.getOrDefault("content", ""));
        // 群消息取 chatroomId,私聊取 fromWxId(字段名以文档为准)
        Object target = event.get("chatroomId") != null
                ? event.get("chatroomId") : event.get("fromWxId");

        if (content.contains("价格")) {
            wtapi.call("/finder/v2/api/发送文本路径以文档为准",
                    Map.of("to", target, "content", "价目表已发您,请查收"));
        } else if (content.contains("人工")) {
            // 通知你的客服坐席系统
        }
        // 接 AI(ChatGPT/文心一言/自研NLP)同样在这一层扩展
    }
}

六、上线前工程化检查清单

  • 凭证全部走配置,不同环境(SaaS / 私有化地址)用 profile 切换
  • 回调接口只做"接收+投递",AI、数据库等耗时操作全部异步
  • 线程池设置有界队列与拒绝策略,防止流量高峰把服务压垮
  • 调用结果按 code:"1000" 判定,失败记日志并按业务策略重试
  • 私有化部署时只改 base-url,业务代码不动
  • 回调地址公网可达,建议加访问日志留存所有推送事件

为什么 Java 团队适合长期方案

WTAPI 全部接口为标准化 RESTful 设计,Java 用最熟悉的 HTTP 客户端即可直连,无特殊依赖;官方支持 Java / Python / C++ / Go / PHP,多语言团队并存时接口约定完全一致。平台 10w+ 日均调用、99.9% 可用性、24H 稳定运行,与 Java 服务的稳定性诉求正好匹配。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐