Ödeme Akışları
@solana-commerce/headless paketi, ticari ödeme akışları oluşturmak için
framework-bağımsız fonksiyonlar sağlar. Bu araçlar ödeme isteği nesneleri
oluşturmaya, Solana Pay URL'leri üretmeye ve zincir üzerindeki ödemeleri
doğrulamaya yardımcı olur. Paket, herhangi bir JavaScript ortamında çalışacak
şekilde tasarlanmıştır: React, Vue, Svelte, vanilla JS, Node.js veya serverless
fonksiyonlar.
Kurulum
pnpm add @solana-commerce/headless
Ödeme İsteği Fonksiyonları
Bu fonksiyonlar, farklı ticaret kalıpları için standartlaştırılmış ödeme isteği nesneleri oluşturur. Herhangi bir blockchain işlemi gerçekleştirmezler—sadece cüzdanlarda, Solana Pay URL'lerinde veya özel ödeme arayüzlerinde kullanılmak üzere veriyi yapılandırırlar.
createBuyNowRequest()
Tek bir ürün satın alımı için standartlaştırılmış bir ödeme isteği oluşturur.
function createBuyNowRequest(recipient: string,product: any,options?: {memo?: string;label?: string;message?: string;}): PaymentRequest;
Parametreler
-
recipient(string, zorunlu) - Ödemeyi alacak satıcı cüzdan adresi (base58 kodlu Solana public key). -
product(any, zorunlu) - Şunları içeren ürün nesnesi:price(sayı, zorunlu) - Ürün fiyatı. Birim bağlama göre değişir (örneğin, SOL için lamport, token'lar için küçük birimler).currency(string, zorunlu) - Ödeme para birimi. SOL veya bir token mint adresi olabilir.name(string, zorunlu) - Ürün adı, sağlanmadıysa varsayılan memo/etiket için kullanılır.- Ek alanlar (id, description, image, vb.)
productsdizisinde aktarılır.
-
options(nesne, opsiyonel) - Özelleştirme seçenekleri:memo(string) - İşlem için zincir üzerinde not. Varsayılan:"Purchase: {product.name}".label(string) - Ödeme isteği için görüntüleme etiketi (Solana Pay'de kullanılır). Varsayılan:product.name.message(string) - Ödemeden sonra gösterilen başarı mesajı. Varsayılan:"Thank you for purchasing {product.name}!".
Dönüş Değeri
Şunları içeren bir PaymentRequest nesnesi:
recipient- Satıcı cüzdan adresiamount- Ürün fiyatı (product.price'den kopyalanır)currency- Ödeme para birimi (product.currency'den kopyalanır)products- Tek ürünü içeren dizimemo- İşlem notu (seçenek veya varsayılan: "Satın alma: (product.name)")label- Ödeme etiketi (seçenek veya varsayılan: "product.name")message- Başarı mesajı (seçenek veya varsayılan: "(product.name) satın aldığınız için teşekkür ederiz!")
Örnek:
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()
Alışveriş sepetindeki birden fazla ürün için ödeme talebi oluşturur.
function createCartRequest(recipient: string,products: any[],options?: {memo?: string;label?: string;message?: string;currency?: string;}): PaymentRequest;
Parametreler
-
recipient(string, zorunlu) - Ödemeyi alacak tüccar cüzdan adresi. -
products(any[], zorunlu) - Ürün nesneleri dizisi. -
options(nesne, isteğe bağlı) - Özelleştirme seçenekleri:currency(string) - Tüm sepet için ödeme para birimi.memo(string) - Zincir üstü not. Varsayılan:"Cart purchase (products.length items)".label(string) - Ödeme etiketi. Varsayılan:"Cart Checkout".message(string) - Başarı mesajı. Varsayılan:"Thank you for your purchase!".
Döndürülen Değer
Aşağıdakileri içeren bir PaymentRequest nesnesi:
recipient- Tüccar cüzdan adresiamount- Tüm ürün fiyatlarının toplamı (products.reduce((sum, p) => sum + p.price, 0))currency- Ödeme para birimi (seçeneklerden veya tanımsız)products- Ürünler dizisimemo,label,message- Seçenek değerleri veya varsayılanlar
Örnek:
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()
Kullanıcı tanımlı tutarla bahşiş veya bağış için ödeme talebi oluşturur.
function createTipRequest(recipient: string,amount: number,options?: {currency?: string;memo?: string;label?: string;message?: string;}): PaymentRequest;
Parametreler
-
recipient(string, zorunlu) - Bahşiş alıcısının cüzdan adresi (içerik üretici, yayıncı, hayır kurumu vb.). -
amount(number, zorunlu) - Bahşiş tutarı. Birim para birimine bağlıdır (SOL için lamport, tokenlar için küçük birimler). -
options(nesne, isteğe bağlı) - Özelleştirme seçenekleri:currency(string) - Ödeme para birimi. Varsayılan: tanımsız (tüketiciler tarafından genellikle SOL olarak işlenir).memo(string) - Zincir üstü not. Varsayılan:"Thank you for your support!".label(string) - Ödeme etiketi. Varsayılan:"Tip".message(string) - Başarı mesajı. Varsayılan:"Thanks for the tip!".
Döndürülen Değer
Aşağıdakileri içeren bir PaymentRequest nesnesi:
recipient- Bahşiş alıcısının cüzdan adresiamount- Bahşiş tutarıcurrency- Ödeme para birimi (seçeneklerden veya tanımsız)memo,label,message- Seçenek değerleri veya varsayılanlar
Örnek:
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!"});
Ödeme Doğrulama Fonksiyonları
Bu fonksiyonlar, işlemleri doğrulamak ve onayları beklemek için Solana ile
etkileşime girer. gill kütüphanesinden bir Solana RPC istemcisi gerektirir.
verifyPayment()
Bir işlemin zincir üzerinde var olduğunu doğrular ve isteğe bağlı olarak ödeme tutarını, alıcıyı ve token'ı doğrular.
async function verifyPayment(rpc: SolanaClient["rpc"],signatureString: string,expectedAmount?: number,expectedRecipient?: string,expectedMint?: string): Promise<PaymentVerificationResult>;
Parametreler
-
rpc(SolanaClient['rpc'], zorunlu) -gill'den RPC istemcisi.createSolanaClient(rpcUrl).rpcile oluşturun. -
signatureString(string, zorunlu) - Doğrulanacak işlem imzası (base58 kodlu). -
expectedAmount(number, isteğe bağlı) - Doğrulanacak beklenen ödeme tutarı. Birim para birimiyle eşleşmelidir:- SOL için: lamport (1 SOL = 1.000.000.000 lamport)
- SPL token'ları için: token ondalık basamaklarına göre küçük birimler (örneğin, USDC 6 ondalık kullanır)
Sağlanmazsa, tutar doğrulaması atlanır.
-
expectedRecipient(string, isteğe bağlı) - Beklenen alıcı cüzdan adresi. (expectedAmountile birlikte) sağlanırsa, fonksiyon alıcının en az bu tutarı aldığını doğrular. Sağlanmazsa, doğrulama atlanır. -
expectedMint(string, isteğe bağlı) - SPL token basım adresi. Yalnızca SPL token transferleri için gereklidir. Sağlanmazsa, fonksiyon SOL transferi varsayar.
Döndürülen Değer
Bir Promise<PaymentVerificationResult> nesnesi:
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}
Doğrulama Mantığı
Fonksiyon şu kontrolleri gerçekleştirir:
-
İmza Geçerliliği: İmzanın geçerli olduğunu kontrol eder.
-
İşlem Varlığı:
rpc.getTransaction()kullanarak işlemi getirir. Bulunamazsa,verified: falsedöndürür. -
Onay Durumu: İşlemin zincir üzerinde gerçekleştiğini kontrol eder.
-
SOL Transfer Doğrulaması (eğer
expectedRecipientveexpectedAmountsağlanmışsa veexpectedMintyoksa):- İşlemde alıcının hesap dizinini bulur
- Bakiye değişimini hesaplamak için
preBalancesvepostBalancesdeğerlerini karşılaştırır - Değişimin en az
expectedAmountolduğunu doğrular
-
SPL Token Transfer Doğrulaması (
expectedMintsağlanmışsa):- Alıcının hem Token Program hem de Token-2022 Program için İlişkili Token Hesabını (ATA) türetir
- Beklenen mint ile eşleşen bir ATA için
postTokenBalanceskontrol eder - Token miktarının en az
expectedAmountolduğunu doğrular
Güvenlik Hususları
- İstemci Tarafı Doğrulaması: Bu fonksiyon RPC'den işlem verilerini alır. RPC URL'nizi istemciye açık hale getirmeyin.
- Sonlandırma: Fonksiyon onaylanmış işlemleri kontrol eder, ancak yüksek
değerli ödemeler için
finalizeddurumunu beklemeyi düşünün.
Örnek:
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()
Bir işlem onaylanmış veya sonlandırılmış duruma ulaşana kadar blok zincirini yoklar, veya zaman aşımına uğrar.
async function waitForConfirmation(rpc: SolanaClient["rpc"],signatureStr: string,timeoutMs?: number): Promise<boolean>;
Parametreler
-
rpc(SolanaClient['rpc'], zorunlu) -gill'den RPC istemcisi. -
signatureStr(string, zorunlu) - Beklenecek işlem imzası. -
timeoutMs(number, isteğe bağlı) - Milisaniye cinsinden beklenecek maksimum süre. Varsayılan:30000(30 saniye).
Dönüş Değeri
Promise<boolean>- İşlem zaman aşımı içindeconfirmedveyafinalizeddurumuna ulaşırsatrue, aksi takdirdefalsedöndürür.
Örnek:
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 Fonksiyonları
Bu fonksiyonlar mobil cüzdan taraması için Solana Pay URL'leri ve stilize QR kodları oluşturur.
createSolanaPayRequest()
Bir Solana Pay URL'si ve stilize bir QR kodu oluşturur.
async function createSolanaPayRequest(request: TransferRequestURLFields,options: SolanaPayRequestOptions): Promise<{ url: URL; qr: string }>;
Parametreler
-
request(TransferRequestURLFields, zorunlu) - Solana Pay transfer istek alanları:recipient- Alıcı genel anahtarı (@solana-commerce/solana-pay'dencreateRecipient(address)kullanın)amount- (isteğe bağlı) Küçük birimler cinsinden ödeme tutarı (SOL için lamport)splToken(isteğe bağlı) - SPL token mint genel anahtarı (createSPLToken(address)kullanın)reference(isteğe bağlı) - İzleme için referans genel anahtarılabel(isteğe bağlı) - Satıcı adımessage(isteğe bağlı) - Başarı mesajımemo(isteğe bağlı) - Zincir üstü not
-
options(SolanaPayRequestOptions, zorunlu) - QR kod stil seçenekleri:size(sayı) - QR kodunun piksel cinsinden genişlik/yükseklik değeri. Varsayılan:256.background(string) - Arka plan rengi (hex/rgb). Varsayılan:'white'.color(string) - QR kod rengi (hex/rgb). Varsayılan:'black'.margin(sayı) - QR kodunun etrafındaki modül cinsinden kenar boşluğu.errorCorrectionLevel('L' | 'M' | 'Q' | 'H') - Hata düzeltme seviyesi. Daha yüksek seviyeler daha fazla hasara izin verir ancak daha yoğun kodlar oluşturur.logo(string) - QR kodunun merkezine yerleştirilecek logo görsel URL'si.logoSize(sayı) - Logo boyutu, QR kod boyutunun yüzdesi olarak.logoBackgroundColor(string) - Logonun arkasındaki arka plan rengi.logoMargin(sayı) - Logo etrafındaki kenar boşluğu.dotStyle('dots' | 'rounded' | 'square') - QR kod modüllerinin şekli.cornerStyle('square' | 'rounded' | 'extra-rounded' | 'full-rounded' | 'maximum-rounded') - Köşe işaretleyicilerinin şekli.
Dönüş Değeri
Bir Promise, bir nesneye çözümlenir:
url(URL) - Solana Pay URL'si (örn.,solana:recipient?amount=10&spl-token=...)qr(string) - QR kod görselinin Base64 kodlu veri URL'si (<img src={qr} />olarak kullanın)
Örnek:
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?