大哥讲完需求,我一个字都没记住

一次外部平台即时预约对接的完整复盘:从听完需求一头雾水,到靠 Agent 读懂代码、整理方案、排查联调、沉淀文档,中间踩了哪些坑,以及最后想明白的那件事。


大哥讲了大概二十分钟,讲完问我理解有没有 80%。

我说没有。

其实我当时完全是懵的。我刚接手这个项目,对内部代码不熟、对外部平台交易链路不熟、对订单模型不熟。我唯一记住的一句话是:要新增一个转接类,根据应用配置判断走哪个 service。

然后他就说 开始写吧 排期四天 还给你多排了。


先用 Agent 把项目读了一遍

靠人工翻代码太慢了。我开始用 Agent 读项目里和外部平台相关的代码。

我让它帮我找:外部平台回调进来的统一入口是哪里、我方主动调外部平台的入口是哪里、新老业务服务各自在哪被调用、三方关系怎么查怎么存、预下单/退款/接单/取消/核销分别落在哪些类里。

把这些入口都找出来之后,我才开始真正看懂需求。

然后我又做了一件事:把大哥口头讲的内容,跟代码结构放在一起,和 Agent 对话,反复梳理,最终整理出一份结构化改造方案——背景、新老模式差异、路由层设计、涉及的接口清单、VO 字段映射、改动文件列表。

这份方案写完,我才觉得自己真的理解了这次需求要做什么。


第一个坑:我以为"创建预约"是第三步

外部平台即时预约的新流程,和老流程有个关键区别:老流程是支付完了,我方再主动调外部平台创建预约;新流程不是这样的。

但代码里明明有一个创建预约接口,我一开始以为它是即时预约的第三步。

Agent 帮我把代码入口、外部平台文档和流程语义放在一起比对,才搞清楚:即时预约模式下,用户支付完成之后,是外部平台服务端自己创建订单和预约信息,不需要我方主动去创建。我方需要做的,是等平台把预约信息推过来,然后围绕预约/履约 ID 继续后续流转。

如果这个认知一开始就搞错,后续联调方向会跑偏。


第二个坑:预约 ID 取错了

这次需求里最关键的字段认知之一,是预约/履约 ID 的来源问题。

老流程里,主动调外部平台时传的 ID 来自旧三方关系里的履约字段。即时预约模式下,同样的接口,应该使用新增的即时预约履约字段。

两个字段,名字不一样,位置不一样,但如果没人告诉你,你很可能一直从旧地方取,然后外部平台那边返回"订单不存在"或者"预约 ID 不对"。

涉及这个改动的接口不少:预约结果通知、商家取消预约、用户取消预约、核销推送、服务状态推送——凡是预约/履约维度的主动调用,都要按模式选择来源。

很多接口报错,表面看是外部平台接口失败,本质上是字段取错了。


联调开始,文档开始打脸

代码改完,开始联调。第一件事就被签名拦住了。

回调验签里的公钥语义很容易混:我方主动调外部平台,用的是我方应用私钥签名,平台用我方应用公钥验;外部平台回调我方,是平台私钥签名,我方要用平台公钥验签。两个方向,密钥完全不同。

为了先跑通流程,我临时把验签注掉了——后来发现这不是好做法。更好的方式是做成配置开关:联调环境允许关闭,预发和线上强制开启,关闭时打 WARN 日志,同时把签名原文、公钥来源、timestamp、nonce 都打出来方便后续排查。

签名过了,下一个问题来了。

某个退款场景,平台返回参数错误。对着文档看了半天,那个字段明明写的是"非必传"。最后和外部平台 oncall 确认:即时预约模式下这个字段实际必传,文档没更新。

类似的情况还有几个:

  • 商家退款不触发退款回调——文档里没说,联调了才知道
  • 即时预约模式下没有预约取消回调——老流程有,新流程没有
  • 商家改了服务时间之后,平台侧无法同步修改,导致核销阶段报"核销时间早于服务时间"
  • 我方的错误码平台前端不一定展示得出来

这些都不是看代码能发现的,要靠日志、数据库、平台后台、curl replay 和外部 oncall 一起对。


退款那几天

从 git 提交记录看,6 月 30 日到 7 月 1 日,有好几次提交都在改退款发起和金额计算。

退款是这次联调里最复杂的部分。普通退款和取消预约在部分回调上是复用的。代码里有一个逻辑:退款金额为零时当成取消预约特殊分支处理。平台优惠还会影响退款金额的计算。商家发退款和用户发退款,回调行为也不完全一样。

每次以为改好了,又有新情况。

这类外部对接,不能只测正常下单链路。退款、取消、核销、超时、各种异常分支,少一个都是定时炸弹。


Agent 真正帮到我的地方

说"赋能"有点虚。让我说具体的,总共五件事。

一、帮我读懂陌生代码。

项目代码量不小,历史包袱重,靠人工翻太慢。我用 Agent 做的第一件事,是让它定位所有和外部平台相关的入口——回调进来走哪里,我方主调走哪里,新老服务各自在哪被调用,三方关系怎么查怎么存。

这些入口找出来,整个项目的骨架就清楚了。原本可能要花一两天的代码阅读,半天搞定。从"大概知道方向"到能独立梳理主链路,就这一步。

二、把口头需求变成结构化方案。

大哥讲需求的方式是口头说,说完就去开会了。我跟 Agent 反复对话,把这些零散信息一点点整理成结构化改造方案:背景、新老模式差异、路由层设计、接口清单、字段映射、改动文件列表。

这不是 Agent 帮我"写方案",是它帮我把自己的思路理清楚了。方案整理完,需求才算真正搞懂。

三、识别哪些代码不是主链路。

代码里有"创建预约"接口,我一开始以为它是即时预约的第三步。Agent 帮我把代码入口、外部平台文档和业务语义放在一起比对,才搞清楚:这个接口在新模式下根本不走,主流程是平台侧自己创建预约。

如果这个认知一开始搞错了,联调里会一直在错误方向上排查,每次报错都像是新题。

四、从日志生成 curl,支持本地 replay。

联调阶段最消耗时间的事,是每次排查都要等外部平台重新触发请求——一次等几分钟,等久了还不一定触发到你想测的那个场景。

我让 Agent 根据日志里的真实请求,生成对应的 curl 命令。从此可以拿真实样本本地 replay,改一个字段立刻验,签名失败/参数错误/状态问题一层层排查,不用等任何人。这些样本最后整理成了一个目录,留给下一个接手的人直接用。

五、把联调结论变成文档。

联调里很多关键结论不在任何官方文档里——商家退款不触发回调、即时预约没有预约取消回调、某字段实际必传……这些是在 oncall 回复里、在某次排查的聊天记录里拿到的。

Agent 帮我把这些口头确认的结论当场整理成文字。如果不当场整理,三天后自己都不记得了,更别说交接给别人。


这五件事,放在一张图里看更直观:

Agent 赋能开发全流程

红色是挑战,紫色是 Agent 介入点,绿色是产出。覆盖了从接手项目到交付的完整过程。


想清楚了一件事

做到后期我才真正想明白,这件事为什么比预期难。

问题不在接口本身,在于两套状态机没有对齐。

外部平台有自己的状态流:下单、支付、预约、取消、退款、核销、履约完成。我方内部有自己的状态流:商品单、服务单、支付单、退款单、三方关系、履约状态。对接的本质,是把每一步的触发方、字段、成功/失败后双方的状态变化,全部映射清楚。

开发前没想清楚这个,联调里每次报错就像在解一道新题,解完了下一个还是摸不清方向。

如果重来一次,我会在第一天先把三件事做出来:全链路时序图(谁调谁、何时调、哪步在哪侧发生)、接口矩阵(每个接口的方向/入口/关键字段/新老模式差异)、字段字典(各种订单号预约号退款号履约号的来源和关系)。这三件事比直接开始写代码重要。


最后说排期

这次排期给了 4 天开发,实际联调花了将近一周。

外部平台对接和内部需求不一样——真正不可控的从来不是写代码的时间,是文档对不上、oncall 等回复、多个系统状态要一起对齐。

下次排期我会单独把联调时间列出来,不往开发时间里藏,也不跟自己说"联调应该很快的"。

主链路开发完不等于需求收敛。 对外部平台对接来说,这句话是认真的。

评论