หลังจากไปหน้าให้เลือกว่า Success หรือ Failure จะรับค่ามันยังไงครับ omise-js, charge-api

omise-js
charge-api
thai

#1

หลังจากไปหน้าให้เลือกว่า Success หรือ Failure จะรับค่ามันยังไงครับ
ว่ามัน Success หรือ Failure ครับ

ภาพประกอบ

ลิงค์ทดสอบ
https://packandship.net/testx/omise.js


#2

การ validate หรือการรับค่า charge เพื่อตรวจสอบว่า transaction นั้นๆ success หรือ fail จะมีขั้นตอนที่สำคัญๆ อยู่ 3 ส่วนด้วยกันครับ

ส่วนที่ 1 : จังหวะที่สร้าง charge
ณ ตอนที่สร้าง charge (ที่หน้า https://packandship.net/testx/omise.js/checkout.php)
จะมี parameter ตัวนึงที่ชื่อว่า return_uri ที่สามารถกำหนดได้ว่าจะให้ Omise callback redirect ไปที่ไหน

เช่น ผมอาจจะกำหนดให้

$charge = OmiseCharge::create(aray(
    ...
    'return_uri' => 'https://packandship.net/testx/omise.js/result.php?order=123456'
    ...
));

ซึ่ง url ตัวนี้ จะเป็น url ที่ เมื่อ user ทำการชำระเงินเรียบร้อยแล้ว (ทั้งสำเร็จและไม่สำเร็จ) จะถูก redirect กลับมาที่ url นี้ครับ

สังเกตจาก code ผมจะมีแนบ ?order=123456 ติดไปด้วย เลข (หรือ string) ตรงนี้ควรจะเป็นเลข reference id ที่เราเก็บเอาไว้ในฐานข้อมูล (อาจจะเป็น order id ที่ถูกสร้างเอาไว้ก่อน หรือเป็นเลขชั่วคราวที่ random สร้างขึ้นมาก็ได้ครับ) ซึ่งเราจะเอาไปใช้ในขั้นตอนที่ 2 และ 3 ครับ

ส่วนที่ 2 : จังหวะที่สร้าง charge เรียบร้อยแล้ว ก่อนที่จะ redirect user ออกไปที่หน้า authorize_uri

ณ ขั้นตอนที่ 1 หลังจากสร้าง charge เรียบร้อยแล้ว Omise จะคืนค่า charge object กลับมา
โดย flow ปรกติ คือ เราจะต้อง redirect user ออกไปที่ authorize_uri เพื่อไปที่หน้าชำระเงิน

แต่ก่อนที่เราจะ redirect ผู้ใช้งานออกไปนั้น ให้เราทำการเก็บ charge id ที่ return กลับมาใน charge object ลงฐานข้อมูลไว้ก่อนครับ โดยเก็บไว้คู่กับ reference id ในขั้นตอนที่ 1 (ด้านบน)

เช่น

// "order_payment" table 
| ref_id | charge_id           |
| 123456 | chrg_51dsc3fxx1blah |

จากนั้นจึงค่อย redirect user ออกไปที่หน้าชำระเงิน

หมายเหตุ: charge_id จะได้จาก $charge[‘id’] และ authorize_id จะได้จาก $charge[‘authorize_id’] (หลังจากที่สร้าง charge ในขั้นตอนที่ 1)

ส่วนที่ 3 : จังหวะ user ชำระเงินเรียบร้อยแล้ว และถูก redirect กลับมาที่หน้า "return_uri"
หรือก็คือหน้า https://packandship.net/testx/omise.js/result.php?order=123456 ที่เรากำหนดไว้ที่ขั้นตอนแรก

ณ ขั้นตอนนี้ เราสามารถนำ querystrting order มา query หา charge_id จากใน database ครับ
แล้วจากนั้นจึงใช้ charge_id ที่ query ได้มา เรียกไปที่ Omise Charge API เพื่อตรวจสอบผลลัพธ์การชำระเงินครับ

เช่น

<?php
require_once 'omise-php/lib/Omise.php';

/* Defined OMISE KEYS */
define('OMISE_PUBLIC_KEY', 'pkey_test');
define('OMISE_SECRET_KEY', 'skey_test');

$charge_id = // query result จากการนำ $_GET['order'] ไปหา charge_id ในฐานข้อมูลที่เตรียมไว้ในขั้นตอนที่ 2
$charge = OmiseCharge::retrieve($charge_id);
if ($charge['status'] === 'successful') {
    // Do success.
} else {
  // Do fail.
}


จากสามขั้นตอนด้านบน จะทำให้สามารถตรวจสอบผลลัพธ์ของ charge นั้นๆ ได้ครับ :)))
หากมีข้อสงสัยใดๆ สามารถสอบถามเพิ่มเติมได้เลยนะครับ :grinning:


สอบถามเรื่องการใช้ 3DS
#3

ขออนุญาตเพิ่มเติมว่า ในบางกรณี charge result อาจจะไม่ได้เป็นทั้ง successful หรือ failed นะครับ
จะมีบางครั้งที่ธนาคารปลายทางอาจมีการอัพเดทสถานะการชำระเงินภายหลัง (อาจจะ 3-5 นาทีหลังจากนั้น) จากที่ผู้ใช้งานชำระบนหน้าเว็บเรียบร้อยแล้ว

ในกรณีนี้ ขั้นตอนที่ 3

$charge = OmiseCharge::retrieve($charge_id);

$charge[‘status’] ตรงนี้ จะได้ค่าเป็น pending ครับ

ในกรณีนี้ สามารถใช้ฟีเจอร์ที่ชื่อว่า Webhook ในการช่วยตรวจสอบผลลัพธ์ของ transaction อีกรอบนึงได้ครับ
สามารถตรวจสอบรายละเอียดเพิ่มเติมได้ที่กระทู้ อะไรคือ Webhooks ผมไม่ใช้ก็ตัดเงินได้ปกตินี่ครับ นะครับ :smiley:


#4

ขอบคุณมากครับ :grinning::grinning::grinning::grinning:


#5

ยินดีครับ
หากมีข้อสงสัยอะไรเพิ่มเติมสามารถสอบถามได้เลยนะครับ :grinning: