เดิมทีการแปลงเงินเฟียตเป็นคริปโต (fiat-to-crypto on-ramp) ต้องใช้เวลาหลายสัปดาห์กับเอกสาร KYC, การเชื่อมโยงธนาคาร และกระบวนการปฏิบัติตามข้อกำหนดยุ่งยาก MoonPay API รวมระบบเหล่านั้นให้เป็นหนึ่งเดียว: สร้าง URL ที่ลงนาม ใส่ widget ลงในแอปของคุณ แล้วปล่อยให้ MoonPay จัดการการประมวลผลบัตร การโอนเงินผ่านธนาคาร การยืนยันตัวตน และการชำระเงินเข้ากระเป๋าเงินของผู้ใช้อย่างครบวงจร
คู่มือนี้จะอธิบายขั้นตอนการใช้งาน MoonPay API ตั้งแต่ตั้งค่าบัญชีพันธมิตร การใช้งาน widget เทียบกับ API โดยตรง การสร้าง URL ที่ลงนาม การยืนยัน webhook การใช้งาน sell flow การจ่ายเงิน NFT และข้อจำกัดด้าน compliance ทุกคำขอในบทความนี้ถูกทดสอบใน Sandbox และอ้างอิงตาม พอร์ทัลสำหรับนักพัฒนา MoonPay อย่างเป็นทางการ คุณสามารถทดสอบคำสั่งเหล่านี้ผ่าน Apidog ได้ทันทีขณะพัฒนา
หากคุณกำลังเปรียบเทียบผู้ให้บริการ fiat-to-crypto API แนะนำให้ดูข้อมูล API ที่ดีที่สุดสำหรับ on-ramp/off-ramp เพื่อเปรียบเทียบ MoonPay กับ Transak, Ramp และ Stripe Crypto และถ้าต้องการเข้าใจฝั่ง USDC ของโครงสร้างพื้นฐาน Custodial แนะนำ วิธีใช้ Circle API
สรุปโดยย่อ
- MoonPay คือบริการ on-ramp/off-ramp ที่ได้รับการกำกับดูแล ใช้โดยกระเป๋าเงินดิจิทัล, ตลาด NFT, กระดานแลกเปลี่ยนใน 160+ ประเทศ
- เลือกเชื่อมต่อได้ 2 วิธี: Ramps SDK/widget (เร็ว, UI โฮสต์โดย MoonPay) หรือ Direct REST API (ควบคุม UI เอง)
- URL widget ต้องลงนามด้วย HMAC-SHA256 ด้วย secret key ของคุณ URL ที่ไม่ลงนามจะถูกปฏิเสธ
- KYC, การประมวลผลบัตร ระบบธนาคาร จัดการฝั่งเซิร์ฟเวอร์ MoonPay คุณรับสถานะผ่าน webhook ที่ลงนามด้วย HMAC เช่นกัน
- ค่าธรรมเนียม: บัตร 3.5-4.5%, โอนเงินผ่านธนาคารถูกกว่า ค่าธรรมเนียมเครือข่ายแสดงโปร่งใสกับผู้ใช้
- Off-ramp (ขาย) คล้ายกับการซื้อ: URL ที่ลงนาม, ผู้ใช้ส่งคริปโต, MoonPay โอนเงินเฟียตเข้าบัญชีธนาคาร
MoonPay คืออะไร?
MoonPay คือผู้ให้บริการชำระเงินที่ได้รับใบอนุญาต ช่วยให้ผู้ใช้ของคุณซื้อ/ขายคริปโตด้วยบัตร, โอนเงินผ่านธนาคาร, Apple Pay, Google Pay, SEPA และวิธีการชำระเงินท้องถิ่น MoonPay ดำเนินธุรกิจบริการทางการเงินในสหรัฐ มีใบอนุญาต EMI ในยุโรป และจดทะเบียนใน UK, แคนาดา, ออสเตรเลีย คุณไม่ต้องเป็นผู้โอนเงินเองเพื่อรับบัตรและส่ง ETH ไปยังกระเป๋าผู้ใช้
รองรับคริปโต 110+ สกุล 40+ เครือข่าย (Ethereum, Solana, Bitcoin, Polygon, Base, Arbitrum) รวมถึงการจ่ายเงิน NFT ตัว widget นี้ถูกใช้ใน MetaMask, Trust Wallet, OpenSea
การยืนยันตัวตนและการตั้งค่า
สมัครบัญชีพันธมิตรที่ moonpay.com/business หลังอนุมัติ คุณจะได้ key สองชุด (Sandbox & Production) แต่ละชุดมี publishable key (pk_test_...) และ secret key (sk_test_...) เก็บ secret key อย่างปลอดภัย ใช้สำหรับ sign URL และ verify webhook
ตั้งค่าตัวแปรสภาพแวดล้อม:
export MOONPAY_API_KEY="pk_test_123..."
export MOONPAY_SECRET_KEY="sk_test_abc..."
export MOONPAY_BASE_URL="https://api.moonpay.com"
Sandbox และ Production ใช้ endpoint เดียวกัน แต่ Sandbox คืนธุรกรรมทดสอบและเปลี่ยนสถานะได้ใน dashboard ทดสอบจนพร้อม แล้วค่อยสลับไป Production เมื่อผ่าน compliance
เอนด์พอยต์หลัก
เอนด์พอยต์ MoonPay ที่ใช้งานบ่อย: currency, ราคา, ธุรกรรม, webhooks ดู REST reference ฉบับเต็ม
ดึงรายการสกุลเงินที่รองรับ
เรียกดูรายการสกุลเงินแบบสด กรองตาม IP หรือตำแหน่งผู้ใช้
curl -X GET "https://api.moonpay.com/v3/currencies" \
-H "Authorization: Api-Key $MOONPAY_API_KEY"
ผลลัพธ์มี code, name, type (crypto/fiat), minBuyAmount, maxBuyAmount และข้อมูลโทเค็นบนหลายเชน
รับใบเสนอราคาแบบเรียลไทม์
ให้ผู้ใช้ทราบว่าพวกเขาจะได้รับคริปโตเท่าไหร่ก่อนยืนยัน (รวมค่าธรรมเนียม)
curl -X GET "https://api.moonpay.com/v3/currencies/eth/buy_quote?apiKey=$MOONPAY_API_KEY&baseCurrencyAmount=100&baseCurrencyCode=usd" \
-H "Content-Type: application/json"
ผลลัพธ์: quoteCurrencyAmount, feeAmount, networkFeeAmount, totalAmount แนะนำให้แคช quote ไว้ 2-3 วินาที; quote มีอายุประมาณ 60 วินาที
สร้าง URL widget ซื้อแบบลงนาม (Node.js)
สร้าง URL พร้อม query parameters เซ็นด้วย secret key แล้วเปลี่ยนเส้นทางหรือฝังลงใน iframe:
import crypto from "node:crypto";
function buildMoonPayBuyUrl({ walletAddress, currencyCode, baseAmount, email }) {
const params = new URLSearchParams({
apiKey: process.env.MOONPAY_API_KEY,
currencyCode,
walletAddress,
baseCurrencyCode: "usd",
baseCurrencyAmount: String(baseAmount),
email,
redirectURL: "https://yourapp.com/moonpay/complete",
});
const originalUrl = `https://buy.moonpay.com?${params.toString()}`;
const signature = crypto
.createHmac("sha256", process.env.MOONPAY_SECRET_KEY)
.update(new URL(originalUrl).search)
.digest("base64");
return `${originalUrl}&signature=${encodeURIComponent(signature)}`;
}
ส่ง URL นี้ให้ผู้ใช้ ลายเซ็นผูกพารามิเตอร์กับบัญชีคุณ ป้องกันการแก้ไข walletAddress หรือจำนวนเงินโดยไม่ได้รับอนุญาต ดูพารามิเตอร์ widget เพิ่มเติม
ยืนยันลายเซ็น webhook
Webhook ทุกอันมี header Moonpay-Signature-V2 ตรวจสอบด้วย secret key ก่อนเชื่อถือข้อมูล:
import crypto from "node:crypto";
export function verifyMoonPayWebhook(rawBody, header, secret) {
const [tPart, sPart] = header.split(",");
const timestamp = tPart.split("=")[1];
const signature = sPart.split("=")[1];
const expected = crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(signature, "hex"),
);
}
ปฏิเสธคำขอ webhook ที่เก่ากว่า 5 นาที ป้องกัน replay attack ดูรายละเอียดอีเวนต์ webhook
กระบวนการขาย (off-ramp)
สร้าง URL ลงนามที่ชี้ไป sell.moonpay.com ให้ผู้ใช้เลือกคริปโตและจำนวนเงิน MoonPay สร้าง deposit address ให้ ผู้ใช้โอนคริปโต และเมื่อได้รับยืนยัน MoonPay โอนเงินเฟียตเข้าบัญชีธนาคารผู้ใช้
const sellParams = new URLSearchParams({
apiKey: process.env.MOONPAY_API_KEY,
baseCurrencyCode: "eth",
baseCurrencyAmount: "0.5",
quoteCurrencyCode: "usd",
refundWalletAddress: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbc",
});
const sellUrl = `https://sell.moonpay.com?${sellParams.toString()}`;
// ลงนามด้วยวิธีเดียวกับ URL สำหรับการซื้อ
refundWalletAddress สำคัญ กรณีผู้ใช้ส่งสินทรัพย์ผิดประเภทหรือ KYC ล้มเหลว MoonPay จะคืนเงินไปยัง address นี้
การชำระเงิน NFT
MoonPay รองรับการซื้อ NFT ด้วยบัตร ลงทะเบียนรายการกับ MoonPay หรือเชื่อมต่อตลาดที่รองรับ แล้วสร้าง URL ลงนามพร้อม contractAddress, tokenId, listingId MoonPay จะจัดการทั้งฝั่งเงินเฟียตและโอน on-chain ลดอัตราการละทิ้งในยอดขายหลัก
ข้อผิดพลาดและ Rate Limits ที่พบบ่อย
-
400 invalid_signature: อินพุต HMAC ไม่ตรงกับเซิร์ฟเวอร์ ตรวจสอบ encoding ให้ตรงกับค่าที่ลงนามเสมอ -
403 geo_restricted: IP อยู่ในประเทศที่ MoonPay ไม่รองรับ ตรวจสอบisAllowedก่อนแสดงผล -
422 transaction_limit_exceeded: ผู้ใช้เกิน limit รายวัน/สัปดาห์/เดือน บัตรปกติ $2,000/วัน $10,000/เดือน จนกว่าจะ KYC ขั้นสูง -
429 rate_limited: เกิน 100 คำขอต่อนาทีต่อ API key บน public endpoint แนะนำแคช currency/quote อย่างจริงจัง
ยึดสถานะธุรกรรมจาก webhook ไม่ใช่ browser ฝั่งผู้ใช้ ผู้ที่ปิดแท็บระหว่าง redirect ก็ยังได้รับเงินในกระเป๋าเมื่อ transaction_updated ถูก trigger พร้อม status: completed
หากต้องการรองรับหลาย wallet ดู วิธีใช้ MetaMask API และ API กระเป๋าคริปโตที่ดีที่สุด ส่วน compliance KYC แนะนำ API KYC ที่ดีที่สุด
ราคาของ MoonPay
- ซื้อด้วยบัตร: 3.5%-4.5% ขั้นต่ำ $3.99
- โอนเงินผ่านธนาคาร (ACH, SEPA, Open Banking): 1%-1.9% เหมาะสำหรับธุรกรรมขนาดใหญ่
- ค่าธรรมเนียมเครือข่าย: ส่งต่อราคาต้นทุน ขึ้นกับเชนและปริมาณ
- ขาย (off-ramp): โครงสร้างค่าธรรมเนียมคล้ายกัน ขึ้นกับช่องทางปลายทาง
พันธมิตรที่มีปริมาณสูงสามารถเจรจา revenue share และได้ราคาพิเศษจากทีม MoonPay
ทดสอบ MoonPay ด้วย Apidog
ปัญหาหลักของการ integrate MoonPay คือ URL ที่ลงนามและ HMAC webhook ทั้งสองอย่างทดสอบและ debug ได้ง่ายขึ้นใน API client ที่เหมาะสม เช่น Apidog คุณสามารถ import MoonPay OpenAPI spec, จัดการ sandbox keys เป็น environment variable และทดสอบ flow เต็มรูปแบบ (เช่น buy-quote, transaction status, replay webhook) โดยไม่ต้องแตะ backend จริง
เวิร์กโฟลว์แนะนำ: สร้าง environment สำหรับ sandbox และ production, ตั้ง pre-request hook สำหรับ signing (ใช้ Node crypto code ข้างบน), เก็บ transaction ID เป็นตัวแปรข้าม API call ได้สะดวก เมื่อได้รับ webhook ใน production ให้นำ raw body มา replay บน mock server ของ Apidog เพื่อ debug ตัวตรวจสอบ signature ได้เต็มขั้น ดาวน์โหลด Apidog เพื่อใช้ signing hook, mock server, environment switcher ในที่เดียว
FAQ
- จำเป็นต้องมี KYC provider เองนอกจาก MoonPay หรือไม่? ไม่จำเป็น MoonPay จัดการ KYC ฝั่งเซิร์ฟเวอร์ทั้งหมด แอปของคุณไม่เห็นเอกสาร หากต้องการ KYC ล่วงหน้าสำหรับฟีเจอร์อื่น ดู API KYC ที่ดีที่สุด
- ใช้ MoonPay แบบไม่แสดง widget แบรนด์ได้หรือไม่? ได้ โดยใช้ Direct API หรือ headless SDK แต่ต้องผ่าน compliance เพิ่มเติม ส่วนใหญ่จะเริ่มจาก widget ก่อน แล้วค่อยย้าย API เมื่อปริมาณสูง
- รองรับประเทศไหนบ้าง? On-ramp 160+ ประเทศ Off-ramp 50+ ประเทศ รายละเอียด currency/method ตามแต่ละ region endpoint currency จะคืนข้อมูลแบบ real-time
- ธุรกรรมใช้เวลากี่นาที? ซื้อด้วยบัตรภายใน 5 นาที โอนเงินผ่านธนาคารใช้ 1-3 วันทำการ ธุรกรรมขาย (off-ramp) โอนเงินเฟียตเข้าธนาคารผู้ใช้ 1-3 วันหลังยืนยัน on-chain
-
Webhook ส่งไม่ติดจะเกิดอะไรขึ้น? MoonPay จะ retry โดยใช้ exponential backoff นานสูงสุด 24 ชม. ให้ตอบกลับ 2xx หลังบันทึก event แล้ว และ dedupe ด้วย
idเพราะ retry อาจเกิด event ซ้ำ - Sandbox กับ Production เหมือนกันหรือไม่? ใกล้เคียง แต่ Sandbox ผ่อนปรน geo restriction, KYC ใช้เอกสารทดสอบ, ธุรกรรมเปลี่ยนสถานะได้ใน dashboard ควร smoke test production จริงเสมอก่อน launch

Top comments (0)