unis_crm/OMS退单回调接口调用失败排查与注意事项.md

100 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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://<host>:<port>/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` 仅用于日志对账,不参与业务判断,可选。