検索
ホームページウェブフロントエンドjsチュートリアルStripe Connect を使用したマーケットプレイスの作成: オンボードプロセス

導入

マーケットプレイスを提供している決済処理業者が多くないことを考えると、マーケットプレイスを作成するのはおそらく難しすぎるか不可能でしょう。もしマーケットプレイスが提供しなければ、その情報を知った瞬間にプラットフォームから強制終了される可能性が高く、それがなかったとしてもプラットフォームを使用して販売者への支払い、返金、支払いを処理するための強固な基盤がないマーケットプレイスを作成するのは危険です。

Stripe Connect はこれらの問題に対処し、販売者としてサインアップできる基本的なマーケットプレイスを作成し、顧客がこれらの販売者から商品を簡単に購入できるようにします。プラットフォーム所有者はサービス手数料を設定することもできるため、ユーザー X がストア Y から購入すると、その取引の X% が取り扱われますが、それについては後ほど説明します。

Creating a marketplace with Stripe Connect: The onboard process

プロジェクトのセットアップ

データベース接続の処理には Prisma を使用し、認証は remix-auth によって処理されます。この部分については、マーケットプレイスの販売者側のみを処理します。

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Store {
  id         String   @id // This will be the store's subdomain
  name       String
  updated_at DateTime @default(now()) @updatedAt
  seller     Seller?
}

model Seller {
  id           Int      @id @default(autoincrement())
  email        String
  password     String
  store        Store    @relation(fields: [store_id], references: [id])
  date_created DateTime @default(now())
  date_updated DateTime @updatedAt
  store_id     String   @unique
}

これは schema.prisma ファイルの外観です。販売者モデルとそれに関連する店舗モデルがあります。「id」フィールドはサブドメインとして機能するため、購入者の側に到達すると、次のことが可能になります。 store.localhost.com にアクセスし、そこの販売者から製品を購入します。
また、販売者の Connect アカウントに関するデータを保存する Stripe モデルも追加します。

model Stripe {
  account_id String @id
  is_onboarded Boolean @default(false)
  user Users @relation(fields: [user_id], references: [discord_id])
  user_id String @unique
  created_at DateTime @default(now())
  updated_at DateTime @updatedAt
}

model Seller {
  id           Int      @id @default(autoincrement())
  email        String
  password     String
  store        Store    @relation(fields: [store_id], references: [id])
  date_created DateTime @default(now())
  date_updated DateTime @updatedAt
  store_id     String   @unique
  stripe       Stripe?
}

これでユーザーのオンボーディングを処理できるようになったので、.env ファイルに別の変数を定義しましょう。

STRIPE_SK=your stripe secret key here

Stripe の開発ページで生成することで Stripe 秘密キーを取得できます。現時点では Stripe Connect の使用のみを許可する制限付きキーを作成することをお勧めします。

次に、Stripe クライアントをエクスポートしてルートで使用できるようにする新しいファイルを作成する必要があります

// app/libs/stripe.server.ts
import Stripe from 'stripe';
export const stripe = new Stripe(process.env.STRIPE_SK)

「/onboarding」に新しいルートを作成します

// app/routes/onboarding.tsx

export default function Onboarding() {
    const {stripe} = useLoaderData();

    return <div classname="{'text-center" pt->
    <h1 id="Account-onboarded-stripe-is-onboarded-stripe-account-id-Not-connected">Account onboarded: {stripe?.is_onboarded ? stripe?.account_id : '? Not connected'}</h1>
        <div classname="{'flex" items-center text-white text-sm mt-5 justify-center gap-3>
            {!stripe ? 
                <form method="{'post'}">
                    <button type="{'submit'}" classname="{'bg-blue-600" hover:cursor-pointer rounded- px-4 py-1.5>Setup your seller
                        account
                    </button>

                </form>
            > : 
                <div classname="{'bg-blue-600" rounded- px-4 py-1.5>Seller dashboard</div>

            >}
        </div>
    </div>
}

販売者のオンボーディングステータスに関するデータを渡すローダー関数を追加します

export async function loader({request}: LoaderFunctionArgs) {
    const user = await authenticator.isAuthenticated(request, {
        failureRedirect: '/login'
    })

    const seller = await prisma.seller.findFirst({
        where: {
            id: user.id
        }, include: {
            stripe: true
        }
    })

    return {
        stripe: seller?.stripe
    }
}

ここで、/onboarding にアクセスすると、接続されていないことが表示され、ボタンを押してサインアップできるようになります。ここでアクション関数が登場します。

export async function action({request}: ActionFunctionArgs) {
    const authenticated = await authenticator.isAuthenticated(request, {
        failureRedirect: '/login'
    })
    const seller = await prisma.seller.findFirst({
        where: {
            id: authenticated.id
        }, include: {
            stripe: true
        }
    })
    if (seller && seller.stripe?.is_onboarded) {
        return json({
            message: 'User is onboarded already',
            error: true
        }, {
            status: 400
        })
    }
    const account = seller?.stripe?.account_id ? {
        id: seller.stripe?.account_id
    } : await stripe.accounts.create({
        email: seller?.email,
        controller: {
            fees: {
                payer: 'application',
            },
            losses: {
                payments: 'application',
            },
            stripe_dashboard: {
                type: 'express',
            },
        },
    });
    if (!seller?.stripe?.account_id) {
        await prisma.seller.update({
            where: {
                id: authenticated.id
            },
            data: {
                stripe: {
                    create: {
                        account_id: account.id
                    }
                }
            }, include: {
                stripe: true
            }
        })
    }
    const accountLink = await stripe.accountLinks.create({
        account: account.id,
        refresh_url: 'http://localhost:5173/onboarding',
        return_url: 'http://localhost:5173/onboarding',
        type: 'account_onboarding',
        collection_options: {
            fields: 'eventually_due',
        },
    });
    console.debug(`[ACCOUNT ID = ${account.id}] CREATED ACCOUNT ONBOARDING LINK, REDIRECTING...`)

    return redirect(accountLink.url)
}

販売者がボタンを押すと、登録に使用したメールアドレスでアカウントが作成され、販売者が既に Stripe アカウントを関連付けている場合は、オンボーディング ページにリダイレクトするアカウント リンクが作成されます。がオンボーディングされていない場合は、オンボーディング リンクにリダイレクトします。

Creating a marketplace with Stripe Connect: The onboard process

そこから販売者はメール/電話番号を入力し、オンボーディングプロセスが始まります。通常、Stripe は販売者にビジネスの場所、ビジネスの詳細、銀行口座などを尋ねます...

Stripe Connect イベントの Webhook をリッスンできるようになりました。そのため、販売者が正常にオンボーディングしたら、それらの属性をデータベース内の販売者のレコードに追加します。

テストの場合は、Stripe CLI をダウンロードするだけで、そこからイベントをこれから作成する新しいルート /api/notifications に転送できます

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Store {
  id         String   @id // This will be the store's subdomain
  name       String
  updated_at DateTime @default(now()) @updatedAt
  seller     Seller?
}

model Seller {
  id           Int      @id @default(autoincrement())
  email        String
  password     String
  store        Store    @relation(fields: [store_id], references: [id])
  date_created DateTime @default(now())
  date_updated DateTime @updatedAt
  store_id     String   @unique
}

そのコマンドを実行すると、Webhook 署名が与えられます。これにより、Stripe から送信された各 Webhook の整合性を検証できるようになります。Stripe の開発者ポータルで Webhook を作成した場合も同様に、シークレットが得られます。 .

model Stripe {
  account_id String @id
  is_onboarded Boolean @default(false)
  user Users @relation(fields: [user_id], references: [discord_id])
  user_id String @unique
  created_at DateTime @default(now())
  updated_at DateTime @updatedAt
}

model Seller {
  id           Int      @id @default(autoincrement())
  email        String
  password     String
  store        Store    @relation(fields: [store_id], references: [id])
  date_created DateTime @default(now())
  date_updated DateTime @updatedAt
  store_id     String   @unique
  stripe       Stripe?
}

.env ファイルに新しい変数も追加します

STRIPE_SK=your stripe secret key here

これで、Stripe から送信されるこれらのイベントを処理するコードを作成できます

// app/libs/stripe.server.ts
import Stripe from 'stripe';
export const stripe = new Stripe(process.env.STRIPE_SK)

Stripe がリクエストを送信していることを確認します。Stripe である場合は次に進みます。注目したいイベントは account.updated です。そのイベントは、販売者をリダイレクトする前に作成したアカウントに関連しています。

販売者がオンボーディング プロセスを開始したり、電話番号を追加したり、電子メールを入力したり、最終的にオンボーディング プロセスを完了すると、「account.updated」イベントが取得され、この配列が一緒に送信されます

アカウント.requirements.currently_due

'currently_due' 配列の長さが 0 の場合、ユーザーが完全にオンボーディングされ、支払いを受け入れることができることがわかります。そのため、データベースを更新してユーザーが商品を作成できるようにすることができますが、その前に以下を追加しましょう「/api/notifications」アクション内のこのロジック

// app/routes/onboarding.tsx

export default function Onboarding() {
    const {stripe} = useLoaderData();

    return <div classname="{'text-center" pt->
    <h1 id="Account-onboarded-stripe-is-onboarded-stripe-account-id-Not-connected">Account onboarded: {stripe?.is_onboarded ? stripe?.account_id : '? Not connected'}</h1>
        <div classname="{'flex" items-center text-white text-sm mt-5 justify-center gap-3>
            {!stripe ? 
                <form method="{'post'}">
                    <button type="{'submit'}" classname="{'bg-blue-600" hover:cursor-pointer rounded- px-4 py-1.5>Setup your seller
                        account
                    </button>

                </form>
            > : 
                <div classname="{'bg-blue-600" rounded- px-4 py-1.5>Seller dashboard</div>

            >}
        </div>
    </div>
}

それが整ったら、オンボーディングを試して、それが機能するかどうかを確認できます。たとえばアドレスを入力するとすぐに、プロジェクトのコンソールに
のようなメッセージが表示されます。

export async function loader({request}: LoaderFunctionArgs) {
    const user = await authenticator.isAuthenticated(request, {
        failureRedirect: '/login'
    })

    const seller = await prisma.seller.findFirst({
        where: {
            id: user.id
        }, include: {
            stripe: true
        }
    })

    return {
        stripe: seller?.stripe
    }
}

これは、本文が検証され、Stripe からイベントを正常に受信していることを意味しますが、オンボーディングが機能するかどうかを見てみましょう。

最後のステップに到達すると、おそらくアカウントの詳細が不完全であることが表示されます。最後のステップは ID 確認です。これはテストモードなので、それをシミュレートできます

Creating a marketplace with Stripe Connect: The onboard process

それが完了したら、前のページに戻り、送信を押し、送信を押して、コンソールに入ります

export async function action({request}: ActionFunctionArgs) {
    const authenticated = await authenticator.isAuthenticated(request, {
        failureRedirect: '/login'
    })
    const seller = await prisma.seller.findFirst({
        where: {
            id: authenticated.id
        }, include: {
            stripe: true
        }
    })
    if (seller && seller.stripe?.is_onboarded) {
        return json({
            message: 'User is onboarded already',
            error: true
        }, {
            status: 400
        })
    }
    const account = seller?.stripe?.account_id ? {
        id: seller.stripe?.account_id
    } : await stripe.accounts.create({
        email: seller?.email,
        controller: {
            fees: {
                payer: 'application',
            },
            losses: {
                payments: 'application',
            },
            stripe_dashboard: {
                type: 'express',
            },
        },
    });
    if (!seller?.stripe?.account_id) {
        await prisma.seller.update({
            where: {
                id: authenticated.id
            },
            data: {
                stripe: {
                    create: {
                        account_id: account.id
                    }
                }
            }, include: {
                stripe: true
            }
        })
    }
    const accountLink = await stripe.accountLinks.create({
        account: account.id,
        refresh_url: 'http://localhost:5173/onboarding',
        return_url: 'http://localhost:5173/onboarding',
        type: 'account_onboarding',
        collection_options: {
            fields: 'eventually_due',
        },
    });
    console.debug(`[ACCOUNT ID = ${account.id}] CREATED ACCOUNT ONBOARDING LINK, REDIRECTING...`)

    return redirect(accountLink.url)
}

これでうまくいきました。Stripe はオンボーディング ページに戻り、アカウント ID が表示されます。これはオンボーディングが成功し、製品の作成を開始できることを意味します。

Creating a marketplace with Stripe Connect: The onboard process

それでは、商品に進む前に販売者ダッシュボード ボタンを機能させて、/portal に新しいルートを作成しましょう

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Store {
  id         String   @id // This will be the store's subdomain
  name       String
  updated_at DateTime @default(now()) @updatedAt
  seller     Seller?
}

model Seller {
  id           Int      @id @default(autoincrement())
  email        String
  password     String
  store        Store    @relation(fields: [store_id], references: [id])
  date_created DateTime @default(now())
  date_updated DateTime @updatedAt
  store_id     String   @unique
}

非常に基本的な機能なので、オンボーディングしている場合に /portal にアクセスすると、Stripe アカウント用に生成された 1 回限りのリンクにリダイレクトされます。

オンボーディング ルートで、販売者ダッシュボード div をリンクでラップします。

model Stripe {
  account_id String @id
  is_onboarded Boolean @default(false)
  user Users @relation(fields: [user_id], references: [discord_id])
  user_id String @unique
  created_at DateTime @default(now())
  updated_at DateTime @updatedAt
}

model Seller {
  id           Int      @id @default(autoincrement())
  email        String
  password     String
  store        Store    @relation(fields: [store_id], references: [id])
  date_created DateTime @default(now())
  date_updated DateTime @updatedAt
  store_id     String   @unique
  stripe       Stripe?
}

/portal にアクセスするかボタンを押すと、Stripe の Connect アカウント用ポータルにリダイレクトされ、ユーザーはそこで分析や支払いなどを確認できます...

Creating a marketplace with Stripe Connect: The onboard process

これで、Stripe Connect を使用してマーケットプレイスを作成するパート 1 が終了します。パート 2 は製品、支払い、支払いを扱います。パート 3 が最後で、そこでプロジェクトの顧客側の側面を扱います。 .

プロジェクトのソース コードは、https://github.com/ddm50/ Stripe-connect-howto-seller でご覧いただけます

以上がStripe Connect を使用したマーケットプレイスの作成: オンボードプロセスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。