Omise Payment Flow สำหรับ 3-D Secure

Omise Payment Method

ก่อนที่จะอธิบาย Omise Payment Flow ขออนุญาตอธิบายถึงวิธีการสร้าง Charge หรือการชำระกับทาง Omise (อ่านว่า โอ-มิ-เซะ หลายคนอ่านกัน โอมิส 😂) ก่อน ซึ่งในตอนนี้มีหลายรูปแบบ โดยคร่าวๆที่ทราบตอนนี้คือมี

  1. Credit / Debit card ชำระผ่านบัตรเครดิต หรือบัตรเดบิต ซึ่งสามารถแยกได้อีก 2 รูปแบบย่อยคือ Non 3-D Secure (Non 3DS) กับ 3-D Secure (3DS)
    บางคนงงว่า 3DS มันคืออะไร ก็ลองอ่านจากบทความนี้ดูครับ
  2. Internet Banking ชำระผ่านอินเตอร์เน็ตแบงค์กิ้ง
  3. Alipay (Online) ชำระผ่านอาลีเพย์แบบออนไลน์
  4. Bill Payment (Tesco Lotus) ชำระด้วยบาร์โค้ดที่เทสโก้โลตัส (ในบทความนี้จะไม่พูดถึงเรื่อง Bill Payment)

Omise Payment Flow

โดยปกติการชำระผ่านบัตรเครดิตหรือเดบิตการ์ดนั้นทำได้ไม่ยาก เพราะในเอกสารนั้นมีตัวอย่างการชำระพร้อม source code ให้ครบถ้วนอยู่แล้ว และแม้ว่าในเอกสารจะมีอธิบายไว้ค่อนข้างครบ แต่หลายคนอาจจะงงกับวิธีการเขียนเพื่อเชื่อมต่ออยู่ดี Credit / Debit card แบบ 3-D Secure รวมถึงการชำระที่เขียนลักษณะเดียวกันได้คือ Internet Banking กับ Alipay Online ซึ่ง Flow ในการสร้าง Charge คือ

Omise Payment Flow

Omise Payment Flow

  1. เมื่อสร้าง Token หรือ Source สำเร็จก็ดำเนินการส่งข้อมูลพร้อม Order เพื่อดำเนินการสร้าง Charge พร้อม return_uriโดยเรียก API ไปยัง Charge API
  2. API จะส่งคืนค่า JSON กลับมา หากส่งข้อมูลไม่ถูกต้องจะได้รับ { 'object': 'error', .... } กลับคืนมา ซึ่งใน error จะมี url เพื่อเข้าไปอ่านรายละเอียดเพิ่มเติมว่า error เพราะอะไร
  3. หากถูกต้อง status ของ Credit / Debit card แบบ 3-D Secure, Internet Banking และ Alipay Online จะเป็น pending เสมอ เพราะการชำระดังกล่าวจำเป็นต้องผ่านการอนุมัติจากผู้ซื้อบนเว็บไซต์ของธนาคาร หรือของ Alipay เสียก่อน และจะได้รับ authorize_uri กลับมาด้วย
  4. จากนั้นก็เขียนโปรแกรมให้ redirect หรือเปลี่ยนหน้าเพจไปที่ authorize_uri เท่านั้นก็จบแล้ว เมื่อทำธุรกรรมบนหน้าเว็บไซต์ของธนาคารหรือของ Alipay ถ้าเป็น Credit / Debit card มันก็คือขั้นตอนการกรอก OTP นั่นแหละ พอเสร็จมันก็จะเปลี่ยนหน้าเพจกลับมายัง return_uri ที่ส่งตั้งแต่ตอนสร้าง Charge

ถ้าลองเขียน Code PHP แบบง่ายๆก็น่าจะเป็นแบบนี้ครับ

[php]
$charge = OmiseCharge::create(array(
// ส่วนนี้แล้วแต่ว่าใครจะเขียนสำหรับรูปแบบการชำระแบบไหน
));

if ($charge[‘status’] === ‘pending’ && $charge[‘authorize_uri’] !== null) {
header("Location: {$charge[‘authorize_uri’]}");
exit();
}
[/php]

เท่านี้ก็เรียบร้อยแล้ว ✌✌ ง่ายกว่าที่คิดใช่ไหมละครับ

ขอฝากบทความก่อนหน้าสำหรับคนใช้ React Native และต้องการที่จะเชื่อมต่อกับ Omise ที่ลิงค์นี้นะคร้าบบบ

ข้อมูลอ้างอิง
  1. https://www.omise.co/th/fraud-protection
  2. https://www.omise.co/th/how-to-implement-3-D-Secure