Co możesz otrzymywać
Podłącz zewnętrzny wallet RPC tylko do podglądu, osobny dla projektu, oraz demona. Każda faktura otrzymuje subadres. Sam publiczny demon nie widzi Twoich płatności. Trzymaj portfel umożliwiający wydawanie gdzie indziej; Wholly Crypto nie może wykonać sweepu XMR.
Skonfiguruj sklep
- Zainstaluj Wholly Crypto, utwórz projekt i sklep oraz zachowaj prywatną kopię zapasową portfela.
- Sprawdź połączenia zgodne ze skanerem i włącz blockchain oraz zamierzone aktywa w Sklep → Metody płatności.
- Ustaw potwierdzenia i termin ważności. Przetestuj fakturę na małą kwotę i zweryfikuj rozliczenie przed realizacją zamówień.
Dokąd trafiają płatności
Każda faktura otrzymuje subadres z podłączonego portfela tylko do podglądu. Potrzebujesz zarówno połączenia wallet RPC, jak i dowodów z demona. Sam publiczny demon Monero nie może wykryć płatności do Twojego portfela.
Przewodnik konfiguracji portfelaPrzenieś środki, gdy będziesz gotowy
Zarządzaj wypłatami w zewnętrznym portfelu Monero umożliwiającym wydawanie. Wholly Crypto nie może wysyłać ani automatycznie wykonywać sweepu XMR. Zrób osobną kopię tego portfela i nigdy nie wklejaj kluczy wydawania do połączenia z publicznym węzłem.
Przewodnik po portfelu MoneroCzy mogę użyć takiej samej konfiguracji jak dla Bitcoin lub Ethereum?
Nie. Najpierw podłącz zewnętrzny portfel tylko do podglądu dla projektu, a następnie włącz XMR w sklepie. Chroń dostęp do wallet RPC: tryb tylko do podglądu nie oznacza, że informacje o transakcjach powinny być publiczne.
Rozwiązywanie problemów z płatnościami
Najpierw sprawdź tę sieć
Sprawdź połączenie portfela tylko do podglądu projektu i postęp synchronizacji oraz demona. Sam sprawny publiczny demon nie może rozpoznać Twojego przychodzącego XMR.
Płatność zaginęła lub jest opóźniona
Dopasuj sieć, adres, aktywo i ewentualny wymagany identyfikator do faktury. Sprawdź gotowość skanera i postęp potwierdzeń. Nie proś o drugą płatność, dopóki nie sprawdzisz pierwszej transakcji.
Przewodnik odbieraniaPrzywracaj lub konsoliduj portfele
Zachowaj prywatną kopię zapasową i szczegóły derywacji. Inna aplikacja portfela może nie wyświetlić każdego adresu odbiorczego. Wysyłanie i odzyskiwanie zależą od blockchaina i formatu portfela; samo zaimportowanie słów odzyskiwania nie gwarantuje żadnego z nich.
Kopia zapasowa i przywracanieOpłaty i weryfikacja
Domyślna opłata za przetwarzanie wynosi 1% wartości faktury w walucie fiducjarnej, płatne z oddzielnego salda. Obowiązuje przypisana Ci stawka. Opłaty sieciowe i koszty serwera są oddzielne.
Publiczni dostawcy mogą mieć awarie lub limity zapytań. Wysłana transakcja ani przekierowanie powrotne nie są dowodem płatności. Używaj zweryfikowanego statusu faktury i podpisanych powiadomień.
Środki na przetwarzanie API, IPN i webhookiKalkulator kursów
Przelicz kwotę
To wartość szacunkowa, a nie wycena płatności. Nie obejmuje opłat sieciowych, opłat giełdowych ani narzutów kursowych sprzedawcy.
Skąd pochodzą kursy?
Szacunki dla krypto korzystają z buforowanych publicznych cen Kraken oraz Binance tam, gdzie są dostępne. Niektóre ceny Binance używają USDT jako odniesienia dla USD. Kursy walut fiducjarnych pochodzą z Frankfurter i są dziennymi kursami referencyjnymi, a nie bieżącymi notowaniami rynkowymi.
Zestaw danych odświeża się automatycznie. Sprawdź daty źródeł pod wynikiem. Wpisana kwota pozostaje w Twojej przeglądarce. Obecność aktywa na liście nie gwarantuje obsługi płatności.
Kraken · Binance · Frankfurter · Nazwy i ikony aktywów: CoinGecko
Utwórz fakturę przez API
Uruchamiaj te przykłady na swoim serwerze. Zastąp host API, identyfikator projektu i sklepu oraz zachowaj dane dostępu w tajemnicy. Kwoty są ciągami dziesiętnymi.
Najpierw włącz metodę w sklepie. Wybór zawęża włączone metody; nie dodaje aktywów. Jeśli nic nie pasuje, obowiązują ustawienia domyślne sklepu. Sprawdź zwrócone metody przed pokazaniem strony płatności.
: "${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))