📖 API Documentation

คู่มือการใช้งาน API ของ Paynoi

  • Base URL: https://paynoi.com/ppay_api
  • Content-Type: application/json
  • Authentication: ใช้ api_key จากตาราง users

สำคัญ! ก่อนใช้งาน

  • เปิดการแจ้งเตือน SMS Banking เงินเข้า มาที่เบอร์ 0956511824
1

Create Transaction

สร้างธุรกรรมพร้อมเพย์และ QR Code โดยรับ amount เป็นจำนวนเต็ม (หน่วยบาท) และ API จะสุ่มทศนิยม 2 ตำแหน่ง (เช่น 100 บาทอาจกลายเป็น 100.24 บาท) ** สุ่มเริ่มตั้งแต่ .00-.99

Request POST

Endpoint: /ppay_api

JSON Request
{
    "method": "create",
    "api_key": "your_test_api_key",
    "amount": 100,
    "ref1": "testpay",
    "key_id": "100568",
    "account": "1234567890",
    "type": "1"
}
  • method คงที่เป็น "create"
  • api_key API key จากตาราง users
  • amount จำนวนเต็ม (หน่วยบาท เช่น 100)
    ⚠️ ต้องไม่ต่ำกว่า ยอดขั้นต่ำ ที่ตั้งไว้ในหน้าตั้งค่าของคุณ
  • ref1 อ้างอิงธุรกรรม (เช่น รหัสคำสั่งซื้อ)
  • key_id รหัสธนาคาร 6 หลัก — ระบบ SMS รองรับ 3 ธนาคาร: 100568 กสิกรไทย, 100569 กรุงศรีอยุธยา, 100570 ไทยพาณิชย์
    หมายเหตุ: กรุงไทย และ G Wallet (เป๋าตัง) รองรับเฉพาะช่องทาง พร้อมเพย์ LINE Connect เท่านั้น
  • account เลขที่พร้อมเพย์ (เบอร์มือถือ หรือ เลขบัตรประชาชน)
  • type ประเภทบัญชี (1: เบอร์มือถือ หรือ 2: เลขบัตรประชาชน)

Response

Success (สมมติสุ่มทศนิยมได้ 0.24):

JSON Response
{
    "status": 1,
    "trans_id": "PPAY_123456789",
    "qr_image_base64": "data:image/png;base64,iVBORw0KGgoAAA...",
    "amount_check": 10024,
    "amount": "100.24",
    "expire_at": "2026-08-05 23:28:20"
}
  • status 1 (สำเร็จ)
  • trans_id รหัสธุรกรรมที่สร้าง
  • qr_image_base64 รูป QR Code ในรูปแบบ Base64
  • amount_check ยอดรวม (สตางค์ เช่น 10024)
  • amount ยอดรวมที่มีทศนิยม (บาท เช่น 100.24)
  • qr_image_base64 ขึ้นต้นด้วย data:image/png;base64, ใส่ใน <img src="..."> ได้ทันที
  • expire_at เวลาหมดอายุ รูปแบบ Y-m-d H:i:s (2 ชั่วโมงจากเวลาสร้าง)
    หมายเหตุ: endpoint check คืนค่าเป็น ISO 8601 ต่างจาก create

Error:

JSON Error Response
{
    "status": 0,
    "msg": "จำนวนเงิน, ref1, key_id, หรือ account ไม่ถูกต้อง"
}
สำคัญ: ทุก error ตอบกลับด้วย HTTP 200
อย่าเช็คแค่ HTTP status code — ต้องเช็คค่า status ใน JSON เสมอ (1 = สำเร็จ, 0 = ล้มเหลว)
ข้อความ msg ที่พบได้:
  • API key ไม่ถูกต้อง
  • จำนวนเงิน (X บาท) ต่ำกว่ายอดขั้นต่ำ (Y บาท)
  • ไม่พบการตั้งค่าสำหรับ key_id นี้ — ยังไม่ได้ตั้งค่าธนาคารสำหรับ key_id นั้น
  • จำนวนเงิน, ref1, key_id, หรือ account ไม่ถูกต้อง — พารามิเตอร์ไม่ครบ
  • เมธอดไม่ถูกต้องmethod ไม่ใช่ create / cancel / check
2

Cancel Transaction

ยกเลิกธุรกรรมที่อยู่ในสถานะ pending หรือหมดอายุ (เกิน 15 นาทีจาก created_at)

Request POST

Endpoint: /ppay_api

JSON Request
{
    "method": "cancel",
    "api_key": "your_test_api_key",
    "trans_id": "PPAY_123456789"
}
  • method คงที่เป็น "cancel"
  • api_key API key จากตาราง users
  • trans_id รหัสธุรกรรมจากคำขอ create

Response

Success:

JSON Response
{
    "status": 1
}

Error:

JSON Error Response
{
    "status": 0,
    "msg": "ธุรกรรมยังไม่หมดอายุและอยู่ในสถานะที่ไม่สามารถยกเลิกได้"
}
3

Check Transaction Status

ตรวจสอบสถานะและรายละเอียดของธุรกรรม

Request POST

Endpoint: /ppay_api

JSON Request
{
    "method": "check",
    "api_key": "your_test_api_key",
    "trans_id": "PPAY_123456789"
}
  • method คงที่เป็น "check"
  • api_key API key จากตาราง users
  • trans_id รหัสธุรกรรมจากคำขอ create

Response

Success:

JSON Response
{
    "status": 1,
    "trans_id": "PPAY_123456789",
    "amount_check": 10024,
    "amount": "100.24",
    "ref1": "testpay",
    "payment_status": "pending",
    "created_at": "2025-04-28 12:00:00",
    "expire_at": "2025-04-28T12:15:00+07:00",
    "type": "1",
    "key_id": "100568"
}
  • status 1 (สำเร็จ)
  • trans_id รหัสธุรกรรม
  • amount_check ยอดรวม (สตางค์ เช่น 10024)
  • amount ยอดรวมที่มีทศนิยม (บาท เช่น 100.24)
  • ref1 อ้างอิงธุรกรรม
  • payment_status สถานะการชำระเงิน (เช่น pending, completed, failed)
  • created_at เวลาสร้าง
  • expire_at เวลาหมดอายุ (ISO 8601)
  • type ชนิดพร้อมเพย์ (1 = เบอร์โทร, 2 = เลขบัตรประชาชน)
  • key_id รหัส 6 หลัก (เช่น 100568)

Error:

JSON Error Response
{
    "status": 0,
    "msg": "ไม่พบธุรกรรม"
}

Webhook Notification

เมื่อมีการชำระเงินสำเร็จ API จะส่ง webhook ไปยัง webhook_url ที่กำหนดใน user_settings

Webhook Payload

JSON Webhook Payload
{
    "data": {
        "trans_id": "PPAY_123456789",
        "ref1": "testpay",
        "amount_check": 10024,
        "amount": "100.24",
        "transaction_date: "2025-04-28",
		"transaction_time: "12:00:00",
        "status": "1",
        "payment_status": "completed"
    },
    "signature": "hmac_signature"
}
  • data ข้อมูลการชำระเงิน
  • signature ลายเซ็น HMAC-SHA256 (ใช้ api_key จาก users)

Expected Response

Webhook endpoint ต้องตอบกลับ:

JSON Response
{
    "status": 1
}

PHP Example Code

ตัวอย่างโค้ด PHP สำหรับเรียก API โดยใช้ cURL

PHP Code
<?php

function callPromptPayApi($method, $data) {
    $url = 'https://paynoi.com/ppay_api';
    $payload = json_encode($data);

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return [
        'http_code' => $httpCode,
        'response' => json_decode($response, true)
    ];
}

// ตัวอย่าง: Create Transaction
$createData = [
    'method' => 'create',
    'api_key' => 'your_test_api_key',
    'amount' => 100,
    'ref1' => 'testpay',
    'key_id' => '100568',
    'account' => '1234567890',
    'type' => '1'
];
$result = callPromptPayApi('create', $createData);
echo "Create Response: " . print_r($result, true) . "\n";

// ตัวอย่าง: Cancel Transaction
$cancelData = [
    'method' => 'cancel',
    'api_key' => 'your_test_api_key',
    'trans_id' => 'PPAY_123456789'
];
$result = callPromptPayApi('cancel', $cancelData);
echo "Cancel Response: " . print_r($result, true) . "\n";

// ตัวอย่าง: Check Transaction
$checkData = [
    'method' => 'check',
    'api_key' => 'your_test_api_key',
    'trans_id' => 'PPAY_123456789'
];
$result = callPromptPayApi('check', $checkData);
echo "Check Response: " . print_r($result, true) . "\n";

?>

หมายเหตุ

ข้อควรทราบ

  • Amount: ส่งเป็นจำนวนเต็ม (บาท เช่น 100) API จะสุ่มทศนิยม 2 ตำแหน่ง (เช่น 0.24) ทำให้ได้ยอดรวมเช่น 100.24 บาท
  • Key ID (ระบบ SMS): 100568 กสิกรไทย · 100569 กรุงศรีอยุธยา · 100570 ไทยพาณิชย์
    กรุงไทย และ G Wallet (เป๋าตัง) ใช้ได้เฉพาะ LINE Connect
  • Security: ใช้ HTTPS และเก็บ api_key อย่างปลอดภัย
  • Logs: การดำเนินการบันทึกใน logs/app.log

สำหรับการตั้งค่า user_settings หรือการเชื่อมต่อธนาคาร กรุณาติดต่อทีมพัฒนา

เกี่ยวกับ LINE Connect API

API ของเราอนุญาตให้ผู้ใช้ดึงข้อมูลธุรกรรมและจัดการ LINE โดยใช้ api_key & record_key ที่ได้รับจากบัญชีของคุณ ทดสอบ API ได้โดยใช้ Postman หรือเครื่องมืออื่นๆ

เราแนะนำให้สร้างการตรวจสอบด้วยรูปแบบ จำนวนเงินสุ่มทศนิยม 2 ตำแหน่ง (เช่น 100 บาทอาจกลายเป็น 100.24 บาท) ** สุ่มเริ่มตั้งแต่ .00-.99 เพื่อให้ตรงการทำธุรกรรมของแต่ละรายการนั้นๆ เพื่อง่ายต่อการตรวจสอบ และมีเวลาจำกัดต่อรายการนั้นๆเพื่อความแม่นยำมากขึ้น

GET ดึงข้อมูลธุรกรรม LINE

API นี้ใช้ดึงรายการเงินเข้าจากบัญชี LINE ของคุณ รองรับทั้ง 2 วิธีเชื่อมต่อ:
• พร้อมเพย์ LINE Connect (แนะนำ) — ดึงจากข้อมูลที่ระบบบันทึกไว้ ใช้ได้ต่อเนื่อง ไม่มีวันหมดอายุ เชื่อมต่อที่หน้า LINE Connect
• อัปโหลดไฟล์ HAR (วิธีเดิม) — ต้องอัปโหลดไฟล์ใหม่ทุก 7 วัน ที่หน้า อัปโหลด HAR

  • URL: https://paynoi.com/api_line
  • Method: GET
  • Parameters:
    api_key (required)
    record_key (required)
    limit (optional) จำนวนรายการ 1-200 ค่าเริ่มต้น 50 — ใช้ได้เฉพาะผู้ใช้ LINE Connect
  • Response: JSON ประกอบด้วย status และ data (array ของธุรกรรม)
ตัวอย่างโค้ด

ตัวอย่างการเรียก API ด้วยภาษาโปรแกรมต่างๆ

PHP
$api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$record_key = "12345";
$api_url = "https://paynoi.com/api_line?api_key=" . urlencode($api_key) . "&record_key=" . urlencode($record_key);

$ch = curl_init($api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($response === false || $http_code != 200) {
    echo "Error: Failed to fetch data (HTTP $http_code)";
} else {
    $data = json_decode($response, true);
    if ($data['status'] === 'success') {
        foreach ($data['data'] as $transaction_group) {
            foreach ($transaction_group as $transaction) {
                echo "บัญชี: " . $transaction['bankaccount'] . "";
                echo "จำนวน: " . $transaction['amount'] . " " . $transaction['currency'] . "";
                echo "วันที่: " . $transaction['date'] . "";
                echo "ยอดคงเหลือ: " . $transaction['balance'] . "";
                echo "ประเภท: " . $transaction['type'] . "";
            }
        }
    } else {
        echo "Error: " . $data['status'];
    }
}
JavaScript
const apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const record_key = "12345";
const apiUrl = `https://paynoi.com/api_line?api_key=${encodeURIComponent(apiKey)}&record_key=${encodeURIComponent(record_key)}`;

fetch(apiUrl)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error: ${response.status}`);
        }
        return response.json();
    })
    .then(data => {
        if (data.status === "success") {
            data.data.forEach(group => {
                group.forEach(transaction => {
                    console.log(`บัญชี: ${transaction.bankaccount}`);
                    console.log(`จำนวน: ${transaction.amount} ${transaction.currency}`);
                    console.log(`วันที่: ${transaction.date}`);
                    console.log(`ยอดคงเหลือ: ${transaction.balance}`);
                    console.log(`ประเภท: ${transaction.type}`);
                });
            });
        } else {
            console.error("Error:", data.status);
        }
    })
    .catch(error => {
        console.error("Fetch error:", error);
    });
Postman
{
  "method": "GET",
  "url": "https://paynoi.com/api_line?api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxx&record_key=xxxxx",
  "headers": {
    "Accept": "application/json"
  },
  "body": null
}
ตัวอย่างการตอบกลับ

ตัวอย่าง JSON ที่ API ส่งคืนเมื่อเรียกสำเร็จ

{
  "status": "success",
  "data": [
    [
      {
        "bankaccount": "xxx-x-x8685-x",
        "amount": "1.00",
        "currency": "บาท",
        "date": "2025-04-25 23:44:00",
        "balance": "239.50",
        "type": "เงินเข้า"
      }
    ],
    [
      {
        "bankaccount": "xxx-x-x8685-x",
        "amount": "800.00",
        "currency": "บาท",
        "date": "2025-04-24 22:06:00",
        "balance": "895.50",
        "type": "เงินเข้า"
      }
    ]
  ]
}
ตารางข้อมูลธุรกรรม
บัญชีจำนวนสกุลเงิน วันที่ยอดคงเหลือประเภท
xxx-x-x8685-x1.00บาท 2025-04-25 23:44:00239.50เงินเข้า
xxx-x-x8685-x30.00บาท 2025-04-25 16:30:00240.50เงินเข้า
รหัสธนาคาร (record_key / key_id)

ใช้ระบุว่าต้องการดึงข้อมูลจากธนาคารใด ค่านี้ตรงกับที่ตั้งไว้ในระบบของคุณ

รหัส ธนาคาร LINE Official Account
100568 ธนาคารกสิกรไทย KBank Live
100569 ธนาคารกรุงศรีอยุธยา Krungsri Simple
100570 ธนาคารไทยพาณิชย์ SCB Connect
100571 ธนาคารกรุงไทย
+ G Wallet (เป๋าตัง)
Krungthai Connext
100572 ธนาคารออมสิน GSB NOW
รองรับ G Wallet (เป๋าตัง) แล้ว
เงินเข้ากระเป๋า G Wallet จะถูกแจ้งเตือนผ่าน LINE Official Account ของธนาคารกรุงไทย จึงใช้ record_key = 100571 เช่นเดียวกับบัญชีกรุงไทยทั่วไป
ข้อมูลที่ได้จะมีฟิลด์ bankaccount ขึ้นต้นด้วย G Wallet เช่น "bankaccount": "G Wallet XX3351" เพื่อให้แยกออกจากบัญชีธนาคารปกติได้
1. Gen QR Code Scan
<img src="https://promptpay.paynoi.com/api.php?id=หมายเลขพร้อมเพย์&amount=จำนวนเงิน">

รองรับ เบอร์มือถือ 10 หลัก · บัตรประชาชน / Tax ID 13 หลัก · e-Wallet 15 หลัก (เช่น G Wallet)

เพิ่ม &format=svg หรือ &format=json เพื่อรับผลลัพธ์รูปแบบอื่น  ·  ดูเอกสารฉบับเต็ม →

ตัวอย่าง QR พร้อมเพย์

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

2. รับเงินผ่านบัญชีธนาคาร

ใช้เลขบัญชีธนาคารปกติในการรับเงินโอนจากลูกค้าของคุณได้เลย
เนื่องจาก API สามารถดึงรายการเงินเข้าผ่าน Line Connect ได้ปกติ

บัญชีรับเงินของคุณ
ตัวอย่าง QR รับเงิน
ชื่อบัญชี นายตัวอย่าง รับเงินดี
เลขที่บัญชี xxx-x-x1234-x
ธนาคาร ธนาคารกสิกรไทย
ตัวอย่างประกอบเอกสาร · QR สร้างจาก promptpay.paynoi.com
Webhook — แจ้งเตือนเงินเข้า (LINE Connect)

เมื่อระบบตรวจพบเงินเข้าจาก LINE จะยิงข้อมูลไปยัง URL ที่คุณตั้งไว้ที่หน้า LINE Connect ทันที (ไม่ต้องเรียก API เอง)

Webhook Payload
{
  "data": {
    "source": "line",
    "amount": "30.00",
    "bankaccount": "X-1964",
    "currency": "บาท",
    "date": "2026-08-05 20:26",
    "balance": "907460.23",
    "trans_id": "625966477152879227",
    "transactiontype": "เงินเข้า"
  },
  "signature": "d97e11486295aabd303a72ecf48b36b2438a1567ba47d18b6f457227fe78d2bc"
}
การตรวจสอบ Signature (Verify)

ทุก webhook แนบ signature เพื่อยืนยันว่าข้อมูลมาจาก Paynoi จริงและไม่ถูกแก้ไขระหว่างทาง

อัลกอริทึมHMAC-SHA256
Secretapi_key ของคุณ (ดูที่หน้าโปรไฟล์)
ข้อมูลที่ใช้คำนวณJSON string ของ object data เท่านั้น (ไม่รวม signature)
รูปแบบผลลัพธ์hex ตัวพิมพ์เล็ก 64 ตัวอักษร (ไม่ใช่ base64)
ลำดับฟิลด์source → amount → bankaccount → currency → date → balance → trans_id → transactiontype
สำคัญมาก: ห้าม parse แล้ว stringify ใหม่
ระบบคำนวณจาก json_encode() ของ PHP ซึ่ง escape ภาษาไทยเป็น \uXXXX และ escape / เป็น \/
ถ้าคุณ JSON.parse แล้ว JSON.stringify ใหม่ (Node.js / Python) จะได้ string คนละแบบ → signature ไม่มีวันตรง
✅ วิธีที่ถูกต้อง: ตัดส่วน data ออกจาก raw body โดยตรง แล้วนำไปคำนวณ

String ที่นำไปเข้า HMAC จริง (238 bytes — สังเกตภาษาไทยถูก escape):

{"source":"line","amount":"30.00","bankaccount":"X-1964","currency":"\u0e1a\u0e32\u0e17","date":"2026-08-05 20:26","balance":"907460.23","trans_id":"625966477152879227","transactiontype":"\u0e40\u0e07\u0e34\u0e19\u0e40\u0e02\u0e49\u0e32"}
ตัวอย่างโค้ดตรวจสอบ
Node.js / Express
const crypto = require('crypto');

// สำคัญ: ต้องรับเป็น raw body ไม่ใช่ object ที่ parse แล้ว
app.use('/webhook', express.raw({ type: 'application/json' }));

app.post('/webhook', (req, res) => {
  const raw  = req.body.toString('utf8');
  const body = JSON.parse(raw);

  // ตัดเฉพาะส่วน data ออกจาก raw string (ไม่ re-serialize)
  const start = raw.indexOf('"data":') + 7;
  const end   = raw.lastIndexOf(',"signature"');
  const dataJson = raw.slice(start, end);

  const expected = crypto
    .createHmac('sha256', YOUR_API_KEY)
    .update(dataJson, 'utf8')
    .digest('hex');

  if (expected !== body.signature) {
    return res.status(401).json({ status: 0 });
  }

  // ผ่านการตรวจสอบ — ประมวลผลเงินเข้าได้
  res.json({ status: 1 });   // ต้องตอบ status:1 ไม่งั้นระบบนับว่าล้มเหลว
});
Python / Flask
import hmac, hashlib, json
from flask import request, jsonify

@app.route('/webhook', methods=['POST'])
def webhook():
    raw  = request.get_data(as_text=True)
    body = json.loads(raw)

    start = raw.index('"data":') + 7
    end   = raw.rindex(',"signature"')
    data_json = raw[start:end]

    expected = hmac.new(
        YOUR_API_KEY.encode(),
        data_json.encode('utf-8'),
        hashlib.sha256
    ).hexdigest()

    if not hmac.compare_digest(expected, body['signature']):
        return jsonify(status=0), 401

    return jsonify(status=1)
PHP
<?php
$body = json_decode(file_get_contents('php://input'), true);
$expected = hash_hmac('sha256', json_encode($body['data']), $YOUR_API_KEY);

if (!hash_equals($expected, $body['signature'])) {
    http_response_code(401);
    exit(json_encode(['status' => 0]));
}

// ผ่านการตรวจสอบ
echo json_encode(['status' => 1]);
Expected Response

ปลายทางต้องตอบกลับ HTTP 200 พร้อม JSON นี้ ไม่งั้นระบบจะบันทึกว่าส่งไม่สำเร็จ:

{
  "status": 1
}
ข้อจำกัดเวลา
ระบบส่ง webhook เฉพาะรายการที่เกิดขึ้นภายใน 24 ชั่วโมง เท่านั้น
กรณีเชื่อมต่อ LINE ใหม่แล้วระบบดึงรายการย้อนหลังขึ้นมา รายการเหล่านั้นจะบันทึกเข้าระบบตามปกติแต่ไม่ส่ง webhook ซ้ำ เพื่อป้องกันการเติมเงินซ้ำซ้อน — ดึงรายการเหล่านั้นได้ผ่าน API ดึงข้อมูลธุรกรรม