Webhook ของ P2P

เข้าใจภาพรวมก่อน แล้วเปิดเฉพาะรายละเอียดที่ต้องใช้

1. ภาพรวมที่ต้องรู้

ผู้ฝากโอนเงินเข้าบัญชีผู้ถอนโดยตรง ระบบส่ง webhook แจ้งร้านค้าของแต่ละฝั่ง

ฝั่งฝาก → บันทึกเมื่อชำระสำเร็จ

PAYMENT_PAID

ฝั่งถอน → รอ event ปิดรายการ

แจ้งความคืบหน้า ≠ ถอนสำเร็จ

แต่ละร้านได้รับเฉพาะ event ของรายการตัวเอง · ผลถอนอาจสำเร็จเต็มจำนวน สำเร็จบางส่วน หรือถูกปฏิเสธ

ฝั่งถอนได้ webhook 3 ช่วง

  1. ช่วงที่ 1 · ก่อนเริ่ม

    ยืนยันคำสั่งถอน

    ชื่อ event ที่ร้านได้รับ

    WITHDRAWAL_VERIFY

    เฉพาะร้านที่เปิด verify · ต้องตอบ 2xx ภายใน 10 วินาที

  2. ช่วงที่ 2 · หลายครั้ง

    รายงานความคืบหน้า

    ชื่อ event ที่ร้านได้รับ

    WITHDRAWAL_PARTIALLY_FUNDED

    ทุกครั้งที่รายการย่อยเปลี่ยน ดู reason · ยังไม่บันทึกยอด

  3. ช่วงที่ 3 · 1 ครั้ง

    ปิดรายการ

    ชื่อ event ที่ร้านได้รับ

    WITHDRAWAL_COMPLETEDWITHDRAWAL_COMPLETED_PARTIALLYWITHDRAWAL_REJECT

    ได้อย่างใดอย่างหนึ่ง บันทึกยอดตรงนี้ ดู outcome.result · มาหลังความคืบหน้าครั้งสุดท้ายเสมอ

ช่วงที่ 2 แยกด้วย reason

สัดส่วนจาก production 24 ชม. (13 ต.ค. 2026)
LEG_SETTLED ได้รับเงิน

รายการย่อยได้รับชำระแล้ว (รวมกรณีผู้ฝากชนะข้อพิพาท)

4,234 · 85.3%
PLEDGE_EXPIRED ยังไม่ได้เงิน

ผู้ฝากไม่โอนภายในเวลา

492 · 9.9%
SHORTFALL_TO_BANK ยังไม่ได้เงิน

ส่วนที่ยังขาดส่งให้บัญชีบริษัทโอน

215 · 4.3%
PLEDGE_REJECTED ยังไม่ได้เงิน

ผู้ฝากแพ้ข้อพิพาท ยอดกลับเข้ารายการถอน

24 · 0.5%

3

PARTIALLY_FUNDED เฉลี่ยต่อรายการ (สูงสุด 11)

1,348

ปิดด้วย WITHDRAWAL_COMPLETED

3

ปิดด้วย WITHDRAWAL_REJECT

ถอนไม่ได้ครบ ระบบคืนเงิน — ได้ webhook อะไร

ไม่มี event "refund" แยก · การคืนเงินมากับ webhook ปิดรายการ

จับคู่ได้บางส่วน ส่วนที่เหลือหาผู้ชำระไม่ได้ (ตัวอย่างจริง ถอน 1,000)

WITHDRAWAL_COMPLETED_PARTIALLY

ลูกค้าได้ 900 จากผู้ฝาก 4 รายการย่อย อีก 100 คืน · outcome.result = PARTIALLY_SETTLED

900

ลูกค้าได้

100

คืนลูกค้า

100.20

คืนเข้าร้าน

ไม่ได้รับชำระเลย (ตัวอย่างจริง ถอน 300)

WITHDRAWAL_REJECT

ไม่มีเงินถึงลูกค้า คืนเต็มจำนวน · outcome.result = NOT_SETTLED

0

ลูกค้าได้

300

คืนลูกค้า

300.60

คืนเข้าร้าน

  • คืนลูกค้าเท่ากับ summary.withdrawer_pending_refund เท่านั้น — outcome.refunded_amount / agent_refunded คือยอดคืนเข้าร้านซึ่งรวมค่าธรรมเนียม
  • withdrawal.withdrawal_status เป็น REJECTED ได้แม้ลูกค้าได้เงินไปบางส่วนแล้ว — แยกกรณีด้วย outcome.result / customer_kept_money
  • refund_reason ใน production 72 ชม. ล่าสุดเป็น UNKNOWN 36 จาก 38 ใบ (ที่เหลือ SYSTEM_FAILED) — ใช้บันทึก log ได้ แต่อย่าใช้แยกกรณี

ตัวอย่างจริง: ถอน 700 บาท

webhook ที่ร้านได้รับจริง · เวลาไทย · ปิด id ไว้
  1. 09:46PARTIALLY_FUNDEDLEG_SETTLED

    ได้ 100 (รายการย่อย 1/3)

    100 / 700
  2. 09:49PARTIALLY_FUNDEDLEG_SETTLED

    ได้ 300 (รายการย่อย 3/3)

    400 / 700
  3. 10:00PARTIALLY_FUNDEDPLEDGE_EXPIRED

    รายการย่อย 300 ไม่ได้โอน

    400 / 700
  4. 10:19PARTIALLY_FUNDEDLEG_SETTLED

    ผู้ฝากรายใหม่ชำระ 100

    500 / 700
  5. 10:45PARTIALLY_FUNDEDSHORTFALL_TO_BANK

    ปิดรอบ ส่วนที่ยังขาด 100 ส่งให้บัญชีบริษัทโอน

    600 / 700
  6. 12:34WITHDRAWAL_COMPLETEDFULLY_SETTLED

    ลูกค้าได้ครบ 700 (P2P 600 + บัญชีบริษัท 100)

    700 / 700

ยอดสะสมให้อ่านจาก progress.settled_amount ไม่ใช่นับจำนวนครั้ง — ที่ 10:45 ยอดขยับจาก 500 เป็น 600 ใน webhook SHORTFALL_TO_BANK โดยไม่มี LEG_SETTLED แยก · บันทึกยอดเมื่อได้ WITHDRAWAL_COMPLETED เท่านั้น

2. ดูจากตัวอย่าง

3. คู่มือสำหรับนักพัฒนา

ตัวอย่าง webhook ของฝากอัตโนมัติ