เพย์วิธพอยท์ เบต้า

เพย์วิธพอยท์ คืออีกหนึ่งช่องทางการรับชำระเงินที่ให้ผู้ซื้อใช้คะแนนสะสมจากบัตรเครดิตใช้จ่ายแทนเงินสด คู่มือนี้จะอธิบายขั้นตอนการรับชำระเงินผ่าน เพย์วิธพอยท์ และวิธีเชื่อมต่อระบบผ่าน API ของโอมิเซะ

ขณะนี้กลุ่มบัตรเครดิตซิตี้ รีวอร์ดเป็นโปรแกรมสะสมพอยท์เดียวที่สามารถรองรับการรับชำระผ่านเพย์วิธพอยท์

การเปิดรับชำระเงิน

  • ประเทศที่รองรับ: ประเทศไทย
  • API เวอร์ชันล่าสุดที่รองรับ: 2017-11-02

ขณะนี้เพย์วิธพอยท์อยู่ระหว่างการทดสอบ ร้านค้าที่สนใจเปิดรับชำระผ่านช่องทางนี้ กรุณากรอกรายละเอียดในแบบฟอร์มและทีมงานของเราจะแจ้งให้ทราบเมื่อระบบพร้อมเปิดใช้งาน

ขั้นตอนการรับชำระเงิน

ผู้ซื้อที่เลือกจ่ายด้วยวิธีนี้จะถูกโอนออกไปอีกหน้าต่างเพื่อยืนยันรายการโดยใช้ข้อมูลบัญชีส่วนตัวและรหัส OTP

หลังจากสร้างรายการ ผู้ซื้อจะถูกโอนไปยังหน้าต่างอื่นรวมกัน 2 ครั้ง คือ 1.โอนออกจากเว็บไซต์ร้านค้าเพื่อยืนยันรายการ 2.โอนกลับมาหน้าเว็บไซต์เมื่อรายการถูกยืนยันแล้ว

รูปภาพด้านล่างจะอธิบายขั้นตอนการรับชำระเงินผ่าน เพย์วิธพอยท์

ลำดับแรก ผู้ซื้อจะเลือกช่องทางการชำระเงิน เพย์วิธพอยท์ ❷ และยืนยันยอดชำระในสกุลเงินดั้งเดิม ❸.

Points Select

หลังจากที่ยืนยันยอดชำระแล้ว ผู้ซื้อจะถูกโอนไปหน้าต่างใหม่เพื่อใส่หมายเลขโทรศัพท์และหมายเลขบัตรเครดิต 4 ตัวท้าย ❹ จากนั้นรหัส OTP จะถูกไปส่งไปยังหมายเลขโทรศัพท์ของผู้ซื้อ โดยผู้ซื้อจะต้องใส่รหัส OTP ให้ถูกต้อง เมื่อใส่รหัส OTP ถูกต้องแล้ว ❺ ผู้ซื้อจะต้องยืนยันจำนวนพอยท์ที่จะถูกใช้ในรายการนั้น (ระบบจะแสดงยอดพอยท์ที่คงเหลือให้ดูด้วย) ❻ หลังจากผู้ซื้อได้ใช้พอยท์ชำระรายการแล้ว จะถูกโอนกลับไปที่หน้าเว็บไซต์ของร้านค้า ❼ โดยระบบของโอมิเซะจะส่ง webhook event ให้ร้านค้าเพื่อแจ้งว่ารายการนั้นสำเร็จ

Payment Flow

การติดตั้งใช้งาน

ในการสร้างรายการรับชำระเงินผ่านเพย์วิธพอยท์ ให้ร้านค้าส่งคำสั่ง API ดังนี้

  1. สร้าง payment source (type: points_citi) โดยใช้ Omise.js, omise-ios หรือ omise-android
  2. สร้าง charge โดยใช้ source จากขั้นตอนแรก
  3. เมื่อผู้ซื้อทำรายการสำเร็จและร้านค้าได้รับ webhook event หรือ charge.complete แล้ว เราแนะนำให้ตรวจสอบสถานะรายการด้วยตนเองอีกครั้งเพื่อความแม่นยำ

การสร้าง source เพื่อรับชำระเงินผ่านเพย์วิธพอยท์ จะเกิดขึ้นในฝั่งของผู้ซื้อ (client-side) เช่นบนเว็บไซต์หรือโทรศัพท์มือถือของผู้ซื้อ ร้านค้าจะต้องใช้ public key

ส่วนการสร้างรายการ (charge) เพื่อรับชำระเงินผ่านเพย์วิธพอยท์ จะเกิดขึ้นในฝั่งของร้านค้า (server-side) ร้านค้าจะต้องใช้ secret key

หมายเหตุ: หากมีความจำต้องสร้างทั้งรายการและ source ในฝั่งร้านค้า (server-side) สามารถทำพร้อมกันได้เลยโดยการส่งคำสั่ง API เพียงครั้งเดียว และใช้งาน secret key

การสร้าง source

เมื่อผู้ซื้อเลือกชำระเงินผ่านช่องทางนี้ ให้ร้านค้าสร้าง source ผ่าน source API โดยกำหนด amount, currency, และ type

ตัวอย่างด้านล่างนี้เป็นการสร้าง source สำหรับรายการ เพย์วิธพอยท์ จำนวน ฿4,000 ให้แทนค่าของ omise_public_key และ $OMISE_PUBLIC_KEY ด้วย test public key ของร้านค้าซึ่งสามารถคัดลอกได้จาก แดชบอร์ด

หากใช้ Omise.js parameter type เป็นตัวแปรที่จำเป็นของฟังก์ชัน createSource

Omise.setPublicKey(omise_public_key);

Omise.createSource('points_citi', {
  "amount": 400000,
  "currency": "THB"
}, function(statusCode, response) {
  console.log(response)
});

หากร้านค้าต้องการทดสอบให้สร้าง request โดยใช้ curl

curl https://api.omise.co/sources \
  -X POST \
  -u $OMISE_PUBLIC_KEY: \
  -d "amount=400000" \
  -d "currency=THB" \
  -d "type=points_citi"
{
  "object": "source",
  "id": "src_test_5jk1zpg3lycikyi3t32",
  "livemode": false,
  "location": "/sources/src_test_5jk1zpg3lycikyi3t32",
  "amount": 400000,
  "barcode": null,
  "created_at": "2020-04-15T08:04:12Z",
  "currency": "THB",
  "email": null,
  "flow": "redirect",
  "installment_term": null,
  "name": null,
  "mobile_number": null,
  "phone_number": null,
  "scannable_code": null,
  "references": null,
  "store_id": null,
  "store_name": null,
  "terminal_id": null,
  "type": "points_citi",
  "zero_interest_installments": null
}

ตัวแปรของ id คือ source identifier (เริ่มต้นด้วย src)

การสร้างรายการรับชำระเงิน

สร้างรายการรับชำระเงินโดยระบุ parameter return_uri, source, amount และ currency

  • return_uri จะเป็นตำแหน่งบนเว็บไซต์ของร้านค้าที่ผู้ซื้อจะถูกส่งไปเมื่อยืนยันรายการสำเร็จ
  • source จะเป็นตัวกำหนด source identifier
  • amount และ currency จะต้องมีค่าตรงกับ amount และ currency ของ source

ตัวอย่างด้านล่างนี้แสดงการสร้างรายการรับชำระเงินผ่าน ขึ้นใหม่โดยใช้ curl

ในการสร้างรายการให้ร้านค้าแทน $OMISE_SECRET_KEY ด้วย test secret key ของร้านค้าซึ่งสามารถคัดลอกได้จากแดชบอร์ด และแทน $SOURCE_ID ด้วย id ของ source

curl https://api.omise.co/charges \
  -u $OMISE_SECRET_KEY: \
  -d "amount=400000" \
  -d "currency=THB" \
  -d "return_uri=http://example.com/orders/345678/complete" \
  -d "source=$SOURCE_ID"
{
  "object": "charge",
  "id": "chrg_test_5jk1zpk9wqkiyaph7c0",
  "location": "/charges/chrg_test_5jk1zpk9wqkiyaph7c0",
  "amount": 400000,
  "net": 384378,
  "fee": 14600,
  "fee_vat": 1022,
  "interest": 0,
  "interest_vat": 0,
  "funding_amount": 400000,
  "refunded_amount": 0,
  "authorized": false,
  "capturable": false,
  "capture": true,
  "disputable": false,
  "livemode": false,
  "refundable": false,
  "reversed": false,
  "reversible": false,
  "voided": false,
  "paid": false,
  "expired": false,
  "platform_fee": {
    "fixed": null,
    "amount": null,
    "percentage": null
  },
  "currency": "THB",
  "funding_currency": "THB",
  "ip": null,
  "refunds": {
    "object": "list",
    "data": [],
    "limit": 20,
    "offset": 0,
    "total": 0,
    "location": "/charges/chrg_test_5jk1zpk9wqkiyaph7c0/refunds",
    "order": "chronological",
    "from": "1970-01-01T00:00:00Z",
    "to": "2020-04-15T08:04:13Z"
  },
  "link": null,
  "description": null,
  "metadata": {},
  "card": null,
  "source": {
    "object": "source",
    "id": "src_test_5jk1zp4kbnfdys52u39",
    "livemode": false,
    "location": "/sources/src_test_5jk1zp4kbnfdys52u39",
    "amount": 400000,
    "barcode": null,
    "created_at": "2020-04-15T08:04:10Z",
    "currency": "THB",
    "email": null,
    "flow": "redirect",
    "installment_term": null,
    "name": null,
    "mobile_number": null,
    "phone_number": null,
    "scannable_code": null,
    "references": null,
    "store_id": null,
    "store_name": null,
    "terminal_id": null,
    "type": "points_citi",
    "zero_interest_installments": null
  },
  "schedule": null,
  "customer": null,
  "dispute": null,
  "transaction": null,
  "failure_code": null,
  "failure_message": null,
  "status": "pending",
  "authorize_uri": "https://pay.omise.co/payments/pay2_test_5jk1zpkdqa88zn31tfe/authorize",
  "return_uri": "http://example.com/orders/345678/complete",
  "created_at": "2020-04-15T08:04:12Z",
  "paid_at": null,
  "expires_at": "2020-04-22T08:04:12Z",
  "expired_at": null,
  "reversed_at": null,
  "zero_interest_installments": true
}

การสร้าง source และรายการรับชำระเงิน

ร้านค้าสามารถสร้างทั้ง source และ รายการรับชำระเงิน (charge) ผ่านการเรียกใช้ API เพียงครั้งเดียว

curl https://api.omise.co/charges \
  -X POST \
  -u $OMISE_SECRET_KEY: \
  -d "amount=400000" \
  -d "currency=THB" \
  -d "return_uri=http://example.com/orders/345678/complete" \
  -d "source[type]=points_citi"

สร้างรายการสำเร็จ

เมื่อร้านค้าสร้างรายการรับชำระเงินขึ้นแล้ว จะพบว่าสถานะของรายการแสดงเป็น pending หรือ status==pending สถานะของรายการรับชำระเงินสามารถเป็นได้ทั้ง successful, failed และ expired

ในส่วนต่อไปเราจะอธิบายวิธีอนุมัติรายการ, การรับ event แจ้งเตือนเมื่อรายการเสร็จสิ้นผ่าน webhook และการตรวจสอบสถานะรายการ

ภาพด้านล่างนี้แสดงให้เห็นถึงขั้นตอนทั้งหมดในการรับชำระเงินแต่ละรายการ

sequenceDiagram participant customer participant omise.js participant merchant participant api.omise.co customer->>omise.js: Send payment details for purchase omise.js->>api.omise.co: Request source using payment details api.omise.co-->>omise.js: Return source omise.js->>merchant: Merchant gets returned source merchant->>api.omise.co: Request charge using source and purchase details api.omise.co-xmerchant: Send "charge.create" webhook api.omise.co-->>merchant: Return charge merchant->>customer: Redirect to "authorize_uri" for pending charge customer->>api.omise.co: Provide charge authorization details at "authorize_uri" api.omise.co-->>customer: Redirect to "return_uri" api.omise.co-xmerchant: Send "charge.complete" webhook merchant-xcustomer: Send charge result (e.g. via email)

ในโหมดทดสอบร้านค้าสามารถเข้า URL เพื่อปรับสถานะรายการให้สำเร็จหรือไม่สำเร็จได้ด้วยตนเอง

เมื่อผู้ซื้อยืนยันการทำรายการแล้วจะถูกส่งไปยังหน้าที่ร้านค้าระบุเป็น return_uri เอาไว้

การรับ event แจ้งเตือนรายการสำเร็จ

ร้านค้าสามารถรับการแจ้งเตือนเมื่อมีการทำรายการเสร็จสิ้นโดยใช้งาน webhook events

ในการติดตั้งให้ร้านค้ากำหนดตำแหน่งบนเซิร์ฟเวอร์เพื่อรับ webhook events และเพิ่มตำแหน่งเดียวกันนี้เป็น webhook endpoint บนแดชบอร์ด

เมื่อมีรายการเสร็จสิ้นระบบจะส่ง POST request ไปยัง endpoint นี้ พร้อมทั้งแนบสถานะการตอบกลับของรายการนั้นๆ ไปด้วย

ตัวแปรหลักหรือ key สำหรับ event object ประกอบไปด้วย charge.complete และตัวแปร data ที่มี charge object

อ่านเพิ่มเติมได้ที่ Events API

การตรวจสอบสถานะรายการ

เมื่อได้รับ event ของรายการที่เสร็จสิ้นแล้ว ร้านค้าสามารถตรวจสอบสถานะรายการหรือ status โดยใช้ Charge API

หากค่าของ charge.status เป็น successful หมายถึงว่ารายการรับชำระเงินสำเร็จ หากค่าของ charge.status เป็น failed รายการรับชำระเงินนั้นไม่สำเร็จ ร้านค้าสามารถตรวจสอบ failure_code และ failure_message ได้ใน charge object เพื่ออ่านคำอธิบายเพิ่มเติม

สาเหตุขัดข้องที่อาจเกิดขึ้นได้มีดังนี้

รหัสข้อขัดข้อง รายละเอียด
payment_rejected รายการถูกปฏิเสธโดยธนาคารผู้ออกบัตร
failed_processing ระบบทำรายการไม่สำเร็จ
insufficient_fund วงเงินคงเหลือไม่เพียงพอหรือวงเงินเต็ม

การยกเลิกรายการและการคืนเงิน

รายการที่ใช้ เพย์วิธพอยท์ ยังไม่สามารถทำการยกเลิกรายการหรือการคืนเงินได้ผ่านโอมิเซะ หากต้องการยกเลิกรายการหรือคืนเงิน กรุณาติดต่อธนาคารโดยตรง

ข้อจำกัด

  • จำนวนรับชำระขั้นต่ำ: 2000 (THB20.00)
  • จำนวนรับชำระสูงสุด: 100000000 (THB1,000,000.00)

ขั้นตอนต่อไป