使用技術

  • Docker
  • Laravel
  • Nginx
  • PHP
  • PostgreSQL
  • Stripe

デモ

URL
https://frea-market.onrender.com
デモアカウント
「デモアカウントでログイン」を押すだけで入れます(入力は不要です)。
テスト用カード番号
4242 4242 4242 4242

概要

個人間で商品を売買するフリマアプリです。会員登録したメンバーが自分の商品を出品し、ほかのメンバーの商品を購入できます。支払いは Stripe を通して行い、カード払いとコンビニ払いに対応しています。

スクリーンショット

商品一覧の画面
商品一覧
商品詳細の画面
商品詳細
購入手続きの画面
購入手続き

主な機能

  • 会員登録、メール認証、ログイン
  • 商品の一覧、商品名での検索、いいねした商品だけのマイリスト
  • 商品の詳細、いいね、コメント
  • 商品の出品
  • 商品の購入(カード払い、コンビニ払い)、購入ごとの配送先の変更
  • マイページ(出品した商品、購入した商品)

工夫した点

  • Stripe 決済を、再利用できる部品として設計
    Stripe との連携処理を、アプリ本体から切り離した部品として実装しました。Webhook の受信はアプリ側で受けますが、受け取ったデータは部品に渡すだけで処理され、アプリ側に書くのは結果を使う処理(コールバック関数)だけです。Stripe 固有の処理がアプリに入り込まないので、ほかの Laravel アプリにも再利用できます。TypeScript 向けに作った npm パッケージ stripe-subscription-kit と同じ設計を、PHP で実装したものです。
  • 購入の確定は、Stripe からの通知で行う
    購入は、決済画面から戻ってきたときではなく、Stripe から届く「支払い完了」の通知(Webhook)で確定します。決済のあとに画面を閉じても、確定が漏れません。通知は署名を検証して本物かを確かめ、同じ通知が何度届いても二重に処理しないようにしています。
  • 同じ商品が二重に売れないようにする
    「購入する」を押した時点で商品を確保し、データベースの一意制約で、同じ商品に 2 件の購入が入らないようにしています。また、支払う金額は画面から送られた値を使わず、サーバー側で商品の価格から決めています。

制作の経緯

Web 技術習得中の課題として作成したものを、ポートフォリオ用にアップデートしました。
今回のアップデートでは、主に以下の追加・変更を行っております。

  • Stripe 決済を、再利用できる部品として設計し直して実装
  • Render と Neon(PostgreSQL)を使って本番環境に公開
  • 自作のロゴへの差し替え
  • テストコードの拡充