ลองเล่น Stripe payment gateway กัน
/ 6 min read
สามารถดู video ของหัวข้อนี้ก่อนได้ ดู video
Content นี้สนับสนุนโดย เหล่าผู้ตามของ Mikelopster เช่นเดิม (มีคนทักมาถามเรื่อง Payment เลยรู้สึกอยากแชร์เรื่องนี้ไว้ให้เป็นความรู้เพิ่มเติม) เลยรู้สึกว่า อยากลอง Stripe (ปกติเราเคยลอง Omise) และจะได้มาเล่าเรื่อง payment flow ไปเลย
Stripe คืออะไร ?
Stripe คือ Platform ชำระเงินที่ออกแบบมาเพื่อให้รับชำระเงินและส่งเงินได้ทั่วโลก ซึ่งโจทย์ของ Stripe ก็คือการเป็นตัวกลางในการชำระเงินระหว่าง user และธนาคาร (Payment gateway)
อ่านเพิ่มเติมกันได้ https://stripe.com/th-be/payments
เราจะลองเล่น Stripe กันยังไงดี
ทีนี้ Stripe เองก็มี API ที่ให้นักพัฒนามาลองใช้เพื่อใช้สำหรับพัฒนาช่องทางชำระเงินของตัวเอง ซึ่งมีทั้ง การ implement โดยการทำ form ขึ้นมาและใช้การสร้าง token ผ่าน Stripe หรือการใช้ redirect payment อย่างหน้า checkout ของ Stripe ก็สามารถทำได้
เคสที่เราจะมาลองเล่นกันเป็นเคสแบบ one time checkout คือ เป็นการชำระเงินแบบจ่ายเงินครั้งเดียวจบ ซึ่งเป็นตัวอย่างที่เล่นง่ายที่สุด และผมคิดว่าเห็นภาพง่ายที่สุด
ตามเอกสารนี้เลย (ช่องทาง Online Payment) https://stripe.com/docs/payments/checkout/how-checkout-works
ซึ่งจริงๆ มันมีรูปแบบ payment ที่หลากหลายมากทั้งจะ จ่ายปกติ (ในตัวอย่างที่เราจะทำ) หรือ subscription https://stripe.com/docs/development/quickstart
จะมาทำ
- payment api (ผ่าน node) สำหรับสร้าง order และรับชำระเงิน
- ทำหน้า UI สำหรับชำระเงิน
- และทำหน้า success, fail เพื่อมารองรับหลังจาก payment เสร็จ
เป็นการจำลอง flow ชำระเงินอย่างง่ายกัน
Config เริ่มต้น เตรียมตัว project กันก่อน
1. setup docker สำหรับ project นี้ (docker-compose.yml)
- สำหรับ project นี้เราจะ setup docker 2 ตัวคือ mysql และ phpmyadmin เท่านั้น
- โดยโจทย์ของ mysql คือการเก็บข้อมูล user และ order คู่กันไว้ เป็นการเก็บ status ที่ได้รับจาก Stripe มาว่าส่ง status กลับมาถูกต้องหรือไม่
docker-compose.yml
2. setup folder project
./src
เป็นสถานที่เก็บไฟล์ html (ฝั่ง Frontend) ของหน้าเว็บไว้ประกอบด้วย- checkout.html = หน้าสำหรับรับชำระเงิน
- main.js = สำหรับเก็บ function สำหรับการชำระเงินและยิง API เอาไว้
- cancel.html = หน้าที่บอกว่าชำระเงินไม่สำเร็จ
- success.html = หน้าที่บอกว่าชำระเงินสำเร็จแล้ว
index.js
จะใช้สำหรับเก็บ nodejs ของฝั่ง API เอาไว้ เพื่อใช้สำหรับสร้าง API Placeorder, Webhook และ API สำหรับ check status ของ order
3. code index.js
เราจะทำการ setup code ไว้เริ่มต้นเป็นแบบนี้
พาเล่น Dashboard Stripe ก่อนว่ามีอะไรบ้าง
ให้ทุกคนทำการสมัคร Stripe ผ่าน https://stripe.com/
- Stripe มี sandbox เอาไว้ให้ developer เล่น = ไม่ต้องจ่ายเงินจริงก็สามารถยิงจ่ายเงินทดสอบได้
หน้าที่สำคัญ
-
เมนู การชำระเงิน: หน้าสำหรับดูการชำระเงิน (สามารถดู log การชำระเงินได้)
-
หน้านักพัฒนา เป็นการดูการ Call API ว่ามีการยิงมาเท่าไหร่บ้าง
-
หน้านักพัฒนา > คีย์ API สำหรับดู Public, Secret key สำหรับการยิง Payment Stripe
-
หน้านักพัฒนา > Webhook สำหรับการใส่ API webhook
-
ตรงหัวข้อ “เพิ่มตัวรอรับเหตุการณ์ในระบบ” จะเป็นการบอกวิธีการ proxy API webhook จาก server มาสู่ local ได้
-
ให้ทำการลง stripe CLI ตามคำแนะนำในนี้เลย (เดี๋ยวเราจะใช้กันตอนทดสอบ webhook กัน)
เริ่ม implement !
เรามาดูภาพรวมก่อนว่าเราจะทำอะไรกันบ้าง
เราจะแบ่งงานออกเป็น 2 ฝั่งคือ Backend และ Frontend โดยเราจะเริ่มทำจาก Backend ก่อน
1. Backend (API)
/api/checkout
(Placeorder) สำหรับเก็บข้อมูล order และสร้าง Payment
/api/webhook
สำหรับรับข้อมูลจาก Stripe มา update ที่ database ของเรา
/api/order/:id
สำหรับรับ order_id มาเพื่อ recheck status ก่อนแสดงว่า success หรือไม่
ก่อนเริ่มให้ทำการ binding webhook เข้า local ก่อน
เมื่อทุกอย่างเรียบร้อยลองทดสอบยิงข้อมูลด้วย API กันดูก่อน Test card สามารถดูได้จาก https://stripe.com/docs/testing
ลองทดสอบการเช็ค status order ดูว่าถูกไหม
2. Frontend
เราจะทำทั้งหมด 4 อย่างคือ
- สร้าง main.js ก่อนเพื่อรวมคำสั่งสำหรับการส่ง payment เอาไว้ (และเรียกใช้ stripe library)
- checkout.html จำลองหน้าสำหรับเตรียมจ่ายเงิน
- success.html จำลองหน้าสำหรับ success
- cancal.html จำลองหน้ากรณี fail หรือ cancel
- ไม่มีอะไร เพราะหน้านี้เป็น fallback
- การถึงหน้านี้ = ไม่สามารถไปไหนต่อได้นอกจากต้องชำระเงินใหม่ (ต่อให้เช็คท้ายที่สุดก็ต้องพาไปชำระเงินใหม่)
- เว้นแต่ อยาก handle case ว่า ถ้า success จริงๆ พากลับไปหน้า success
Github code
สำหรับใครที่อยากดู source code ฉบับเต็ม มาดูที่นี่ได้ https://github.com/mikelopster/stripe-payment-example
Reference เพิ่มเติม
- https://stripe.com/docs/js/elements_object/create_without_intent
- https://www.knowledgehut.com/blog/web-development/stripe-node-js
- https://medium.com/@Bigscal-Technologies/how-to-integrate-stripe-payment-apis-using-node-js-566bfdad5850
- https://stripe.com/docs/libraries/stripejs-esmodule
- มารู้จัก Svelte และ SvelteKit กันมี Video มี Github
สำรวจโลกแห่งการพัฒนาเว็บไซต์สมัยใหม่ด้วยการแนะนำ Svelte และ SvelteKit ที่ครอบคลุมของเรา
- ทำไมถึงต้องใช้ Nuxt ทั้งๆที่มี Vue อยู่แล้ว ?มี Video
มาทำความรู้จัก Nuxt กันว่ามันคืออะไร มีความแตกต่างกับ Vue ยังไงบ้าง และเคสแบบไหนควรใช้ Nuxt บ้าง
- รู้จักกับ Web Vitals guideline การสร้าง UX ที่ดีออกมากันมี Video
รู้จักกับคำศัพท์พื้นฐานของ Web Vitals และ use case ต่างๆของ Web Vitals กัน
- รู้จักกับ Design Pattern - Creational (Part 1/3)มี Video
มาเรียนรู้รูปแบบการพัฒนา Software Design Pattern ประเภทแรก Creational กัน