🐡

【Stripe】Checkout Sessionで初回決済したカードをデフォルトカードにする方法

2023/04/20に公開

こんにちは、ひょうどうです。
今回は、Stripe Checkout Session(以下 Checkout と略す) で初回決済に使用したクレジットカード(以下カードと略す)をデフォルトカードに設定する方法を紹介します。

Checkout で初回決済に使用したカードは顧客のデフォルトカードにはならないため、2 回目以降に Stripe Charges API を活用した 1 クリック購入フローを実現することができません。

そこで、初回決済が行われた後、以下で紹介するデフォルトカードに設定する処理をすることで、2 回目以降から 1 クリック決済を実現することができます。

  • デフォルトカードではない状態(Checkout 決済後)

  • デフォルトカード状態(処理後)

それでは早速紹介します。

登録されているカードをデフォルトカードに設定する方法

export const setupCardDomain = async (customerId: string): Promise<void> => {
  // 顧客の決済情報を取得
  const { data: paymentMethodsList } = await stripeClient.paymentMethods.list({
    customer: customerId,
  });

  // カード決済のみにフィルタする
  const cardPaymentMethodsList = paymentMethodsList.filter(
    ({ card }) => !!card
  );

  // カード情報がない場合スキップ
  if (cardPaymentMethodsList.length === 0) {
    return;
  }

  // デフォルトカードに設定
  await stripeClient.customers.update(customerId, {
    invoice_settings: {
      default_payment_method: cardPaymentMethodsList[0].id,
    },
  });
};

こちらの関数をサブスク完了後、または Checkout 完了後に実行すると良いでしょう。

Webhook イベント例

  • customer.subscription.updated
  • checkout.session.completed

デフォルトカードが登録されているかどうか判定する方法

export const getIsDefaultCardByCustomerId = async (
  customerId: string
): Promise<boolean> => {
  const customer = await stripeClient.customers.retrieve(customerId);

  if (customer.deleted === true) {
    return false;
  }

  return !!customer.default_source;
};

こちらの関数を活用することで、初回決済時のみ Checkout を活用し、2 回目以降からは Checkout を挟まずに決済を行えるため、購入フローを省略することができます。

まとめ

本記事では、Stripe Checkout Session で初回決済に使用したクレジットカードをデフォルトカードに設定する方法を紹介しました。

1 クリック決済は非常に便利な機能でリピートの多いサービスではユーザー満足度に影響してくる重要な機能です。
今回の知見が読者のサービス向上につながれば幸いです。

ご一読ありがとうございました。

参考文献

https://stripe.com/docs/payments/checkout/subscriptions/update-payment-details?locale=ja-JP
https://qiita.com/hideokamoto/items/453486d61fb425c1d4db

GitHubで編集を提案

Discussion