Skip to content

ເອກະສານ API ສາທາລະນະ ​

ເວີຊັ່ນ: 1.1.0 ອັບເດດລ່າສຸດ: 2025-12-24

ສະພາບແວດລ້ອມ ​

ສະພາບແວດລ້ອມBase URLຄຳອະທິບາຍ
Productionhttps://gateway.facaiqq.com/v1ທຸລະກຳຈິງ, ການຊຳລະເງິນຈິງ
Sandboxhttps://gateway.facaiqq.com/v1ທຸລະກຳທົດສອບ (ປະເພດ merchant sandbox ເທົ່ານັ້ນ)

ພາບລວມ ​

API ສາທາລະນະຊ່ວຍໃຫ້ merchants ສາມາດເຊື່ອມຕໍ່ຄວາມສາມາດໃນການປະມວນຜົນການຊຳລະເງິນເຂົ້າກັບແອັບພລິເຄຊັນຂອງພວກເຂົາ. ທຸກຄຳຂໍ API ຕ້ອງມີການຢືນຢັນຕົວຕົນດ້ວຍ HMAC-SHA256.

Production ທຽບກັບ Sandbox ​

ປະເພດ Merchant ກຳນົດເສັ້ນທາງທຸລະກຳ:

  • Production Merchant: ທຸລະກຳເງິນຈິງທີ່ປະມວນຜົນຜ່ານຜູ້ໃຫ້ບໍລິການຊຳລະເງິນ.
  • Sandbox Merchant: ທຸລະກຳຈຳລອງສຳລັບການທົດສອບ. ຄຳຕອບຖືກຈຳລອງໃນທ້ອງຖິ່ນໂດຍບໍ່ມີການປະມວນຜົນພາຍນອກ.

ການຢືນຢັນຕົວຕົນ ​

ທຸກຄຳຂໍ API ຕ້ອງມີ headers ດັ່ງຕໍ່ໄປນີ້:

Headerຈຳເປັນຄຳອະທິບາຍ
X-API-Keyແມ່ນAPI key ຂອງ merchant ຂອງທ່ານ (64 ຕົວອັກສອນ)
X-Signatureແມ່ນລາຍເຊັນ HMAC-SHA256 ຂອງຄຳຂໍ
X-Timestampແມ່ນUnix timestamp (ວິນາທີນັບຕັ້ງແຕ່ epoch)
Content-Typeແມ່ນapplication/json

ການສ້າງລາຍເຊັນ ​

ລາຍເຊັນຖືກຄຳນວນໂດຍໃຊ້ HMAC-SHA256 ກັບ Secret Key ຂອງທ່ານ:

Signature = HMAC-SHA256(SignatureData, SecretKey)
SignatureData = METHOD|PATH|TIMESTAMP|BODY

ຕົວຢ່າງ (ຄຳຂໍ POST):

SignatureData = "POST|/v1/payments/deposit|1702400000|{\"amount\":100.00,\"currency\":\"THB\",\"reference_id\":\"ORDER-001\"}"

ຕົວຢ່າງ (ຄຳຂໍ GET):

SignatureData = "GET|/v1/payments/pay_abc123|1702400000"

ຕົວຢ່າງລະຫັດ ​

python
import hmac
import hashlib
import time
import json
import requests

api_key = "your_api_key"
secret_key = "your_secret_key"
base_url = "https://gateway.facaiqq.com"

def create_signature(method, path, timestamp, body=""):
    # ສຳຄັນ: path ຕ້ອງເປັນເສັ້ນທາງ HTTP ເຕັມ (ເຊັ່ນ: /v1/payments/deposit)
    data = f"{method}|{path}|{timestamp}"
    if body:
        data += f"|{body}"
    return hmac.new(
        secret_key.encode(),
        data.encode(),
        hashlib.sha256
    ).hexdigest()

def make_request(method, path, body=None):
    timestamp = str(int(time.time()))
    body_str = json.dumps(body) if body else ""
    signature = create_signature(method, path, timestamp, body_str)

    headers = {
        "X-API-Key": api_key,
        "X-Signature": signature,
        "X-Timestamp": timestamp,
        "Content-Type": "application/json"
    }

    url = base_url + path
    if method == "POST":
        return requests.post(url, headers=headers, json=body)
    else:
        return requests.get(url, headers=headers)

# ສ້າງ deposit - ໝາຍເຫດ: ໃຊ້ເສັ້ນທາງເຕັມລວມທັງ /v1
response = make_request("POST", "/v1/payments/deposit", {
    "amount": 1000.00,
    "currency": "THB",
    "reference_id": "ORD888888888",
    "bank_code": "004",
    "bank_account_no": "1234567890",
    "bank_account_name": "test test",
    "webhook_url": "https://example.com/path/to/your/webhook"
})
print(response.json())
javascript
const crypto = require("crypto");
const axios = require("axios");

const apiKey = "your_api_key";
const secretKey = "your_secret_key";
const baseUrl = "https://gateway.facaiqq.com";

function createSignature(method, path, timestamp, body = "") {
  // ສຳຄັນ: path ຕ້ອງເປັນເສັ້ນທາງ HTTP ເຕັມ (ເຊັ່ນ: /v1/payments/deposit)
  let data = `${method}|${path}|${timestamp}`;
  if (body) {
    data += `|${body}`;
  }
  return crypto.createHmac("sha256", secretKey).update(data).digest("hex");
}

async function makeRequest(method, path, body = null) {
  const timestamp = Math.floor(Date.now() / 1000).toString();
  const bodyStr = body ? JSON.stringify(body) : "";
  const signature = createSignature(method, path, timestamp, bodyStr);

  const headers = {
    "X-API-Key": apiKey,
    "X-Signature": signature,
    "X-Timestamp": timestamp,
    "Content-Type": "application/json",
  };

  const url = baseUrl + path;
  if (method === "POST") {
    return axios.post(url, body, { headers });
  } else {
    return axios.get(url, { headers });
  }
}

// ສ້າງ deposit - ໝາຍເຫດ: ໃຊ້ເສັ້ນທາງເຕັມລວມທັງ /v1
makeRequest("POST", "/v1/payments/deposit", {
  amount: 1000.0,
  currency: "THB",
  reference_id: "ORD888888888",
  bank_code: "004",
  bank_account_no: "1234567890",
  bank_account_name: "test test",
  webhook_url: "https://example.com/path/to/your/webhook",
}).then((res) => console.log(res.data));
php
<?php
$apiKey = 'your_api_key';
$secretKey = 'your_secret_key';
$baseUrl = 'https://gateway.facaiqq.com';

function createSignature($method, $path, $timestamp, $body = '') {
    global $secretKey;
    // ສຳຄັນ: path ຕ້ອງເປັນເສັ້ນທາງ HTTP ເຕັມ (ເຊັ່ນ: /v1/payments/deposit)
    $data = "$method|$path|$timestamp";
    if ($body) {
        $data .= "|$body";
    }
    return hash_hmac('sha256', $data, $secretKey);
}

function makeRequest($method, $path, $body = null) {
    global $apiKey, $baseUrl;

    $timestamp = time();
    $bodyStr = $body ? json_encode($body) : '';
    $signature = createSignature($method, $path, $timestamp, $bodyStr);

    $headers = [
        'X-API-Key: ' . $apiKey,
        'X-Signature: ' . $signature,
        'X-Timestamp: ' . $timestamp,
        'Content-Type: application/json'
    ];

    $ch = curl_init($baseUrl . $path);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if ($method === 'POST') {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyStr);
    }

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// ສ້າງ deposit - ໝາຍເຫດ: ໃຊ້ເສັ້ນທາງເຕັມລວມທັງ /v1
$response = makeRequest('POST', '/v1/payments/deposit', [
    'amount' => 1000.00,
    'currency' => 'THB',
    'reference_id' => 'ORD888888888',
    'bank_code' => '004',
    'bank_account_no' => '1234567890',
    'bank_account_name' => 'test test',
    'webhook_url' => 'https://example.com/path/to/your/webhook'
]);
print_r($response);
go
package main

import (
    "bytes"
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "strconv"
    "time"
)

const (
    apiKey    = "your_api_key"
    secretKey = "your_secret_key"
    baseURL   = "https://gateway.facaiqq.com"
)

func createSignature(method, path, timestamp, body string) string {
    // ສຳຄັນ: path ຕ້ອງເປັນເສັ້ນທາງ HTTP ເຕັມ (ເຊັ່ນ: /v1/payments/deposit)
    data := fmt.Sprintf("%s|%s|%s", method, path, timestamp)
    if body != "" {
        data += "|" + body
    }
    h := hmac.New(sha256.New, []byte(secretKey))
    h.Write([]byte(data))
    return hex.EncodeToString(h.Sum(nil))
}

func makeRequest(method, path string, body interface{}) (map[string]interface{}, error) {
    timestamp := strconv.FormatInt(time.Now().Unix(), 10)

    var bodyStr string
    var reqBody io.Reader
    if body != nil {
        bodyBytes, _ := json.Marshal(body)
        bodyStr = string(bodyBytes)
        reqBody = bytes.NewBuffer(bodyBytes)
    }

    signature := createSignature(method, path, timestamp, bodyStr)

    req, _ := http.NewRequest(method, baseURL+path, reqBody)
    req.Header.Set("X-API-Key", apiKey)
    req.Header.Set("X-Signature", signature)
    req.Header.Set("X-Timestamp", timestamp)
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    var result map[string]interface{}
    json.NewDecoder(resp.Body).Decode(&result)
    return result, nil
}

func main() {
    // ສ້າງ deposit - ໝາຍເຫດ: ໃຊ້ເສັ້ນທາງເຕັມລວມທັງ /v1
    result, _ := makeRequest("POST", "/v1/payments/deposit", map[string]interface{}{
        "amount":            1000.00,
        "currency":          "THB",
        "reference_id":      "ORD888888888",
        "bank_code":         "004",
        "bank_account_no":   "1234567890",
        "bank_account_name": "test test",
        "webhook_url":       "https://example.com/path/to/your/webhook",
    })
    fmt.Printf("%+v\n", result)
}

Endpoints ​

ສ້າງ Deposit ​

ສ້າງຄຳຂໍການຊຳລະເງິນ deposit ໃໝ່. ສົ່ງຄືນ PromptPay QR code ສຳລັບລູກຄ້າຊຳລະເງິນ.

POST /v1/payments/deposit

Request Body ​

ຊ່ອງຂໍ້ມູນປະເພດຈຳເປັນຄຳອະທິບາຍ
amountnumberແມ່ນຈຳນວນເງິນ (> 0)
currencystringແມ່ນລະຫັດສະກຸນເງິນ (3 ຕົວອັກສອນ, ເຊັ່ນ: "THB")
reference_idstringແມ່ນລະຫັດອ້າງອີງຄຳສັ່ງຊື້ທີ່ບໍ່ຊ້ຳກັນຂອງທ່ານ (1-64 ຕົວອັກສອນ)
customer_emailstringບໍ່ອີເມວລູກຄ້າສຳລັບການແຈ້ງເຕືອນ
customer_phonestringບໍ່ເບີໂທລະສັບລູກຄ້າ (ສູງສຸດ 20 ຕົວອັກສອນ)
descriptionstringບໍ່ຄຳອະທິບາຍການຊຳລະເງິນ (ສູງສຸດ 255 ຕົວອັກສອນ)
webhook_urlstringບໍ່URL webhook ສຳລັບການແຈ້ງເຕືອນການຊຳລະເງິນ
bank_codestringບໍ່ລະຫັດທະນາຄານຂອງຜູ້ຊຳລະ (3 ຕົວເລກ) ສຳລັບອ້າງອີງ
bank_account_nostringບໍ່ເລກບັນຊີທະນາຄານຂອງຜູ້ຊຳລະ (ສູງສຸດ 20 ຕົວອັກສອນ)
bank_account_namestringບໍ່ຊື່ເຈົ້າຂອງບັນຊີທະນາຄານຂອງຜູ້ຊຳລະ (ສູງສຸດ 100 ຕົວອັກສອນ)

ຕົວຢ່າງຄຳຂໍ ​

json
{
  "amount": 1000.00,
  "currency": "THB",
  "reference_id": "ORD888888888",
  "bank_code": "004",
  "bank_account_no": "1234567890",
  "bank_account_name": "test test",
  "webhook_url": "https://example.com/path/to/your/webhook"
}

ຄຳຕອບ ​

ຮູບແບບຄຳຕອບຈະຂຶ້ນກັບວ່າຍອດ amount ຮອດເກນທີ່ແອັດມິນກຳນົດຫຼືບໍ່ (ຕົວຢ່າງດ້ານລຸ່ມໃຊ້ເກນ 5000 ເຊິ່ງເປັນພຽງຄ່າຕົວຢ່າງເທົ່ານັ້ນ — ຄ່າຈິງກຳນົດໂດຍແອັດມິນ).

ກໍລະນີ amount ຕ່ຳກວ່າເກນ (ເຊັ່ນ < 5000) — ຊຳລະຜ່ານ QR PromptPay

company_account = false ແລະ ຍັງຄົງສົ່ງຄືນ QR code PromptPay ຕາມປົກກະຕິ.

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORD888888888",
  "type": "deposit",
  "status": "pending",
  "amount": 1000.00,
  "currency": "THB",
  "company_account": false,
  "qr_code": "00020101021129370016A000000677010111011300668123456785802TH5303764...",
  "qr_code_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
  "created_at": "2025-12-24T10:30:00Z",
  "expires_at": "2025-12-24T10:45:00Z"
}

ກໍລະນີ amount ຮອດເກນ (ເຊັ່ນ >= 5000) — ໂອນເຂົ້າບັນຊີບໍລິສັດ

company_account = true ພ້ອມຂໍ້ມູນບັນຊີບໍລິສັດ (company_account_bank_code, company_account_bank_name, company_account_name, company_account_no). ຄຳຕອບນີ້ຈະບໍ່ສົ່ງຄືນຊ່ອງ qr_code / qr_code_image.

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORD888888888",
  "type": "deposit",
  "status": "pending",
  "amount": 5000.00,
  "currency": "THB",
  "company_account": true,
  "company_account_bank_code": "004",
  "company_account_bank_name": "ທະນາຄານກະສິກອນໄທ",
  "company_account_name": "ບໍລິສັດ ຕົວຢ່າງ ຈຳກັດ",
  "company_account_no": "1234567890",
  "created_at": "2025-12-24T10:30:00Z",
  "expires_at": "2025-12-24T10:45:00Z"
}

ຊ່ອງຂໍ້ມູນຄຳຕອບ ​

ຊ່ອງຂໍ້ມູນປະເພດຄຳອະທິບາຍ
idstringID ທຸລະກຳທີ່ບໍ່ຊ້ຳກັນ (ຮູບແບບ UUID)
reference_idstringລະຫັດອ້າງອີງຄຳສັ່ງຊື້ຂອງທ່ານ
typestringປະເພດທຸລະກຳ (deposit)
statusstringສະຖານະການຊຳລະເງິນ
amountnumberຈຳນວນເງິນ
currencystringລະຫັດສະກຸນເງິນ
company_accountbooleanສະຖານະບັນຊີບໍລິສັດ — true ເມື່ອ amount ຮອດເກນທີ່ແອັດມິນກຳນົດ (ໂອນເຂົ້າບັນຊີບໍລິສັດ), false ເມື່ອຕ່ຳກວ່າເກນ (ຊຳລະຜ່ານ QR) — ຄ່າເກນ 5000 ເປັນພຽງຕົວຢ່າງ
company_account_bank_codestringລະຫັດທະນາຄານຂອງບັນຊີບໍລິສັດ (3 ຫຼັກ) (ສະແດງສະເພາະກໍລະນີ company_account = true)
company_account_bank_namestringຊື່ທະນາຄານຂອງບັນຊີບໍລິສັດ (ສະແດງສະເພາະກໍລະນີ company_account = true)
company_account_namestringຊື່ບັນຊີບໍລິສັດ (ສະແດງສະເພາະກໍລະນີ company_account = true)
company_account_nostringເລກບັນຊີບໍລິສັດ (ສະແດງສະເພາະກໍລະນີ company_account = true)
qr_codestringສະຕຣິງ PromptPay QR code (ສົ່ງເມື່ອ company_account = false ເທົ່ານັ້ນ)
qr_code_imagestringຮູບພາບ QR code ທີ່ເຂົ້າລະຫັດ Base64, PNG (ສົ່ງເມື່ອ company_account = false ເທົ່ານັ້ນ)
created_atstringເວລາສ້າງ (ISO 8601)
expires_atstringເວລາໝົດອາຍຸ (ISO 8601, ຄ່າເລີ່ມຕົ້ນ 15 ນາທີ)

ສ້າງ Withdraw ​

ສ້າງຄຳຂໍຖອນເງິນ/ຈ່າຍເງິນໃໝ່ໄປຫາບັນຊີທະນາຄານ.

POST /v1/payments/withdraw

Request Body ​

ຊ່ອງຂໍ້ມູນປະເພດຈຳເປັນຄຳອະທິບາຍ
amountnumberແມ່ນຈຳນວນເງິນຖອນ (> 0)
currencystringແມ່ນລະຫັດສະກຸນເງິນ (3 ຕົວອັກສອນ)
reference_idstringແມ່ນລະຫັດອ້າງອີງທີ່ບໍ່ຊ້ຳກັນຂອງທ່ານ (1-64 ຕົວອັກສອນ)
bank_codestringແມ່ນລະຫັດທະນາຄານ (3 ຕົວເລກ, ເບິ່ງຕາຕະລາງຂ້າງລຸ່ມ)
account_numberstringແມ່ນເລກບັນຊີທະນາຄານ (10-20 ຕົວເລກ)
account_holder_namestringແມ່ນຊື່ເຈົ້າຂອງບັນຊີ (1-100 ຕົວອັກສອນ)
descriptionstringບໍ່ຄຳອະທິບາຍການໂອນ (ສູງສຸດ 255 ຕົວອັກສອນ)
webhook_urlstringບໍ່URL webhook ສຳລັບການແຈ້ງເຕືອນການໂອນ

ລະຫັດທະນາຄານ ​

ລະຫັດຊື່ໄທຊື່ອັງກິດ
002ธนาคารกรุงเทพBangkok Bank PCL (BBL)
004ธนาคารกสิกรไทยKasikornbank PCL (Kbank)
006ธนาคารกรุงไทยKrungthai Bank PCL (KTB)
011ธนาคารทหารไทยธนชาตTMBThanachart Bank PCL (TTB)
014ธนาคารไทยพาณิชย์Siam Commercial Bank PCL (SCB)
017ธนาคารซิตี้แบงก์Citibank N.A.
020ธนาคารสแตนดาร์ดชาร์เตอร์ด (ไทย)Standard Chartered Bank (Thai) PCL
022ธนาคารซีไอเอ็มบี ไทยCIMB Thai Bank PCL
024ธนาคารยูโอบีUnited Overseas Bank (Thai) PCL
025ธนาคารกรุงศรีอยุธยาBank of Ayudhya PCL (Krungsri)
026ธนาคารเมกะสากลพาณิชย์Mega International Commercial Bank
030ธนาคารออมสินGovernment Savings Bank (GSB)
031ธนาคารฮ่องกงและเซี่ยงไฮ้HSBC Thailand
033ธนาคารอาคารสงเคราะห์Government Housing Bank (GHB)
034ธนาคารเพื่อการเกษตรฯBAAC
065ธนาคารธนชาตThanachart Bank PCL
066ธนาคารอิสลามแห่งประเทศไทยIslamic Bank of Thailand
067ธนาคารทิสโก้TISCO Bank PCL
069ธนาคารเกียรตินาคินภัทรKiatnakin Phatra Bank PCL (KKP)
070ธนาคารไอซีบีซี (ไทย)ICBC (Thai) PCL
071ธนาคารไทยเครดิตThai Credit Retail Bank
073ธนาคารแลนด์ แอนด์ เฮ้าส์Land and Houses Bank PCL (LH Bank)
088ธนาคารคลิกซ์Clicx Bank
PROMPTPAYพร้อมเพย์PromptPay
TRUEทรูมันนี่TrueMoney

ການຖອນເງິນ PromptPay ​

ເມື່ອໃຊ້ bank_code: "PROMPTPAY", ຊ່ອງ account_number ຄວນມີ:

ຄວາມຍາວເລກບັນຊີປະເພດ Proxyຄຳອະທິບາຍ
10 ຕົວເລກMOBILEເບີໂທລະສັບມືຖື
13 ຕົວເລກTXIDເລກບັດປະຈຳຕົວ ຫຼື ເລກປະຈຳຕົວຜູ້ເສຍພາສີ

ຕົວຢ່າງຄຳຂໍ (PromptPay ກັບເບີມືຖື):

json
{
  "amount": 5000.00,
  "currency": "THB",
  "reference_id": "ORD888888890",
  "bank_code": "PROMPTPAY",
  "account_number": "0812345678",
  "account_holder_name": "John Doe"
}

ຕົວຢ່າງຄຳຂໍ (PromptPay ກັບເລກບັດປະຈຳຕົວ):

json
{
  "amount": 5000.00,
  "currency": "THB",
  "reference_id": "ORD888888891",
  "bank_code": "PROMPTPAY",
  "account_number": "1234567890123",
  "account_holder_name": "John Doe"
}

ຕົວຢ່າງຄຳຂໍ ​

json
{
  "amount": 5000.00,
  "currency": "THB",
  "reference_id": "ORD888888889",
  "bank_code": "014",
  "account_number": "1234567890",
  "account_holder_name": "John Doe",
  "webhook_url": "https://example.com/path/to/your/webhook"
}

ຄຳຕອບ ​

json
{
  "id": "660e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORD888888889",
  "type": "withdraw",
  "status": "processing",
  "amount": 5000.00,
  "currency": "THB",
  "created_at": "2025-12-24T11:00:00Z"
}

ເອົາຂໍ້ມູນການຊຳລະເງິນ ​

ເອົາລາຍລະອຽດການຊຳລະເງິນໂດຍ ID ການຊຳລະເງິນ.

GET /v1/payments/{id}

Path Parameters ​

Parameterປະເພດຄຳອະທິບາຍ
idstringID ການຊຳລະເງິນ (ຮູບແບບ UUID)

ຕົວຢ່າງຄຳຕອບ ​

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORDER-2024-001",
  "type": "deposit",
  "status": "completed",
  "amount": 1500.00,
  "currency": "THB",
  "qr_code": "00020101021129370016A000000677010111...",
  "created_at": "2024-12-12T10:30:00Z",
  "expires_at": "2024-12-12T10:45:00Z"
}

ຍົກເລີກການຊຳລະເງິນ ​

ຍົກເລີກການຊຳລະເງິນທີ່ລໍຖ້າຢູ່. ສາມາດຍົກເລີກໄດ້ສະເພາະການຊຳລະເງິນທີ່ມີສະຖານະ pending ເທົ່ານັ້ນ.

POST /v1/payments/{id}/cancel

Path Parameters ​

Parameterປະເພດຄຳອະທິບາຍ
idstringID ການຊຳລະເງິນທີ່ຈະຍົກເລີກ

ຕົວຢ່າງຄຳຕອບ ​

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORDER-2024-001",
  "type": "deposit",
  "status": "cancelled",
  "amount": 1500.00,
  "currency": "THB",
  "created_at": "2024-12-12T10:30:00Z"
}

ສະຖານະການຊຳລະເງິນ ​

ສະຖານະຄຳອະທິບາຍ
pendingການຊຳລະເງິນຖືກສ້າງແລ້ວ, ລໍຖ້າການດຳເນີນການຂອງລູກຄ້າ
processingການຊຳລະເງິນກຳລັງຖືກປະມວນຜົນ
completedການຊຳລະເງິນສຳເລັດແລ້ວ
failedການຊຳລະເງິນລົ້ມເຫລວ (ລວມທັງທຸລະກຳທີ່ໝົດອາຍຸ)
cancelledການຊຳລະເງິນຖືກຍົກເລີກ
refundedການຊຳລະເງິນຖືກຄືນເງິນ

ໝາຍເຫດ

ເມື່ອການຊຳລະເງິນໝົດອາຍຸ (ລູກຄ້າບໍ່ຊຳລະເງິນພາຍໃນເວລາທີ່ກຳນົດ), ສະຖານະຈະປ່ຽນເປັນ failed ພ້ອມກັບເຫດຜົນຄວາມລົ້ມເຫລວ "Transaction expired". Webhook ຈະຖືກສົ່ງເພື່ອແຈ້ງເຕືອນລະບົບຂອງທ່ານ.


Webhooks ​

ເມື່ອທ່ານສະໜອງ webhook_url, ພວກເຮົາຈະສົ່ງຄຳຂໍ POST ພ້ອມກັບການອັບເດດການຊຳລະເງິນ.

Webhook Payload ​

Webhook payload ຖືກສົ່ງໂດຍກົງ (ບໍ່ໄດ້ຫໍ່ຢູ່ໃນໂຄງສ້າງເຫດການ):

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "type": "deposit",
  "amount": 1500.00,
  "fee": 37.50,
  "netAmount": 1462.50,
  "bankAccountNo": "1234567890",
  "bankAccountName": "SOMCHAI JAIDEE",
  "bankCode": "014",
  "bankName": "ธนาคารไทยพาณิชย์",
  "currency": "THB",
  "referenceNo": "ORDER-2024-001",
  "status": "success",
  "timestamp": "2024-12-12T10:35:00Z",
  "paidAt": "2024-12-12T10:34:55.123456789Z"
}

ຊ່ອງຂໍ້ມູນ Webhook Payload ​

ຊ່ອງຂໍ້ມູນປະເພດຄຳອະທິບາຍ
idstringID ທຸລະກຳ
typestringປະເພດທຸລະກຳ: deposit ຫຼື withdraw
amountnumberຈຳນວນເງິນການຊຳລະເງິນເດີມ
feenumberຄ່າທຳນຽມການປະມວນຜົນ
netAmountnumberຈຳນວນເງິນຫຼັງຫັກຄ່າທຳນຽມ
bankAccountNostringເລກບັນຊີທະນາຄານ (ສຳລັບ deposits ທີ່ມີຂໍ້ມູນຜູ້ຊຳລະ)
bankAccountNamestringຊື່ເຈົ້າຂອງບັນຊີທະນາຄານ
bankCodestringລະຫັດທະນາຄານ
bankNamestringຊື່ທະນາຄານເປັນພາສາໄທ
currencystringລະຫັດສະກຸນເງິນ
referenceNostringID ອ້າງອີງຂອງທ່ານ
statusstringsuccess, failed, ຫຼື expired
timestampstringເວລາສົ່ງ webhook (ISO 8601)
paidAtstringເວລາສຳເລັດການຊຳລະເງິນ (ວ່າງຖ້າຍັງບໍ່ຊຳລະ)

ຄ່າສະຖານະ Webhook ​

ສະຖານະຄຳອະທິບາຍ
successການຊຳລະເງິນສຳເລັດແລ້ວ
failedການຊຳລະເງິນລົ້ມເຫລວ ຫຼື ໝົດອາຍຸ
expiredການຊຳລະເງິນໝົດອາຍຸ (legacy, ປັດຈຸບັນໃຊ້ failed)

ນະໂຍບາຍການລອງສົ່ງ Webhook ໃໝ່ ​

  • Webhooks ຈະຖືກລອງສົ່ງໃໝ່ສູງສຸດ 5 ຄັ້ງ ຖ້າການສົ່ງລົ້ມເຫລວ
  • ໄລຍະຫ່າງການລອງໃໝ່: 1 ນາທີ ລະຫວ່າງການພະຍາຍາມ
  • ການສົ່ງສຳເລັດແມ່ນ ຄຳຕອບ HTTP 2xx ໃດໆກໍໄດ້
  • ຫຼັງຈາກ 5 ຄັ້ງທີ່ລົ້ມເຫລວ, webhook ຈະຖືກໝາຍວ່າລົ້ມເຫລວ

ການຢືນຢັນ Webhook ​

ຄຳຂໍ Webhook ລວມມີ headers ສຳລັບການຢືນຢັນ:

Headerຄຳອະທິບາຍ
X-Webhook-Signatureລາຍເຊັນ HMAC-SHA256 ຂອງ request body
X-Webhook-TimestampUnix timestamp ຂອງ webhook
Content-Typeapplication/json

ຢືນຢັນ webhooks ໂດຍໃຊ້ວິທີ HMAC ດຽວກັນກັບຄຳຂໍ API:

python
import hmac
import hashlib

def verify_webhook(body, signature, timestamp, secret_key):
    expected = hmac.new(
        secret_key.encode(),
        f"{timestamp}|{body}".encode(),
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

ຄຳຕອບຂໍ້ຜິດພາດ ​

ຂໍ້ຜິດພາດທັງໝົດມີຮູບແບບດັ່ງນີ້:

json
{
  "code": "ERROR_CODE",
  "message": "Human-readable error message"
}

ລະຫັດສະຖານະ HTTP ​

ສະຖານະຄຳອະທິບາຍ
200ສຳເລັດ
201ສ້າງສຳເລັດ
400ຄຳຂໍບໍ່ຖືກຕ້ອງ - parameters ບໍ່ຖືກຕ້ອງ
401ບໍ່ໄດ້ຮັບອະນຸຍາດ - API key ຫຼື ລາຍເຊັນບໍ່ຖືກຕ້ອງ
403ຖືກຫ້າມ - merchant ບໍ່ເຄື່ອນໄຫວ ຫຼື ສິດທິບໍ່ພຽງພໍ
404ບໍ່ພົບ
409ຂັດແຍ້ງ - reference_id ຊ້ຳ
500ຂໍ້ຜິດພາດພາຍໃນເຊີບເວີ
504Gateway timeout

ລະຫັດຂໍ້ຜິດພາດ ​

ລະຫັດຄຳອະທິບາຍ
INVALID_REQUESTການກວດສອບ request body ລົ້ມເຫລວ
MISSING_API_KEYຂາດ header X-API-Key
MISSING_SIGNATUREຂາດ header X-Signature
MISSING_TIMESTAMPຂາດ header X-Timestamp
INVALID_API_KEYAPI key ບໍ່ຖືກຕ້ອງ
INVALID_SIGNATUREການຢືນຢັນລາຍເຊັນລົ້ມເຫລວ
INVALID_TIMESTAMPຮູບແບບ timestamp ບໍ່ຖືກຕ້ອງ
TIMESTAMP_EXPIREDtimestamp ຂອງຄຳຂໍຢູ່ນອກຂອບເຂດທີ່ຖືກຕ້ອງ
MERCHANT_INACTIVEບັນຊີ merchant ບໍ່ເຄື່ອນໄຫວ
PAYMENT_NOT_FOUNDບໍ່ພົບການຊຳລະເງິນ
PAYMENT_ERRORຂໍ້ຜິດພາດການປະມວນຜົນການຊຳລະເງິນທົ່ວໄປ
DUPLICATE_REFERENCEID ອ້າງອີງມີຢູ່ແລ້ວ
INSUFFICIENT_BALANCEຍອດເງິນບໍ່ພຽງພໍສຳລັບການຖອນ
INVALID_BANK_CODEລະຫັດທະນາຄານບໍ່ຖືກຕ້ອງ
INVALID_ACCOUNTບັນຊີທະນາຄານບໍ່ຖືກຕ້ອງ (sandbox)
PAYMENT_CANNOT_BE_CANCELLEDບໍ່ສາມາດຍົກເລີກການຊຳລະເງິນໄດ້
TIMEOUTຄຳຂໍໝົດເວລາ

ການທົດສອບ Sandbox ​

Sandbox ເຮັດວຽກແນວໃດ ​

ໂໝດ Sandbox ຖືກກຳນົດໂດຍ ປະເພດ merchant ຂອງທ່ານ, ບໍ່ແມ່ນ URL ແຍກຕ່າງຫາກ. ທັງ sandbox ແລະ production merchants ໃຊ້ API endpoint ດຽວກັນ:

Base URL: https://gateway.facaiqq.com/v1

  • Sandbox Merchants: ທຸລະກຳຖືກເກັບໄວ້ໃນຖານຂໍ້ມູນ sandbox. ບໍ່ມີການປະມວນຜົນເງິນຈິງ.
  • Production Merchants: ທຸລະກຳຖືກເກັບໄວ້ໃນຖານຂໍ້ມູນ production ແລະ ປະມວນຜົນຜ່ານຜູ້ໃຫ້ບໍລິການຊຳລະເງິນ.

ຕິດຕໍ່ຝ່າຍຊ່ວຍເຫຼືອເພື່ອຂໍ credentials sandbox ສຳລັບການທົດສອບ.

ຈຳນວນເງິນທົດສອບ ​

ໃນໂໝດ sandbox, ຈຳນວນເງິນສະເພາະຈະເຮັດໃຫ້ເກີດພຶດຕິກຳທີ່ແຕກຕ່າງກັນ:

ຈຳນວນເງິນສະກຸນເງິນພຶດຕິກຳຄຳອະທິບາຍ
100.00THBauto_approveການຊຳລະເງິນສຳເລັດທັນທີ
200.00THBauto_pendingການຊຳລະເງິນຢູ່ໃນສະຖານະລໍຖ້າ (ຈຳລອງຄວາມຊັກຊ້າ)
500.00THBauto_approveການຊຳລະເງິນສຳເລັດທັນທີ
888.88THBtimeoutການຊຳລະເງິນໝົດເວລາ
999.99THBauto_failການຊຳລະເງິນລົ້ມເຫລວທັນທີ
1000.00THBauto_approveການຊຳລະເງິນສຳເລັດທັນທີ
ອື່ນໆTHBpendingຂັ້ນຕອນການຊຳລະເງິນປົກກະຕິ

ສະຖານະການທົດສອບ ​

ທ່ານສາມາດແທນທີ່ພຶດຕິກຳໂດຍໃຊ້ header X-Sandbox-Scenario:

ສະຖານະການຄຳອະທິບາຍ
auto_approveບັງຄັບໃຫ້ການຊຳລະເງິນສຳເລັດທັນທີ
auto_failບັງຄັບໃຫ້ການຊຳລະເງິນລົ້ມເຫລວ
auto_pendingບັງຄັບໃຫ້ການຊຳລະເງິນຢູ່ໃນສະຖານະລໍຖ້າ
timeoutຈຳລອງການໝົດເວລາ
invalid_accountຈຳລອງບັນຊີທະນາຄານບໍ່ຖືກຕ້ອງ (ສຳລັບ withdraw ເທົ່ານັ້ນ)

ຕົວຢ່າງ:

bash
curl -X POST https://gateway.facaiqq.com/v1/payments/deposit \
  -H "X-Sandbox-Scenario: auto_approve" \
  -H "X-API-Key: your_sandbox_api_key" \
  -H "X-Signature: ..." \
  -H "X-Timestamp: ..." \
  -H "Content-Type: application/json" \
  -d '{"amount": 500.00, "currency": "THB", "reference_id": "TEST-001"}'

Response Headers ​

ຄຳຕອບລວມມີ header ທີ່ບອກສະພາບແວດລ້ອມ:

Headerຄ່າຄຳອະທິບາຍ
X-Environmentsandbox ຫຼື productionບອກປະເພດ merchant

ການໝົດອາຍຸທຸລະກຳ ​

  • ທຸລະກຳ Deposit ມີຄ່າເລີ່ມຕົ້ນການໝົດອາຍຸ 15 ນາທີ
  • ຖ້າລູກຄ້າບໍ່ຊຳລະເງິນພາຍໃນເວລານີ້:
    • ສະຖານະປ່ຽນເປັນ failed (ບໍ່ແມ່ນ expired)
    • failure_reason ຖືກຕັ້ງເປັນ "Transaction expired"
    • Webhook ຖືກສົ່ງພ້ອມກັບ status: "failed"
  • ການກວດສອບການໝົດອາຍຸດຳເນີນທຸກ 1 ນາທີ

ຂໍ້ຈຳກັດອັດຕາ ​

Endpointຂໍ້ຈຳກັດອັດຕາ
ທຸກ endpoints100 ຄຳຂໍ/ນາທີ
Create Deposit30 ຄຳຂໍ/ນາທີ
Create Withdraw20 ຄຳຂໍ/ນາທີ

Headers ຂໍ້ຈຳກັດອັດຕາລວມຢູ່ໃນຄຳຕອບ:

Headerຄຳອະທິບາຍ
X-RateLimit-Limitຄຳຂໍສູງສຸດຕໍ່ຊ່ວງເວລາ
X-RateLimit-Remainingຄຳຂໍທີ່ຍັງເຫຼືອໃນຊ່ວງເວລາ
X-RateLimit-ResetUnix timestamp ເວລາຂໍ້ຈຳກັດຖືກຣີເຊັດ

ການຊ່ວຍເຫຼືອ ​

ສຳລັບການຊ່ວຍເຫຼືອດ້ານເທັກນິກ:

FacaiQQ Payment Gateway