Co możesz otrzymywać
Używaj sieci głównej Ethereum. Zweryfikowane tokeny ERC-20, takie jak USDC i USDT, potrzebują ETH na każdym adresie wysyłającym, gdy później je przenosisz. Import frazy odzyskiwania do MetaMask może pokazać tylko pierwsze konto.
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 nowy adres odbiorczy. Kopia zapasowa obejmuje wyprowadzone klucze, ale import słów odzyskiwania do MetaMask może pokazać tylko pierwsze konto. Zachowaj też dane adresów i wyprowadzania.
Przewodnik konfiguracji portfelaPrzenieś środki, gdy będziesz gotowy
Używaj automatycznego sweepu, aby zbierać wpływy w jednym miejscu. Każdy adres z tokenami potrzebuje ETH do wysyłania. Gas finansowany przez projekt może zasilać kwalifikujące się adresy w granicach limitów; puste adresy nieopłaconych faktur nie są zasilane.
Poradnik automatycznego sweepCzy mogę odbierać USDT i USDC na tym samym adresie?
Portfel może przechowywać oba, ale każda faktura ma własne metody płatności i kwotę. Włącz dokładne kontrakty Ethereum w sklepie. Nie zastępuj tokena tokenem o tym samym symbolu z innej sieci.
Rozwiązywanie problemów z płatnościami
Najpierw sprawdź tę sieć
Sprawdź sieć główną Ethereum i dokładny kontrakt tokena. Saldo tokena nie może opłacić własnego gasu: każdy adres wysyłający potrzebuje ETH w Ethereum.
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": "ethereum",
"asset_tickers": [
"ETH"
]
}
]
}'// 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": "ethereum",
"asset_tickers": [
"ETH"
]
}
]
}`;
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": "ethereum",
"asset_tickers": [
"ETH"
]
}
]
}
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": "ethereum",
"asset_tickers": [
"ETH"
]
}
]
}""".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))