支払いカスタマイズ
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
は、response
とcontext
にアクセスします。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
プロパティをチェックすることで、組織がプラットフォームの使用料を支払っていることを確認します。