Errori della Merchant API
July 30, 2026
Status HTTP della Merchant API FlowAlp Pay, struttura del body JSON di errore e indicazioni pratiche di retry con exponential backoff.
Quando una chiamata alla Merchant API fallisce, la risposta combina uno status HTTP con un body JSON che spiega il problema. Questa pagina elenca la semantica degli status, la struttura dell'errore e come fare retry in sicurezza.
Dalla versione v1.15, le richieste fallite restituiscono uno status specifico per il tipo di errore invece di una risposta generica — vedi Versioni API e changelog.
Status HTTP
| Status | Significato | Cosa fare |
|---|---|---|
200 OK | Richiesta elaborata; controlla il campo status nel body | Prosegui il flusso |
400 Bad Request | Request malformata o non valida (campi, tipi, encoding) | Correggi il payload; non ripetere la richiesta invariata |
401 Unauthorized | Credenziali mancanti o non valide | Verifica API Secret e metodo di autenticazione; non riprovare invariata |
403 Forbidden | Accesso negato; arriva anche dopo un sovraccarico prolungato sull'edge della piattaforma | Verifica permessi e instance; con volumi alti fai backoff e riprova |
404 Not Found | Risorsa, ID o path sconosciuti | Controlla Object, id e segmento di versione |
405 Method Not Allowed | Verbo HTTP errato; sotto carico è anche un primo segnale di rate limit | Controlla la mappatura dei verbi; con volumi alti fai backoff |
429 Too Many Requests | Status standard di rate limit | Fai backoff e riprova più tardi |
5xx | Problema temporaneo lato server | Riprova con exponential backoff |
Il rate limit documentato si manifesta come 405 seguito da 403 finché il limite resta superato; se dovessi ricevere 429, trattalo allo stesso modo. Dettagli: Rate limit della Merchant API.
Struttura della risposta di errore
Le chiamate fallite restituiscono un body JSON con un campo status e una spiegazione leggibile, tipicamente nel campo message:
{
"status": "error",
"message": "Description of what went wrong"
}Le chiamate riuscite restituiscono "status": "success" più un array data. Valuta prima lo status HTTP, poi il body. I testi dei messaggi non fanno parte del contratto dell'API: basa la logica sugli status code, mai sulle stringhe dei messaggi.
Indicazioni per i retry
| Classe di errore | Retry? | Come |
|---|---|---|
400 / 401 / 404 — errori di validazione e autenticazione | No | Correggi prima la request o le credenziali |
405 / 403 con volumi alti, 429 | Sì | Exponential backoff con jitter |
5xx e timeout di rete | Sì | Exponential backoff; limita i tentativi |
Un punto di partenza collaudato: ritardo iniziale 500 ms, raddoppio a ogni tentativo, jitter casuale fino a 300 ms, ritardo massimo 30 s, al massimo 5 tentativi. Rendi idempotenti le operazioni ripetute nel tuo sistema, ad esempio deduplicando su referenceId.
<?php
function callWithBackoff(callable $request, int $maxAttempts = 5)
{
$delayMs = 500;
for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
[$status, $body] = $request();
if ($status < 400) {
return $body;
}
$retriable = in_array($status, [403, 405, 429], true) || $status >= 500;
if (!$retriable || $attempt === $maxAttempts) {
throw new RuntimeException('FlowAlp Pay request failed: HTTP ' . $status);
}
usleep(($delayMs + random_int(0, 300)) * 1000);
$delayMs = min($delayMs * 2, 30000);
}
}response=$(curl --silent --write-out "\n%{http_code}" \
--url "https://api.pay.flowalp.com/v1.16/Transaction/<transaction-id>/?instance=<instance>" \
--header "x-api-key: <api-secret>")
body=$(printf '%s' "$response" | head -n -1)
status=$(printf '%s' "$response" | tail -n 1)
echo "HTTP $status"
echo "$body"Diagnosi dei problemi di autenticazione
- Esegui lo smoke test SignatureCheck per separare i problemi di credenziali da quelli di endpoint.
- Verifica che l'instance name corrisponda al sottodominio della tua pagina di pagamento.
- In modalità firma, confronta l'encoding della query string con l'implementazione di riferimento in Autenticazione della Merchant API.
Best practice di logging
- Registra status HTTP, path della risorsa e il tuo ID di correlazione (ad esempio
referenceId) — mai l'API Secret oApiSignature. - Separa gli errori di validazione da quelli di autenticazione nelle metriche.
- Preferisci i webhook al polling aggressivo, così gli errori transitori pesano meno.