0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Paidy Checkoutで送信する注文情報を、Stripeで簡単に取得・収集する方法

Posted at

決済手段としてPaidyを追加する場合、顧客がPaidy以外で注文を行った履歴情報を送信する必要があります。この記事では、Stripeを利用している場合に、Paidyへ送信する情報を集める方法を紹介します。

[関連記事] Stripeを使って「クレジットカード」と「Paidy」両方に対応した決済フォームを作る方法

Stripe Elementsを利用すると、Paidyとクレジットカード決済それぞれをサポートする決済フォームが簡単に作れます。実装方法や注文データの扱いについては、以下の記事をご覧ください。

Paidyでは「Paidy決済以外」での注文履歴情報が必要

Paidyでの決済を行うPaidy Checkoutを利用するには、与信のために顧客の情報をいくつか送信する必要があります。特徴的なのは、顧客の氏名や住所だけでなく、「Paidy以外での購入履歴」についても送信が必要なことです。Paidyのドキュメントを見ると、次の値が必須とされています。

  • order_count
  • ltv
  • last_order_amount
  • last_order_at

この4項目を送信するには、ショップにおける、Paidy以外を利用した際の注文回数・合計金額と、最後の注文情報が必要です。このほかにも直近3ヶ月の行動なども送信することができます。Paidyのドキュメントを確認して、オプションとされている値をどこまでサポートするかを検討しましょう。

Stripe上での直近の注文内容を取得する方法

クレジットカード決済やApple Pay / Google Pay、そして銀行振込・コンビニ決済などをStripeで提供している場合、最後の注文情報はStripe APIから取得できます。

まず取得には、StripeのCustomer IDが必要です。これはログインユーザーのIDと紐づけたデータベースや、ユーザー情報テーブルのメタデータに保存するなどして、取得できるようにしておきましょう。このCustomer IDを利用して、Stripe上での決済履歴を取得します。

last_order_amountlast_order_atでは、キャンセル・拒否・返金された取引を除外する必要があります。そのため、Search APIを利用して、「支払いが成功し、全額返金されていない支払い」を特定します。

async function getLastStripeOrder(customerId) {
  const charges = await stripe.charges.search({
    query: `customer:"${customerId}" AND -refunded:"true" AND status:"succeeded"`,
    limit: 1,
  });
  // @TODO 必要な情報を取得・計算する
};

マルチキャプチャ機能を利用する場合
2024/08時点ではベータ機能ですが、複数回のキャプチャを実施できる機能が開発中です。

https://docs.stripe.com/payments/multicapture

この機能を利用した場合、1つの注文でChargeが複数作成されます。そのため、今回紹介している手法では注文の一部金額しか取得できなくなることがありますのでご注意ください。

取得した結果から、最後の決済日と決済金額を取得しましょう。注文の一部を返品している場合など、部分的に返金を行なっていることがありますので、返金した金額を差し引く処理も追加しています。

async function getLastStripeOrder(customerId) {
  const charges = await stripe.charges.search({
    query: `customer:"${customerId}" AND -refunded:"true" AND status:"succeeded"`,
    limit: 1,
  });
+  if (!charges.data) {
+    return null;
+  }
+ const lastCharge = charges.data[0]
+ const lastOrderAt = new Date(lastCharge.created * 1000).toISOString();
+ const lastOrderAmount = lastCharge.amount_captured - lastCharge.amount_refunded;
+  return {
+    lastOrderAt,
+    lastOrderAmount,
+  };
};

注文回数とLTVは、集計用データベースを用意しよう

同様の方法で注文回数やLTVの計算もできます。ただし注文回数の多い顧客では、APIから取得するデータの量が多くなるため、サイトの表示や処理に時間がかかる可能性があります。そのため、Stripe Webhookを利用して、累計金額を計算する処理とデータベースを作ることをお勧めします。

この場合、決済に成功したことを通知するcharge.succeededイベントと返金が発生した場合に送信されるcharge.refundedイベントの2つは少なくとも受信する必要があります。

Paidyの組み込み効率化にも、Stripeを活用しよう

今回の記事では、Paidy Checkoutで使用する決済履歴データをStripeから収集する方法を紹介しました。Stripe上のデータは、Search APIを使った検索やWebhookを利用したデータ連携で簡単に取得・収集できます。LTVや注文回数の計算をWebhook経由で実施することで、ユーザーの注文フローを遅延なく提供できるようにシステムを構築しましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?