Co możesz otrzymywać
Skanowane są tylko transparentne płatności ZEC. Nie używaj chronionych przelewów ani nie zakładaj, że pojawi się chronione saldo. Każda faktura ma własny transparentny adres odbiorczy.
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
Faktury używają oddzielnych adresów odbiorczych. Zachowaj pełną kopię zapasową, listę adresów i szczegóły derywacji; zaimportowany portfel może nie wykryć od razu każdego adresu faktury.
Przewodnik konfiguracji portfelaPrzenieś środki, gdy będziesz gotowy
Ręczne wysyłki i automatyczne operacje sweep konsolidują dostępne do wydania wyjścia. Wiele małych wpływów może zwiększać rozmiar transakcji i opłaty. Sprawdź podgląd i utrzymuj cel w tej samej sieci.
Poradnik automatycznego sweepRozwiązywanie problemów z płatnościami
Najpierw sprawdź tę sieć
Obsługiwane są tylko transparentne płatności. Nie używaj żądania chronionej płatności. Przelewy wychodzące używają transparentnych środków t1, nie chronionych sald.
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": "zcash",
"asset_tickers": [
"ZEC"
]
}
]
}'// 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": "zcash",
"asset_tickers": [
"ZEC"
]
}
]
}`;
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": "zcash",
"asset_tickers": [
"ZEC"
]
}
]
}
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": "zcash",
"asset_tickers": [
"ZEC"
]
}
]
}""".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))