Das @solana-commerce/solana-pay-Paket bietet vollständige
Solana Pay-Funktionalität für die Entwicklung von
Zahlungserlebnissen, kompatibel mit den Bibliotheken
gill und
@solana/kit. Es übernimmt
URL-Kodierung/-Parsing, QR-Code-Generierung mit benutzerdefiniertem Styling
sowie Transaktionskonstruktion für sowohl SOL- als auch SPL-Token-Transfers.
Installation
pnpm add @solana-commerce/solana-pay
URL-Kodierung
encodeURL(fields)
Erstellt eine Solana Pay URL, die der
Solana Pay-Spezifikation entspricht. Diese
Funktion generiert solana:-Protokoll-URLs, die als Links geteilt oder als
QR-Codes kodiert werden können, damit mobile Wallets sie scannen können.
Parameter
fields(TransferRequestURLFields | TransactionRequestURLFields) - Konfiguration für die Zahlungs-URL
TransferRequestURLFields
Wird für einfache Zahlungsanfragen (direkte Überweisungen) verwendet:
-
recipient(Address, erforderlich) - Die Wallet-Adresse des Händlers (base58-kodierter öffentlicher Schlüssel), die die Zahlung erhält. Kann ein String oderAddress-Typ vongillsein. -
amount(bigint, optional) - Zahlungsbetrag in lamport (atomare Einheiten). Für SOL gilt: 1 SOL = 1.000.000.000 lamport (9 Dezimalstellen). Für SPL-Token verwenden Sie die Dezimalpräzision des Tokens (z. B. USDC verwendet 6 Dezimalstellen, also 1 USDC = 1.000.000). -
splToken(Address, optional) - Die SPL-Token-Mint-Adresse für Token-Zahlungen. Wenn nicht angegeben, wird die Zahlung als SOL angenommen. -
reference(Address | Address[], optional) - Eindeutige Referenzadresse(n) zur Nachverfolgung von Zahlungen. Generieren Sie diese mitgenerateKeyPairSigner().address. Die Referenz wird als schreibgeschütztes Konto zur Transaktion hinzugefügt, sodass Sie Zahlungen mit dieser Referenz abfragen können. -
label(string, optional) - Für Menschen lesbarer Händler- oder App-Name, der dem Benutzer in seiner Wallet angezeigt wird (z. B. "Café", "Mein Shop"). -
message(string, optional) - Nachricht, die dem Benutzer vor der Zahlung angezeigt wird (z. B. „Vielen Dank für Ihren Einkauf!“, „Trinkgeld für tollen Service“). -
memo(string, optional) - On-Chain-Memo, das der Transaktion angehängt wird. Wird dauerhaft auf Solana gespeichert. Nützlich für Bestellnummern, Rechnungsnummern oder andere Zahlungsmetadaten.
TransactionRequestURLFields
Wird für komplexe Zahlungsanforderungen verwendet (einschließlich Anweisungen):
-
link(URL, erforderlich) - Der Link zur Transaktion (Link). Wenn die URL Abfrageparameter enthält, muss sie URL-codiert sein. -
label(string, optional) - Für Menschen lesbarer Händler- oder App-Name, der dem Benutzer in seinem Wallet angezeigt wird (z. B. „Café“, „Mein Shop“). -
message(string, optional) - Nachricht, die dem Benutzer vor der Zahlung angezeigt wird (z. B. „Vielen Dank für Ihren Einkauf!“, „Trinkgeld für tollen Service“).
Funktionsweise
Die Funktion führt mehrere Operationen durch, um eine gültige Solana Pay URL zu erstellen:
-
Protokollpräfix - Erstellt eine URL mit dem
solana:-Protokollschema (ähnlich wiemailto:oderbitcoin:) -
Empfänger als Pfadname - Verwendet die Base58-Adresse des Empfängers als URL- Pfadname (z. B.
solana:merchantWalletAddress123...) -
Betragumwandlung - Wandelt den Bigint-lamport-Betrag in eine dezimale Zeichenfolgendarstellung ohne Gleitkomma-Präzisionsprobleme um.
-
Abfrageparameter - Hängt alle optionalen Felder und Referenzen als URL-codierte Abfrageparameter an
Rückgabewert
URL-Objekt mit dem solana:-Protokoll, das:
- Mit
.toString()in eine Zeichenkette zum Teilen umgewandelt werden kann - An
createQR()zur QR-Code-Generierung übergeben werden kann - Direkt in Anchor-Tags verwendet werden kann:
<a href={url.toString()}>Pay with Solana</a>
Beispiel: Einfache Zahlung
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!
Beispiel: SPL-Token-Zahlung
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"});
Beispiel: Zahlung mit Nachverfolgung
Verwenden Sie Referenzen, um bestimmte Zahlungen zu identifizieren:
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
URL-Parsing
parseURL(url)
Dekodiert und validiert eine Solana Pay URL und extrahiert alle Zahlungsparameter. Diese Funktion führt eine Validierung durch und konvertiert Beträge von Dezimalzeichenfolgen zurück in bigint lamport.
Parameter
url(string | URL) - Die zu parsende Solana Pay URL. Kann ein String oder URL-Objekt sein.
Rückgabewert
Ein geparste TransferRequestURLFields- oder
TransactionRequestURLFields-Objekt.
Beispiel: Parsen und Validieren
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);}}
Beispiel: URL-Validatoren-Funktion
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"};}}
QR-Code-Generierung
createQR(url, size, background, color)
Generiert einen für Solana Pay URLs optimierten SVG-QR-Code. Die Funktion erzeugt stilvolle, hochwertige QR-Codes mit abgerundeten Ecken und anpassbaren Farben.
Parameter
url(string | URL) - Die im QR-Code zu kodierende Solana Pay URLsize(number, Standard:512) - Breite und Höhe in Pixelnbackground(string, Standard:'white') - Hintergrundfarbe (Hex oder benannte Farbe). Sollte für Wallet-Kompatibilität hell sein.color(string, Standard:'black') - Vordergrund-/Punktfarbe (Hex oder benannte Farbe). Sollte für Kontrast dunkel sein.
createStyledQRCode(url, options)
Rückgabewert
Promise<string> - SVG-Markup als String, das verwendet werden kann für:
- Als Quelle für ein
img-Element:<img src={qrCode} /> - Speichern in einer Datei
Beispiel
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;}
Beispiel: Branded QR-Code
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}
Transaktionserstellung
createTransfer(rpc, sender, fields)
Erstellt eine vollständige Solana-Transaktionsnachricht für eine
Zahlungsübertragung. Diese Funktion erkennt automatisch, ob eine SOL- oder
SPL-Token-Übertragung erstellt werden soll, basierend auf dem
splToken-Parameter, und konstruiert alle erforderlichen Anweisungen. Die
Funktion legt eine Blockhash-Lebensdauer für die Transaktion fest, indem sie den
neuesten Blockhash vom RPC-Client verwendet, und gibt eine vollständige,
unsignierte Transaktion zurück, die zum Signieren und Übermitteln an den RPC
bereit ist (Typ TransactionMessageWithBlockhashLifetime, kompatibel mit Solana
Kit/Gill).
Parameter
-
rpc(Rpc<SolanaRpcApi>) - Solana RPC-Client vongill. Erstellen mitcreateSolanaClient(rpcUrl).rpc. -
sender(Address) - Die Wallet-Adresse des Zahlers. Muss ein finanziertes Konto sein, das die Transaktion signiert. -
fields(CreateTransferFields) - Übertragungskonfiguration:recipient(Address, erforderlich) - Ziel-Wallet-Adresseamount(bigint, erforderlich) - Betrag in lamport (SOL) oder atomaren Token-Einheiten (SPL)splToken(Address, optional) - SPL-Token-Mint-Adresse. Falls nicht angegeben, wird eine SOL-Übertragung erstellt.reference(Address | Address[], optional) - Referenzadresse(n) zur Nachverfolgungmemo(string, optional) - On-Chain-Memo-Text
Rückgabewert
Promise<TransactionMessageWithBlockhashLifetime> - Vollständige
Transaktionsnachricht mit:
- Version-0-Format (unterstützt Address-Lookup-Tabellen)
- Blockhash-Lebensdauer (Transaktion läuft nach ~60 Sekunden ab)
- Allen erforderlichen Anweisungen (Übertragung + optionales Memo)
- Bereit zum Signieren mit Wallet und Übermitteln an RPC
Fehlerbehandlung
Wirft CreateTransferError mit spezifischen Nachrichten:
"sender not found"- Absender-Konto existiert nicht"recipient not found"- Empfänger-Konto existiert nicht
Beispiel: SOL-Zahlung
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);
Beispiel: USDC-Zahlung
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?