メインコンテンツまでスキップ

支払いカスタマイズ

Geekleでは、Nodeblocksが提供する機能を使用して支払い機能を実装しています。この場合、 組織がサービスの支払いを行うことをベースにした支払い設定を行っています。

組織サービスのカスタマイズ

カスタムフィールド

まず、支払いに関連する情報を保存する場所が必要です。Nodeblocksではカスタムフィールドの追加が可能です。src/custom-fields/organization.tsに、組織用のカスタムフィールドリストを作成しました。

export const customOrganizationFields: util.CustomField[] = [
// ... 他のカスタムフィールド
{
name: 'representative_person_name',
type: 'string',
},
{
name: 'payment_customer_id',
type: 'string',
},
{
name: 'needs_payment_method_setup',
type: 'boolean',
},
{
name: 'subscription_status',
type: 'string',
},
{
name: 'subscription_id',
type: 'string',
},
];

これらのフィールドにより、支払いプロバイダー(この場合はStripe)に接続するために必要な情報を保存できます。

サイドエフェクト

Nodeblocksのこの機能により、エンドポイントがリクエストされた時に追加のアクションをトリガーできます。組織にカスタムフィールドが設定されたので、これらのフィールドにデータを保存するための新しいサイドエフェクトを追加します。

src/sideEffects/index.ts内に、2つの支払いサイドエフェクトを追加しました。

export function createStripeAPI() {
return new Stripe(getEnvString('STRIPE_API_KEY', ''));
}

export async function setSideEffectHandlers(
adapter: defaultAdapter.OrganizationDefaultAdapter
) {
for (const sideEffectHandler of [
//...他のサイドエフェクト
createPaymentCustomer,
setSubscriptionData,
]) {
adapter = await sideEffectHandler(adapter);
}
return adapter;
}

createPaymentCustomerは、支払いプラットフォーム(Stripeなど)で顧客を作成し、createOrganizationが呼び出された後にトリガーされます。 setSubscriptionDataは、支払い顧客にサブスクリプションを作成して接続し、updateOrganizationが呼び出された後にトリガーされます。

createPaymentCustomerは、組織データを持つresponseオブジェクトにアクセスします。この組織IDをStripeバックエンドへの顧客作成コールに含めます。顧客が作成されると、両方のプラットフォーム間でリンクされるように、組織に顧客情報を更新します。

setSubscriptionDataは、responsecontextにアクセスします。updateOrganizationには組織オブジェクト全体が含まれていないため、サイドエフェクトが実行される前に組織がリクエストされ、addHandlerSideEffectを使用してサイドエフェクトに渡されます。この関数は、最初に承認された組織リクエストであることを検証し、その後、組織に関連付けられた顧客IDを使用してサブスクリプションを作成するために必要なすべての情報を取得します。サブスクリプションIDは組織に保存され、組織IDはサブスクリプションに保存されます。

カスタムエンドポイント

データが組織オブジェクトに保存されたので、Stripe側にある最新の状態を反映しないといけません。Stripeからのイベントを受信するWebhookエンドポイントを作成します。

src/index.ts内に、組織サービスに2つの新しいカスタムルートを追加できます。

  • /webhook/subscription: StripeからのWebhookイベントを受信するため
  • /payment-dashboard: 顧客がサブスクリプションを管理するための個人用ダッシュボードを生成するため

カスタムハンドラーロジックはsrc/handlerに保存されています。

  const customRoutes = [
{
handler: createWebhookHandler(adapter),
method: 'post',
path: '/webhook/subscription',
validators: [
createIsWebHookAuthenticateValidator(
getEnvString('STRIPE_WEBHOOK_SECRET', '')
),
],
},
//... createPaymentDashboardLink
]

このリストをcreateNodeblocksOrganizationApp.startServiceに渡すことで、新しいエンドポイントが追加されます! これで、ユーザーの試用期間が終了したり、支払いが遅れたりした場合、そのロジックをcreateWebhookHandlerで処理できるようになります。

オーダー、カタログ、チャットサービス

各サービスにカスタムバリデーターを追加し、needs_payment_method_setupプロパティをチェックすることで、組織がプラットフォームの使用料を支払っていることを確認します。