บทนำและขอบเขต
Loco Payment Gateway Management เป็นระบบบริหารการชำระเงินออนไลน์ของ LOCO ทำหน้าที่เป็น ศูนย์ควบคุมการรับชำระเงินจากทุกจุดรับเงิน ตั้งแต่ลูกค้าสแกน QR พร้อมเพย์ แตะบัตรเครดิต ผ่อนชำระ หรือจ่ายผ่านวอลเล็ต ไปจนถึงรอบโอนเงินเข้าบัญชีบริษัท โดยทำงานเชื่อมกับระบบของธนาคาร KBank และ SCB ทั้งการขอรายการชำระ การรับผลยืนยันอัตโนมัติ และการกระทบยอดรายวัน
ระบบถูกออกแบบให้ทีมปฏิบัติการและการเงินเห็นทุกอย่างจบในที่เดียว: ธุรกรรมทุกรายการตรวจย้อนได้ ค่าธรรมเนียมแยกตามช่องทาง รอบโอนและกระทบยอดชัดเจน และจัดการจุดรับเงินได้ทุกแห่งในเครือ ปัจจุบันระบบอยู่ในเวอร์ชันต้นแบบที่ทำงานครบทุกหน้าจอในโหมดสาธิต พร้อมการออกแบบการเชื่อมต่อจริงที่ระบุไว้ในบทที่ 6 และ 9
สิ่งที่ระบบทำได้ในภาพรวม
- ภาพรวมเรียลไทม์: ยอดรับชำระวันนี้ อัตราความสำเร็จ ยอดรอชำระบัญชี และยอดคืนเงิน พร้อมกราฟแยกรายธนาคารและสถานะการเชื่อมต่อ
- ธุรกรรมครบวงจร: ค้นหาและกรองทุกมิติ ดูรายละเอียดแบบไทม์ไลน์ คืนเงิน ส่ง Webhook ซ้ำ และส่งออกไฟล์ CSV
- ลิงก์ชำระเงิน: สร้าง QR และลิงก์เรียกเก็บเงินรายรายการ พร้อมวันหมดอายุและการติดตามสถานะ
- คืนเงิน: คืนแบบเต็มจำนวนหรือบางส่วน ส่งคำขอไปธนาคาร และติดตามผลจนจบขั้นตอน
- กระทบยอดและรอบโอน: รวมยอดรายวันเป็นรอบ T+1 หักค่าธรรมเนียม แสดงความถูกต้องของทุกรอบ และแจ้งเมื่อยอดไม่ตรง
- ช่องทางธนาคาร: เปิดและปิดบริการของ KBank และ SCB ต่อจุดรับเงิน จัดการคีย์เชื่อมต่อ Webhook และค่าธรรมเนียม
- จุดรับเงิน: บริหารสถานะและบริการของจุดรับเงินทุกแห่ง พร้อมยอดรับชำระล่าสุดของแต่ละจุด
- รายงาน: สรุปยอดรับชำระ ค่าธรรมเนียม และอัตราความสำเร็จ แยกตามวัน จุดรับเงิน และช่องทาง พร้อมส่งออก CSV
- ผู้ใช้และสิทธิ์: 4 บทบาท 10 สิทธิ์ กำหนดขอบเขตจุดรับเงินที่แต่ละคนรับผิดชอบได้
- บันทึกระบบ: ประวัติการเรียก API และการส่ง Webhook ทุกครั้ง พร้อมความหน่วงและผลตอบกลับสำหรับตรวจสอบ
ขอบเขตของเอกสารฉบับนี้
เอกสารนี้อธิบาย ระบบต้นแบบเวอร์ชัน V1 ตามที่สร้างจริง ณ วันที่ระบุ โดยแยกให้ชัดเจนระหว่าง (หนึ่ง) ส่วนที่ทำงานแล้วในโหมดสาธิต ซึ่งเปิดใช้ได้ทันทีจากไฟล์เว็บแอป และ (สอง) ส่วนการเชื่อมต่อธนาคารจริง ซึ่งออกแบบไว้พร้อมใช้งานและสรุปขั้นตอนดำเนินการไว้ในบทที่ 9 เอกสารนี้จึงใช้ได้ทั้งสำหรับทบทวนการออกแบบ ชี้แจงผู้มีส่วนได้ส่วนเสีย และเป็นคู่มือตั้งต้นของทีมที่ดูแลระบบต่อ
สถาปัตยกรรมระบบ
ระบบแบ่งการทำงานเป็นสามชั้นชัดเจน ได้แก่ ชั้นคอนโซลบริหารสำหรับทีมงาน ชั้นบริการชำระเงินที่สร้างรายการและรับผลจากธนาคาร และชั้นเชื่อมต่อธนาคารที่คุยกับ KBank และ SCB ในเวอร์ชันต้นแบบ ชั้นทั้งหมดรวมอยู่ในไฟล์เว็บแอปเดียวเพื่อสาธิตครบทุกฟังก์ชัน เมื่อใช้งานจริง แยกเป็นหน้าบ้าน ระบบบริการ และฐานข้อมูลกลางตามแนวทางที่ระบุในแผนภาพ โดยใช้แนวทางแบบเดียวกับระบบ LOCO24Park ที่ใช้งานอยู่แล้ว (Cloudflare Worker + D1)
องค์ประกอบหลัก
| องค์ประกอบ | หน้าที่ |
|---|---|
| คอนโซลบริหาร | หน้าจอใช้งาน 12 หน้าสำหรับทีมงาน ครอบคลุมภาพรวม ธุรกรรม ลิงก์ชำระเงิน คืนเงิน ชำระบัญชี ร้านค้าและจุดรับเงิน ช่องทางธนาคาร รายงาน ผู้ใช้ ตั้งค่า และบันทึกระบบ |
| ระบบรับชำระเงิน | สร้างรายการชำระ (QR พร้อมเพย์ บัตร ผ่อนชำระ ลิงก์ชำระเงิน) รับผลยืนยันจากธนาคาร บันทึกธุรกรรม และส่ง Webhook แจ้งระบบปลายทาง |
| ระบบการเงิน | รวมยอดรายวันเป็นรอบโอนเงิน T+1 หักค่าธรรมเนียมตามอัตราต่อช่องทาง กระทบยอดกับรายงานธนาคาร และติดตามสถานะความถูกต้องของทุกรอบ |
| บันทึกและตรวจสอบ | บันทึกธุรกรรมทุกรายการ บันทึกการเรียก API และการส่ง Webhook พร้อมความหน่วงและรหัสผลตอบกลับ เพื่อการตรวจสอบย้อนหลัง |
| ชั้นข้อมูล | โหมดสาธิตทำงานด้วยข้อมูลตัวอย่างฝังในตัว การใช้งานจริงออกแบบให้เก็บรวมที่ฐานข้อมูลกลางชุดเดียว พร้อมประวัติทุกการเคลื่อนไหว |
| ช่องทางธนาคาร | KBank และ SCB ผ่าน Merchant ID แยกต่อจุดรับเงิน ยืนยันผลด้วย Webhook และมีรอบโอนรายวันของแต่ละธนาคาร |
| ระบบปลายทาง | ระบบอื่นในเครือ เช่น LOCO24Park และเว็บไซต์ loco.co รับแจ้งผลชำระเงิน คืนเงิน และสถานะอัตโนมัติผ่าน Webhook เมื่อเชื่อมต่อจริง |
การไหลของคำขอ
ทุกการทำงานในระบบเดินตามเส้นทางเดียวกันเสมอ ทำให้ตรวจสอบและต่อระบบเพิ่มได้ง่าย:
- เข้าสู่ระบบ: ผู้ใช้เปิดคอนโซลและยืนยันตัวตน ระบบตรวจสิทธิ์ตาม 4 บทบาทก่อนแสดงข้อมูล
- สร้างรายการรับชำระ: จากจุดรับเงินหรือลิงก์ชำระเงิน ระบบส่งคำขอไปยังธนาคารของช่องทางนั้น
- ลูกค้าชำระเงิน: ลูกค้าจ่ายในแอปธนาคารของตนเอง (QR บัตร หรือผ่อนชำระ) ไม่ผ่านหน้าจอของระบบ
- รับผลยืนยัน: ธนาคารส่งผลกลับแบบ Webhook ระบบบันทึกธุรกรรมทันทีและแจ้งระบบปลายทาง
- รวมรอบโอนและกระทบยอด: สิ้นวัน ระบบรวมยอดเป็นรอบ T+1 หักค่าธรรมเนียม และเทียบยอดกับธนาคารอัตโนมัติ
- คืนเงินเมื่อจำเป็น: ทีมการเงินยืนยันคำขอ ระบบส่งไปธนาคารและติดตามผลจนบันทึกในรายงานครบถ้วน
บทบาทและสิทธิ์การใช้งาน
ระบบแบ่งสิทธิ์ผู้ใช้เป็น 4 บทบาท ครอบคลุม 10 สิทธิ์ใน 4 กลุ่มงาน (ธุรกรรม การเงิน รายงาน และระบบ) โดยผู้ดูแลระบบกำหนดบทบาทของแต่ละคนได้ พร้อมกำหนดขอบเขตจุดรับเงินที่รับผิดชอบ (ทุกจุด หรือเลือกเฉพาะจุด) การแยกแบบนี้ทำให้ทีมปฏิบัติการสร้างรายการรับชำระได้ แต่แตะต้องงานเงินไม่ได้ และทีมการเงินคุมการคืนเงินกับกระทบยอดโดยไม่ต้องเห็นการตั้งค่าระบบ
| บทบาท | ทำได้ | ขอบเขต |
|---|---|---|
| ผู้ดูแลระบบ | ทุกส่วนของระบบ รวมการจัดการผู้ใช้งาน ช่องทางธนาคาร และการตั้งค่าระบบ (10 จาก 10 สิทธิ์) | ทุกจุดรับเงิน |
| การเงิน | ดูธุรกรรม คืนเงิน ดูรอบชำระบัญชี ยืนยันกระทบยอด ดูรายงาน และส่งออกรายงาน (6 สิทธิ์) | ทุกจุดรับเงิน |
| ปฏิบัติการ | ดูธุรกรรม สร้างลิงก์ชำระเงิน และดูรายงาน (3 สิทธิ์) | เฉพาะจุดรับเงินที่ได้รับมอบหมาย |
| ผู้ชมรายงาน | ดูธุรกรรมและดูรายงานได้อย่างเดียว (2 สิทธิ์) เหมาะกับผู้บริหารที่ต้องการติดตามผล | ทุกจุดรับเงิน |
| สิทธิ์ | ผู้ดูแลระบบ | การเงิน | ปฏิบัติการ | ผู้ชมรายงาน |
|---|---|---|---|---|
| ดูรายการธุรกรรมทั้งหมด | ● | ● | ● | ● |
| สร้างและยืนยันการคืนเงิน | ● | ● | ||
| สร้างลิงก์ชำระเงิน | ● | ● | ||
| ดูรอบชำระบัญชีและยอดโอน | ● | ● | ||
| ยืนยันผลกระทบยอดกับธนาคาร | ● | ● | ||
| ดูรายงานสรุปและค่าธรรมเนียม | ● | ● | ● | ● |
| ส่งออกรายงานเป็นไฟล์ | ● | ● | ||
| ตั้งค่าช่องทางธนาคาร | ● | |||
| จัดการผู้ใช้งานและบทบาท | ● | |||
| แก้ไขการตั้งค่าระบบ | ● |
หน้าจอและความสามารถ
คอนโซลประกอบด้วย 12 หน้าจอ เรียงตามการใช้งานจริงของทีมงาน ตั้งแต่เห็นภาพรวม ลงรายละเอียดธุรกรรม จนถึงการตั้งค่าและตรวจสอบย้อนหลัง ทุกหน้าจอใช้ข้อมูลชุดเดียวกัน การแก้ไขในหน้าหนึ่งจึงสะท้อนถึงหน้าอื่นทันที เช่น เมื่อคืนเงินจากหน้าธุรกรรม รายการจะปรากฏในหน้าคืนเงินและตัวเลขในภาพรวมพร้อมกัน
| หน้าจอ | ทำอะไรได้ |
|---|---|
| เข้าสู่ระบบ | ยืนยันตัวตนด้วยอีเมลและรหัสผ่าน พร้อมตัวเลือกจำการเข้าใช้ในเครื่อง (โหมดสาธิตใช้บัญชีใดก็ได้เพื่อเข้าชม) |
| ภาพรวม | ตัวชี้วัด 4 ด้าน (ยอดรับชำระวันนี้ อัตราความสำเร็จ ยอดรอชำระบัญชี คืนเงินเดือนนี้) กราฟยอดรายวันแยก KBank และ SCB สัดส่วนวิธีชำระ จุดรับเงินยอดสูงสุด สถานะการเชื่อมต่อธนาคาร และธุรกรรมล่าสุด |
| ธุรกรรม | ค้นหาและกรองตามช่องทาง วิธีชำระ สถานะ และช่วงเวลา พร้อมแถบสรุปยอด เปิดรายละเอียดแบบไทม์ไลน์ 5 ขั้น คืนเงิน ส่ง Webhook ซ้ำ คัดลอกเลขอ้างอิง และส่งออก CSV |
| ลิงก์ชำระเงิน | สร้าง QR และลิงก์เรียกเก็บเงิน กำหนดยอด จุดรับเงิน ธนาคาร และอายุลิงก์ ดูตัวอย่าง QR คัดลอกลิงก์ และยกเลิกลิงก์ที่ไม่ใช้แล้ว |
| คืนเงิน | สร้างคำขอคืนเงินโดยเลือกธุรกรรมต้นทาง ระบุเหตุผล คืนเต็มจำนวนหรือบางส่วน ยืนยันก่อนส่งไปธนาคาร และติดตามสถานะจนจบ |
| ชำระบัญชี | ติดตามรอบโอนเงิน T+1 ของทั้งสองธนาคาร สรุปยอดรอโอน ค่าธรรมเนียม และผลกระทบยอด 4 สถานะ พร้อมขั้นตอนยืนยันเมื่อยอดไม่ตรง |
| ร้านค้าและจุดรับเงิน | บริหารจุดรับเงินทุกแห่ง แสดง Merchant ID ของทั้ง KBank และ SCB บริการที่เปิดใช้ จำนวนจุด QR ยอดรับชำระล่าสุด และการระงับหรือเปิดใช้งานจุด |
| ช่องทางธนาคาร | จัดการการเชื่อมต่อ KBank และ SCB เปิดปิดบริการรายวิธีชำระ ตรวจค่าธรรมเนียม (MDR) แก้ไข Merchant ID Terminal Webhook และคีย์ พร้อมทดสอบการเชื่อมต่อและดูกิจกรรมล่าสุด |
| รายงาน | สรุปยอดรับชำระ ค่าธรรมเนียม และอัตราความสำเร็จตามช่วงเวลา 7/14/30 วัน แนวโน้มรายวัน ตารางรายได้รายวัน แยกตามธนาคารและจุดรับเงิน พร้อมส่งออก CSV |
| ผู้ใช้และสิทธิ์ | เพิ่มและแก้ไขผู้ใช้งาน กำหนดบทบาทและขอบเขตจุดรับเงิน ระงับหรือคืนสิทธิ์ และแก้ไขชุดสิทธิ์ของแต่ละบทบาท |
| ตั้งค่า | ข้อมูลบริษัท การแจ้งเตือน 4 รายการ (ธุรกรรมล้มเหลว กระทบยอดไม่ตรง รายงานประจำวัน คำขอคืนเงิน) นโยบายความปลอดภัย และคีย์เชื่อมต่อสำหรับระบบภายนอกพร้อมการหมุนคีย์ |
| บันทึกระบบ | ประวัติการเรียก API และการส่ง Webhook ทุกครั้ง กรองตามประเภทหรือผลตอบกลับ ดูความหน่วงและข้อมูลคำขอฉบับเต็มสำหรับการตรวจสอบ |
หลักการออกแบบหน้าจอ
- ตัวเลขที่เชื่อถือได้: ตัวเลขการเงินทุกตัวใช้ฟอนต์แบบตาราง (tabular) หลักตรงกันทุกแถว อ่านเทียบกันได้ทันที
- ทุกรายการตรวจย้อนได้: ทุกธุรกรรมมีไทม์ไลน์ ทุกการเรียก API มีบันทึก ทุกรอบโอนมีที่มาของยอด
- สองธนาคารเป็นพลเมืองชั้นหนึ่ง: สีและสัญลักษณ์ของ KBank และ SCB ปรากฏสม่ำเสมอทั้งระบบ ช่วยการกวาดสายตาแยกรายธนาคารได้ทันที
- ใช้ได้ทุกขนาดจอ: หน้าจอทำงานได้บนเดสก์ท็อป แท็บเล็ต และมือถือ โดยตารางข้อมูลเลื่อนในกรอบของตนเองไม่ทำหน้าเว็บแตก
ขั้นตอนการทำงานหลัก
การทำงานของระบบวนอยู่กับวงจรเดียวเสมอ: สร้างรายการ ลูกค้าจ่าย ธนาคารยืนยัน บันทึกและแจ้งผล รวมรอบโอน กระทบยอด แล้วเข้าบัญชี วงจรนี้ทำงานอัตโนมัติเกือบทั้งหมด ทีมงานเข้ามาแทรกเฉพาะกรณีคืนเงินหรือเมื่อยอดกระทบไม่ตรงเท่านั้น
5.1 การรับชำระเงินที่จุดรับเงิน
- ทีมงานเปิดรับชำระที่จุดรับเงิน เลือกวิธีชำระ (QR พร้อมเพย์ บัตรเครดิต/เดบิต ผ่อนชำระ หรือวอลเล็ต) และช่องทางธนาคาร
- ระบบสร้างรายการและส่งคำขอไปยังธนาคารของช่องทางนั้น ลูกค้าชำระเงินในแอปธนาคารของตนเอง
- ธนาคารประมวลผลและส่งผลยืนยันกลับแบบ Webhook ระบบบันทึกธุรกรรมพร้อมค่าธรรมเนียมตามอัตราที่ตั้งไว้
- ระบบแจ้งผลไปยังระบบปลายทางทันที (เช่น ระบบลานจอด หรือเว็บไซต์) เพื่อให้งานต่อเนื่อง
- ผู้ใช้เห็นรายการใหม่ในหน้าธุรกรรมทันที พร้อมสถานะและไทม์ไลน์ครบทุกขั้น
- สิ้นวัน รายการที่สำเร็จจะถูกนับเข้ารอบโอนของธนาคารนั้น
5.2 การสร้างลิงก์ชำระเงิน
- ทีมงานสร้างลิงก์ใหม่ ระบุหัวข้อ ยอดเงิน จุดรับเงิน ช่องทางธนาคาร และอายุลิงก์ (3, 7 หรือ 30 วัน)
- ระบบออกรหัสลิงก์พร้อม QR สำหรับส่งให้ลูกค้าทางช่องทางใดก็ได้
- ลูกค้าเปิดลิงก์และชำระเงินผ่านแอปธนาคาร เมื่อสำเร็จ ลิงก์เปลี่ยนเป็นสถานะ "ชำระแล้ว" อัตโนมัติ
- ลิงก์ที่เลยกำหนดเปลี่ยนเป็น "หมดอายุ" เอง และทีมงานยกเลิกลิงก์ที่ไม่ใช้ได้ตลอดเวลา
5.3 การคืนเงิน
- ทีมการเงินเปิดคำขอคืนเงิน เลือกธุรกรรมต้นทาง และระบุเหตุผล (ลูกค้ายกเลิกบริการ ชำระซ้ำซ้อน สแกน QR ซ้ำ หรืออื่น ๆ)
- เลือกระหว่างคืนเต็มจำนวนอัตโนมัติ หรือคืนบางส่วนโดยระบุยอดเอง ระบบตรวจเพดานยอดให้ทันที
- ยืนยันผ่านกล่องยืนยันการเงิน ระบบส่งคำขอไปยังธนาคารและตั้งสถานะ "รอดำเนินการ"
- ธนาคารคืนเงินเข้าช่องทางเดิมของลูกค้า (ใช้เวลาประมาณ 1 ถึง 3 วันทำการ) ระบบอัปเดตสถานะเป็นสำเร็จหรือไม่สำเร็จพร้อมเหตุผล
- ยอดคืนเงินปรากฏในภาพรวม หน้าคืนเงิน และรายงานอัตโนมัติ
5.4 การกระทบยอดและรอบโอนเงิน
- สิ้นวัน ระบบรวมยอดรับชำระที่สำเร็จของแต่ละธนาคารเป็นรอบโอน (T+1) หักค่าธรรมเนียมตามอัตราต่อช่องทาง
- ระบบเทียบยอดของระบบกับยอดที่ธนาคารรายงานอัตโนมัติ ผลลัพธ์เป็น 4 สถานะ: กระทบยอดแล้ว รอตรวจสอบ ไม่ตรง หรือรอโอน
- รอบที่ยอดไม่ตรงจะแสดงส่วนต่างชัดเจน พร้อมขั้นตอนให้ทีมการเงินเทียบกับรายงานธนาคารก่อนยืนยัน
- เมื่อยืนยันแล้ว ระบบบันทึกผลและแสดงยอดโอนสุทธิเข้าบัญชีบริษัทตามรอบของแต่ละธนาคาร (KBank 17:00 น. และ SCB 16:30 น. ในค่าตั้งต้น)
- ทุกอย่างพร้อมสำหรับรายงานประจำวันและการปิดงบ โดยไม่ต้องรวบรวมยอดมือ
5.5 การจัดการช่องทางธนาคาร
- ทีมเทคนิคแก้ไข Merchant ID Terminal Webhook และคีย์ของแต่ละธนาคารได้จากหน้าช่องทางธนาคาร
- เปิดหรือปิดบริการรายวิธีชำระได้ทันที (เช่น ปิดรับผ่อนชำระชั่วคราว) โดยมีผลกับรายการใหม่ทันที
- ทดสอบการเชื่อมต่อได้จากปุ่มทดสอบ ระบบรายงานเวลาตอบกลับของธนาคาร
- ทุกการเปลี่ยนแปลงถูกบันทึกในบันทึกระบบพร้อมผู้ดำเนินการและเวลา
การเชื่อมต่อธนาคาร KBank และ SCB
การเชื่อมต่อออกแบบเป็นสองทางเสมอ: ระบบเป็นฝ่ายส่งคำขอ (สร้างรายการชำระ คืนเงิน ตรวจสอบสถานะ) และเป็นฝ่ายรับผลผ่าน Webhook ที่ธนาคารเรียกกลับมาที่ระบบ ทั้งสองทางยืนยันความถูกต้องด้วยคีย์ของแต่ละช่องทาง และทุกคำขอถูกบันทึกไว้ในบันทึกระบบเพื่อการตรวจสอบ ในโหมดสาธิตปัจจุบัน เส้นทางเหล่านี้จำลองการทำงานครบถ้วน โดยไม่เรียกบริการจริงของธนาคาร
| บริการ | KBank | SCB |
|---|---|---|
| QR พร้อมเพย์ | 0.90% | 0.95% |
| บัตรเครดิต / เดบิต | 2.65% | 2.75% |
| ผ่อนชำระผ่านบัตร | 3.20% | ไม่รองรับ |
| E-Wallet | 1.80% | 2.00% |
| รอบโอนเงิน | ทุกวัน 17:00 น. (T+1) | ทุกวัน 16:30 น. (T+1) |
ข้อมูลที่ต้องเตรียมจากธนาคาร
- Merchant ID และ Terminal ID สำหรับแต่ละจุดรับเงิน (แยกตามธนาคาร)
- คีย์สำหรับเรียกบริการ (Merchant Secret / API Key) ระบบเก็บแบบเข้ารหัสและแสดงเพียงบางส่วน
- บัญชีสำหรับรับโอน ของแต่ละธนาคาร พร้อมรอบโอนที่ตกลงไว้
- อัตราค่าธรรมเนียม (MDR) ตามสัญญา แยกตามวิธีรับชำระ เพื่อให้ระบบคำนวณยอดสุทธิได้ตรง
- Webhook URL ปลายทาง ของระบบ คือ https://api.loco.cloud/hooks/payments/<ช่องทาง> พร้อม Secret สำหรับตรวจลายเซ็น
รูปแบบการรับผลยืนยัน (Webhook)
เมื่อลูกค้าชำระเงินสำเร็จ ธนาคารจะเรียกกลับมาที่ระบบพร้อมข้อมูลยืนยัน ระบบตรวจลายเซ็นก่อนบันทึกทุกครั้ง ตัวอย่างข้อมูลที่ระบบออกแบบไว้:
{
"event": "payment.succeeded",
"ref": "PG-20261016-0042",
"bank": "kbank",
"method": "qr",
"amount": 450,
"fee": 4.05,
"net": 445.95,
"currency": "THB",
"paid_at": "2026-10-16 09:33:12",
"signature": "X-Loco-Signature: t=1760599992, v1=6f3a..."
}
ความน่าเชื่อถือของการรับส่งผล
- ตรวจลายเซ็นทุกครั้ง: ใช้ HMAC-SHA256 ในหัวข้อ X-Loco-Signature ป้องกันข้อมูลปลอม
- ส่งซ้ำอัตโนมัติ: ระบบปลายทางที่ยังไม่ตอบรับจะได้รับ Webhook ซ้ำสูงสุด 3 ครั้ง (เว้นช่วง 2, 4 และ 8 วินาที) ป้องกันเหตุการณ์ตกหล่นชั่วคราว
- บันทึกครบทุกคำขอ: ทั้งขาเข้าและขาออก พร้อมรหัสผลตอบกลับและความหน่วง แสดงในหน้าบันทึกระบบ
- กระทบยอดเป็นด่านสุดท้าย: ก่อนโอนเงินทุกครั้ง ระบบเทียบยอดกับธนาคารอีกชั้นหนึ่ง ไม่โอนยอดที่ไม่ตรงโดยไม่มีการยืนยัน
แบบจำลองข้อมูล
ข้อมูลของระบบยึด ธุรกรรมเป็นศูนย์กลาง ทุกกลุ่มข้อมูลอื่นอ้างอิงกลับมาที่ธุรกรรมเสมอ ทำให้การตรวจสอบทำได้จากจุดเดียว: เปิดธุรกรรมหนึ่งรายการ แล้วเห็นได้ทันทีว่ามาจากจุดรับเงินใด ชำระผ่านช่องทางใด ถูกรวมในรอบโอนไหน มีการคืนเงินหรือไม่ และเกิดบันทึกอะไรขึ้นบ้าง
| กลุ่มข้อมูล | เก็บอะไร | เขตข้อมูลสำคัญ |
|---|---|---|
| ธุรกรรม | รายการรับชำระทุกรายการจากทุกจุดรับเงิน | order_ref · amount · fee · net · method · bank · status · bank_ref |
| คืนเงิน | คำขอคืนเงินที่อ้างอิงธุรกรรมต้นทาง พร้อมเหตุผลและผลลัพธ์ | tx_id · amount · full/partial · reason · status · done_by |
| รอบชำระบัญชี | รอบโอนเงินรายวันของแต่ละธนาคาร พร้อมผลกระทบยอด | bank · date · gross · fee · net · count · status · diff |
| ลิงก์ชำระเงิน | ลิงก์และ QR ที่สร้างเพื่อเรียกเก็บเงิน พร้อมอายุการใช้งาน | title · amount · status · expires · url · paid_tx |
| จุดรับเงิน | จุดรับเงินทุกแห่ง พร้อมบัญชีร้านค้ากับทั้งสองธนาคาร | kbank_mid · scb_mid · services · qr_points · status |
| ช่องทางธนาคาร | การตั้งค่าการเชื่อมต่อของ KBank และ SCB | mid · terminal · services · fees · webhook · account · cycle |
| บันทึกระบบ | ประวัติการเรียก API และการส่ง Webhook ทุกครั้ง | type · bank · http · latency · ref_tx · payload |
| ผู้ใช้และสิทธิ์ | บัญชีทีมงาน บทบาท ขอบเขต และสถานะการใช้งาน | roles · perms · sites_scope · status · last_active |
| การตั้งค่า | ค่าตั้งต้นของระบบ ทั้งข้อมูลบริษัท การแจ้งเตือน และคีย์ภายนอก | company · notifications · security · api_keys |
กติกาความถูกต้องของข้อมูล
- หนึ่งเลขอ้างอิงต่อหนึ่งรายการ: ทุกธุรกรรมมีรหัสเฉพาะรูปแบบ PG-วันเดือนปี-ลำดับ ใช้อ้างอิงกับธนาคาร ระบบปลายทาง และเอกสารได้ตลอดสาย
- คืนเงินไม่เกินยอดจริง: ยอดคืนสะสมทุกรายการของธุรกรรมหนึ่งต้องไม่เกินยอดชำระ และระบบตรวจเพดานให้ก่อนยืนยันทุกครั้ง
- หนึ่งลิงก์ชำระได้ครั้งเดียว: เมื่อลิงก์ถูกชำระสำเร็จ จะผูกกับธุรกรรมนั้นและไม่เปิดรับซ้ำ
- หนึ่งรอบโอนต่อธนาคารต่อวัน: ป้องกันยอดโอนซ้ำหรือตกหล่น และทำให้กระทบยอดตรวจได้ตรงกับรายงานธนาคารเสมอ
ความปลอดภัย
ระบบชำระเงินกำหนดให้ความปลอดภัยเป็นข้อบังคับ ไม่ใช่ตัวเลือก นโยบายของระบบวางไว้สองหลัก: เก็บข้อมูลน้อยที่สุด และ เปิดเผยเท่าที่จำเป็นต่อบทบาทเท่านั้น ข้อมูลบัตรไม่เคยผ่านระบบ เนื่องจากลูกค้าชำระในหน้าแอปธนาคารหรือหน้าของธนาคารโดยตรง
การยืนยันตัวตนและการเข้าถึง
- เข้าสู่ระบบด้วยอีเมลและรหัสผ่าน เมื่อใช้งานจริงรหัสผ่านจัดเก็บแบบเข้ารหัสทางเดียว (hashed) ไม่สามารถอ่านค่าต้นฉบับได้
- ผู้ดูแลระบบสามารถเปิดการยืนยันสองขั้นตอน (2FA) บังคับสำหรับบัญชีระดับผู้ดูแลได้
- เซสชันหมดอายุอัตโนมัติเมื่อไม่มีการใช้งานนาน (ค่าตั้งต้น 8 ชั่วโมง) และบังคับออกจากระบบทุกอุปกรณ์เมื่อเปลี่ยนรหัสผ่าน
- ทุกหน้าจอและทุกการสั่งงานตรวจสิทธิ์ตามบทบาท 4 ระดับ ก่อนแสดงหรือแก้ไขข้อมูล
การเก็บและการแสดงข้อมูลสำคัญ
- คีย์เชื่อมต่อธนาคารและคีย์ API ของระบบภายนอกจัดเก็บแบบเข้ารหัส แสดงเพียงบางส่วน (ปิดอักขระกลาง) และไม่ส่งค่ากลับในรายการใด ๆ
- การหมุนคีย์ (Rotate) ทำได้จากหน้าตั้งค่า พร้อมแจ้งเตือนให้อัปเดตคีย์ที่ระบบปลายทางภายใน 24 ชั่วโมง
- ข้อมูลลูกค้าที่แสดงในธุรกรรมถูกปิดบางส่วน เช่น เบอร์โทรศัพท์ แสดงเท่าที่จำเป็นต่อการติดตามงาน
ความปลอดภัยของการรับส่งข้อมูล
- การรับส่งทุกเส้นทางผ่าน HTTPS ทั้งหมด ไม่มีเส้นทางไม่เข้ารหัส
- Webhook ทุกเส้นทางตรวจลายเซ็น HMAC-SHA256 ก่อนประมวลผล ป้องกันข้อมูลปลอมหรือการแก้ไขระหว่างทาง
- การตั้งค่าช่องทางธนาคารสามารถจำกัดเฉพาะ IP ที่กำหนดได้ (ตัวเลือกสำหรับการใช้งานจริง)
- ข้อมูลที่รับเข้าทุกคำขอถูกตรวจสอบความถูกต้องของรูปแบบก่อนบันทึกเสมอ
การตรวจสอบย้อนหลัง (Audit)
- ทุกการเรียก API และทุก Webhook ถูกบันทึกพร้อมเวลา ผู้ดำเนินการ ปลายทาง รหัสผลตอบกลับ และความหน่วง
- การคืนเงินทุกครั้งมีบันทึกว่าใครเป็นผู้ยืนยัน เวลาใด พร้อมเหตุผลประกอบ
- การเปลี่ยนแปลงการตั้งค่าช่องทางและคีย์ถูกบันทึกพร้อมผู้ดำเนินการ เพื่อตรวจสอบย้อนหลังได้ครบถ้วน
แผนการนำไปใช้งานจริง
การเปลี่ยนจากโหมดสาธิตเป็นระบบใช้งานจริงใช้ขั้นตอนมาตรฐาน 5 ขั้น โดยไม่ต้องรื้อหน้าจอที่สร้างไว้เลย เนื่องจากทุกอย่างใน V1 ออกแบบตามเส้นทางเดียวกับของจริงอยู่แล้ว งานหลักที่เพิ่มคือการได้รับคีย์จากธนาคารและเปิดใช้ส่วนบริการหลังบ้าน
| พร้อมแล้วในเวอร์ชัน V1 | ต้องดำเนินการเพิ่มเมื่อเชื่อมจริง |
|---|---|
| หน้าจอใช้งานครบ 12 หน้าจอ พร้อมการโต้ตอบเต็มรูปแบบ | Merchant ID และคีย์จริงจาก KBank และ SCB ต่อจุดรับเงิน |
| การออกแบบการเชื่อมต่อธนาคาร (คำขอ Webhook ลายเซ็น การส่งซ้ำ) | ส่วนบริการหลังบ้านและฐานข้อมูลกลาง (แนวทาง Cloudflare Worker + D1) |
| ระบบกระทบยอดและรอบโอน T+1 พร้อม 4 สถานะ | การยืนยันตัวตนจริงพร้อมการจัดการรหัสผ่านและ 2FA |
| สิทธิ์ 4 บทบาท 10 สิทธิ์ พร้อมขอบเขตจุดรับเงิน | การทดสอบกับสภาพแวดล้อมทดสอบของธนาคาร (Sandbox) |
| รายงานและการส่งออก CSV ครบทุกมุมมอง | การอบรมทีมงานและการส่งมอบคู่มือปฏิบัติงาน |
ลำดับขั้นตอนเปิดใช้งาน
- เตรียมบัญชีร้านค้ากับธนาคาร: ยื่นเอกสารกับ KBank และ SCB เพื่อเปิดบัญชีร้านค้าสำหรับแต่ละจุดรับเงิน และรับชุดคีย์สำหรับทดสอบ
- ทดสอบใน Sandbox: เชื่อมช่องทางทดสอบของธนาคาร ทดสอบให้ครบทุกเส้น: QR บัตร ผ่อนชำระ คืนเงิน Webhook และกระทบยอด โดยไม่ใช้เงินจริง
- ตั้งค่าในระบบ: กรอก Merchant ID Terminal คีย์ Webhook และอัตราค่าธรรมเนียมตามสัญญา ทดสอบการเชื่อมต่อจากหน้าจอให้ผ่านทุกช่องทาง
- เปิดใช้จริงแบบนำร่อง: ย้ายขึ้นระบบจริงและเปิดทีละ 2 ถึง 3 จุดรับเงินก่อน ตรวจกระทบยอดของรอบแรกให้ตรง ก่อนขยายผลทุกจุด
- เปิดใช้เต็มรูปแบบ: ทดสอบคืนเงินจริงหนึ่งรายการ ทบทวนบันทึกระบบ อบรมทีมตามบทบาท แล้วเปิดใช้งานทุกจุดรับเงิน
การทดสอบและตรวจรับ
ระบบต้นแบบผ่านการตรวจสอบคุณภาพครบทั้งการทำงาน การแสดงผล และเอกสาร ก่อนส่งมอบทุกครั้ง บทนี้อธิบายสิ่งที่ตรวจสอบแล้วในเวอร์ชันปัจจุบัน และเกณฑ์ตรวจรับที่จะใช้เมื่อเชื่อมต่อธนาคารจริง เพื่อให้ทุกฝ่ายเห็นตรงกันว่าอะไรคือความพร้อมใช้งาน
สิ่งที่ตรวจสอบแล้วในเวอร์ชันนี้
- การทำงานอัตโนมัติ 40 รายการ ครอบคลุมทั้ง 12 หน้าจอ ตั้งแต่เข้าสู่ระบบ กรองธุรกรรม เปิดรายละเอียดธุรกรรม ไปจนถึงยืนยันกระทบยอด ผ่านทั้งหมด ไม่พบข้อผิดพลาด
- การแสดงผลทุกขนาดจอ ตรวจที่ความกว้าง 1440 พิกเซลสำหรับเดสก์ท็อป 1024 พิกเซลสำหรับแท็บเล็ต และ 390 พิกเซลสำหรับมือถือ ไม่มีเนื้อหาล้นกรอบหรือถูกบดบัง และตารางข้อมูลเลื่อนในกรอบของตนเอง
- การส่งออกไฟล์ ตรวจไฟล์ CSV ทุกชุด เปิดได้ถูกต้องทั้ง Excel และ Google Sheets รวมถึงการส่งออกเฉพาะรายการที่กรองอยู่
- รูปแบบการพิมพ์ ตรวจการพิมพ์เอกสารและ PDF ขนาด A4 จัดหน้าเรียบร้อย ตารางและแผนภาพไม่ถูกตัดกลางหน้า
- เอกสารระบบ ตรวจความครบถ้วนของทั้ง 12 บทและภาคผนวก ความถูกต้องของทุกสถานะและคำศัพท์ และความสอดคล้องกับตัวระบบ
เกณฑ์ตรวจรับเมื่อเชื่อมต่อธนาคารจริง
| รายการ | เกณฑ์ผ่าน |
|---|---|
| การเชื่อมต่อทุกช่องทาง (KBank และ SCB) | ทดสอบสำเร็จทั้ง QR พร้อมเพย์ บัตรเครดิต และผ่อนชำระ |
| การรับผลอัตโนมัติ (Webhook) | อัตราส่งถึงระบบปลายทางสำเร็จมากกว่า 99% |
| การกระทบยอด | ยอดตรงทุกรอบ ต่อเนื่อง 7 วันติดกัน |
| การคืนเงิน | ทดสอบคืนเงินจริงสำเร็จ อย่างน้อย 1 รายการต่อช่องทาง |
| การอบรมและส่งมอบ | ทีมปฏิบัติการและการเงินใช้งานได้จริงตามบทบาท ครบทุกหน้าจอ |
การดีพลอยและปฏิบัติการ
เวอร์ชันต้นแบบจัดเก็บและเผยแพร่เป็นไฟล์เว็บแอปไฟล์เดียวบน Cloudflare Pages ทำให้เปิดใช้ได้ทุกที่โดยไม่ต้องติดตั้ง เมื่อเชื่อมต่อจริง ส่วนบริการและฐานข้อมูลจะเพิ่มเข้ามาในโครงเดียวกัน บทนี้อธิบายโครงสร้างการจัดเก็บ วิธีปรับปรุงระบบ และงานปฏิบัติการประจำที่ทีมควรทำอย่างสม่ำเสมอ
โครงสร้างการจัดเก็บ
- เวอร์ชันออนไลน์ เผยแพร่บน Cloudflare Pages ที่ loco-payment-gateway.pages.dev อัปเดตได้ทันทีเมื่อมีเวอร์ชันใหม่
- ไฟล์งานต้นทาง แยกเป็นโฟลเดอร์โปรเจ็กต์ พร้อมสคริปต์ประกอบไฟล์เดียว จึงสร้างเวอร์ชันใหม่ได้ทุกเมื่อด้วยคำสั่งเดียว
- การเก็บย้อนหลัง ทุกเวอร์ชันเดิมถูกเก็บครบสำหรับเทียบและย้อนกลับได้เสมอ
- เอกสารระบบ จัดเก็บเป็นชุดเดียวกันทั้งเวอร์ชันเว็บ ไฟล์ PDF และแผนภาพ อยู่คู่กับตัวระบบ
การปรับปรุงระบบ
- แก้ไขที่ไฟล์ต้นทางเท่านั้น ไม่แก้ไฟล์ที่เผยแพร่แล้วโดยตรง เพื่อให้ทุกอย่างตรวจสอบย้อนกลับได้
- สร้างเวอร์ชันใหม่โดยเพิ่มเลขรุ่นถัดไป ระบบจะเก็บรุ่นเดิมเข้ากรุให้อัตโนมัติ
- ตรวจสอบตามรายการมาตรฐาน 40 ข้อ และตรวจการแสดงผลทุกขนาดจอก่อนเผยแพร่ทุกครั้ง
- หลังเผยแพร่ แจ้งทีมงานพร้อมบันทึกสิ่งที่เปลี่ยนไว้คู่กับเอกสารฉบับนี้
งานปฏิบัติการประจำ
| รอบเวลา | งาน |
|---|---|
| ทุกวัน | ตรวจหน้าชำระบัญชีว่าไม่มีรอบค้างสถานะยอดไม่ตรง และตรวจบันทึกระบบว่าไม่มีผลตอบกลับผิดพลาดซ้ำ ๆ ต่อเนื่องกัน |
| ทุกสัปดาห์ | เทียบรอบโอนทั้งสองธนาคารกับรายงานธนาคาร ทบทวนอัตราความสำเร็จ และรายการคืนเงินที่ค้างอยู่ |
| ทุกเดือน | หมุนคีย์เชื่อมต่อตามนโยบาย ทบทวนสิทธิ์ผู้ใช้งาน และตรวจความครบของข้อมูลสำหรับปิดงบ |
ข้อจำกัดและแนวทางต่อไป
ข้อจำกัดที่ทราบ ณ เวอร์ชันนี้
- ข้อมูลในโหมดสาธิตเป็นข้อมูลตัวอย่างที่ฝังในตัว ไม่ผูกกับธุรกรรมจริง และจะถูกรีเซ็ตเมื่อเปิดไฟล์ใหม่
- การเรียกธนาคารเป็นการจำลองครบทุกเส้นทาง แต่ยังไม่มีการส่งคำขอจริงออกนอกระบบ
- การแจ้งเตือนภายนอก (อีเมล รายงานประจำวัน) เป็นการตั้งค่าเตรียมไว้ จะเริ่มทำงานเต็มรูปแบบเมื่อเชื่อมผู้ให้บริการ
- รายงานเน้นช่วง 7/14/30 วัน ยังไม่มีรายงานเปรียบเทียบรายปีหรือรายงานภาษีเฉพาะกิจ
แนวทางพัฒนาต่อไป
- เชื่อมธนาคารจริง: ดำเนินการตามแผนในบทที่ 9 เพื่อให้ระบบรับชำระและกระทบยอดด้วยข้อมูลจริง
- แจ้งเตือนเชิงรุก: เชื่อม LINE แจ้งทีมการเงินทันทีเมื่อมีธุรกรรมล้มเหลวหรือยอดกระทบไม่ตรง
- เอกสารอัตโนมัติ: ออกใบเสร็จรับเงินและใบกำกับภาษีอัตโนมัติจากรายการชำระ คู่กับชุดเลขหมายแยกตามกฎหมาย
- รายงานขั้นสูง: เปรียบเทียบช่วงเวลา วิเคราะห์ค่าธรรมเนียมย้อนหลัง และมุมมองสำหรับผู้บริหาร
- เชื่อมระบบในเครือครบวงจร: ขยาย Webhook ไปยังทุกผลิตภัณฑ์ LOCO เพื่อให้การรับชำระจบในระบบเดียวโดยไม่ต้องบันทึกซ้ำ
ภาคผนวก: สถานะอ้างอิงและคำศัพท์
สถานะของรายการในระบบ
| รายการ | สถานะ | ความหมาย |
|---|---|---|
| ธุรกรรม | รอชำระ | สร้างรายการแล้ว รอลูกค้าชำระเงิน (QR หรือลิงก์หมดอายุได้ตามกำหนด) |
| สำเร็จ | ธนาคารยืนยันการชำระแล้ว บันทึกยอดพร้อมค่าธรรมเนียมเรียบร้อย | |
| ไม่สำเร็จ | ธนาคารปฏิเสธหรือลูกค้ายกเลิก ไม่มีการตัดเงิน | |
| คืนเงินแล้ว | รายการนี้ถูกคืนเงินเรียบร้อยแล้วตามคำขอที่อนุมัติ | |
| คืนเงิน | รอดำเนินการ | ส่งคำขอไปธนาคารแล้ว รอผลยืนยัน (ประมาณ 1 ถึง 3 วันทำการ) |
| สำเร็จ | ธนาคารคืนเงินเข้าช่องทางเดิมของลูกค้าเรียบร้อย | |
| ไม่สำเร็จ | ธนาคารปฏิเสธคำขอ พร้อมเหตุผลระบุในรายการ | |
| รอบชำระบัญชี | รอโอน | รวบยอดรอบวันแล้ว รอเวลารอบโอนของธนาคาร |
| รอตรวจสอบ | รอบนี้รอทีมการเงินตรวจสอบและยืนยันกระทบยอด | |
| ไม่ตรง | ยอดโอนต่างจากยอดในระบบ แสดงส่วนต่างให้ตรวจสอบก่อนยืนยัน | |
| กระทบยอดแล้ว | ยอดตรงกันและโอนเข้าบัญชีบริษัทเรียบร้อย | |
| ลิงก์ชำระเงิน | ใช้งาน | ลิงก์พร้อมให้ลูกค้าชำระ ยังไม่หมดอายุ |
| ชำระแล้ว | ลูกค้าชำระผ่านลิงก์นี้สำเร็จแล้ว | |
| หมดอายุ | เลยกำหนดอายุลิงก์ สร้างใหม่ได้เมื่อต้องการ | |
| ยกเลิก | ทีมงานยกเลิกลิงก์นี้ก่อนถูกใช้งาน |
คำศัพท์ที่ใช้ในระบบ
- QR พร้อมเพย์ (PromptPay QR): การชำระเงินด้วยการสแกน QR ผ่านแอปธนาคาร เป็นวิธีที่ค่าธรรมเนียมต่ำและสำเร็จเร็วที่สุด
- MDR (Merchant Discount Rate): อัตราค่าธรรมเนียมที่ธนาคารหักจากยอดชำระ คิดเป็นเปอร์เซ็นต์ตามวิธีรับชำระ
- รอบโอน T+1: ธนาคารโอนยอดรับชำระของวันนี้เข้าบัญชีในวันถัดไป หลังหักค่าธรรมเนียม
- Webhook: การที่ธนาคารหรือระบบภายนอกเรียกกลับมาที่ระบบของเราโดยอัตโนมัติเมื่อมีเหตุการณ์เกิดขึ้น เช่น ชำระสำเร็จหรือคืนเงินสำเร็จ
- HMAC-SHA256: วิธีลงลายเซ็นดิจิทัลสำหรับ Webhook เพื่อยืนยันว่าข้อมูลมาจากแหล่งที่เชื่อถือได้และไม่ถูกแก้ไข
- Merchant ID / Terminal: รหัสบัญชีร้านค้าและรหัสเครื่องรับชำระที่ธนาคารออกให้ ใช้ระบุว่ายอดนี้เป็นของจุดรับเงินใด
- กระทบยอด (Reconciliation): การเทียบยอดในระบบกับยอดที่ธนาคารรายงาน ให้ตรงกันก่อนโอนเงินทุกครั้ง
- Sandbox: สภาพแวดล้อมทดสอบของธนาคาร ใช้ซ้อมทุกขั้นตอนโดยไม่ใช้เงินจริง
- PDPA: พระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคล ระบบออกแบบให้เก็บข้อมูลเท่าที่จำเป็นและเข้าถึงตามสิทธิ์