Cosa puoi ricevere
Usa OP Mainnet e i suoi contratti verificati. Lo stesso simbolo di token su una rete diversa non è lo stesso metodo di pagamento. L'invio di token richiede ETH su OP Mainnet.
Configura il tuo negozio
- Installa Wholly Crypto, crea un progetto e un negozio e conserva un backup privato del wallet.
- Verifica le connessioni compatibili con lo scanner e attiva rete e asset in Store → Payment methods.
- Imposta conferme e scadenza. Prova una piccola fattura e verifica il saldo prima di evadere gli ordini.
Dove arrivano i pagamenti
Le fatture usano indirizzi separati. Conserva backup completo, elenco e derivazione; un wallet importato potrebbe non trovarli tutti subito.
Guida alla configurazione dei walletSposta i fondi quando vuoi
Invia o raccogli la moneta nativa e token ERC-20 verificati. Ogni sorgente richiede gas nella moneta della rete. Il progetto può finanziare indirizzi idonei entro i tuoi limiti.
Tutorial sullo sweep automaticoProblemi con i pagamenti
Controlla prima questa rete
Scegli OP Mainnet. Le commissioni richiedono ETH, non OP. Verifica che la destinazione accetti depositi su questa rete.
Un pagamento manca o è in ritardo
Confronta rete, indirizzo, asset e riferimento con la fattura. Controlla scanner e conferme. Non chiedere un altro pagamento prima di verificare la prima transazione.
Guida alla ricezioneRipristina wallet o riunisci i fondi
Conserva backup privato e dettagli di derivazione. Altre app potrebbero non mostrare tutti gli indirizzi. Invio e recupero dipendono da rete e formato: importare le parole non basta a garantirli.
Backup e ripristinoCommissioni e verifica
La commissione predefinita è l'1% del valore fiat della fattura, pagata con crediti separati. Vale la tua tariffa assegnata. Rete e server hanno costi a parte.
I provider pubblici possono avere guasti o limiti. Una transazione inviata o un reindirizzamento non provano il pagamento. Usa lo stato verificato della fattura e le notifiche firmate.
Crediti di elaborazione API, IPN e webhookCalcolatore di cambio
Converti un importo
È una stima, non una quotazione di pagamento. Commissioni di rete, dell'exchange e spread del commerciante non sono inclusi.
Da dove provengono i tassi?
Le stime crypto usano i prezzi pubblici Kraken in cache, con Binance dove disponibile. Alcuni prezzi Binance usano USDT come riferimento USD. I tassi fiat provengono da Frankfurter e sono tassi di riferimento giornalieri, non quotazioni di trading in tempo reale.
L'istantanea si aggiorna automaticamente. Controlla le date delle fonti sotto il risultato. L'importo inserito resta nel tuo browser. La presenza di un asset non garantisce il supporto ai pagamenti.
Kraken · Binance · Frankfurter · Nomi e icone degli asset: CoinGecko
Crea una fattura con l'API
Esegui gli esempi sul tuo server. Sostituisci host API e ID di progetto e negozio. Tieni privata la credenziale. Gli importi sono stringhe decimali.
Attiva prima il metodo nel negozio. La selezione filtra i metodi attivi, non aggiunge asset. Senza corrispondenze valgono i predefiniti. Controlla i metodi restituiti prima di aprire il checkout.
: "${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": "optimism",
"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": "optimism",
"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": "optimism",
"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": "optimism",
"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))