Những gì bạn có thể nhận
Kết nối RPC ví chỉ xem bên ngoài, dành riêng cho dự án, cùng với daemon. Mỗi hóa đơn nhận một địa chỉ phụ. Chỉ daemon công khai không thể thấy các khoản thanh toán của bạn. Giữ ví chi tiêu ở nơi khác; Wholly Crypto không thể gom XMR.
Thiết lập cửa hàng
- Cài Wholly Crypto, tạo dự án và cửa hàng, giữ sao lưu ví riêng tư.
- Kiểm tra kết nối tương thích máy quét và bật chuỗi, tài sản muốn dùng trong Cửa hàng → Phương thức thanh toán.
- Đặt xác nhận và thời hạn. Thử hóa đơn nhỏ và xác minh quyết toán trước khi hoàn tất đơn hàng.
Nơi tiền thanh toán đến
Mỗi hóa đơn nhận địa chỉ phụ từ ví chỉ xem đã kết nối. Bạn cần cả kết nối RPC ví lẫn bằng chứng daemon. Chỉ daemon Monero công khai không thể phát hiện thanh toán vào ví của bạn.
Hướng dẫn thiết lập víChuyển tiền khi bạn sẵn sàng
Quản lý rút tiền trong ví chi tiêu Monero bên ngoài. Wholly Crypto không thể gửi hoặc tự động gom XMR. Sao lưu riêng ví đó và không bao giờ dán khóa chi tiêu vào kết nối node công khai.
Hướng dẫn ví MoneroTôi có thể thiết lập giống Bitcoin hoặc Ethereum không?
Không. Trước tiên kết nối ví chỉ xem bên ngoài cho dự án, rồi bật XMR trong cửa hàng. Bảo vệ quyền truy cập RPC ví: chỉ xem không có nghĩa thông tin giao dịch nên công khai.
Khắc phục sự cố thanh toán
Kiểm tra mạng này trước
Kiểm tra kết nối ví chỉ xem của dự án và tiến độ đồng bộ cùng với daemon. Chỉ daemon công khai khỏe không thể xác định XMR đến của bạn.
Thanh toán thiếu hoặc chậm
Đối chiếu mạng, địa chỉ, tài sản và mọi tham chiếu bắt buộc với hóa đơn. Kiểm tra máy quét sẵn sàng và tiến độ xác nhận. Đừng yêu cầu thanh toán lần hai trước khi kiểm tra giao dịch đầu.
Hướng dẫn nhận tiềnKhôi phục hoặc hợp nhất ví
Giữ sao lưu riêng và chi tiết dẫn xuất. Ứng dụng ví khác có thể không hiển thị mọi địa chỉ nhận. Gửi và khôi phục phụ thuộc chuỗi, định dạng ví; chỉ nhập từ khôi phục không bảo đảm cả hai.
Sao lưu & khôi phụcPhí và xác minh
Phí xử lý mặc định là 1% giá trị tiền pháp định hóa đơn, trả từ tín dụng riêng. Áp dụng mức được gán cho bạn. Phí mạng và chi phí máy chủ riêng biệt.
Nhà cung cấp công khai có thể gặp sự cố hoặc giới hạn tần suất. Giao dịch đã gửi hay chuyển hướng quay lại không phải bằng chứng thanh toán. Dùng trạng thái hóa đơn đã xác minh và thông báo đã ký.
Tín dụng xử lý API, IPN & webhookCông cụ tính tỷ giá
Quy đổi số tiền
Đây là ước tính, không phải báo giá thanh toán. Không gồm phí mạng, phí sàn và mức chênh lệch của nhà bán hàng.
Tỷ giá đến từ đâu?
Ước tính tiền mã hóa dùng giá công khai Kraken được lưu đệm, với Binance khi có sẵn. Một số giá Binance dùng USDT làm tham chiếu USD. Tỷ giá tiền pháp định đến từ Frankfurter và là tỷ giá tham chiếu hằng ngày, không phải báo giá giao dịch trực tiếp.
Snapshot tự làm mới. Kiểm tra ngày nguồn bên dưới kết quả. Số tiền bạn nhập nằm trong trình duyệt. Tài sản được liệt kê không bảo đảm được hỗ trợ thanh toán.
Kraken · Binance · Frankfurter · Tên & biểu tượng tài sản: CoinGecko
Tạo hóa đơn bằng API
Chạy ví dụ này trên máy chủ của bạn. Thay máy chủ API, ID dự án và ID cửa hàng, giữ thông tin xác thực riêng tư. Số tiền là chuỗi thập phân.
Bật phương thức trong cửa hàng trước. Lựa chọn thu hẹp phương thức đã bật; không thêm tài sản. Nếu không khớp gì, áp dụng mặc định cửa hàng. Kiểm tra phương thức trả về trước khi hiển thị trang thanh toán.
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new invoice.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: order-1042-attempt-1' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "monero",
"asset_tickers": [
"XMR"
]
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new invoice.
const body = `{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "monero",
"asset_tickers": [
"XMR"
]
}
]
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new invoice.
$body = <<<'JSON'
{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "monero",
"asset_tickers": [
"XMR"
]
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: order-1042-attempt-1", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new invoice.
headers = {
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "monero",
"asset_tickers": [
"XMR"
]
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))