# MJ 计费、重试与排障

<a id="mj-errors"></a>

<a id="计费-重试与排障"></a>

## 接口说明

每次生成或后续动作按对应动作价格收费。Imagine 四宫格按一次动作计费，放大、变体、Modal 等后续提交独立计费。任务提交时预扣积分，明确拒绝或终态 FAILURE / CANCEL 幂等退款；重复查询不重复扣费或退款。

state 只做业务关联，不能作为幂等键，也不能通过 state 查询任务。提交结果不明时保留金额和任务占用，等待核对，不自动退款或重发。保存错误响应头 `X-Midjourney-Task-Id`（若有）及原始错误；它是核对用标识，不证明任务已被接受。

参数校验错误使用以下原生形态；业务错误保留其明确原因。HTTP 状态与业务 code 都需要检查。

 **本站参数错误示例**  `HTTP 400`

```json
{
  "code": 4,
  "description": "请输入提示词后再生成。",
  "result": null,
  "properties": null
}
```

 现象 | 处理 |
| --- | --- |
 401 / 403 | 核对本站 Key、Bearer 格式、有效期与动作模型权限；父任务及子操作都须在当前 Key 的授权范围内。 |
 404 / 查不到任务 | 确认根地址不带 /v1，路径含 /mj，使用回执 result；必须与提交时使用同一 Key 和站点。不存在或属于其他 Key 的任务都会拒绝访问。 |
 400 / 参数被拒绝 | 检查 description、必填字段和 JSON 类型；特别注意 noStorage 是布尔值，Modal 蒙版是字符串，Edits 蒙版是数组。非空 notifyHook 当前不可用。 |
 无可用渠道 / 动作未定价 | 接口存在不等于动作已开通；确认模型目录、Key 分组及对应动作价格。不能通过添加 model 字段绕过。 |
 提交 HTTP 200，但没有成功 | 检查 JSON code 和 result。提交接受与任务生成成功是不同阶段；生成成功以任务 status: SUCCESS 为准。 |
 排队、持续 0% 或达到客户端等待期限 | 保存任务 ID，稍后继续查询；客户端超时不取消任务，不代表失败，也不自动退款。 |
 提交超时 / 5xx / 非 JSON / 断网 | 结果可能不明，禁止盲目重发 POST。保存 X-Midjourney-Task-Id（若返回）、state、时间和响应，交管理员核对；HTTP 响应都未收到时不要假设未受理。 |
 查询 429 / 5xx / 网络错误 | 仅对查询做有上限的指数退避；不要因此重新提交任务。401 / 403 等明确权限错误应先修复。 |
 MODAL 一直不结束 | 按所选按钮补充 prompt / maskBase64，调用 modal；仅轮询无法代替这一步。 |
 图片下载失败 | 签名过期可重新查询任务刷新链接；HTTP 410 或 imageUnavailable=true 表示图片已失效，工作台会移除对应创作，原计费记录保留。其他下载故障可稍后重试，不要重新提交生成。 |
