Cos’è e quando si usa
Questa pagina serve a verificare un certificato aprendo un link condiviso (tipicamente su desktop).
Il link contiene il tokenId (bytes32) nella querystring.
Senza login
- Leggi on-chain (pubblico) via RPC
- Vedi stato/esito/date/documentHash/documentURI
- Puoi fare “Verifica (OK/NO)” se inserisci i campi umani
Con login admin (opzionale)
- Autofill campi da JSON protetti (qr_cert_details.php)
- Abilita “Apri PDF” (nel tuo flusso è gated da sessione)
1) Come deve essere fatto il link condiviso
Il link deve contenere t (oppure tokenId) con un bytes32 valido:
0x + 64 caratteri esadecimali.
Esempio
- https://.../qr_verify?t=0xaaaaaaaa....(64 hex)
Problemi tipici quando il link “non funziona”
- tokenId tagliato (manca una parte)
- tokenId non è bytes32 (lunghezza diversa)
- param sbagliato (t mancante)
- copiato con spazi o caratteri extra
2) Apertura pagina: cosa succede in automatico
- Il tokenId viene letto dalla querystring e inserito nel campo tokenId.
- Se il tokenId è valido, la pagina può avviare una lettura automatica dopo pochi ms.
- Se apri la pagina senza tokenId, lo incolli tu a mano e poi premi Leggi on-chain.
3) “Leggi on-chain” (snapshot pubblico)
Questo step non richiede login. Serve a controllare:
esistenza token, owner e dati principali registrati nel contratto.
3.1 Sequenza logica
- Controllo esistenza: chiamata tokenOwnerOf(tokenId)
- Se esiste → chiamata getCertificateData(tokenId)
- Rendering tabella “Dati on-chain”
3.2 Se token non esiste
- Vedi “Certificato inesistente (token non mintato)”
- Lo stato in alto va su errore
- Non ha senso procedere con verifica hash
3.3 Dati che vedrai in tabella
- Stato certificato (Valido / Revocato / Sostituito)
- Esito (Positivo / Negativo / Condizionato)
- Date (issuedAt / inspectionDate / validUntil)
- documentHash e documentURI
- Metadata freeze (se REV2 espone tokenMetadataFrozen)
- Sostituzioni (se presenti: supersededBy / supersedes)
Nota sulle sostituzioni (“Apri certificato sostitutivo”)
Se il contratto risponde con supersededBy(tokenId)=0x... (non zero),
la pagina mostra:
- tokenId del sostituto
- link interno per aprire lo stesso viewer col token sostitutivo: ?t=NUOVO_TOKEN
4) Admin (opzionale): Connetti wallet + Firma e Login
Questo blocco è pensato per uso interno (desktop con wallet disponibile). Serve per:
leggere JSON protetti e precompilare i campi umani, e per sbloccare “Apri PDF”.
4.1 Flusso
- Connetti wallet: aggancia provider (UP Extension / EIP-6963 / window.ethereum)
- Firma e Login:
- richiesta nonce (qr_nonce.php)
- firma (personal_sign)
- login pending (qr_login.php)
- verifica owner (qr_verify_owner.php)
- Se tokenId è già presente: prova autofill da qr_cert_details.php
4.2 Cosa cambia dopo login
- Campi umani possono essere precompilati (se tokenId trovato nel JSON)
- Il bottone Apri PDF può diventare cliccabile (se on-chain hai documentURI)
5) “Apri PDF” (solo dopo login)
Nel tuo codice attuale, “Apri PDF” è volutamente gated: funziona solo se:
sei loggato e hai già letto on-chain (serve documentURI).
5.1 Requisiti
- Login admin attivo (cookie sessione)
- Hai già fatto “Leggi on-chain”
- documentURI presente e valido
Tipi URI supportati
- ipfs://CID/path -> convertito su gateway Pinata
- https://... -> aperto diretto
- CID "nudo" -> convertito su gateway (caso raro)
6) “Verifica (OK/NO)” (hash pepperati)
Questa è la verifica “forte”: confronta gli hash pepperati calcolati dal server con quelli registrati on-chain.
Funziona bene quando hai almeno:
Numero certificato (umano) + uno o più campi umani compilati.
6.1 Cosa devi inserire
- Numero certificato (umano) (obbligatorio per avviare la verifica in questa pagina)
- Altri campi: azienda, P.IVA, CF, ecc. (opzionali)
6.2 Cosa succede quando premi “Verifica (OK/NO)”
- La pagina chiama qr_verify_hash_fields_public.php con action=hashFields
- Il server calcola gli hash pepperati dei campi compilati
- Confronto uno-a-uno con gli hash on-chain (tabella risultati OK/NO)
- Riepilogo: match: X/Y e badge “VERIFICA OK” se X=Y
Interpretazione “N/D”
N/D significa: campo non compilato → non verificato.
Quindi non “abbassa” il punteggio, semplicemente non entra nel confronto.
7) “Clear”
- Svuota i campi
- Resetta le tabelle
- Rimette lo stato in “Pronta”
- Non fa logout (quello è separato)
Checklist rapida (desktop)
- 1 Apri il link condiviso con ?t=0x...
- 2 Premi (o attendi) Leggi on-chain
- 3 Se vuoi verificare: compila Numero certificato + campi umani → Verifica
- 4 Se vuoi aprire PDF o autofill: fai Connetti wallet + Firma e Login → poi Apri PDF