ไอเดีย #30: ระบบร้านค้าออนไลน์ขายสินค้าดิจิทัล
คนทำเทมเพลต ฟอนต์ คอร์สวิดีโอ หรือ e-book ขายเองหลายคนยังใช้วิธีให้ลูกค้าโอนเงินแล้วทักแชต จากนั้นแอดมินค่อยส่งลิงก์ดาวน์โหลดให้ทีละคน ปัญหาคือดึกแล้วลูกค้าต้องรอถึงเช้า ลิงก์ที่ส่งไปถูกแชร์ต่อในกลุ่มจนคนไม่ได้ซื้อก็โหลดได้ ส่วนโปรแกรมที่ขายเป็น license ก็ไม่รู้ว่าคีย์ไหนถูกใช้ไปกี่เครื่อง ร้านขายสินค้าดิจิทัลที่ส่งของได้ทันทีและคุมสิทธิ์ได้จริงจึงเป็นโปรเจกต์ที่น่าทำมาก
ใครจะใช้
- ผู้ขาย / ครีเอเตอร์ — อัปโหลดสินค้า ตั้งราคา ดูยอดขาย
- ลูกค้า — ซื้อ จ่ายเงิน และดาวน์โหลดจากหน้าคลังสินค้าของตัวเอง
- แอดมิน — ตรวจรายการชำระเงิน จัดการ license และคำขอคืนเงิน
ฟีเจอร์ขั้นต่ำ (MVP)
- จัดการสินค้า แนบไฟล์หลายเวอร์ชัน คำอธิบาย และราคา
- ตะกร้าและชำระเงินผ่าน PromptPay QR หรือ payment gateway ที่ยืนยันอัตโนมัติด้วย webhook
- เมื่อชำระสำเร็จ ส่งสิทธิ์ดาวน์โหลดเข้าบัญชีลูกค้าและอีเมลทันที
- ลิงก์ดาวน์โหลดแบบ signed URL ที่หมดอายุในเวลาที่กำหนด และจำกัดจำนวนครั้งต่อการซื้อ
- ออก license key ต่อการซื้อ กำหนดจำนวนเครื่องที่ใช้ได้ และมี API ให้โปรแกรมตรวจสอบ activate หรือ deactivate
- หน้าประวัติการซื้อที่ลูกค้ากลับมาขอลิงก์ใหม่ได้เองเมื่อลิงก์เดิมหมดอายุ
- ออกใบเสร็จ และใบกำกับภาษีพร้อม VAT 7% สำหรับผู้ขายที่จดทะเบียนภาษีมูลค่าเพิ่ม
ต่อยอดได้อีก
- ใส่ลายน้ำชื่อหรืออีเมลผู้ซื้อลงในไฟล์ PDF เพื่อลดการแชร์ต่อ
- ระบบคูปองและ affiliate ให้คนช่วยขายได้ค่าคอมมิชชัน
- แจ้งลูกค้าเมื่อมีไฟล์เวอร์ชันใหม่ให้อัปเดต
- ขายแบบสมาชิกรายเดือน เข้าถึงสินค้าทั้งหมดได้ตลอดอายุสมาชิก
โครงข้อมูลตั้งต้น
products— id, title, price, status, current_file_idproduct_files— id, product_id, version, storage_key, size, checksumorders— id, user_id, total, vat_amount, status, paid_at, gateway_refentitlements— id, order_id, user_id, product_id, download_count, max_downloadsdownload_tokens— id, entitlement_id, token_hash, expires_at, used_at, iplicenses— id, entitlement_id, license_key, max_activations, activations
ระดับความยาก และสิ่งที่จะได้เรียนรู้
ระดับ ท้าทาย เพราะเกี่ยวกับทั้งเงินและความปลอดภัยของไฟล์ ทำได้ด้วย Yii2 หรือ Laravel + PostgreSQL/MySQL ไฟล์เก็บบน object storage แบบ private สิ่งที่จะได้เรียนรู้:
- การสร้าง signed URL และส่งไฟล์ผ่าน X-Sendfile หรือ X-Accel-Redirect แทนการเปิด path ตรง
- การรับ webhook แบบ idempotent และตรวจ signature ของ payment gateway
- การออกแบบ license key ที่เดาไม่ได้ และ API สำหรับ activate
- การทำ rate limit ป้องกันการดาวน์โหลดหรือเดาคีย์แบบรัว ๆ
ข้อควรระวัง
- ห้ามวางไฟล์สินค้าไว้ใน public folder เด็ดขาด ไม่งั้นแค่เดา path ก็โหลดได้ฟรี
- ถ้า webhook ถูกส่งซ้ำ ต้องไม่ออก license หรือสิทธิ์ซ้ำ ใช้ unique constraint ที่ gateway_ref ช่วยได้
- เงื่อนไขการคืนเงินของสินค้าดิจิทัลและการออกเอกสารภาษี ควรเขียนให้ชัดและตรวจสอบกับนักบัญชีหรือระเบียบล่าสุด
ใครเคยขายสินค้าดิจิทัลเองหรือทำระบบแบบนี้ให้ลูกค้าบ้าง ตั้งเวลาหมดอายุลิงก์ไว้นานแค่ไหนถึงจะพอดี ไม่ทำให้ลูกค้าหงุดหงิด และป้องกันการแชร์ไฟล์ด้วยวิธีไหนได้ผล? มาแชร์ประสบการณ์หรือโชว์ร้านที่ทำเสร็จแล้วในกระทู้นี้กันครับ