抽象类适合封装异步通知回调中重复流程:验签、解密、参数校验、幂等处理、应答构造;核心是分离变与不变——固定流程由抽象类实现,业务差异点(如字段解析、领域逻辑)交由子类实现。

抽象类适合封装异步通知回调中重复出现的流程:验签、解密、参数校验、幂等处理、应答构造。核心是把变与不变分离——固定流程由抽象类实现,业务差异点(如业务字段解析、领域逻辑)留给子类实现。
定义抽象回调处理器基类
声明一个 abstract class,包含模板方法 handleCallback(),按标准顺序编排通用步骤:
- 接收原始请求(如 HttpServletRequest 或 byte[])
- 统一验签(调用
verifySignature()抽象方法,由子类提供签名算法和密钥) - 可选解密(若协议要求,解密后转为标准 Map 或 DTO)
- 基础参数校验(时间戳、必填字段、格式)
- 幂等控制(基于业务唯一 ID 查询 DB 或缓存,已处理则直接返回成功应答)
- 委托给子类执行业务逻辑
doBusinessLogic() - 统一构造并返回标准应答报文(含状态码、消息、时间戳、签名)
规范核心应答报文结构
所有子类必须返回同一格式的响应体,建议使用不可变 DTO 封装:
- code:整型业务码(如 200 成功,400 参数错,500 系统异常)
- message:简明提示语(不暴露敏感信息,面向调用方)
- timestamp:当前毫秒时间戳(用于防重放)
- sign:对 code + message + timestamp 拼接后签名(确保响应完整性)
- 可选 data:泛型字段,子类按需填充业务返回数据
抽象基类提供 buildSuccessResponse() 和 buildErrorResponse() 工厂方法,避免子类手动拼接。
子类只需关注业务差异点
继承抽象类后,子类只实现三个关键抽象方法:
-
getSignKey():返回本次回调对应的验签密钥(可从配置中心或数据库加载) -
parseRequest(原始输入):将原始请求解析为统一 RequestDTO(如订单号、金额、状态) -
doBusinessLogic(RequestDTO):执行真实业务(更新订单、发消息、扣库存),抛出明确业务异常
所有异常统一由基类捕获,转换为标准错误应答,不暴露堆栈。
配合 Spring Web 使用示例
在 Controller 中注入具体子类实例,用 @PostMapping 接收回调:
- 避免在 Controller 层做任何逻辑,只负责转发:
return callbackHandler.handleCallback(request); - 基类内部自动适配不同协议(HTTP body、form、query),子类决定如何解析
- 日志统一打点(入参摘要、耗时、结果 code),便于监控和问题定位
这样既保证了各渠道回调(支付、物流、认证)行为一致,又让新增渠道只需写一个轻量子类,不重复造轮子。

















