🍃

Stripe Connectで定期購入を次回更新日に解約する処理(Node)

2021/10/03に公開

expressを使用してAPIを作成。

import * as cors from 'cors'
import * as express from 'express'
import Stripe from 'stripe'

const stripe = (apiKey: string): Stripe =>
  new Stripe(apiKey, { apiVersion: '2020-08-27' })
  
const app = express()

app.use(cors({ origin: true }))

app.post('/stripe/cancel_subscription', (req, res) => {
  const { apiKey, accountId, subscription } = req.body
  
  await stripe(apiKey).subscriptions.update(
    subscription,
    { cancel_at_period_end: true },
    { stripeAccount: accountId }
  )
})

処理の詳細

subscriptions.updateの第二引数でtrue更新しているcancel_at_period_endですが、
これで次回更新日に定期購入がキャンセルされるようになります。

また、今回はConnetアカウントのお客の操作ですので、
subscriptions.updateの第三引数には、ConnectアカウントのアカウントIDを指定する必要があります。

req.bodyで取得しているパラメータの詳細:

  • apiKey: 親アカウントのシークレットキー
  • accountId: ConnectアカウントID
  • subscription: Coneectアカウントのお客が購入している定期購入ID

最後に

ここでは明示的に親アカウントのシークレットキーをreq.bodyで受け取っていますが、
Stripeでの実装としては望ましくないので、サーバ側の環境変数で保持しておくといいかもです。

ちなみに、cancel_at_period_end: falseという処理を行うと、
このキャンセルをキャンセルし、次回更新日には課金が行われる(再開)ことになります💸

Discussion