---
title: 退款
description: 通过 Coinetic 加密支付网关向顾客退款：使用 API 提交 POST /v1/refunds 退款申请，金额与地址规则，从您自己的钱包执行退款，退款状态及 refund.sent Webhook。
url: https://coinetic.money/zh/docs/refunds/
lang: zh-Hans
---

# 退款

退款即把款项转回给顾客：适用于订单取消、多付，或过期后的少付。可通过 API 或在后台提交退款申请。

## 由谁转出款项

取决于申请中的 `executor` 字段：

- **`merchant`：付款进入了您的钱包**（常见情况）。Coinetic 不托管您的资金：由您自己向顾客转账，并登记交易哈希。
- **`platform`：付款进入了平台钱包。**您只需发起退款申请；由 Coinetic 运营人员核验地址、审批并转出。

## 规则

- **只能以原支付资产退款。**顾客用 TRON 上的 USDT 付款，就会收到 TRON 上的 USDT。不做兑换。
- **不超过已付金额**，请查看账单的 `refundable_amount`。支持分次退款，每张账单最多 20 个未完成的申请。
- **地址必须属于原支付网络。**按该网络的地址格式校验（EVM 使用 EIP-55 校验和）。不接受 Coinetic 自己的地址。
- **已支付的账单仍保持已支付状态。**已退金额见 `refunded_amount`。
- **对未付清的账单执行退款，会永久关闭该账单**，即使只是部分退款：账单变为 `cancelled`，之后的补付不再计入订单。提交申请前请先确认账单状态。

## 提交申请

`POST /v1/refunds`

```http
POST /v1/refunds
Idempotency-Key: refund-ORDER-1001-1
Content-Type: application/json

{"invoice_id":"inv_x7k2…","amount_minor":"10500000","address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE","reason":"取消订单 ORDER-1001"}
```

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `invoice_id` | 是 | 您商店的账单 |
| `amount_minor` | 是 | 以字符串表示的**最小单位**金额（6 位小数时 `"10500000"` = 10.5 USDT），或 `"full"`，表示全部可退金额 |
| `address` | 是 | 顾客在原支付网络上的地址 |
| `reason` | 否 | 退款原因，最多 500 个字符 |

## 从您的钱包退款

- 从您自己的钱包，以原支付资产和网络向顾客转出申请中的 `amount`（网络手续费由您承担）。
- 登记交易哈希：

```http
POST /v1/refunds/{id}/executed
Idempotency-Key: refund-exec-ORDER-1001-1
Content-Type: application/json

{"tx_hash":"0x5c50…","ack_status_change":false}
```

申请将进入 `reported` 状态。在 EVM 网络（Ethereum、BSC、Polygon、Base、Arbitrum）上，Coinetic 会自动在链上找到已确认的交易，将申请转为 `sent`，并发送 `refund.sent` Webhook。Bitcoin、Litecoin、TRON 和 Solana 暂不支持自动核验，申请会保持 `reported` 状态。

如需撤销，请调用 `POST /v1/refunds/{id}/cancel` 并注明原因：该金额将重新变为可退。

## 状态

| 状态 | 含义 |
| --- | --- |
| `requested` | 申请已受理 |
| `approved` | 已由运营人员批准（仅限 `executor: platform`） |
| `reported` | 您已提交交易哈希，等待链上确认 |
| `sent` | 款项已转出，`tx_hash` 为链上交易 |
| `rejected` | 已拒绝或已撤销，原因见 `reject_reason` |

拒绝不会通过 Webhook 通知，请定时检查未完成的申请：`GET /v1/refunds?status=requested`。

## 在沙盒中

`POST /v1/refunds/{id}/simulate` 会一次性走完整个流程：申请变为 `sent` 并带有测试用 `tx_hash`，同时发送 `refund.sent`。生产环境中没有此接口。
