この作品について
転職・退職・家計の書類を、印刷してすぐ使える形で売るダウンロードストア。履歴書8様式・職務経歴書12職種を含む配布ZIP8本・107ファイルをスクリプトで生成し、決済はSquareのホスト画面に任せてカード番号を自サイトに通さない。ZIPはpublicに置かず署名トークン(既定14日)でのみ配信し、データベースは持たない。同じ決済と同じ購入判定の上に、自撮りから証明写真を作って写真入り履歴書PDFまで書き出すAI証明写真(¥980)も同居させ、こちらだけZIPではなくその場生成で渡す。
Problem
困りごとと、解き方
テンプレート販売は白紙だけを配るものが多く、記入例と書き方が別売りか無い
履歴書は1様式ごとにWord・印刷用PDF・記入例PDFの3点、職務経歴書は1職種ごとに白紙と記入例をWordとPDFの4点で束ねた
個人で売る以上、深夜に買われても人が起きて送るわけにいかない
完了画面・Webhook・15分ごとのcronの3経路で納品し、注文のmetadataで二重送信を止める
Squareアカウントは他プロジェクトと共用で、取りこぼし回収は口座全体の決済を見に行く
purchaseMatches()で商品名と金額が両方一致した注文だけを通し、他プロジェクトの入金を拾わない
Result
できあがったもの
成果
- 販売まわりの自動テスト60項目が全PASS(購入判定・署名トークン・DL API・ZIP容量ほか)
- 15ページ×5幅(390/744/820/1180/1440)の75項目に無料ツールの実動作8項目を足した83項目が本番URLで全PASS
- ZIPの収録数は生成時の記載とunzipの実数が8本すべて一致(25/5/25/24/3/4/9/12ファイル)
見どころ
- 配布ZIP8本・107ファイルをスクリプトから生成(手作業でファイルを作らない)
- ZIPは非公開、HMAC-SHA256の署名トークン(既定14日)でのみ配信
- 商品名と金額の両方が一致した決済だけを納品対象にする購入判定
- 配布ZIPは最大2.60MB、Vercelの応答上限4.5MBを8本ともクリア
- 無料ツール4本を入口に併設。うち履歴書メーカーは免許証を撮るだけで学歴・住所が埋まる
How
どう作ったか
- 企画・UI設計・フルスタック開発・決済・納品フロー設計
- Next.js 15.5・TypeScript 5.9・Square REST API(Hosted Checkout・SDK不使用)・Playwright(Chromium) print-to-PDF(配布PDF 70本)・docx / exceljs(Word 36本・計算式入りExcel 1本)・pdf-lib(履歴書PDFへの写真焼き込み)・HMAC-SHA256 署名トークン・nodemailer + XServer SMTP・Vercel(hnd1) + Cron
Next


