توفر حزمة @solana-commerce/solana-pay وظائف
Solana Pay الكاملة لبناء تجارب الدفع، متوافقة مع مكتبات
gill و
@solana/kit. تتعامل مع ترميز/تحليل الروابط،
وإنشاء أكواد QR بتنسيقات مخصصة، وبناء المعاملات لتحويلات SOL والرموز SPL.
التثبيت
pnpm add @solana-commerce/solana-pay
ترميز الروابط
encodeURL(fields)
ينشئ رابط Solana Pay يتوافق مع
مواصفات Solana Pay. تُنشئ هذه الدالة روابط
بروتوكول solana: يمكن مشاركتها كروابط أو ترميزها كأكواد QR لمحافظ الهاتف
المحمول لمسحها.
المعاملات
fields(TransferRequestURLFields | TransactionRequestURLFields) - إعدادات رابط الدفع
TransferRequestURLFields
يُستخدم لطلبات الدفع البسيطة (التحويلات المباشرة):
-
recipient(Address، مطلوب) - عنوان محفظة التاجر (مفتاح عام مشفر بنظام base58) التي ستستقبل الدفع. يمكن أن يكون نصاً أو نوعAddressمنgill. -
amount(bigint، اختياري) - مبلغ الدفع بوحدات lamport (الوحدات الذرية). بالنسبة لـ SOL، 1 SOL = 1,000,000,000 lamport (9 خانات عشرية). بالنسبة لرموز SPL، استخدم دقة الخانات العشرية للرمز (على سبيل المثال، USDC يستخدم 6 خانات عشرية، لذا 1 USDC = 1,000,000). -
splToken(Address، اختياري) - عنوان إصدار رمز SPL لمدفوعات الرموز. إذا تم حذفه، يُفترض أن الدفع بعملة SOL. -
reference(Address | Address[]، اختياري) - عنوان (عناوين) مرجعية فريدة تُستخدم لتتبع المدفوعات. يتم الإنشاء باستخدامgenerateKeyPairSigner().address. يُضاف المرجع كحساب للقراءة فقط إلى المعاملة، مما يسمح لك بالاستعلام عن المدفوعات باستخدام هذا المرجع. -
label(string، اختياري) - اسم التاجر أو التطبيق المقروء والمعروض للمستخدم في محفظته (مثل "مقهى"، "متجري"). -
message(string، اختياري) - الرسالة المعروضة للمستخدم قبل الدفع (مثل "شكراً لعملية الشراء!"، "إكرامية لخدمة ممتازة"). -
memo(string، اختياري) - مذكرة على السلسلة مرفقة بالمعاملة. تُخزَّن بشكل دائم على سولانا. مفيدة لمعرفات الطلبات، أرقام الفواتير، أو بيانات الدفع الوصفية الأخرى.
TransactionRequestURLFields
تُستخدم لطلبات الدفع المعقدة (بما في ذلك التعليمات):
-
link(URL، مطلوب) - الرابط إلى المعاملة (Link). إذا كان الرابط يحتوي على معاملات استعلام، يجب ترميزه بصيغة URL. -
label(string، اختياري) - اسم التاجر أو التطبيق المقروء للإنسان المعروض للمستخدم في محفظته (مثل "مقهى"، "متجري"). -
message(string، اختياري) - الرسالة المعروضة للمستخدم قبل الدفع (مثل "شكراً لعملية الشراء!"، "إكرامية لخدمة ممتازة").
كيف يعمل
تقوم الدالة بعدة عمليات لبناء عنوان URL صالح لسولانا Pay:
-
بادئة البروتوكول - تنشئ عنوان URL بمخطط بروتوكول
solana:(مشابه لـmailto:أوbitcoin:) -
المستلم كمسار - تستخدم عنوان base58 للمستلم كمسار URL (مثل
solana:merchantWalletAddress123...) -
تحويل المبلغ - تحوّل مبلغ lamport من نوع bigint إلى تمثيل سلسلة عشرية دون مشاكل دقة الفاصلة العائمة.
-
معاملات الاستعلام - تُلحق جميع الحقول الاختيارية والمراجع كمعاملات استعلام مرمَّزة بصيغة URL
القيمة المُرجَعة
كائن URL ببروتوكول solana: يمكن:
- تحويله إلى سلسلة نصية باستخدام
.toString()للمشاركة - تمريره إلى
createQR()لإنشاء رمز QR - استخدامه مباشرة في وسوم الروابط:
<a href={url.toString()}>Pay with Solana</a>
مثال: دفعة أساسية
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!
مثال: دفعة برمز 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"});
مثال: دفعة مع التتبع
استخدم المراجع لتحديد المدفوعات المحددة:
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
parseURL(url)
يفك تشفير ويتحقق من صحة عنوان URL لدفع سولانا، ويستخرج جميع معاملات الدفع. تقوم هذه الدالة بإجراء التحقق وتحويل المبالغ من سلاسل نصية عشرية إلى lamport من نوع bigint.
المعاملات
url(string | URL) - عنوان URL لدفع سولانا المراد تحليله. يمكن أن يكون سلسلة نصية أو كائن URL.
القيمة المُرجعة
كائن TransferRequestURLFields أو TransactionRequestURLFields محلل.
مثال: التحليل والتحقق
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);}}
مثال: دالة التحقق من صحة عنوان 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"};}}
إنشاء رمز QR
createQR(url, size, background, color)
ينشئ رمز QR بتنسيق SVG محسّن لعناوين URL الخاصة بدفع سولانا. تنتج الدالة رموز QR عالية الجودة ومنسقة بزوايا مستديرة وألوان قابلة للتخصيص.
المعاملات
url(string | URL) - عنوان URL لدفع سولانا المراد تشفيره في رمز QRsize(number، الافتراضي:512) - العرض والارتفاع بالبكسلbackground(string، الافتراضي:'white') - لون الخلفية (hex أو اسم لون). يجب أن يكون فاتحاً للتوافق مع المحافظ.color(string، الافتراضي:'black') - لون المقدمة/النقاط (hex أو اسم لون). يجب أن يكون داكناً للتباين.
createStyledQRCode(url, options)
القيمة المُرجعة
Promise<string> - ترميز SVG كسلسلة نصية يمكن:
- تعيينها كمصدر لعنصر
img:<img src={qrCode} /> - حفظها في ملف
مثال
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;}
مثال: رمز QR مخصص
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}
بناء المعاملات
createTransfer(rpc, sender, fields)
يبني رسالة معاملة سولانا كاملة لتحويل دفعة. تكتشف هذه الدالة تلقائياً ما إذا كان
يجب إنشاء تحويل SOL أو رمز SPL بناءً على معامل splToken، وتنشئ جميع التعليمات
الضرورية. تقوم الدالة بتعيين عمر blockhash للمعاملة باستخدام أحدث blockhash من
عميل RPC وتُرجع معاملة كاملة غير موقّعة جاهزة للتوقيع والإرسال إلى RPC (من نوع
TransactionMessageWithBlockhashLifetime، متوافقة مع Solana Kit/Gill).
المعاملات
-
rpc(Rpc<SolanaRpcApi>) - عميل RPC لسولانا منgill. قم بالإنشاء باستخدامcreateSolanaClient(rpcUrl).rpc. -
sender(Address) - عنوان محفظة الدافع. يجب أن يكون حساباً ممولاً سيوقّع على المعاملة. -
fields(CreateTransferFields) - إعدادات التحويل:recipient(Address، مطلوب) - عنوان المحفظة الوجهةamount(bigint، مطلوب) - المبلغ بوحدات lamport (SOL) أو الوحدات الذرية للرمز (SPL)splToken(Address، اختياري) - عنوان mint لرمز SPL. إذا تم حذفه، ينشئ تحويل SOL.reference(Address | Address[]، اختياري) - عنوان (عناوين) مرجعية للتتبعmemo(string، اختياري) - نص مذكرة على السلسلة
القيمة المُرجعة
Promise<TransactionMessageWithBlockhashLifetime> - رسالة معاملة كاملة تتضمن:
- صيغة الإصدار 0 (تدعم جداول البحث عن العناوين)
- عمر Blockhash (تنتهي صلاحية المعاملة بعد ~60 ثانية)
- جميع التعليمات الضرورية (التحويل + مذكرة اختيارية)
- جاهزة للتوقيع عليها بالمحفظة وإرسالها إلى RPC
معالجة الأخطاء
تُطلق CreateTransferError مع رسائل محددة:
"sender not found"- حساب المرسل غير موجود"recipient not found"- حساب المستلم غير موجود
مثال: دفعة 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);
مثال: دفعة 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?