TUNGKAO เอกสาร API

เชื่อมระบบกับ TUNGKAO

API เดียว ใช้ key เดียวรูปแบบเดียวกันทุกบริการ — Base URL: https://api.tungkao.com

🚀

เริ่มต้นใช้งาน

ทุกบริการใช้รูปแบบเดียวกัน: สร้าง API key ในหน้าร้านค้า (1 key ต่อ 1 บริการ) แล้วส่ง key ใน header Authorization ทุกคำขอ

ขั้นตอน

  1. สมัคร/เข้าสู่ระบบที่ app.tungkao.com ด้วย Gmail แล้วเติมเครดิต (1 บาท = 100 เครดิต)
  2. เมนู API key → เลือกการ์ดบริการ → ตั้งอายุ key → สร้าง → คัดลอก key เก็บไว้ (แสดงครั้งเดียว)
  3. เก็บ key ไว้ที่เซิร์ฟเวอร์ (ตัวแปรแวดล้อม TUNGKAO_KEY) ห้ามใส่ในหน้าเว็บ/แอปมือถือ
  4. เริ่มด้วย key โหมด test (tk_test_…) ไม่คิดเครดิต แล้วค่อยเปลี่ยนเป็น live
GET/v1/account — ทดสอบ key: ดูเครดิตคงเหลือ
curl -X GET https://api.tungkao.com/v1/account \
  -H "Authorization: Bearer $TUNGKAO_KEY"

เซ็นคำขอ (เมื่อเปิดคีย์เซ็น)

import crypto from "node:crypto";
async function tungkao(method, path, body) {
  const raw = body ? JSON.stringify(body) : "";
  const ts = Math.floor(Date.now() / 1000).toString();
  const hash = crypto.createHash("sha256").update(raw).digest("hex");
  const sig = crypto.createHmac("sha256", process.env.TUNGKAO_SIGNING_SECRET).update(`${ts}.${method}.${path}.${hash}`).digest("hex");
  const r = await fetch("https://api.tungkao.com" + path, { method, body: raw || undefined, headers: {
    Authorization: `Bearer ${process.env.TUNGKAO_KEY}`, "Content-Type": "application/json",
    "X-Tungkao-Timestamp": ts, "X-Tungkao-Signature": sig } });
  return r.json();
}
console.log(await tungkao("GET", "/v1/account"));
  • ทุกคำตอบเป็น JSON มี success และ request_id — ถ้าผิดพลาดจะมี error.code (เช่น KEY_EXPIRED, INSUFFICIENT_CREDITS) ดูทั้งหมดที่ /errors
  • key มีวันหมดอายุตามที่เลือก (1–24 เดือน หรือไม่หมด) เราเตือนก่อน 30/7/1 วันทาง webhook api_key.expiring ต่ออายุได้ในหน้าร้าน key เดิมใช้ต่อได้
  • ยืนยันโดเมน: key live 1 ตัวผูกได้ 1 เว็บ ไปที่ API key → 'ยืนยันโดเมน' ใส่โดเมน ดาวน์โหลดไฟล์ tungkao-verify-….html ไปวางที่ https://โดเมนคุณ/ (หรือใส่ DNS TXT _tungkao-verify.โดเมน) แล้วกดตรวจสอบ — ยังไม่ยืนยันจะได้ error DOMAIN_NOT_VERIFIED ยืนยันแล้วเปลี่ยนโดเมนไม่ได้ และบัญชีอื่นใช้โดเมนนี้ไม่ได้
  • Secret key หลุด: กด 'รีคีย์ทันที' ได้ไม่จำกัดครั้ง key เก่าใช้ไม่ได้ทันที / key ของบริการหนึ่งใช้กับบริการอื่นไม่ได้ (WRONG_PRODUCT)
  • ความปลอดภัยขั้นสูง (ทางเลือก): เปิด 'เซ็นคำขอ' ที่ key จะได้คีย์เซ็น tksign_… แล้วทุกคำขอต้องมี X-Tungkao-Timestamp และ X-Tungkao-Signature = HMAC-SHA256(คีย์เซ็น, เวลา.METHOD.path.sha256(body)) — ถึง Secret key หลุดก็ใช้ไม่ได้
  • ส่ง header Accept-Language: th, en, lo, my, zh-CN, ko, ja, vi, km, id เพื่อเลือกภาษาข้อความ
🧾

ตรวจสลิปธนาคาร

slip_verify

ตรวจว่าสลิปโอนเงินเป็นของจริง ยอดตรง โอนเข้าบัญชีคุณ และยังไม่เคยใช้ — เหมาะกับร้านที่ให้ลูกค้าแนบสลิป

ขั้นตอน

  1. ลูกค้าอัปโหลดรูปสลิป เว็บคุณอ่าน QR บนสลิป (ข้อความยาวๆ ขึ้นต้น 0041…)
  2. ส่ง qr_payload + ยอดที่ต้องได้ + บัญชีรับของคุณ มาที่ API
  3. รับออเดอร์เฉพาะเมื่อ status = VALID เท่านั้น
POST/v1/slip/verify
curl -X POST https://api.tungkao.com/v1/slip/verify \
  -H "Authorization: Bearer $TUNGKAO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"qr_payload":"0041000600000101030040220014…","expected_amount":"500.00","receivers":[{"bank":"KBANK","account_number":"1234567890"}]}'
  • ส่ง header Idempotency-Key (เช่นเลขออเดอร์) ถ้าเน็ตหลุดแล้วส่งซ้ำ จะไม่ถูกคิดเงินซ้ำ
  • สลิปเดิมใช้ได้ครั้งเดียวต่อ key (ครั้งที่สองได้ DUPLICATE)
🏦

ฝากเงินด้วยสลิป

slip_deposit

ระบบเติมเงินให้สมาชิกของเว็บคุณ: ตรวจสลิป บันทึกยอดฝากของสมาชิกคนนั้น และส่ง webhook บอกเว็บคุณ

ขั้นตอน

  1. ตั้งบัญชีรับเงินและ Webhook URL ที่ key ในหน้าร้าน
  2. ส่งสลิปพร้อม customer_ref (รหัสสมาชิกของคุณ)
  3. เมื่อได้ webhook deposit.succeeded (ตรวจลายเซ็นก่อน) ให้เติมเงินให้สมาชิก
POST/v1/deposits/slip
curl -X POST https://api.tungkao.com/v1/deposits/slip \
  -H "Authorization: Bearer $TUNGKAO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"qr_payload":"0041000600000101030040220014…","customer_ref":"member-1001","expected_amount":"300.00"}'
GET/v1/deposits/dep_xxx
curl -X GET https://api.tungkao.com/v1/deposits/dep_xxx \
  -H "Authorization: Bearer $TUNGKAO_KEY"

ตรวจลายเซ็น webhook

ทุก webhook มี header X-Tungkao-Signature: t=…,v1=… ต้องตรวจก่อนเชื่อข้อมูล (webhook secret ได้ตอนตั้ง URL ในหน้าร้าน)

import crypto from "node:crypto";
// ใช้ raw body (ข้อความดิบ) เท่านั้น ห้าม JSON.stringify ซ้ำ
function verify(rawBody, header, secret) {
  const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header || "");
  if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
  const want = crypto.createHmac("sha256", secret).update(`${m[1]}.${rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(want), Buffer.from(m[2]));
}
🔐

ล็อกอินให้เว็บคุณ (Google, LINE, Facebook, TikTok, Discord)

ใส่ปุ่ม 'เข้าสู่ระบบด้วย …' ในเว็บคุณได้ทันที ไม่ต้องสมัครกับแต่ละค่ายเอง ได้ชื่อ อีเมล รูป รหัสสมาชิกถาวร และหน้าดูรายชื่อสมาชิก/ประวัติล็อกอิน แยกบริการตามค่าย: google_login, line_login, facebook_login, tiktok_login, discord_login

ขั้นตอน

  1. สร้าง key ของค่ายที่ต้องการ แล้วไปหน้า 'สมาชิกล็อกอิน' ตั้งชื่อเว็บ + Redirect URI (หน้าเว็บคุณที่รับผู้ใช้กลับ ต้องเป็น https และตรงทุกตัวอักษร)
  2. ปุ่มเข้าสู่ระบบของคุณพาผู้ใช้ไป /oauth/authorize พร้อม client_id (id ของ key), redirect_uri และ state (ค่าสุ่มใหม่ทุกครั้ง เก็บใน session)
  3. ผู้ใช้กลับมาที่ redirect_uri?code=…&state=… → ตรวจ state ให้ตรง → เซิร์ฟเวอร์เรียก POST /v1/login/token ภายใน 2 นาที
  4. ใช้ data.user (เช่น 7F3K9QX2-yourshopcom) เป็นรหัสสมาชิก คนเดิมได้รหัสเดิมเสมอ
POST/v1/login/token
curl -X POST https://api.tungkao.com/v1/login/token \
  -H "Authorization: Bearer $TUNGKAO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"code":"จาก redirect","redirect_uri":"https://yourshop.com/auth/callback"}'
GET/v1/login/users?limit=50
curl -X GET https://api.tungkao.com/v1/login/users?limit=50 \
  -H "Authorization: Bearer $TUNGKAO_KEY"

ตัวอย่างครบทั้งระบบ (ปุ่ม + รับกลับ + แลก code)

// npm i express express-session
import express from "express";
import session from "express-session";
import crypto from "node:crypto";

const KEY = process.env.TUNGKAO_KEY;            // API key (tk_live_…) เก็บที่เซิร์ฟเวอร์เท่านั้น
const CLIENT_ID = process.env.TUNGKAO_CLIENT_ID; // id ของ key (เห็นในหน้าร้าน) ไม่ใช่ความลับ
const REDIRECT = "https://yourshop.com/auth/callback"; // ต้องตรงกับที่ลงทะเบียนทุกตัวอักษร

const app = express();
app.use(session({ secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false, cookie: { secure: true, sameSite: "lax" } }));

// 1) ปุ่ม "เข้าสู่ระบบ" ลิงก์มาที่นี่
app.get("/auth/login", (req, res) => {
  req.session.state = crypto.randomBytes(24).toString("base64url");
  const u = new URL("https://api.tungkao.com/oauth/authorize");
  u.search = new URLSearchParams({ client_id: CLIENT_ID, redirect_uri: REDIRECT, state: req.session.state });
  res.redirect(u);
});

// 2) ผู้ใช้กลับมาพร้อม code
app.get("/auth/callback", async (req, res) => {
  if (!req.query.state || req.query.state !== req.session.state) return res.status(400).send("state ไม่ตรง");
  delete req.session.state;
  if (req.query.error) return res.redirect("/login?cancelled=1");
  // 3) แลก code เป็นข้อมูลผู้ใช้ (ภายใน 2 นาที)
  const r = await fetch("https://api.tungkao.com/v1/login/token", {
    method: "POST",
    headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
    body: JSON.stringify({ code: req.query.code, redirect_uri: REDIRECT }),
  });
  const j = await r.json();
  if (!j.success) return res.status(400).send(j.error.message);
  req.session.user = j.data; // j.data.user = รหัสสมาชิกถาวร เช่น 7F3K9QX2-yourshopcom
  res.redirect("/");
});
app.listen(3000);
ค่ายบริการได้อะไร
G Googlegoogle_loginชื่อ อีเมล (ยืนยันแล้ว) รูป
L LINEline_loginชื่อ รูป อีเมล (ถ้าผู้ใช้ยินยอม)
f Facebookfacebook_loginชื่อ รูป อีเมล
♪ TikToktiktok_loginชื่อที่แสดง รูป (ไม่มีอีเมล)
D Discorddiscord_loginชื่อ รูป อีเมล
  • คิดเครดิตตอนผู้ใช้ล็อกอินสำเร็จ: ค่าต่อครั้ง + ค่าสมาชิกใหม่ (ครั้งแรก) ดูราคาปัจจุบันในการ์ดบริการ
  • key โหมด test ใช้ Redirect URI http://localhost ได้และไม่คิดเครดิต
  • ห้ามใส่ API key ในลิงก์หรือหน้าเว็บ — /oauth/authorize ใช้แค่ client_id (id ของ key) ซึ่งเปิดเผยได้
✈️

แจ้งเตือนทาง Telegram

telegram_notify

ส่งข้อความถึงสมาชิกของคุณทาง Telegram ผ่านบอทกลางของ TUNGKAO ไม่ต้องสร้างบอทเอง เช่น แจ้งยอดเข้า สถานะออเดอร์ รหัส OTP

ขั้นตอน

  1. ขอลิงก์เชื่อมให้สมาชิก (ref = รหัสสมาชิกของคุณ) แล้วแสดงปุ่ม 'เชื่อม Telegram' ที่เปิดลิงก์นั้น (อายุ 30 นาที ใช้ครั้งเดียว)
  2. สมาชิกกด Start กับบอท → เชื่อมต่อแล้ว (ดูรายชื่อได้ที่ /v1/telegram/recipients)
  3. ส่งข้อความด้วย ref เดียว หรือ refs ได้สูงสุด 100 คน ใส่ตัวหนา (parse_mode: HTML) และปุ่มลิงก์ได้
POST/v1/telegram/link
curl -X POST https://api.tungkao.com/v1/telegram/link \
  -H "Authorization: Bearer $TUNGKAO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ref":"member-1001"}'
POST/v1/telegram/send
curl -X POST https://api.tungkao.com/v1/telegram/send \
  -H "Authorization: Bearer $TUNGKAO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ref":"member-1001","text":"<b>ยอดเข้าแล้ว</b> 500 บาท","parse_mode":"HTML","button":{"text":"ดูรายการ","url":"https://yourshop.com/orders/1"}}'
GET/v1/telegram/messages
curl -X GET https://api.tungkao.com/v1/telegram/messages \
  -H "Authorization: Bearer $TUNGKAO_KEY"
  • คิดเครดิตเฉพาะข้อความที่ส่งถึง — ส่งไม่ได้ (เช่น ผู้ใช้บล็อกบอท) คืนเครดิตอัตโนมัติ และผู้รับนั้นจะถูกพัก
🔔

แจ้งเตือนทาง Discord

discord_notify

ส่งข้อความเข้าห้อง Discord ของคุณหรือของลูกค้า เช่น แจ้งออเดอร์ใหม่ให้ทีมงาน

ขั้นตอน

  1. ใน Discord: ตั้งค่าห้อง → Integrations → Webhooks → New Webhook → Copy Webhook URL
  2. ลงทะเบียน URL กับ API พร้อม ref (ชื่อเรียกห้องของคุณ) — เราเก็บ URL แบบเข้ารหัส
  3. ส่งข้อความด้วย ref (ปิดการ @everyone ให้อัตโนมัติ)
POST/v1/discord/webhooks
curl -X POST https://api.tungkao.com/v1/discord/webhooks \
  -H "Authorization: Bearer $TUNGKAO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ref":"orders-room","url":"https://discord.com/api/webhooks/123/abc…"}'
POST/v1/discord/send
curl -X POST https://api.tungkao.com/v1/discord/send \
  -H "Authorization: Bearer $TUNGKAO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ref":"orders-room","text":"🛒 ออเดอร์ใหม่ #1001 ยอด 590 บาท"}'
₿

รับชำระคริปโต (เร็วๆ นี้)

crypto

ให้สมาชิกแต่ละคนมีที่อยู่ USDT-TRC20 / BTC / USDT-BEP20 ของตัวเอง เงินเข้าแล้วแจ้งเว็บคุณทาง webhook — กำลังเปิดให้บริการ

ขั้นตอน

  1. ขอที่อยู่ให้สมาชิก
  2. สมาชิกโอนเข้า
  3. เติมเงินเมื่อได้ webhook crypto.deposit.confirmed
POST/v1/crypto/addresses
curl -X POST https://api.tungkao.com/v1/crypto/addresses \
  -H "Authorization: Bearer $TUNGKAO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset":"USDT-TRC20","customer_ref":"member-1001"}'