# OMS 退单回调接口 · 调用失败排查与注意事项 > 本文档说明 OMS 调用 `POST /api/oms/callback/order-return` 时**最常见的失败原因**,以及**配置/联调前必须注意的事项**。 ## 一、最常见的失败原因(必看) ### 1. 接口未加入登录认证白名单(本次已修复) 系统启用了安全过滤(`unisbase.security.enabled=true`),不在 `permit-all-urls` 白名单内的接口**必须先登录(携带 Bearer token)才能访问**。OMS 是系统级外呼,不携带用户登录态,因此会被安全过滤器拦截导致失败。 - 影响接口(本次修复前):`/api/oms/callback/order-return` - 修复位置(已在如下文件加入白名单): - `backend/src/main/resources/application.yml` - `backend/src/main/resources/application-prod.yml` - 新增项:`- /api/oms/callback/order-return` **注意:修改配置文件后必须重启后端服务才能生效。** ### 2. 鉴权头 `X-Internal-Secret` 不匹配 接口使用内部密钥校验(`unisbase.internal-auth`),请求头 `X-Internal-Secret` 必须与配置的 `secret` 一致,否则返回 401: - header 名称:`X-Internal-Secret`(可在 `unisbase.internal-auth.header-name` 覆盖) - secret 值:`unisbase.internal-auth.secret` - 触发条件:`unisbase.internal-auth.enabled=true` 时强制校验 - 常见错误:OMS 侧配置的 secret 与后端不一致、头名写错、大小写不一致。 ## 二、调用方(OMS)必须满足的调用要求 ### 1. 地址与路径 | 项 | 要求 | | --- | --- | | 方法 | `POST`(不是 GET/PUT) | | 完整路径 | `/api/oms/callback/order-return`(注意拼写与大小写) | | 网络 | OMS 与 CRM 需网络可达;若经网关/反向代理,请确认路径透传、末尾保持一致 | ### 2. 请求头 | Header | 是否必需 | 值 | | --- | --- | --- | | `Content-Type` | 是 | `application/json` | | `X-Internal-Secret` | 是 | 与后端 `unisbase.internal-auth.secret` 一致 | ### 3. 请求体 ```json { "opportunityCode": "OPP-20260916-001", "orderNo": "OMS-20260916-0001" } ``` - `opportunityCode`:**必填**,为空或空白会返回参数校验失败(400)。 - `orderNo`:可选,仅用于日志,不影响结果。 ## 三、常见失败场景与返回说明 | 失败场景 | 返回 | 原因/处理 | | --- | --- | --- | | 未放行白名单(未重启) | 需要登录 / 401 | 确认已加白名单并重启服务 | | `X-Internal-Secret` 缺失或不符 | 401 内部接口鉴权失败 | 核对 secret 与头名 | | `content-type` 非 json | 415 | 设置 `Content-Type: application/json` | | 请求方法不是 POST | 405 | 使用 POST | | `opportunityCode` 为空 | 400 | 补齐必填字段 | | 商机编号不存在 | 400 商机不存在 | 确认该编号在 CRM 中存在 | | 更新影响 0 行 | 400 商机更新失败 | 复核商机 id/DB 状态 | | 白名单已放行但头不符 | 401 | 见第一节·二 | ## 四、联调前检查清单 - [ ] 后端已重启,配置文件(开发/prod)均已加白名单 - [ ] OMS 侧 `X-Internal-Secret` 与后端 `secret` 完全一致 - [ ] 请求方法为 POST、`Content-Type: application/json` - [ ] 传入了真实的、CRM 中存在的 `opportunityCode` - [ ] 网络/网关可达,路径未被改写(注意带不带前缀 `/api`) - [ ] 用 `curl` 先在本地自测(见下) ## 五、本地自测命令(参考) ```bash curl -X POST "http://:/api/oms/callback/order-return" \ -H "Content-Type: application/json" \ -H "X-Internal-Secret: <配置的secret>" \ -d '{"opportunityCode":"OPP-20260916-001","orderNo":"OMS-0001"}' ``` 成功返回示例: ```json { "code": 0, "message": "success", "data": 123 } ``` ## 六、注意事项汇总 1. **白名单默认不含新接口**,新增 OMS 类外部接口后必须同步加入 `permit-all-urls`,否则调用方拿不到登录态必然失败——这是本次失败的最可能根因。 2. **配置修改需重启**。 3. **内部密钥不要使用默认值**,生产环境务必设置独立强随机的 `secret`,并同步给 OMS。 4. 接口是**可重试/幂等**的:重复调用只会把阶段保持为 S4、签约信息清空,不会产生副作用。 5. `orderNo` 仅用于日志对账,不参与业务判断,可选。