# payment.paid Webhook

CentralPay ส่ง HTTP POST มาที่ Callback URL ของ Merchant เมื่อ Invoice เปลี่ยนเป็น PAID ไม่ว่าจะมาจาก AUTO, MANUAL_MATCH หรือ MANUAL_CONFIRM

## SHOP endpoint

`/public/webhook/centralpay.php`

## Verification

1. อ่าน raw request body
2. คำนวณ `sha256=` + HMAC-SHA256(raw body, webhook_secret)
3. เทียบกับ `X-Payment-Signature` ด้วย constant-time comparison
4. ตรวจ `event_id` และ `X-Payment-Event`
5. รับเฉพาะ `payment.paid` สำหรับ fulfillment
6. กันซ้ำด้วย `event_id` และ `invoice_no`
7. อัปเดตเครดิต/Order ใน transaction เดียว
8. ตอบ HTTP 200 เมื่อรับและประมวลผลสำเร็จ

Reference code อยู่ที่ `public/webhook/centralpay.php` และ `src/PaymentCreditService.php`.

> โปรแกรมเมอร์ที่นำตัวอย่างนี้ไปใช้กับร้านจริง ให้เปลี่ยนส่วน `members.credit` ใน `PaymentCreditService` เป็น business fulfillment ของระบบตัวเอง เช่น เติม Wallet, mark order paid, activate service หรือออกสินค้า แต่คง Signature verification และ Idempotency ไว้
