วิธีเพิ่มการชำระเงินในแอปของคุณ: การเช็คเอาต์ การสมัครสมาชิก และ Webhook
วิธีที่ง่ายที่สุดในการเพิ่มการชำระเงินให้แอปคือใช้ Stripe: ใช้ Payment Link ถ้าคุณแค่ต้องการปุ่ม "ซื้อ" และจัดการคำสั่งซื้อด้วยตนเองได้ ใช้ Stripe Checkout ถ้าแอปของคุณต้องรู้ว่าใครจ่ายเงินและตอบสนองโดยอัตโนมัติ และใช้ Checkout ในโหมด สมัครสมาชิก ร่วมกับพอร์ทัลลูกค้าของ Stripe สำหรับการเรียกเก็บเงินแบบต่อเนื่อง ในทุกกรณียกเว้นแบบที่ง่ายที่สุด คุณยังต้องใช้ webhook ซึ่งเป็น endpoint บนเซิร์ฟเวอร์ที่ Stripe เรียกเมื่อการชำระเงินสำเร็จ และควรทดสอบทุกอย่างด้วยคีย์ทดสอบและบัตรทดสอบของ Stripe ก่อนเปลี่ยนไปใช้คีย์จริง
คู่มือนี้อธิบายแต่ละตัวเลือก ส่วนของ webhook ที่บทเรียนส่วนใหญ่ข้ามไป และสิ่งที่ควรตรวจก่อนรับเงินจริง รายละเอียดของ Stripe อ้างอิงจากเอกสารของ Stripe เองณ เดือนกันยายน 2026
ทำไมต้องใช้ผู้ให้บริการชำระเงิน
อย่าเก็บเลขบัตรในฟอร์มของคุณเอง การจัดการข้อมูลบัตรดิบทำให้คุณต้องอยู่ในขอบเขตของ PCI DSS (มาตรฐานความปลอดภัยของอุตสาหกรรมบัตร) และมีความรับผิดชอบสูงมาก ผู้ให้บริการชำระเงินอย่าง Stripe จะโฮสต์ฟอร์มการชำระเงิน จัดเก็บบัตร ดำเนินการยืนยันตัวตนกับธนาคาร และแจ้งผลให้แอปของคุณ แอปของคุณจะเห็นเพียงว่า "ลูกค้า X จ่ายเงินสำหรับ Y"
คู่มือนี้ใช้ Stripe เพราะใช้กันอย่างแพร่หลาย มีเอกสารครบถ้วน และเครื่องมือสร้างแอปด้วย AI ส่วนใหญ่รองรับ มีผู้ให้บริการอื่นอยู่ และบางรายทำหน้าที่เป็น "ผู้ขายตามบันทึก" ที่รับภาระการจัดการภาษีการขายแทนคุณ หากการปฏิบัติตามกฎภาษีทำให้คุณกังวล โมเดลนั้นควรค่าแก่การเปรียบเทียบ
สามวิธีในการรับการชำระเงินด้วย Stripe
| ตัวเลือก | ต้องเขียนโค้ดไหม | แอปรู้ไหมว่าใครจ่าย | เหมาะกับ |
|---|---|---|---|
| Payment Links | ไม่ต้อง | รู้ก็ต่อเมื่อเพิ่ม webhook | ขายสินค้าคงที่ไม่กี่รายการ รับบริจาค ทดสอบความต้องการ |
| Checkout (ครั้งเดียว) | ต้องเขียนโค้ดฝั่งเซิร์ฟเวอร์เพื่อสร้าง session | รู้ได้ ผ่าน webhook | ร้านค้า การดาวน์โหลดแบบเสียเงิน การซื้อครั้งเดียว |
| Checkout (สมัครสมาชิก) | โค้ดฝั่งเซิร์ฟเวอร์ และการจัดการ webhook | รู้ได้ ผ่าน webhook | SaaS สมาชิกภาพ ทุกอย่างที่เกิดซ้ำ |
Payment Links
Payment Link คือหน้าชำระเงินที่ Stripe โฮสต์ไว้ ซึ่งคุณสร้างใน Stripe Dashboard โดยไม่ต้องเขียนโค้ด คุณจะได้ URL ที่นำไปไว้หลังปุ่มในแอป แชร์ทางอีเมล หรือแสดงเป็น QR code ได้ เอกสารของ Stripe ระบุว่า Payment Link ขายสินค้า การสมัครสมาชิก หรือรับบริจาคได้ และคุณให้ลูกค้าเลือกจำนวนเงินเองหรือจำกัดจำนวนการซื้อได้
ข้อควรระวังคือ แอปของคุณไม่ได้รู้โดยอัตโนมัติว่าผู้ใช้ที่ล็อกอินอยู่คนใดจ่ายเงิน สำหรับหน้าบริจาคหรือร้านเล็กๆ ที่คุณจัดส่งคำสั่งซื้อเองจากการแจ้งเตือนทางอีเมลของ Stripe ก็ใช้ได้ แต่สำหรับ "จ่ายเพื่อปลดล็อกฟีเจอร์ Pro" ใช้ไม่ได้
Stripe Checkout
Checkout คือหน้าชำระเงินที่เซิร์ฟเวอร์ของคุณสร้างขึ้นเมื่อต้องการสำหรับการซื้อเฉพาะรายการ เซิร์ฟเวอร์บอก Stripe ว่าจะซื้ออะไร (และถ้าต้องการ ระบุว่าใครเป็นผู้ซื้อ) Stripe ส่ง URL กลับมา แล้วคุณส่งลูกค้าไปที่นั่น เอกสารของ Stripe ระบุว่ารองรับทั้งการชำระครั้งเดียวและการสมัครสมาชิก ทั้งในรูปแบบหน้าเต็มที่ Stripe โฮสต์ หน้าที่ฝังในเว็บไซต์ของคุณ หรือฟอร์มแบบฝัง
ขั้นตอนมีดังนี้:
- ลูกค้าคลิก ซื้อ ในแอปของคุณ
- เซิร์ฟเวอร์ ของคุณสร้าง Checkout Session โดยใช้คีย์ลับ พร้อม ID ที่เชื่อมกับผู้ใช้หรือคำสั่งซื้อของคุณ
- ลูกค้าถูกส่งไปยัง Stripe และชำระเงิน
- Stripe ส่งลูกค้ากลับมายังหน้าสำเร็จของคุณ
- Stripe ส่งเหตุการณ์
checkout.session.completedไปยัง webhook ของคุณ และเซิร์ฟเวอร์ของคุณทำเครื่องหมายว่าคำสั่งซื้อจ่ายแล้วหรือปลดล็อกการเข้าถึง
ขั้นตอนที่ 2 ต้องเกิดบนเซิร์ฟเวอร์ เพราะใช้คีย์ลับของคุณ นี่คือเหตุผลหลักที่ Checkout ต้องมี backend
การสมัครสมาชิก
การสมัครสมาชิกใช้ Checkout ในโหมดสมัครสมาชิกร่วมกับราคาแบบเกิดซ้ำที่คุณตั้งค่าไว้ใน Stripe การชำระครั้งแรกทำงานเหมือนขั้นตอนข้างต้น หลังจากนั้น การต่ออายุ บัตรที่ล้มเหลว การอัปเกรด และการยกเลิกจะเกิดขึ้นตามเวลา มักเกิดตอนที่ลูกค้าไม่ได้อยู่ในแอปของคุณเลย ดังนั้นแอปจะรู้เรื่องเหล่านี้ได้ก็ต่อเมื่อผ่าน webhook เท่านั้น
สำหรับให้ลูกค้าจัดการการสมัครสมาชิกของตนเอง Stripe มี พอร์ทัลลูกค้า ที่โฮสต์ไว้ ตามเอกสารของ Stripe ลูกค้าสามารถอัปเดตวิธีการชำระเงินและรายละเอียดการเรียกเก็บเงิน เปลี่ยนหรือยกเลิกการสมัครสมาชิก และดูและดาวน์โหลดใบแจ้งหนี้ได้ที่นั่น คุณตั้งค่าได้ใน Stripe Dashboard แล้วเพิ่มปุ่ม "จัดการการเรียกเก็บเงิน" ที่ส่งลูกค้าไปยังพอร์ทัล วิธีนี้ช่วยให้คุณไม่ต้องสร้างหน้าเหล่านั้นเอง
Webhook: ส่วนที่ข้ามไม่ได้
Webhook คือคำขอ HTTP ที่ Stripe ส่งมายังเซิร์ฟเวอร์ของคุณเมื่อมีบางอย่างเกิดขึ้น (ดู webhook คืออะไร สำหรับแนวคิดทั่วไป) คู่มือการดำเนินการของ Stripe ระบุไว้ชัดเจนว่าคุณไม่ควรพึ่งหน้าสำเร็จเพียงอย่างเดียวในการดำเนินการคำสั่งซื้อ เพราะลูกค้าอาจจ่ายเงินแล้วขาดการเชื่อมต่อก่อนที่หน้านั้นจะโหลด สำหรับการสมัครสมาชิกและวิธีการชำระเงินที่ล่าช้า webhook เป็นสิ่งจำเป็น
เหตุการณ์ที่ควรจัดการ
| เหตุการณ์ | ความหมาย | แอปของคุณควรทำอะไร |
|---|---|---|
checkout.session.completed | Checkout เสร็จสิ้น | ทำเครื่องหมายคำสั่งซื้อว่าจ่ายแล้ว หรือเริ่มให้สิทธิ์การเข้าถึง |
checkout.session.async_payment_succeeded | วิธีที่ล่าช้า (เช่น การหักบัญชีธนาคาร) ผ่านในภายหลัง | ดำเนินการทันที |
checkout.session.async_payment_failed | การชำระแบบล่าช้านั้นล้มเหลว | แจ้งลูกค้า อย่าดำเนินการ |
invoice.paid | การชำระการสมัครสมาชิกสำเร็จ รวมถึงการต่ออายุ | ขยายระยะเวลาการเข้าถึง |
invoice.payment_failed | การต่ออายุล้มเหลว | เตือนผู้ใช้ Stripe อาจลองใหม่ |
customer.subscription.updated | แพ็กเกจเปลี่ยน หรือมีการกำหนดให้ยกเลิก | อัปเดตแพ็กเกจของผู้ใช้ |
customer.subscription.deleted | การสมัครสมาชิกสิ้นสุด | เอาสิทธิ์การเข้าถึงแบบชำระเงินออก |
กฎสำหรับตัวจัดการ webhook ที่ถูกต้อง
กฎเหล่านี้มาจากเอกสาร webhook ของ Stripe โดยตรง และตัวจัดการที่สร้างด้วย AI บางครั้งข้ามไปข้อหนึ่ง:
- ตรวจลายเซ็น ทุกเหตุการณ์มีส่วนหัว
Stripe-Signatureตัวจัดการของคุณตรวจด้วยคีย์ลงนามของ endpoint (ขึ้นต้นด้วยwhsec_) หากไม่ทำ ใครก็สามารถส่ง "การชำระเงินสำเร็จ" ปลอมมายังเซิร์ฟเวอร์ของคุณได้ - ใช้เนื้อหาคำขอแบบดิบ การตรวจลายเซ็นจะล้มเหลวหากเฟรมเวิร์กของคุณแยกวิเคราะห์หรือแก้ไขเนื้อหาก่อน
- ตอบกลับด้วย 2xx อย่างรวดเร็ว แล้วค่อยทำงานที่ช้ากว่า การหมดเวลาถือเป็นความล้มเหลว
- จัดการรายการซ้ำ Stripe อาจส่งเหตุการณ์เดิมมากกว่าหนึ่งครั้ง บันทึก ID ของเหตุการณ์ที่ประมวลผลแล้ว หรือทำให้การดำเนินการปลอดภัยเมื่อรันซ้ำ
- อย่าสมมติลำดับ Stripe ไม่รับประกันว่าเหตุการณ์จะมาถึงตามลำดับที่เกิดขึ้นจริง
- คาดว่าจะมีการลองใหม่ ในโหมดใช้งานจริง Stripe จะลองส่งที่ล้มเหลวใหม่นานสูงสุดสามวัน ดังนั้นการหยุดทำงานสั้นๆ จะไม่ทำให้การชำระเงินหาย แต่ตัวจัดการของคุณต้องรับมือกับเหตุการณ์ที่มาช้าได้
Webhook ต้องมีที่อยู่ HTTPS สาธารณะ ดังนั้นมักใช้งานได้ก็ต่อเมื่อแอปของคุณเผยแพร่แล้ว (CLI ของ Stripe สามารถส่งเหตุการณ์ไปยังเครื่องในเครื่องสำหรับนักพัฒนาได้)
พรอมต์ที่ครอบคลุมทั้งขั้นตอน
เพิ่มการซื้อครั้งเดียวด้วย Stripe Checkout สำหรับ "Pro pack" (price ID อยู่ใน STRIPE_PRICE_ID) สร้าง Checkout Session บนเซิร์ฟเวอร์โดยใช้ STRIPE_SECRET_KEY จาก secrets และใส่ ID ของผู้ใช้ที่ล็อกอินอยู่ในเซสชัน เพิ่ม endpoint POST /api/stripe/webhook ที่ตรวจลายเซ็น Stripe ด้วย STRIPE_WEBHOOK_SECRET โดยใช้เนื้อหาคำขอแบบดิบ จัดการ checkout.session.completed และทำเครื่องหมายว่าผู้ใช้คนนั้นมี Pro pack ทำให้ปลอดภัยหากเหตุการณ์เดิมมาถึงสองครั้ง เพิ่มหน้าสำเร็จและหน้ายกเลิก อย่าเปิดเผยคีย์ลับให้เบราว์เซอร์เด็ดขาด
สำหรับการสมัครสมาชิก เพิ่ม: "ใช้โหมดสมัครสมาชิกกับ STRIPE_PRICE_ID จัดการ invoice.paid, invoice.payment_failed, customer.subscription.updated และ customer.subscription.deleted เพิ่มปุ่มจัดการการเรียกเก็บเงินที่เปิดพอร์ทัลลูกค้าของ Stripe"
โหมดทดสอบ
Stripe มีสภาพแวดล้อม sandbox (ทดสอบ) และสภาพแวดล้อมใช้งานจริงแยกกัน พร้อมคีย์แยกกัน คีย์ sandbox ขึ้นต้นด้วย pk_test_, sk_test_ หรือ rk_test_ ส่วนคีย์ใช้งานจริงขึ้นต้นด้วย pk_live_, sk_live_ หรือ rk_live_ ธุรกรรมทดสอบไม่มีการโอนเงิน
บัตรทดสอบที่มีประโยชน์จากเอกสารการทดสอบของ Stripe (วันหมดอายุในอนาคตใดก็ได้ CVC สามหลักใดก็ได้):
| หมายเลขบัตร | ผลลัพธ์ |
|---|---|
4242 4242 4242 4242 | การชำระเงินสำเร็จ |
4000 0000 0000 0002 | บัตรถูกปฏิเสธ |
4000 0000 0000 3220 | ต้องยืนยันตัวตนด้วย 3D Secure แล้วจึงสำเร็จ |
ทดสอบอย่างน้อยดังนี้:
- การชำระเงินที่สำเร็จปลดล็อกสิ่งที่ถูกต้องให้ผู้ใช้ที่ถูกต้อง
- บัตรที่ถูกปฏิเสธแสดงข้อความที่ชัดเจนและไม่ปลดล็อกอะไรเลย
- การปิดแท็บเบราว์เซอร์ทันทีหลังจ่ายเงินยังคงให้สิทธิ์การเข้าถึง (ซึ่งพิสูจน์ว่า webhook ทำงาน ไม่ใช่แค่หน้าสำเร็จ)
- การยกเลิกในหน้าของ Stripe พากลับมายังแอปของคุณโดยไม่มีการเรียกเก็บเงิน
- สำหรับการสมัครสมาชิก: ยกเลิกในพอร์ทัลลูกค้า และยืนยันว่าการเข้าถึงสิ้นสุดในเวลาที่ควร
การเปิดใช้งานจริง
- เปิดใช้งานบัญชี Stripe ของคุณด้วยข้อมูลธุรกิจและบัญชีธนาคาร
- เปลี่ยนเป็นคีย์ใช้งานจริง ในความลับของแอป Stripe แนะนำคีย์แบบจำกัดที่มีสิทธิ์เฉพาะที่การเชื่อมต่อของคุณต้องการ แทนคีย์ลับที่ไม่จำกัด
- สร้าง endpoint webhook สำหรับใช้งานจริง ที่ชี้ไปยังแอปที่เผยแพร่แล้ว มีคีย์ลงนามของตัวเอง ซึ่งต่างจากของทดสอบ จึงต้องอัปเดต
- สร้างผลิตภัณฑ์และราคาใหม่ในโหมดใช้งานจริง เพราะ ID จากโหมดทดสอบไม่มีอยู่ที่นั่น
- ทำการซื้อจริงขนาดเล็กหนึ่งรายการ แล้วคืนเงิน
เก็บทุกคีย์ไว้ในความลับของโปรเจกต์ อย่าใส่ในโค้ดหรือในแชท เช็กลิสต์ความปลอดภัย ของเราครอบคลุมเรื่องคีย์และการตรวจ webhook อย่างละเอียดกว่านี้
ภาษี การคืนเงิน และเอกสาร
การชำระเงินมาพร้อมภาระหน้าที่ที่โค้ดแก้ให้ไม่ได้ นี่ไม่ใช่คำแนะนำด้านภาษี ควรปรึกษานักบัญชี
- ภาษีการขาย VAT และ GST ขึ้นอยู่กับที่ตั้งของคุณและลูกค้า คุณอาจต้องลงทะเบียน เก็บ และยื่นภาษี Stripe Tax สามารถคำนวณและเก็บภาษีตอนเช็คเอาต์ ติดตามว่ายอดขายของคุณก่อภาระที่ไหน และช่วยเรื่องการลงทะเบียนและการยื่นได้ แต่ความรับผิดชอบยังอยู่กับคุณ ผู้ให้บริการแบบผู้ขายตามบันทึกเป็นทางเลือกที่รับภาระนี้มากขึ้น
- การคืนเงินและข้อพิพาท กำหนดนโยบายการคืนเงินก่อนเปิดตัว และแสดงไว้บนเว็บไซต์ ข้อพิพาท (chargeback) เกิดขึ้นได้ ให้เก็บบันทึกว่าซื้ออะไรและส่งมอบอะไรแล้ว
- ใบเสร็จและใบแจ้งหนี้ Stripe ส่งใบเสร็จทางอีเมลได้ ธุรกิจอาจต้องใช้ใบแจ้งหนี้ที่ถูกต้องตามกฎหมาย
- ค่าธรรมเนียม ผู้ให้บริการทุกรายเก็บค่าธรรมเนียมต่อการทำธุรกรรม ตรวจหน้าราคาปัจจุบันของผู้ให้บริการ แทนการพึ่งตัวเลขในบทความ
การตั้งค่าแบบไหนเหมาะกับแอปของคุณ
- การบริจาคหรือสินค้าไม่กี่รายการ: Payment Links ดู วิธีสร้างเว็บไซต์รับบริจาคสำหรับองค์กรไม่แสวงผลกำไร
- ร้านค้าที่มีตะกร้า: Checkout พร้อมรายการสินค้าและ webhook ดู วิธีสร้างร้านค้าออนไลน์
- SaaS หรือสมาชิกภาพ: Checkout ในโหมดสมัครสมาชิก webhook และพอร์ทัลลูกค้า ดู วิธีสร้าง SaaS MVP และ วิธีตั้งราคาผลิตภัณฑ์ SaaS
- มาร์เก็ตเพลสที่จ่ายเงินให้ผู้ขาย: การตั้งค่าที่ต่างออกไปและมีกฎระเบียบมากกว่า (Stripe Connect หรือที่คล้ายกัน) วางแผนแยกต่างหาก
การเพิ่มการชำระเงินใน Mythex
การชำระเงินในแอปที่คุณสร้างบน Mythex ใช้บัญชีและคีย์ Stripe ของคุณเอง ไม่มีการ "เชื่อมต่อ Stripe" ด้วยคลิกเดียวสำหรับแอปของคุณ ขั้นตอนทั่วไปมีดังนี้:
- รับคีย์ ทดสอบ ของ Stripe
- เพิ่ม
STRIPE_SECRET_KEY(และ webhook secret ในภายหลัง) ลงในความลับของโปรเจกต์ ผ่าน/secretsการตั้งค่าโปรเจกต์ หรือการ์ดความลับที่เอเจนต์แสดงเมื่อต้องการคีย์ - ขอ Checkout จากเอเจนต์ด้วยพรอมต์คล้ายกับด้านบน
- ทดสอบใน Preview ด้วยบัตรทดสอบ เผยแพร่ก่อนลงทะเบียน webhook เพราะต้องใช้ URL สาธารณะของคุณ
- เมื่อเปลี่ยนเป็นคีย์ใช้งานจริงแล้ว เผยแพร่อีกครั้งเพื่อให้แอปที่ใช้งานจริงรับค่าใหม่
ดู รับการชำระเงินด้วย Stripe และ จัดการ webhook ในแบ็กเอนด์ของคุณ ในเอกสาร
คำถาม
วิธีที่ง่ายที่สุดในการรับการชำระเงินในแอปคืออะไร?
Stripe Payment Link ไม่ต้องเขียนโค้ดเลย คุณสร้างได้ใน Stripe Dashboard แล้วลิงก์ไปจากแอปของคุณ แต่ถ้าแอปของคุณต้องรู้ว่าใครจ่ายเงินและปลดล็อกบางอย่างโดยอัตโนมัติ ให้ใช้ Stripe Checkout ร่วมกับ webhook แทน
ต้องใช้ webhook ไหมถ้าจะรับการชำระเงิน?
ต้องใช้ หากแอปของคุณต้องตอบสนองต่อการชำระเงิน เช่น ปลดล็อกบัญชี ทำเครื่องหมายว่าคำสั่งซื้อจ่ายแล้ว หรือจัดการการต่ออายุ เอกสารของ Stripe ระบุว่าไม่ควรพึ่งหน้าสำเร็จเพียงอย่างเดียว เพราะลูกค้าอาจจ่ายเงินแล้วไม่ได้เข้าไปถึงหน้านั้น นอกจากนี้ การสมัครสมาชิกก็ต้องใช้ webhook
ทดสอบการชำระเงินโดยไม่ใช้เงินจริงได้อย่างไร?
ใช้คีย์ API แบบ sandbox (test) ของ Stripe และหมายเลขบัตรทดสอบ เช่น 4242 4242 4242 4242 โดยใส่วันหมดอายุในอนาคตใดก็ได้และ CVC สามหลักใดก็ได้ ธุรกรรมทดสอบจะไม่มีการโอนเงินจริง
Stripe จัดการภาษีการขายและ VAT ให้ฉันหรือไม่?
Stripe Tax คำนวณและเก็บภาษีตอนเช็คเอาต์ได้ และติดตามว่าคุณอาจต้องลงทะเบียนที่ไหนบ้าง แต่คุณยังต้องรับผิดชอบภาระภาษีของตัวเอง ควรปรึกษานักบัญชีสำหรับสถานการณ์ของคุณ