# 退款并取消付款

了解如何取消付款或退款

您可以在支付完成前[取消支付](https://docs.stripe.com/refunds.md#cancel-payment)，此操作不产生任何费用。您也可以在支付成功后对全部或部分金额进行退款，但退款可能会产生一定费用。原交易的 Stripe 处理费不予退还。如需了解更多信息，请访问我们的[定价页面](https://stripe.com/pricing/local-payment-methods)。

退款时会使用您可用的 Stripe 账户余额（不包括待处理金额）。如果您的可用余额不足以支付退款金额，对于银行卡交易，Stripe 会将退款标记为待处理状态（其他支付方式类型的退款将失败），直到您的 Stripe 账户余额充足为止。您可以通过收款或向账户余额*充值* (The act of adding funds to a Stripe account, typically through a transfer from a bank external to Stripe)来解决 Stripe 账户余额为负的问题。在适用地区，Stripe 可能会自动从您的银行账户扣款，以弥补 Stripe 账户的负余额。

## 退款申请

我们会向您客户的银行或*发卡行* (The entity that issued a payment card to a cardholder. This could be a bank, such as with the Visa or Mastercard network, or it could be the card network itself, such as with American Express)提交退款请求。成功的退款会实时显示在您客户的银行对账单上，具体显示时间取决于卡组织和发卡行。

若满足以下所有条件，则我们将向您的客户发送电子邮件，通知他们退款事宜：

- 已经在您的 Stripe 账户的客户上创建了原始收款。
- 客户对象中存储了一个邮件地址。
- 您在[管理平台](https://dashboard.stripe.com/account/emails)中嵌入了**给客户发送退款邮件**。

您可以[在管理平台查看被退款的付款](https://dashboard.stripe.com/test/payments?status%5B0%5D=refunded&status%5B1%5D=refund_pending&status%5B2%5D=partially_refunded)。

## 发放退款

您可以用[退款 API](https://docs.stripe.com/api/refunds.md) 或通过[管理平台](https://dashboard.stripe.com/test/payments)发放退款。您可以对一笔收款发放多笔退款，但退款总额不得超出原始收款金额。

#### 管理平台

用管理平台退款：

1. 在[付款](https://dashboard.stripe.com/payments)页面找出想要退款的付款。
2. 点击付款右侧的溢出菜单(⋯)，然后选择**退款**。
3. 默认情况下，您发放的是全额退款。对于部分退款，输入一个不同的退款金额。
4. 选择一个退款原因。如果选择**其他**，则必须添加一个说明，解释退款的原因。点击**退款**。

> #### 批量退款
> 
> 管理平台支持批量处理全额退款。通过选择每笔付款左侧的选框，选定要退款的付款即可——多页面结果也可同时选定。然后，点击**退款**，并选择一个原因。只能以这种方式发放全额退款；部分退款必须单独发放。

#### API

用 API 发放退款时，请[创建一笔退款](https://docs.stripe.com/api.md#create_refund)，并提供要退还的收款的 ID 或 [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)。

当您使用 PaymentIntent 来收款时，Stripe 会创建一个[扣款](https://docs.stripe.com/api/charges/object.md)对象。要在 PaymentIntent 成功后退款，请使用 PaymentIntent 创建退款，这与退还基础扣款相同。如果您使用 Stripe Tax API 来记录销售情况，则必须[记录退款](https://docs.stripe.com/tax/payment-intent/custom.md#reversals)。

```curl
curl https://api.stripe.com/v1/refunds \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d payment_intent=pi_Aabcxyz01aDfoo
```

您也可以只通过指定金额来退还部分 PaymentIntent。操作时，需以整数形式提供 `amount` 参数，单位为分（或该支付货币的最小货币单位）。

```curl
curl https://api.stripe.com/v1/refunds \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d payment_intent=pi_Aabcxyz01aDfoo \
  -d amount=1000
```

如果您需要对支付款项分开[授权与捕获](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md)，且要对状态为 `requires_capture` 的 PaymentIntent 进行退款，流程会有所不同。此时，与该 PaymentIntent 关联的支付仍处于未捕获状态，无法直接退款，您必须[取消该 PaymentIntent](https://docs.stripe.com/api/payment_intents/cancel.md)。

### 通过 Connect 平台退款

退款行为取决于您的集成中使用的 [Connect 收款类型](https://docs.stripe.com/connect/charges.md#refund-creation)。

- Stripe 直接从 Connect 子账户扣款以用于[直接收款](https://docs.stripe.com/connect/direct-charges.md#issue-refunds)支付的退款。
- Stripe 会向您的平台收取针对[定向收款](https://docs.stripe.com/connect/destination-charges.md#issue-refunds)或[分离收费与转账](https://docs.stripe.com/connect/separate-charges-and-transfers.md#issue-refunds)（无论是否使用`on_behalf_of`）付款的退款费用。要从您的 Connect 子账户中收回退款金额，需要撤销与这些收费类型相关的转账。

Connect 平台可通过使用[支付](https://docs.stripe.com/connect/supported-embedded-components/payments.md) 或[支付详情](https://docs.stripe.com/connect/supported-embedded-components/payment-details.md) 等 Connect 嵌入式组件，使其关联账户能够从其网站向客户提供退款服务。

## 退款目标账户

只能按照原始收款方式原路退款。您不能向其他地方发放退款，例如，另一张卡或银行账户。

已过期的卡或已取消的卡的退款由客户的发卡行处理，并且大多数情况下，退款将转入客户更换的卡中。如果客户没有新卡，则发卡行通常会通过其他方式（例如，支票或银行帐户存款）给客户发放退款。只有极少情况下，向银行卡的退款可能会[失败](https://docs.stripe.com/refunds.md#failed-refunds)。

对于其他支付方式，例如 [ACH](https://docs.stripe.com/payments/ach-direct-debit.md) 和 [iDEAL](https://docs.stripe.com/payments/ideal.md)，退款处理因银行而异。如果客户关闭了他们的支付方式，银行可能会将退款退回给我们——这时它会被标记为[退款失败](https://docs.stripe.com/refunds.md#failed-refunds)。

> #### 银行借记支付方式
> 
> 银行借记支付方式（例如 [SEPA 直接借记](https://docs.stripe.com/payments/sepa-debit.md#refunds)、[Bacs 直接借记](https://docs.stripe.com/payments/payment-methods/bacs-debit.md#refunds)、[ACH 直接借记](https://docs.stripe.com/payments/ach-direct-debit.md#refunds)、[ACSS（加拿大 PAD）](https://docs.stripe.com/payments/acss-debit.md#refunds)、[AU BECS 直接借记](https://docs.stripe.com/payments/au-becs-debit.md#refunds)和 [NZ 银行账户借记](https://docs.stripe.com/payments/nz-bank-account.md#refunds)）存在双重退款风险。如果您在客户银行也发起争议的同时主动发放退款，客户可能就同一笔交易收到两笔退款。建议您参阅各类支付方式的退款指南，以避免此情况发生。

## 处理失败的退款

如果客户的银行或发卡行无法处理，则退款可能会失败。例如，银行账户关闭或银行卡有问题可能导致退款失败。如果发生这种情况，银行会将退款金额退还给我们，然后我们再将这笔钱重新转入您的 Stripe 账户余额。从发放之日起，整个过程最长需要 30 天。

使用 API 时，[退款](https://docs.stripe.com/api.md#refund_object)对象的状态会变为 `failed`，并包含以下属性：

- `failure_balance_transaction`: [余额交易](https://docs.stripe.com/api.md#balance_transaction_object)的 ID，表示退还到您的 Stripe 余额的金额。
- `failure_reason`: 退款失败的原因。这些原因包括：
| 失败原因                                 | 描述                                                                                                                |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| `charge_for_pending_refund_disputed` | 客户在处理退款的过程中对扣款发起了争议。在这种情况下，我们建议[接受或质疑](https://docs.stripe.com/disputes/responding.md#decide)争议，而不要退款，以避免向客户重复退款。 |
| `declined`                           | 退款被我们的金融合作伙伴拒绝了。                                                                                                  |
| `expired_or_canceled_card`           | 支付方式被客户取消，或被合作伙伴作了过期处理。                                                                                           |
| `insufficient_funds`                 | 退款因资金不足且超过待处理退款到期窗口而处理待处理状态。                                                                                      |
| `lost_or_stolen_card`                | 退款因原始卡丢失或被盗而失败。                                                                                                   |
| `merchant_request`                   | 退款在商家请求时失败。                                                                                                       |
| `unknown`                            | 退款因未知原因而失败。                                                                                                       |

对于某些支付方式，拒付代码由我们的金融合作伙伴提供，说明了退款失败的原因，这些代码可以在 `destination_details` 散列的 `network_decline_code` 字段中获取：

```
{
  id: "pyr_1234",
  destination_details: {
    blik: {
      network_decline_code: "decline_code"
    },
    type: 'blik',
  }
}
```

退款极少会失败，但如果失败，我们会用 `refund.failed` *事件* (A tool to send events to your application via webhook or directly to your cloud infrastructure)来通知您（参见[所有退款](https://docs.stripe.com/refunds.md#refund-events)）。如果发生这种情况，您需要安排另一种方式，为客户提供退款。

如果您的平台使用 [Connect 与定向收款](https://docs.stripe.com/connect/destination-charges.md#issue-refunds)，则退款失败的资金会存入您平台账户的 Stripe 余额。

## 取消退款

根据退款的类型，您可以在退款到达客户之前取消退款。有些银行卡退款支持短时取消。退款不得作为收款冲正处理。银行卡退款目前仅可通过管理平台取消。

对于部分[支付方式](https://docs.stripe.com/payments/bank-transfers.md#refunds)，Stripe 会在[处理退款之前](https://docs.stripe.com/refunds.md#requires-action)先联系客户收集银行信息。在尚未收集到银行信息的情况下，您可以取消这些退款。此类退款支持通过 API 和管理平台取消。

已取消的退款将转入 `canceled` 状态。由于取消是退款失败的一种类型，因此 [Refund](https://docs.stripe.com/api.md#refund_object) 对象中会包含 `failure_reason` 和 `failure_balance_transaction` 这两个属性。

如果您的平台使用[定向收款的 Connect ](https://docs.stripe.com/connect/destination-charges.md#issue-refunds)，已取消退款的资金将存入您平台账户的 Stripe 余额中。

To cancel a refund using the Dashboard:

1. Find the payment associated with the refund in the [Payments](https://dashboard.stripe.com/payments) page.
2. Click the overflow menu (⋯) to the right of the payment, then select **Cancel refund**.
3. If there are multiple partial refunds, select the correct refund in the dropdown.
4. Confirm the refund cancellation by selecting **Yes, cancel refund**.

Alternatively, you can click a specific payment and cancel the refund from its details page.

## 需要采取行动的退款

对于部分没有原生退款支持的支付方式（例如，Konbini、PromptPay、Boleto 和银行转账），Stripe 需要在处理退款之前先从您的客户那里收集银行账户详情。在这些情况下，退款将进入 `requires_action` 状态，Stripe 会向您的客户发送电子邮件，要求其提供银行信息。

当退款状态为 `requires_action` 时，[Refund](https://docs.stripe.com/api/refunds/object.md) 对象的 `next_action` 属性会描述退款继续处理所需的操作。`next_action` 对象包含以下字段：

- `next_action.type`：后续操作的类型（例如 `display_details`）。
- `next_action.display_details.email_sent`：有关向客户发送的电子邮件的信息，其中包括：
  - `email_sent_at`：发送电子邮件的时间戳。
  - `email_sent_to`：收件人的电子邮件地址。
- `next_action.display_details.expires_at`：如果客户未回复，退款请求过期的时间戳。

退款状态转换如下：

| 活动 | 退款状态 |
| --- | --- |
| 退款已创建，并已向客户发送电子邮件 | `requires_action` |
| 客户提交银行账户详情，Stripe 开始处理退款 | `待处理` |
| 退款预计会到达客户的银行 | `已成功` |
| 客户的银行将资金退回到 Stripe | `requires_action` |
| 客户未在过期阈值前回复 | `已失败` |
| 退款在 `requires_action` 状态下被取消 | `已取消` |

如果客户的银行无法成功完成转账（例如，账户持有人姓名不匹配或银行账号有误），资金将退回 Stripe，退款状态将转回 `requires_action`。在此情况下，Stripe 会再次向客户发送电子邮件，要求提供更正后的银行账户详情。

在退款处于 `requires_action` 状态时，您可以[取消退款](https://docs.stripe.com/refunds.md#cancel-refund)。例如，当您想通过其他方式将资金退还给客户时。

## 退款和冲正

某些退款（原始收款之后很快发放的）会以*撤销* (A reversal is the cancellation of a transaction. Stripe doesn't withhold any fees for payment reversals)形式显示，而非“退款”。在撤销的情况下，原始收款不会出现在客户的对账单中，且不会单独入账。

*IC+* (A pricing plan where businesses pay the variable network cost for each transaction plus the Stripe fee rather than a flat rate for all transactions. This pricing model provides more visibility into payments costs) 用户可能会发现撤销和退款之间的费用存在差异，因为撤销产生的卡组织费用通常会比较低。

#### 管理平台

要在管理平台上验证退款是否以冲正方式进行，请执行以下操作：

1. 打开与退款相关的付款的付款详情页面。
2. 在时间线中，点击退款条目上的**查看详情**。
3. 如果是冲正，则会显示相应的消息。

#### API

要使用 API 验证退款是否以冲正方式进行，请执行以下操作：

1. 用 API 提取 `refund.updated` [事件](https://docs.stripe.com/refunds.md#refund-events)或[检索退款](https://docs.stripe.com/api/refunds/retrieve.md)。
2. 如果是冲正交易，则会返回 `destination_details[card][type] = 'reversal'`。

## 跟踪退款

在您发起退款后，Stripe 会向您客户的银行或发卡行提交退款请求。客户会在大约 5-10 个工作日（具体取决于银行）后发现退款入账。客户见不到退款时可能会与您联系。有几个原因可能会导致客户看不到退款。

- 原始收款之后很快发放的退款会以“撤销”形式显示，而非“退款”。在撤销的情况下，原始收款不会出现在客户的对帐单中，且不会单独入账。
- 如果客户的银行或发卡行无法正确处理退款，则退款可能会失败。银行会将退款金额退还给我们，然后我们再将这笔钱重新转入您的 Stripe 账户余额。从提出退款请求起，整个过程最长需要 30 天。

如果客户询问有关退款的情况，给他们提供退款对应的主要参考编号可能会有所帮助。对于银行卡退款，它可以是**收单行参考号码 (ARN)**、**系统跟踪审计号 (STAN)**或**检索参考号 (RRN)**。ARN、STAN 或 RRN 是为支付流程中的银行卡交易分配的参考号码。对于本地支付方式的退款，它可以是由 Stripe 或我们的金融合作伙伴生成的参考号码，该参考号码将传播给收款行或机构。然后，您的客户可以向银行出示此参考号码，进而便可告知关于何时可以退款的更多信息。有了参考号码，客户便可对已经发起的退款更有信心。

以下情况下会用到退款参考号码：

- 多数金融合作伙伴都支持，否则会标记为不可用。
- 发起退款后，最长需要 7 个工作日才能收到下游银行合作伙伴提供的 ARN。
- 撤销退款的情况下不会提供 ARN，因为未处理原始收款。对于不支持 ARN 的卡组织，我们会尝试提供其他参考信息，如系统跟踪审计号 (STAN) 或检索参考号 (RRN)。

#### 管理平台

要使用管理平台查找退款参考号码，请执行以下操作：

1. 打开与退款相关的付款的付款详情页面。
2. 在时间线中，点击退款条目上的**查看详情**。
3. 如果可用，Stripe 会在剪贴板上显示 ARN 或 STAN。

#### API

要使用 API 查找退款参考号码，请执行以下操作：

1. 用 API 提取 `refund.updated` [事件](https://docs.stripe.com/refunds.md#refund-events)或[检索退款](https://docs.stripe.com/api/refunds/retrieve.md)。
2. 如可用，Stripe 会在以下 API 响应格式中显示银行卡退款参考编号：

```
{
  id: "re_1234",
  destination_details: {
    card: {
      reference: "123456",
      reference_status: "available",
      reference_type: "acquirer_reference_number",
      type: "refund"
    },
    type: "card",
  }
}
```

或在以下 API 响应格式中显示所选本地支付方式的参考编号：

```
{
  id: "pyr_1234",
  destination_details: {
    eu_bank_transfer: {
      reference: "123456",
      reference_status: "available"
    },
    type: "eu_bank_transfer",
  }
}
```

## 取消付款

当付款状态为 `uncaptured`，或者付款是尚未入账银行的借记付款时，您可以通过管理平台取消付款。要取消具有其他状态的付款，则必须使用 API。

#### 管理平台

通过管理平台取消付款：

1. 在[付款](https://dashboard.stripe.com/payments)页面找出想要取消的付款。
2. 点击该笔支付，然后选择**取消**。
3. 选择取消原因，然后点击**是**。如果选择**其他**，您必须添加注释，说明取消支付的原因。

您可以在以下两种情况下通过管理平台取消付款：

- 付款状态为 `uncaptured`。
- 这笔付款是尚未入账银行的借记付款。

#### API

如果您不打算再收款，则可以[取消 PaymentIntent](https://docs.stripe.com/api/payment_intents/cancel.md)。您可以将某个 PaymentIntent 保持在未完成状态，如 `requires_confirmation` 或 `requires_payment_method`，因为未完成的 PaymentIntents 有助于了解结账过程中的转化率。以下代码示例显示一个取消 PaymentIntent 的请求：

```curl
curl -X POST https://api.stripe.com/v1/payment_intents/{{PAYMENTINTENT_ID}}/cancel \
  -u "<<YOUR_SECRET_KEY>>:"
```

只有在出现以下某个状态时才能取消 PaymentIntent：

- `requires_payment_method`
- `requires_capture`
- `requires_confirmation`
- `requires_action`
- `processing`（仅当相关支付方式为美国银行账户时）

PaymentIntent 成功后不能取消。取消 PaymentIntent 后，不能再通过它进行其他收款。您的应用程序尝试在已取消的 PaymentIntent 上执行的任何操作都会失败，并显示一个错误消息。

## 退款事件

每次创建或更改退款时，Stripe 都会触发[事件](https://docs.stripe.com/api/events.md#events)。其他一些动作，比如关闭审核，也会触发与退款相关的事件。

确保您的集成已设置为能够[处理事件](https://docs.stripe.com/webhooks/handling-payment-events.md)，并且您已[验证 Webhook 签名](https://docs.stripe.com/webhooks.md#verify-events)，以确认传入的事件来自 Stripe。此外，您还必须构建内部逻辑，以便在退款流程状态发生变化时，通知客户或您的团队。至少，Stripe 建议您监听 `refund.created` 事件。

下表描述了与退款相关的最常见事件。

| 活动 | 描述 |
| --- | --- |
| `refund.created` | 创建退款时发送。 |
| `refund.updated` | 更新退款时发送。更新包括添加元数据和提供详细信息，如 [用于跟踪退款的 ARN 参考编号](https://docs.stripe.com/refunds.md#tracing-refunds)。 |
| `refund.failed` | [退款失败](https://docs.stripe.com/refunds.md#failed-refunds)时发送。 |
| `charge.dispute.funds_reinstated` | 当争议关闭并且资金恢复到您的账户时发送，包括[部分退款](https://docs.stripe.com/disputes/best-practices.md#partial-refund-bp)。 |
| `charge.refunded` | 退款时发送，包括部分退款。有关退款的信息，请侦听 `refund.created`。 |
| `review.closed` | [审核](https://docs.stripe.com/api/events/types.md#review_object) 关闭时发送。请查看 `reason` 字段了解关闭原因，具体原因包括：`approved`、`disputed`、`canceled`、`refunded`、`refunded_as_fraud`。 |
| `source.refund_attributes_required` (已废弃) | 当接收方来源需要退款属性来处理退款或不当付款时发送。 |
| `charge.refund.updated` (已废弃) | 只有在退款更新且有相应的收款时才发送。建议侦听 `refund.updated` 来获取所有退款的最新动态。 |

## 成本优化

如果您的企业在临近交易时处理了大量退款，那么我们建议您使用[手动授权和捕获](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md)功能来降低退款成本。通过手动授权和捕获，您可以在捕获付款之前取消付款，或者减少捕获的金额而非处理退款，从而更好地控制成本。

## See also

- [向 Stripe 余额充值](https://docs.stripe.com/get-started/account/add-funds.md)
- [向平台余额充值](https://docs.stripe.com/connect/top-ups.md)
- [本地化价格](https://docs.stripe.com/payments/currencies/localize-prices.md)
