PAY.JP の Checkout V2 を試すためのサンプル集です。クライアント(モバイル)とローカル開発用のバックエンドを同梱しています。セットアップと動作確認の手順はこの README にまとめています。
| ディレクトリ | 内容 |
|---|---|
android/ |
Android アプリ(サンプル API と連携し、Checkout を開く) |
server/ |
Node.js 製のサンプル API(商品一覧・Checkout Session 作成・Webhook 受信) |
ios/ |
iOS アプリ(SwiftUI・サンプル API と連携し Safari で Checkout を開く) |
flutter/ |
Flutter アプリ(Android / iOS 共通・外部ブラウザで Checkout を開く) |
react-native/ |
React Native アプリ(Android / iOS 共通・Linking で外部ブラウザ起動) |
- Node.js 22 以上 (CI 検証バージョン)
- PAY.JP アカウント
- PAY.JP ダッシュボードで Price オブジェクトを作成済み
- PayPay を使うテスト環境
このサンプルサーバーは payment_method_types を ['card', 'paypay'] に固定しています。PayPay が有効でないアカウントでは Checkout Session 作成が失敗する可能性があります。
cd server
npm installcp .env.example .env最低限、次の値を .env に設定してください。
PAYJP_SECRET_KEY=sk_test_xxxxx
PAYJP_SAMPLE_PRICE_ID=price_xxxxx
PAYJP_WEBHOOK_SECRET=your_webhook_secret任意で次の値も設定できます。
PAYJP_SAMPLE_PRODUCT_NAME:/productsで返すサンプル商品名。未設定時はテスト商品PAYJP_SAMPLE_PRODUCT_AMOUNT:/productsで返すサンプル金額。未設定時は100ALLOWED_ORIGINS: CORS 許可オリジン。カンマ区切り。未設定時は全オリジン許可(本番環境では必ず設定してください)PORT: サーバーポート。既定値は3000
npm startサーバーが http://localhost:3000 で起動します。
payjp-cli listen --forward-to http://localhost:3000/webhooksuccess_url へのリダイレクトだけでは決済完了は確定しません。注文確定や発送などの後続処理は、必ず checkout.session.completed の Webhook を受けてから行ってください。
サンプル商品一覧を返します。
レスポンス例:
{
"products": [
{ "id": "price_xxx", "name": "テスト商品A", "amount": 100 }
]
}Checkout Session を作成します。
リクエスト例:
{
"price_id": "price_xxx",
"quantity": 1,
"success_url": "payjpcheckoutexample://checkout/success",
"cancel_url": "payjpcheckoutexample://checkout/cancel"
}レスポンス例:
{
"id": "cs_xxx",
"url": "https://checkout.pay.jp/...",
"status": "open"
}success_url / cancel_url には次のスキームだけを許可しています。
https://http://localhostpayjpcheckoutexample://
PAY.JP からの Webhook を受信します。x-payjp-webhook-token が .env の PAYJP_WEBHOOK_SECRET と一致しない場合は拒否します。
処理対象イベント:
checkout.session.completedcheckout.session.expired
- Android Studio で
android/をプロジェクトとして開きます。 - アプリのバックエンド URL に、エミュレータなら
http://10.0.2.2:3000、実機なら開発マシンの LAN IP を入力します。 - 商品を選び、Checkout を開始します。
- Xcode で
ios/PayJPCheckoutExample.xcodeprojを開きます。 - シミュレータでは既定の
http://localhost:3000のまま動かせます。実機は Mac の LAN IP に変更してください。 - 商品を選び、Safari で Checkout を開始します。
cd flutter && flutter pub get- iOS は初回のみ
flutter config --enable-swift-package-manager(CocoaPods は不要・Podfile もコミットしていません) flutter runでエミュレータ / シミュレータに展開。バックエンド URL 既定値は Android エミュレータがhttp://10.0.2.2:3000、iOS シミュレータがhttp://localhost:3000。- 詳細は
flutter/README.md。
cd react-native && npm install- iOS は
cd ios && bundle install && bundle exec pod install && cd .. npm startで Metro を起動、別シェルでnpm run androidまたはnpm run ios- 詳細は
react-native/README.md。
iOS アプリは success_url に戻った時点では「決済完了」ではなく、Webhook 確認待ちとして扱います。success_url は受付済みのシグナルであって、決済確定そのものではありません。
コマンドラインでビルドする例:
xcodebuild -project ios/PayJPCheckoutExample.xcodeproj -target PayJPCheckoutExample -sdk iphonesimulator -configuration Debug build成果物は ios/build/Debug-iphonesimulator/PayJPCheckoutExample.app に出力されます。プロジェクトの iOS デプロイメントターゲットは 26.1 です。
テストカード、PayPay のテスト手順、テスト用アカウントについては PAY.JP ドキュメント を参照してください。
- 秘密鍵(
sk_xxx)はクライアントサイドに含めないでください success_urlだけで決済完了扱いしないでください- Webhook を使わない場合、このサンプルは注文確定の正判定を提供しません