Il pacchetto @solana-commerce/solana-pay fornisce funzionalità complete di
Solana Pay per creare esperienze di pagamento,
compatibile con le librerie gill e
@solana/kit. Gestisce la codifica/analisi
degli URL, la generazione di codici QR con stili personalizzati e la costruzione
di transazioni sia per trasferimenti di SOL che di token SPL.
Installazione
pnpm add @solana-commerce/solana-pay
Codifica URL
encodeURL(fields)
Crea un URL Solana Pay conforme alla
specifica Solana Pay. Questa funzione genera
URL con protocollo solana: che possono essere condivisi come link o codificati
come codici QR per la scansione da parte dei wallet mobili.
Parametri
fields(TransferRequestURLFields | TransactionRequestURLFields) - Configurazione per l'URL di pagamento
TransferRequestURLFields
Utilizzato per richieste di pagamento semplici (trasferimenti diretti):
-
recipient(Address, obbligatorio) - L'indirizzo del wallet del commerciante (chiave pubblica codificata in base58) che riceverà il pagamento. Può essere una stringa o di tipoAddressdagill. -
amount(bigint, facoltativo) - Importo del pagamento in lamport (unità atomiche). Per SOL, 1 SOL = 1.000.000.000 lamport (9 decimali). Per i token SPL, usa la precisione decimale del token (ad esempio, USDC usa 6 decimali, quindi 1 USDC = 1.000.000). -
splToken(Address, facoltativo) - L'indirizzo mint del token SPL per i pagamenti in token. Se omesso, si presume che il pagamento sia in SOL. -
reference(Address | Address[], facoltativo) - Indirizzo/i di riferimento univoco/i utilizzato/i per tracciare i pagamenti. Generare usandogenerateKeyPairSigner().address. Il riferimento viene aggiunto come account di sola lettura alla transazione, consentendo di eseguire query per i pagamenti utilizzando questo riferimento. -
label(string, facoltativo) - Nome del commerciante o dell'app leggibile dall'utente, visualizzato all'utente nel proprio wallet (ad esempio, "Coffee Shop", "Il Mio Negozio"). -
message(string, opzionale) - Messaggio visualizzato all'utente prima del pagamento (es. "Grazie per l'acquisto!", "Mancia per l'ottimo servizio"). -
memo(string, opzionale) - Memo on-chain allegato alla transazione. Memorizzato permanentemente su Solana. Utile per ID ordine, numeri di fattura o altri metadati di pagamento.
TransactionRequestURLFields
Utilizzato per richieste di pagamento complesse (incluse le istruzioni):
-
link(URL, obbligatorio) - Il link alla transazione (Link). Se l'URL contiene parametri query, deve essere codificato in formato URL. -
label(string, opzionale) - Nome del commerciante o dell'app leggibile visualizzato all'utente nel wallet (es. "Caffetteria", "Il mio negozio"). -
message(string, opzionale) - Messaggio visualizzato all'utente prima del pagamento (es. "Grazie per l'acquisto!", "Mancia per l'ottimo servizio").
Come Funziona
La funzione esegue diverse operazioni per costruire un URL Solana Pay valido:
-
Prefisso Protocollo - Crea un URL con lo schema di protocollo
solana:(simile amailto:obitcoin:) -
Destinatario come Pathname - Utilizza l'indirizzo base58 del destinatario come pathname dell'URL (es.
solana:merchantWalletAddress123...) -
Conversione Importo - Converte l'importo bigint in lamport in una rappresentazione stringa decimale senza problemi di precisione a virgola mobile.
-
Parametri Query - Aggiunge tutti i campi opzionali e i riferimenti come parametri query codificati in formato URL
Risultato
Oggetto URL con il protocollo solana: che può essere:
- Convertito in stringa con
.toString()per la condivisione - Passato a
createQR()per la generazione del codice QR - Utilizzato direttamente nei tag anchor:
<a href={url.toString()}>Pay with Solana</a>
Esempio: Pagamento Base
import { encodeURL } from "@solana-commerce/solana-pay";import { address } from "gill";const url = encodeURL({recipient: address("merchantWalletAddress123..."),amount: 100000000n, // 0.1 SOL (100 million lamports)label: "Coffee Shop",message: "Thanks for your order!"});console.log(url.toString());// solana:merchantWalletAddress123...?amount=0.1&label=Coffee%20Shop&message=Thanks%20for%20your%20order!
Esempio: Pagamento Token SPL
import { encodeURL } from "@solana-commerce/solana-pay";import { address } from "gill";const usdcMint = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const url = encodeURL({recipient: address("merchantWallet..."),amount: 25000000n, // 25 USDC (6 decimals)splToken: usdcMint,label: "USDC Payment",message: "Pay with USDC stablecoin"});
Esempio: Pagamento con Tracciamento
Usa i riferimenti per identificare pagamenti specifici:
import { encodeURL } from "@solana-commerce/solana-pay";import { address } from "gill";import { Keypair } from "@solana/web3.js";// Generate unique reference for this orderconst orderReference = (await generateKeyPairSigner()).address;const url = encodeURL({recipient: address("merchantWallet..."),amount: 500000000n, // 0.5 SOLreference: orderReference,memo: `Order-${Date.now()}`, // On-chain memolabel: "E-commerce Store",message: "Complete your purchase"});// Later, query the blockchain for transactions containing this reference// to verify payment was made
Analisi degli URL
parseURL(url)
Decodifica e convalida un URL Solana Pay, estraendo tutti i parametri di pagamento. Questa funzione esegue la validazione e converte gli importi dalle stringhe decimali in lamport bigint.
Parametri
url(string | URL) - L'URL Solana Pay da analizzare. Può essere una stringa o un oggetto URL.
Restituisce
Un oggetto TransferRequestURLFields o TransactionRequestURLFields
analizzato.
Esempio: Analizza e Convalida
import { parseURL, ParseURLError } from "@solana-commerce/solana-pay";try {const parsed = parseURL("solana:merchant123...?amount=1.5&label=Store&reference=ref123...");console.log(parsed.recipient); // Address objectconsole.log(parsed.amount); // 1500000000n (1.5 SOL in lamports)console.log(parsed.label); // "Store"console.log(parsed.reference); // [Address]// Convert back to human-readable formatconst solAmount = Number(parsed.amount) / 1e9;console.log(`Payment of ${solAmount} SOL`);} catch (error) {if (error instanceof ParseURLError) {console.error("Invalid Solana Pay URL:", error.message);}}
Esempio: Funzione di Convalida URL
import { parseURL, ParseURLError } from "@solana-commerce/solana-pay";function validateSolanaPayURL(urlString: string): {valid: boolean;error?: string;data?: any;} {try {const parsed = parseURL(urlString);// Additional business logic validationif (parsed.splToken) {return {valid: false,error: "Only SOL payments are supported"};}if (parsed.amount && parsed.amount < 1000000n) {return {valid: false,error: "Amount too small (minimum 0.001 SOL)"};}// etc.return {valid: true,data: {recipient: parsed.recipient.toString(),amount: parsed.amount ? Number(parsed.amount) / 1e9 : undefined,token: parsed.splToken?.toString()}};} catch (error) {return {valid: false,error: error instanceof ParseURLError ? error.message : "Unknown error"};}}
Generazione di Codici QR
createQR(url, size, background, color)
Genera un codice QR in formato SVG ottimizzato per gli URL Solana Pay. La funzione produce codici QR di alta qualità con stile personalizzato, angoli arrotondati e colori configurabili.
Parametri
url(string | URL) - L'URL Solana Pay da codificare nel codice QRsize(number, predefinito:512) - Larghezza e altezza in pixelbackground(string, predefinito:'white') - Colore di sfondo (esadecimale o colore nominativo). Dovrebbe essere chiaro per la compatibilità con i wallet.color(string, predefinito:'black') - Colore di primo piano/punto (esadecimale o colore nominativo). Dovrebbe essere scuro per il contrasto.
createStyledQRCode(url, options)
Restituisce
Promise<string> - Markup SVG come stringa che può essere:
- Impostato come sorgente dell'elemento
img:<img src={qrCode} /> - Salvato in un file
Esempio
import { createQR, encodeURL } from "@solana-commerce/solana-pay";import { address } from "gill";async function generatePaymentQR() {const url = encodeURL({recipient: address("merchant..."),amount: 100000000n, // 0.1 SOLlabel: "Coffee Shop"});const qrCode = await createQR(url.toString(),400, // 400x400 pixels"white", // White background"black" // Black foreground);// Display in browserdocument.getElementById("qr-container").innerHTML = qrCode;// Or use as image sourcedocument.getElementById("qr-image").src = qrCode;}
Esempio: Codice QR Brandizzato
import { createStyledQRCode, encodeURL } from "@solana-commerce/solana-pay";import { address } from "gill";async function createBrandedQR() {const url = encodeURL({recipient: address("merchant..."),amount: 25000000n, // 25 USDC (6 decimals)splToken: address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),label: "Coffee Shop",message: "Scan to pay with USDC"});const qr = await createStyledQRCode(url.toString(), {width: 600,margin: 3,color: {dark: "#9945FF", // Solana purplelight: "#F5F5DC" // Beige},errorCorrectionLevel: "H", // Higher correction for logodotStyle: "dots", // Circular dotscornerStyle: "extra-rounded",logo: "/coffee-logo.png", // Your logologoSize: 120,logoBackgroundColor: "#FFFFFF", // White padding behind logologoMargin: 10});return qr; // SVG string}
Costruzione delle Transazioni
createTransfer(rpc, sender, fields)
Costruisce un messaggio di transazione Solana completo per un trasferimento di
pagamento. Questa funzione rileva automaticamente se creare un trasferimento SOL
o SPL token in base al parametro splToken e costruisce tutte le istruzioni
necessarie. La funzione imposta una durata del blockhash per la transazione
utilizzando l'ultimo blockhash dal client RPC e restituisce una transazione
completa, non firmata, pronta per la firma e l'invio all'RPC (tipo
TransactionMessageWithBlockhashLifetime, compatibile con Solana Kit/Gill).
Parametri
-
rpc(Rpc<SolanaRpcApi>) - Client RPC Solana dagill. Creare concreateSolanaClient(rpcUrl).rpc. -
sender(Address) - L'indirizzo del portafoglio del pagante. Deve essere un account finanziato che firmerà la transazione. -
fields(CreateTransferFields) - Configurazione del trasferimento:recipient(Address, obbligatorio) - Indirizzo del portafoglio di destinazioneamount(bigint, obbligatorio) - Importo in lamport (SOL) o unità atomiche del token (SPL)splToken(Address, facoltativo) - Indirizzo mint del token SPL. Se omesso, crea un trasferimento SOL.reference(Address | Address[], facoltativo) - Indirizzo/i di riferimento per il tracciamentomemo(string, facoltativo) - Testo memo on-chain
Valore Restituito
Promise<TransactionMessageWithBlockhashLifetime> - Messaggio di transazione
completo con:
- Formato versione 0 (supporta le tabelle di lookup degli indirizzi)
- Durata del blockhash (la transazione scade dopo ~60 secondi)
- Tutte le istruzioni necessarie (trasferimento + memo facoltativo)
- Pronto per essere firmato con il portafoglio e inviato all'RPC
Gestione degli Errori
Solleva CreateTransferError con messaggi specifici:
"sender not found"- L'account del mittente non esiste"recipient not found"- L'account del destinatario non esiste
Esempio: Pagamento SOL
import { createTransfer } from "@solana-commerce/solana-pay";import { createSolanaClient } from "gill";import { address } from "gill";const rpc = createSolanaClient("https://api.mainnet-beta.solana.com").rpc;// Build SOL transfer transactionconst txMessage = await createTransfer(rpc, address("sender-wallet-address"), {recipient: address("merchant-wallet-address"),amount: 100000000n, // 0.1 SOLmemo: "Coffee purchase"});// Transaction is ready to sign and send// (wallet signing is handled separately)console.log("Transaction ready:", txMessage);
Esempio: Pagamento USDC
import { createTransfer } from "@solana-commerce/solana-pay";import { createSolanaClient } from "gill";import { address } from "gill";const rpc = createSolanaClient("https://api.mainnet-beta.solana.com").rpc;const usdcMint = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const txMessage = await createTransfer(rpc, address("sender-wallet"), {recipient: address("merchant-wallet"),amount: 25000000n, // 25 USDC (6 decimals)splToken: usdcMint,reference: [address("unique-ref-123...")],memo: "Order #12345"});
Is this page helpful?