---
title: 执行结果回调
description: PAC 把客服召回执行结果实时回调给宿主的出站 webhook。
icon: BellRing
---

> **状态:规划中(v2 实时回执),接口待实现。** 字段以最终 OpenAPI 定义为准。
> 客服在 PAC 工作台填写召回执行结果(是否打通、结论、备注等)后,PAC 主动**回执**给宿主,用于同步宿主侧 CRM / 工单。需要此能力的宿主在接入时注册回执地址即可,不需要的可不注册。

---

## 方向与流程

```
客服在 PAC 提交执行结果
  → PAC 状态机更新
    → PAC 主动 POST 宿主回执地址(HMAC 签名)
      → 宿主返回 2xx 确认;非 2xx / 超时 → PAC 退避重试
```

回执方向与登录换票相反:登录是宿主调 PAC,回执是 **PAC 调宿主**。

## 接入前提

接入时向 PAC 提供:
- **回执地址**(`callbackUrl`):宿主侧接收 POST 的 URL;
- **验签密钥**:PAC 用它对请求体签名,宿主据此验签(密钥仅双方持有)。

## 请求:`POST {callbackUrl}`

请求头:

| 头 | 说明 |
|---|---|
| `X-PAC-Event-Id` | 事件唯一 id(= 请求体 `eventId`),**幂等键** |
| `X-PAC-Signature` | `HMAC-SHA256(rawBody, 验签密钥)` 的十六进制;宿主用同密钥重算比对 |

请求体:

```jsonc
{
  "eventId":           "...",        // 幂等键,宿主据此去重
  "patientExternalId": "...",        // 宿主侧患者 id(关联用)
  "operatorUserId":    "...",        // 宿主侧客服 id
  "channel":           "phone",      // phone | wecom | sms | other
  "outcome":           "refused",    // 执行结论,见下
  "notes":             "...",        // 通话纪要(可选)
  "scheduledNextAt":   "2026-07-01T02:00:00Z",  // 约定下次回访时间(可选)
  "planStatus":        "abandoned",  // 回执时该召回工单的状态
  "occurredAt":        "2026-06-30T08:12:00Z"   // 提交时间(ISO 8601)
}
```

**`outcome`** — 客服选择的执行结论(常见值):

| 值 | 含义 | 对 `planStatus` 的影响 |
|---|---|---|
| `success_appointed` | 成功转化为新预约 | `completed` |
| `refused` | 明确拒绝 | `abandoned` |
| `external_treatment` | 已在外院治疗 | `abandoned` |
| `declined_recent` | 近期不考虑 | 维持(冷静期后再召) |
| `scheduled_next` | 约定下次回访 | 维持 |
| `no_answer` / `quick_hangup` | 未接通 / 接通即挂 | 维持 |

> 完整取值以 OpenAPI / `ExecutionOutcome` 枚举为准。

**`planStatus`** — `active`(在召回池)/ `assigned`(已分配)/ `completed`(结案)/ `abandoned`(关闭)。

## 宿主响应与重试

- 宿主收到后**尽快返回 2xx**(建议先落库再异步处理),即视为投递成功。
- 非 2xx 或超时 → PAC 按退避策略重试;多次失败入死信并告警。
- 投递语义为 **at-least-once**:宿主**必须按 `eventId` 去重**(同一 `eventId` 可能到达多次)。
- 验签失败的请求应拒绝(返回 4xx)。
