ปัญหาการแนบข้อมูล custom reference ไปกับ return uri ครับ


#1

สวัสดีครับ

ตอนสร้าง Charge ผม ต่อข้อมูล custom_reference เข้าไปกับ return uri
แบบนี้ครับ www.ddd.com/return_uri/custom_reference
ซึ่งจริงๆแล้วผมไม่ต้องการให้ผู้ใช้งานมองเห็น custom_reference ที่ระบบส่งไป
ระบบต้องการให้เห็นแค่ www.ddd.com/return_uri

ขอคำแนะนำด้วยครับ


#2

สามารถ แก้ปํญหาได้แล้วครับ ใช้วิธี Redirect พร้อม Session


#3

@tong สวัสดีครับ
ถ้าใช้วิธีเก็บ session อันนี้อาจจะต้องระวังในกรณีที่ session หายระหว่าง payment process นิดนึงนะครับ (เช่น user ปิด browser ก่อนที่จะ redierct กลับมายังเว็บไซต์)

ถ้าเป็นกรณีที่ใช้ reference id เรายังสามารถเช็ครายการ uncomplete ได้ในเคสนี้ แต่ถ้าเป็น session เดี่ยวๆ อาจจะทำให้ลำบากในการ debug หรือตรวจสอบถ้าเกิดเหตุการณ์ด้านบน (อาจจะต้องเก็บ session id เอาไว้ใน Database คู่กับ user id อีกที)

หมายเหตุ. ผมขออนุญาตสอบถามเพิ่มเติมได้ไหมครับว่า use-case ที่คุณ @tong กำลัง implement อยู่เป็นแบบไหนนะครับ (ทำไมถึงไม่ต้องการแสดง reference ใน url นะครับ)


#4

ขอบคุณสำหรับคำแนะนำครับ

เป็นเว็บที่ทำใช้เองครับ อีกสองเดือนถ้าเสร็จทัน จะขอเปิดใช้งานจริงครับ

จริงๆแล้ว ที่ผมไม่ต้องการให้ user เห็น reference ก่อนจบ Transaction
เพราะ บางที ระบบของเราอาจมีช่องโหว่ ให้สลับรายการชำระเงิน โดยนำ reference ไปใช้

ถ้าจบรายการ ด้วย www.ddd.com/payment/finish/in-cart
จะปลอดภัยกว่า www.ddd.com/payment/finish/reference_id

ที่ผมใช้ return uri เพราะมันง่ายครับ

ถ้า Omese สามารถส่ง reference แบบ POST มากับ return_uri ได้จะดีเลยครับ

วิธี implement ผมจะ จับคู่ Omise กับ Order ผ่านทาง

1 จับคู่ผ่านทาง Return Uri ก่อนพราะมันง่ายครับ เช็คกับ retrive แล้วจับคู่กันตรงนี้ แจ้งให้ user ทราบ
2 จับคู่ผ่านทาง WebHook เฉพาะกรณีถ้า charge จาก return uri มีสถานะ pending ก็จะรอให้ WebHook เช็คกับ retrive แล้วจับคู่

อีกวิธี คือ จบที่ WebHook ทั้งหมด จะปลอดภัยกว่า แต่จะใช้เวลาเขียนโค้ดมากขึ้นครับ
ผมว่าจะลองดูวิธีนี้


#5

จริงๆ แล้ว ตัว ref id นี่ เราสร้าง table ขึ้นมาเพื่อ generate ref id โดยเฉพาะ สำหรับการ veryfy order เลยก็ได้นะครับ

อาจจะ generate string 6 ตัวแบบแรมดอม เพื่อใช้เป็น ref id
แล้วเอา ref id นี้ไปผูกกับ order id และ OmiseCharge.id อีกทีนึง

แล้วเวลาใช้งาน ในหน้าที่ user redirect กลับมา ก็เอา ref id มา query ใน table นั้นๆ เพื่อเอา OmiseCharge.id ไป retrieve OmiseCharge object ทีหลัง เพื่อเช็คว่าการชำระเงินสำเร็จไหม

ถ้าเขียนเป็น flow จะประมาณ

  1. Create order (ได้ order id ที่ step นี้)
  2. Generate random string (ได้ ref id ที่ step นี้)
  3. สร้าง charge แล้วเอา ref id ไปใส่ใน return uri
  4. พอสร้าง charge เสร็จ เอา order id, ref id, OmiseCharge.id เขียนเก็บลง DB เอาไว้
  5. จากนั้นค่อย Redirect user ออกไปที่หน้าชำระเงิน

ทีนี้ ต่อให้ระบบมีช่องโหว่ หรือสลับรายการชำระเงิน ก็จะไม่มีผลอะไรครับ
เพราะเราเอา ref id ที่อยู่ใน return uri มา retrieve order id หรือ charge id เพื่อ validate result ทีหลัง


หรือถ้าจะให้ secure ยิ่งขึ้น
ในขั้นตอนที่ 3 ตอนสร้าง charge เอา order id ใส่ลงไปใน OmiseCharge.metadata ด้วยก็ได้ครับ
แล้วพอมา retrieve ทีหลัง ก็เอา order id ที่เราเก็บไว้ใน DB มาเทียบกับ OmiseCharge.metadata ว่าเป็น ID เดียวกันไหม


#6


อย่างในกรณีนี้ ผมเอา order_id ไปใส่ไว้ใน charge.metadata ตอนที่สร้าง charge

ตอนหลังที่ redirect user กลับมา เราสามารถดึง order_id จาก charge object นั้นๆ ไปเทียบกับ order_id ที่เราเก็บไว้ในฐานข้อมูลของเราก็ได้ครับ ว่าเป็นตัวเดียวกันไหม ถ้าไม่ใช่ก็ reject หรือโชว์ข้อความว่าไม่สามารถ validate ผลลัพธ์ได้ ฯลฯ


#7

ขอบคุณมากครับ
Metadata นี่แหละช่วยแก้ปัญหา เป็นการล็อกข้อมูลไว้ว่า charge นี้ต้องจับคู่กับ order นี้ เท่านั้น

ผมอ่านใน API อธิบายว่า เก็บค่า Hash ผมเลยข้ามไป

ขอบคุณมากครับผม