Chapter 13

Destination Charges in Connected Account view

Toru Furukawa
Toru Furukawa
2021.12.14に更新

今日は、Connected Account の立場から、Destination Charge で何が起こっているか見ていく。

py_ で始まるオブジェクトは何なのか

Destination Charge を実行した Payment Intent のレスポンスを、もう一度確認する。

request
curl https://api.stripe.com/v1/payment_intents/pi_xxxx \
  -u sk_xxxx: \
  -d "expand[]"="charges.data.transfer" \
  -G
response
{
  "id": "pi_xxxx",
  "charges": {
    "data": [
      {
        "id": "ch_xxxx",
        "transfer": {
          "id": "tr_xxxx",
          "destination": "acct_xxxx",
          "destination_payment": "py_xxxx", // 👈
          ...
        },
        ...
      }
    ],
    ...
  },
  ...
}

Transfer オブジェクトの destination の値は、支払いを受け取るべき Connected Account の ID である。

それとは別に、destination_payment というプロパティがあり、値は py_xxxx という ID っぽい文字列だ。これは何なのか。

expand をもう一段階深くして、呼び出してみよう。

request
curl https://api.stripe.com/v1/payment_intents/pi_xxxx \
  -u sk_xxxx: \
  -d "expand[]"="charges.data.transfer.destination_payment" \
  -G
response
{
  "id": "pi_xxxx",
  "charges": {
    "data": [
      {
        "id": "ch_xxxx",
        "transfer": {
          "id": "tr_xxxx",
          "destination": "acct_xxxx",
          "destination_payment": {
            "id": "py_xxxx",
            "object": "charge", // 👈
            ...

なんと Charge オブジェクトである。

Connected Account の権限で API を呼び出す

ここまでは Platform Account の立場で Payment Intent を見てきた。ここからは Connected Account の立場で見ていく。

  1. Platform Account の secret key を使い
  2. Stripe-Account ヘッダーに Connected Account ID を指定する

と、Connected Account の権限で API 呼び出しができる。py_xxxx の詳しく見ていこう。

request
curl https://api.stripe.com/v1/charges/py_xxxx \
  -u sk_xxxx: \
  -H "Stripe-Account: acct_xxxx" \  # Connected Account として呼び出す
  -d "expand[]"=balance_transaction \
  -G
response
{
  "id": "py_xxxx",
  "object": "charge",
  "application_fee": "fee_xxxx",
  "balance_transaction": {
    "id": "txn_4",
    "amount": 1000,
    "fee": 200,
    "net": 800,
    ...
  },
  "source_transfer": "tr_xxxx",
  ...
}

数字に注目すると、どこかから 1000 円をもらってきて、200 円手数料を引かれて、800 円残高が増加している。

Transaction どこか Connected Account Fee
Charge 2 -1000 800 200

どこか、というのがどこかというと、source_transfer の Trasfer オブジェクトである。

fee は、どこにいくのかというと、Application Fee である。これは Stripe に支払う手数料ではなくて、Platform Account に支払う手数料だ。

Connected Account の立場では、1000 円の売上があって、200 円の手数料を支払った、という取引があったように見えている。

                           Connected Account
                                 ^
                                 |
  [Application Fee]<------+      |
                          |      |
                      200 |      | 800
                          |      |
              1000     [TXN4]----+
  [Transfer]-------->[Charge2]

Connected Account の立場から見た資金フローと、昨日までの Platform Account の立場から見たフローを統合すると、以下の図のようになる。

Buyer           Platform                    .       Seller
Card            Bank                        .       Bank
 :                                          .
Payment Method  Platform Account            .       Connected Account
 |               ^    |       ^             .             ^
 |               |    |       | 200         .             |
 |               |    |       |             .             |
 |               |    |   [TXN3][Application Fee]<-+      |
 |               |    |                     .      |      |
 | 1000      964 |    | 1000                .  200 |      | 800
 v               |    |                     .      |      |
[Charge]         |    v                     .      |      |
[TXN1]-----------+  [TXN2]      1000        .  [TXN4]-----+
 |                  [Transfer]---------->[Charge2]
 | 36                                       .
 v                                          .
Stripe

図の左側が Platform Account、右側が Connected Account のデータ空間だ。それぞれ独立したデータ空間を持っていて、外側で何が起こっているのかは分からない。

Application Fee と Charge 2 (py_xxxx) は、Platform Account と Connected Account での資金フローをつなぐオブジェクトだ。両方のデータ空間から見える。

まとめ

Destination Charge を Connected Account の立場で見てきた。明日は返金とチャージバックをみていく。