Betalingsstromen
Het @solana-commerce/headless pakket biedt framework-onafhankelijke functies
voor het bouwen van commerce betalingsstromen. Deze tools helpen bij het
aanmaken van betalingsverzoek objecten, het genereren van Solana Pay URL's en
het verifiëren van on-chain betalingen. Het pakket is ontworpen om in elke
JavaScript-omgeving te werken: React, Vue, Svelte, vanilla JS, Node.js of
serverless functies.
Installatie
pnpm add @solana-commerce/headless
Betalingsverzoek Functies
Deze functies creëren gestandaardiseerde betalingsverzoek objecten voor verschillende commerce patronen. Ze voeren geen blockchain-operaties uit—ze structureren simpelweg data voor gebruik in wallets, Solana Pay URL's of aangepaste betalings-UI's.
createBuyNowRequest()
Creëert een gestandaardiseerd betalingsverzoek voor een enkele productaankoop.
function createBuyNowRequest(recipient: string,product: any,options?: {memo?: string;label?: string;message?: string;}): PaymentRequest;
Parameters
-
recipient(string, verplicht) - Handelaar wallet-adres (base58-gecodeerde Solana public key) dat de betaling zal ontvangen. -
product(any, verplicht) - Product object met:price(number, verplicht) - Productprijs. De eenheid hangt af van de context (bijv. lamport voor SOL, kleine eenheden voor tokens).currency(string, verplicht) - Betalingsvaluta. Kan'SOL'zijn of een token mint-adres.name(string, verplicht) - Productnaam, gebruikt voor standaard memo/label indien niet opgegeven.- Extra velden (id, description, image, etc.) worden doorgegeven in de
productsarray.
-
options(object, optioneel) - Aanpassingsopties:memo(string) - On-chain memo voor de transactie. Standaard:"Purchase: {product.name}".label(string) - Weergavelabel voor het betalingsverzoek (gebruikt in Solana Pay). Standaard:product.name.message(string) - Succesbericht getoond na betaling. Standaard:"Thank you for purchasing {product.name}!".
Retourneert
Een PaymentRequest object met:
recipient- Het handelaar wallet-adresamount- De productprijs (gekopieerd vanproduct.price)currency- Betalingsvaluta (gekopieerd vanproduct.currency)products- Array met het enkele productmemo- Transactiememo (optie of standaard: "Aankoop: (product.name)")label- Betalingslabel (optie of standaard: "product.name")message- Succesbericht (optie of standaard: "Bedankt voor het kopen van (product.name)!")
Voorbeeld:
const payment = createBuyNowRequest("merchant-wallet-address",{id: "prod_123",name: "Premium Subscription",price: 50000000, // 0.05 SOL in lamportscurrency: "SOL"},{label: "Premium Subscription",message: "Thank you for subscribing!"});
createCartRequest()
Creëert een betalingsverzoek voor meerdere producten in een winkelwagen.
function createCartRequest(recipient: string,products: any[],options?: {memo?: string;label?: string;message?: string;currency?: string;}): PaymentRequest;
Parameters
-
recipient(string, verplicht) - Wallet-adres van de verkoper dat de betaling zal ontvangen. -
products(any[], verplicht) - Array van productobjecten. -
options(object, optioneel) - Aanpassingsopties:currency(string) - Betalingsvaluta voor de gehele winkelwagen.memo(string) - On-chain memo. Standaard:"Cart purchase (products.length items)".label(string) - Betalingslabel. Standaard:"Cart Checkout".message(string) - Succesbericht. Standaard:"Thank you for your purchase!".
Retourneert
Een PaymentRequest-object met:
recipient- Het wallet-adres van de verkoperamount- Som van alle productprijzen (products.reduce((sum, p) => sum + p.price, 0))currency- Betalingsvaluta (uit opties, of undefined)products- De array van productenmemo,label,message- Optiewaarden of standaardwaarden
Voorbeeld:
const cart = createCartRequest("merchant-wallet-address",[{ id: "1", name: "Product A", price: 25 },{ id: "2", name: "Product B", price: 15 },{ id: "3", name: "Product C", price: 10 }],{currency: "USDC",label: "My Store Checkout",message: "Thank you for your order!"});// cart.amount === 50 (sum of prices)
createTipRequest()
Creëert een betalingsverzoek voor fooien of donaties met een door de gebruiker bepaald bedrag.
function createTipRequest(recipient: string,amount: number,options?: {currency?: string;memo?: string;label?: string;message?: string;}): PaymentRequest;
Parameters
-
recipient(string, verplicht) - Wallet-adres van de fooiontvanger (maker, streamer, goed doel, etc.). -
amount(number, verplicht) - Fooibedrag. Eenheid hangt af van de valuta (lamports voor SOL, kleine eenheden voor tokens). -
options(object, optioneel) - Aanpassingsopties:currency(string) - Betalingsvaluta. Standaard: undefined (wordt doorgaans door consumenten als SOL behandeld).memo(string) - On-chain memo. Standaard:"Thank you for your support!".label(string) - Betalingslabel. Standaard:"Tip".message(string) - Succesbericht. Standaard:"Thanks for the tip!".
Retourneert
Een PaymentRequest-object met:
recipient- Het wallet-adres van de fooiontvangeramount- Het fooibedragcurrency- Betalingsvaluta (uit opties, of undefined)memo,label,message- Optiewaarden of standaardwaarden
Voorbeeld:
const tip = createTipRequest("creator-wallet-address",5_000_000, // 0.005 SOL in lamports{currency: "SOL",label: "Tip for Content Creator",message: "Thanks for the support!"});
Betalingsverificatiefuncties
Deze functies communiceren met Solana om transacties te verifiëren en te wachten
op bevestigingen. Ze vereisen een Solana RPC-client uit de gill bibliotheek.
verifyPayment()
Verifieert dat een transactie on-chain bestaat en valideert optioneel het betalingsbedrag, de ontvanger en het token.
async function verifyPayment(rpc: SolanaClient["rpc"],signatureString: string,expectedAmount?: number,expectedRecipient?: string,expectedMint?: string): Promise<PaymentVerificationResult>;
Parameters
-
rpc(SolanaClient['rpc'], verplicht) - RPC-client uitgill. Maak aan metcreateSolanaClient(rpcUrl).rpc. -
signatureString(string, verplicht) - Transactiehandtekening (base58-gecodeerd) om te verifiëren. -
expectedAmount(number, optioneel) - Verwacht betalingsbedrag om te valideren. Eenheid moet overeenkomen met de valuta:- Voor SOL: lamport (1 SOL = 1.000.000.000 lamport)
- Voor SPL-tokens: kleine eenheden gebaseerd op token-decimalen (bijv. USDC gebruikt 6 decimalen)
Indien niet opgegeven, wordt bedragvalidatie overgeslagen.
-
expectedRecipient(string, optioneel) - Verwacht ontvangerwalletadres. Indien opgegeven (samen metexpectedAmount), valideert de functie dat de ontvanger ten minste dit bedrag heeft ontvangen. Indien niet opgegeven, wordt validatie overgeslagen. -
expectedMint(string, optioneel) - SPL-token mint-adres. Alleen vereist voor SPL-tokenoverdrachten. Indien niet opgegeven, gaat de functie uit van een SOL-overdracht.
Retourneert
Een Promise<PaymentVerificationResult> object:
interface PaymentVerificationResult {verified: boolean; // True if payment is validsignature?: string; // Transaction signature (echoed back)amount?: number; // Expected amount (echoed back)recipient?: string; // Expected recipient (echoed back)error?: string; // Error message if verification failed}
Verificatielogica
De functie voert deze controles uit:
-
Handtekeninggeldigheid: Controleert of de handtekening geldig is.
-
Transactie-existentie: Haalt de transactie op met
rpc.getTransaction(). Indien niet gevonden, retourneertverified: false. -
Bevestigingsstatus: Controleert of de transactie on-chain is geland.
-
SOL-overdrachtsvalidatie (indien
expectedRecipientenexpectedAmountopgegeven, en geenexpectedMint):- Vindt de accountindex van de ontvanger in de transactie
- Vergelijkt
preBalancesenpostBalancesom het saldoverschil te berekenen - Verifieert dat het verschil ten minste
expectedAmountis
-
SPL Token Transfer Validatie (indien
expectedMintopgegeven):- Leidt het Associated Token Account (ATA) van de ontvanger af voor zowel het Token Program als het Token-2022 Program
- Controleert
postTokenBalancesop een overeenkomend ATA met de verwachte mint - Verifieert dat het tokenbedrag minstens
expectedAmountis
Beveiligingsoverwegingen
- Client-Side Verificatie: Deze functie haalt transactiegegevens op via RPC. Stel uw RPC URL niet bloot aan de client.
- Finalisatie: De functie controleert op bevestigde transacties, maar voor
betalingen met een hoge waarde kunt u overwegen te wachten op
finalizedstatus.
Voorbeeld:
import { verifyPayment } from "@solana-commerce/headless";import { createSolanaClient } from "gill";const client = createSolanaClient({urlOrMoniker: "mainnet"});const result = await verifyPayment(client.rpc,"transaction-signature-here",50_000_000, // 0.05 SOL in lamports"merchant-wallet-address"// No mint = SOL transfer);if (result.verified) {console.log("Payment confirmed!");} else {console.error("Verification failed:", result.error);}
waitForConfirmation()
Pollt de blockchain totdat een transactie de status confirmed of finalized bereikt, of tot er een time-out optreedt.
async function waitForConfirmation(rpc: SolanaClient["rpc"],signatureStr: string,timeoutMs?: number): Promise<boolean>;
Parameters
-
rpc(SolanaClient['rpc'], verplicht) - RPC-client vangill. -
signatureStr(string, verplicht) - Transactiehandtekening om op te wachten. -
timeoutMs(number, optioneel) - Maximale wachttijd in milliseconden. Standaard:30000(30 seconden).
Retourneert
Promise<boolean>- Retourneerttrueals de transactie de statusconfirmedoffinalizedbereikt binnen de time-out, andersfalse.
Voorbeeld:
import { waitForConfirmation } from "@solana-commerce/headless";import { createSolanaClient } from "gill";const client = createSolanaClient({urlOrMoniker: "mainnet"});// After sending transactionconst signature = await wallet.sendTransaction(transaction);// Wait for confirmation (30 second timeout)const confirmed = await waitForConfirmation(client.rpc, signature, 30000);if (confirmed) {console.log("Transaction confirmed!");} else {console.log("Timeout - transaction not confirmed within 30 seconds");}
Solana Pay Functies
Deze functies genereren Solana Pay URL's en gestileerde QR-codes voor scannen met mobiele wallets.
createSolanaPayRequest()
Creëert een Solana Pay URL en een gestileerde QR-code.
async function createSolanaPayRequest(request: TransferRequestURLFields,options: SolanaPayRequestOptions): Promise<{ url: URL; qr: string }>;
Parameters
-
request(TransferRequestURLFields, verplicht) - Solana Pay transfer request velden:recipient- Publieke sleutel van ontvanger (gebruikcreateRecipient(address)van@solana-commerce/solana-pay)amount- (optioneel) Betalingsbedrag in kleinste eenheden (lamports voor SOL)splToken(optioneel) - Publieke sleutel van SPL token mint (gebruikcreateSPLToken(address))reference(optioneel) - Referentie publieke sleutel voor trackinglabel(optioneel) - Naam van handelaarmessage(optioneel) - Succesberichtmemo(optioneel) - On-chain memo
-
options(SolanaPayRequestOptions, verplicht) - QR-code stijlopties:size(number) - Breedte/hoogte van QR-code in pixels. Standaard:256.background(string) - Achtergrondkleur (hex/rgb). Standaard:'white'.color(string) - QR-code kleur (hex/rgb). Standaard:'black'.margin(number) - Marge rondom QR-code in modules.errorCorrectionLevel('L' | 'M' | 'Q' | 'H') - Foutcorrectieniveau. Hogere niveaus staan meer schade toe maar creëren dichtere codes.logo(string) - Logo afbeeldings-URL om in het midden van de QR-code in te sluiten.logoSize(number) - Logogrootte als percentage van de QR-code grootte.logoBackgroundColor(string) - Achtergrondkleur achter het logo.logoMargin(number) - Marge rondom het logo.dotStyle('dots' | 'rounded' | 'square') - Vorm van QR-code modules.cornerStyle('square' | 'rounded' | 'extra-rounded' | 'full-rounded' | 'maximum-rounded') - Vorm van hoekmarkeringen.
Retourneert
Een Promise die oplost naar een object:
url(URL) - Solana Pay URL (bijv.,solana:recipient?amount=10&spl-token=...)qr(string) - Base64-gecodeerde data-URL van de QR-code afbeelding (te gebruiken als<img src={qr} />)
Voorbeeld:
import {createSolanaPayRequest,createRecipient,createSPLToken} from "@solana-commerce/solana-pay";const payment = await createSolanaPayRequest({recipient: createRecipient("merchant-wallet-address"),amount: 10_000_000, // 0.01 SOL in lamportssplToken: createSPLToken("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), // USDClabel: "My Store",message: "Thank you for your purchase!"},{size: 400,background: "#FFFFFF",color: "#000000",logo: "/logo.png",logoSize: 20,errorCorrectionLevel: "H"});// Display QR codedocument.getElementById("qr").src = payment.qr;console.log(payment.url.toString()); // solana:merchant...?amount=10000000&spl-token=...
Is this page helpful?