Chapter 17

Separate Charges and Transfers - Refunds

Toru Furukawa
Toru Furukawa
2021.12.17に更新

Separate Charges and Transfer アプローチで支払いを処理したときの、返金処理を見ていく。

Transfer よりも前に Refund

Charge したした後、Transfer する前に返金する場合は、次のシーケンスで呼び出す。

request
curl https://api.stripe.com/v1/payment_intents \
  -d amount=1000 \
  ...

curl https://api.stripe.com/v1/refunds \
  -d payment_intent=pi_xxxx \
  -d "expand[]"=balance_transaction \
  ...
response
{
  "id": "re_xxxx",
  "amount": 1000,
  "balance_transaction": {
    "id": "txn_xxxx",
    "amount": -1000,
    "fee": 0,
    "net": -1000,
    ...
  },
  ...
}
```

資金フローは下図のようになる。

```
Payment Method   Platform Account    Connected Account
 ^                 |
 |                 |
 | 1000       1000 |
 |                 |
 | [Refund]        |
[TXN]--------------+
```

収支は下表である。

| Transaction | Payment Methond | Platform Account | Conn. Account A | Conn. Account B |  Stripe |
| ----------- | --------------: | ---------------: | --------------: | --------------: | ------: |
| Charge      |           -1000 |             +964 |               0 |               0 |     +36 |
| Refund      |           +1000 |            -1000 |               0 |               0 |       0 |
| **収支**    |       **-1000** |          **-36** |           **0** |           **0** | **+36** |

Platform が 36 円の赤字になる。サービスによっては、この金額を Connected Account に負担させる必要があるだろう。それはまた今度、見ていく。

# Transfer の後で Refund

Charge して Transfer した後で Refund する場合は、次のシーケンスで呼び出す。

```bash:request
curl https://api.stripe.com/v1/payment_intents \
  -d amount=1000 \
  ...

curl https://api.stripe.com/v1/transfers \
  -d amount=300 \
  -d destination: acct_A \
  ...

curl https://api.stripe.com/v1/transfers \
  -d amount=500 \
  -d destination: acct_B \
  ...

curl https://api.stripe.com/v1/refunds \
  -d payment_intent=pi_xxxx \
  ...

収支は下表のようになる。

Transaction Payment Methond Platform Account Conn. Account A Conn. Account B Stripe
Charge -1000 +964 0 0 +36
Transfer 0 -300 +300 0 0
Transfer 0 -500 0 +500 0
Refund +1000 -1000 0 0 0
収支 0 -836 +300 +500 +36

Transfer で分配された残高は Connected Account の残高に残る。そのため Platform だけが一方的に赤字になる。

Trasnfer した資金を回収する

Connected Account から、Transfer した資金を戻すには明示的に呼び出す。

curl https://api.stripe.com/v1/transfers/tr_forA/reversals \
  -d amount=300 \
  ...

curl https://api.stripe.com/v1/transfers/tr_forB/reversals \
  -d amount=500 \
  ...

収支は下表のようになる。

Transaction Payment Methond Platform Account Conn. Account A Conn. Account B Stripe
Charge -1000 +964 0 0 +36
Transfer 0 -300 +300 0 0
Transfer 0 -500 0 +500 0
Refund +1000 -1000 0 0 0
Transfer Reversal 0 +300 -300 0 0
Transfer Reversal 0 +500 0 -500 0
収支 0 -36 0 0 +36

この例では Transfer した金額をすべて巻き戻しているけれど、一部だけを巻きもどせる。巻き戻さないこともできる。

また -36 円は Platform がかぶったままになる。これを回収する方法は、今度見ていく。

まとめ

Separate Charges and Transfers での、Refund の資金フローを見た。あしたは Dispute を見ていく。