ทรูมันนี่วอลเล็ท

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

เอกสารฉบับนี้จะช่วยเป็นแนวทางการติดตั้งทรูมันนี่วอลเล็ทและอธิบายขั้นตอนการรับชำระเงินผ่านทรูมันนี่วอลเล็ท

ผู้ซื้อที่มีความประสงค์ที่จะชำระเงินผ่านทรูมันนี่วอลเล็ทจะต้องทำการลงทะเบียนหมายเลขโทรศัพท์ไว้กับทรูมันนี่ก่อนแล้ว

การเปิดรับชำระเงินผ่านทรูมันนี่วอลเล็ท

ถ้าต้องการเปิดใช้งาน ทรูมันนี่วอลเล็ท กรุณาส่งอีเมล์มาที่ support@omise.co เพื่อขอเปิดรับชำระผ่านวิธีนี้ ร้านค้าที่มีความประสงค์จะเปิดใช้งานจะต้องอ่านและยอมรับข้อกำหนดและเงื่อนไขการใช้บริการ

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

ขั้นตอนการรับชำระเงินผ่านทรูมันนี่วอลเล็ท

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

Points Select

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

การรับชำระเงินผ่าน ทรูมันนี่วอลเล็ท ฝั่งร้านค้าจะต้องมีการสร้างรายการโดยใช้ API requests 3 อย่างด้วยกัน

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

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

ส่วนการสร้างรายการหรือ charge เพื่อรับชำระผ่าน ทรูมันนี่วอลเล็ท จะเกิดขึ้นในฝั่งของร้านค้า (Server-side) โดยจะต้องใช้ secret key ทางโอมิเซะแนะนำให้ใช้ Omise.js หรือ ไลบรารี่ เพื่อติดตั้ง source ในฝั่งผู้ซื้อ (Client-side)

หมายเหตุ: หากมีความจำเป็นที่ต้องสร้างทั้งรายการและ source ในฝั่งร้านค้า (Server-side) สามารถใช้ Charge API ในการสร้างทั้งรายการและ source ได้ภายใต้ single API request (ไม่แนะนำ)

การสร้าง source ทรูมันนี่วอลเล็ท

การรับชำระผ่าน ทรูมันนี่วอลเล็ท จะต้องมีการสร้าง source ผ่าน source API เมื่อผู้ซื้อยืนยันจะชำระเงินผ่านช่องทางนี้ ให้สร้าง source ขึ้นใหม่โดยระบุ type, amount, currency, และ phone_number

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

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

Omise.setPublicKey(omise_public_key);

Omise.createSource('truemoney', {
  "amount": 400000,
  "currency": "THB",
  "phone_number": "0812345678"
}, 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=truemoney" \
  -d "phone_number=0812345678"
{
  "object": "source",
  "id": "src_test_5hn9a341yyes2fbo6by",
  "livemode": false,
  "location": "/sources/src_test_5hn9a341yyes2fbo6by",
  "created_at": "2019-10-22T10:37:45Z",
  "type": "truemoney",
  "flow": "redirect",
  "amount": 400000,
  "currency": "THB",
  "mobile_number": "0812345678",
  "phone_number": "0812345678",
  "references": null,
  "name": null,
  "email": null,
  "barcode": null,
  "store_id": null,
  "store_name": null,
  "terminal_id": null,
  "installment_term": null,
  "zero_interest_installments": null,
  "scannable_code": null
}

การสร้างรายการรับชำระเงินผ่านทรูมันนี่วอลเล็ท

ให้นำค่าใน id ที่ได้รับมา แทนลงใน source parameter ของรายการรับชำระเงินใหม่ เนื่องจากการรับชำระเงินผ่านทรูมันนี่วอลเล็ทเป็นขั้นตอนแบบ re-direct คือผู้ซื้อถูกส่งออกไปยังหน้าต่างใหม่เพื่อยืนยันการทำรายการ ร้านค้าจะต้องระบุ return_uri เป็น URL ของหน้าที่ต้องการแสดงต่อผู้ซื้อเมื่อทำการชำระเงินเสร็จ

หมายเหตุ: ในตัวอย่างนี้ร้านค้าจะต้องแทน $OMISE_SECRET_KEY ด้วย secret key ของตนเอง และในส่วนของ $SOURCE_ID จะต้องระบุ id ตาม attribute ด้านบน

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=$SOURCE_ID"
{
  "object": "charge",
  "id": "chrg_test_5hn9a367g0r2ynl0f55",
  "livemode": false,
  "location": "/charges/chrg_test_5hn9a367g0r2ynl0f55",
  "created_at": "2019-10-22T10:37:45Z",
  "amount": 400000,
  "currency": "THB",
  "funding_amount": 400000,
  "funding_currency": "THB",
  "fee": 14600,
  "fee_vat": 1022,
  "interest": 0,
  "interest_vat": 0,
  "net": 384378,
  "description": null,
  "metadata": {},
  "status": "pending",
  "capture": true,
  "authorized": false,
  "schedule": null,
  "reversed": false,
  "reversed_at": null,
  "expires_at": "2019-10-29T10:37:45Z",
  "expired": false,
  "expired_at": null,
  "voided": false,
  "paid": false,
  "paid_at": null,
  "transaction": null,
  "refunded_amount": 0,
  "refunds": {
    "object": "list",
    "from": "1970-01-01T00:00:00Z",
    "to": "2019-10-22T10:37:45Z",
    "offset": 0,
    "limit": 20,
    "total": 0,
    "order": "chronological",
    "location": "/charges/chrg_test_5hn9a367g0r2ynl0f55/refunds",
    "data": []
  },
  "link": null,
  "return_uri": "http://example.com/orders/345678/complete",
  "failure_code": null,
  "failure_message": null,
  "card": null,
  "customer": null,
  "ip": null,
  "dispute": null,
  "source": {
    "object": "source",
    "id": "src_test_5hn9a2xlb6o487pofr7",
    "livemode": false,
    "location": "/sources/src_test_5hn9a2xlb6o487pofr7",
    "created_at": "2019-10-22T10:37:44Z",
    "type": "truemoney",
    "flow": "redirect",
    "amount": 400000,
    "currency": "THB",
    "mobile_number": "0812345678",
    "phone_number": "0812345678",
    "references": null,
    "name": null,
    "email": null,
    "barcode": null,
    "store_id": null,
    "store_name": null,
    "terminal_id": null,
    "installment_term": null,
    "zero_interest_installments": null,
    "scannable_code": null
  },
  "platform_fee": {
    "percentage": null,
    "fixed": null,
    "amount": null
  },
  "disputable": false,
  "capturable": false,
  "reversible": false,
  "refundable": false,
  "authorize_uri": "https://pay.omise.co/payments/pay2_test_5hn9a36basp8vdxg6ws/authorize"
}

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

ร้านค้าสามารถสร้าง source และรายการรับชำระได้ภายใต้ single API request

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]=truemoney" \
  -d "source[phone_number]=0812345678"

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

เมื่อมาถึงขั้นตอนนี้ ร้านค้าได้สร้างรายการโดยมีสถานะเป็น pending หรือ status==pending

ขั้นตอนต่อไปจะแสดงวิธีการอนุมัติรายการ การรับ webhook event ของรายการที่สำเร็จและการตรวจสอบสถานะรายการ

การอนุมัติรายการ

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

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

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

การรับ Event ของรายการที่สำเร็จ

วิธีที่ดีที่สุดของการแจ้งเตือนเมื่อมีรายการที่สำเร็จคือการใช้ webhook events

ร้านค้าจะต้องตั้งตำแหน่งบน server เพื่อรับ webhook events และเพิ่มตำแหน่งนี้ให้เป็น webhook endpoint บนหน้าแดชบอร์ดที่ https://dashboard.omise.co/test/webhooks

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

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

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

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

ค่าของ charge.status ประกอบไปด้วย pending successful failed และ expired

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

สาเหตุขัดข้องดูได้ที่ตารางด้านล่างนี้

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

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

รายการรับชำระเงินทรูมันนี่วอลเล็ทสามารถทำการคืนเงิน (refund) ได้ภายใน 30 วันเท่านั้น รายการรับชำระเงินผ่านทรูมันนี่วอลเล็ทไม่สามารถยกเลิกรายการได้ (void) ทำการคืนเงินได้อย่างเดียว

สามารถอ่านวิธีการคืนเงินสำหรับรายการรับชำระเงินผ่านทรูมันนี่วอลเล็ทได้ที่ Refunds API

ข้อจำกัด

  • Minimum: 2000 (฿20)
  • Maximum: 15000000 (฿150,000)

นอกจากการจำกัดยอดชำระต่อรายการแล้ว ยอดชำระสูงสุดยังขึ้นอยู่กับสถานะการยืนยันตัวตนของเจ้าของบัญชีทรูมันนี่วอลเล็ทกับทางผู้ให้บริการด้วย

สถานะ ยอดสูงสุดต่อวัน
ยังไม่ได้ยืนยันตัวตน ฿40,000
ยืนยันตัวตนด้วยหมายเลขบัตรประชาชนผ่านช่องทางออนไลน์ ฿60,000
ยืนยันตัวตนด้วยบัตรประชาชนที่ตู้ทรูมันนี่หรือ 7-11 สาขาที่รองรับ ฿200,000

อ่านเพิ่มเติมได้ที่ คำถามที่พบบ่อยเกี่ยวกับทรูมันนี่วอลเล็ท

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