Пакет @solana-commerce/solana-pay надає повний функціонал
Solana Pay для створення платіжних рішень, сумісних з
бібліотеками gill та
@solana/kit. Він обробляє кодування/парсинг
URL-адрес, генерацію QR-кодів з індивідуальним стилем та побудову транзакцій для
переказів як у SOL, так і в SPL-токенах.
Встановлення
pnpm add @solana-commerce/solana-pay
Кодування URL
encodeURL(fields)
Створює URL-адресу Solana Pay, що відповідає
специфікації Solana Pay. Ця функція генерує
URL-адреси протоколу solana:, якими можна ділитися як посиланнями або кодувати
у вигляді QR-кодів для сканування мобільними гаманцями.
Параметри
fields(TransferRequestURLFields | TransactionRequestURLFields) - Конфігурація для платіжної URL-адреси
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, необов'язково) - Адреса mint SPL-токена для платежів у токенах. Якщо не вказано, вважається, що платіж здійснюється в SOL. -
reference(Address | Address[], необов'язково) - Унікальна референсна адреса(и), що використовуються для відстеження платежів. Згенеруйте за допомогоюgenerateKeyPairSigner().address. Референс додається як read-only обліковий запис до транзакції, що дозволяє запитувати інформацію про платежі, використовуючи цей референс. -
label(string, необов'язково) - Зрозуміла назва продавця або застосунку, що відображається користувачу в його гаманці (наприклад, «Кав'ярня», «Мій магазин»). -
message(string, необов'язково) - Повідомлення, яке відображається користувачу перед платежем (наприклад, "Дякуємо за покупку!", "Чайові за чудовий сервіс"). -
memo(string, необов'язково) - Мемо, прикріплене до транзакції в блокчейні. Зберігається назавжди в Solana. Корисно для ідентифікаторів замовлень, номерів рахунків або інших метаданих платежу.
TransactionRequestURLFields
Використовується для складних запитів на оплату (включно з інструкціями):
-
link(URL, обов'язково) - Посилання на транзакцію (Link). Якщо URL містить параметри запиту, він має бути URL-кодованим. -
label(string, необов'язково) - Зрозуміла людині назва продавця або застосунку, яка відображається користувачу в його гаманці (наприклад, "Кав'ярня", "Мій магазин"). -
message(string, необов'язково) - Повідомлення, яке відображається користувачу перед платежем (наприклад, "Дякуємо за покупку!", "Чайові за чудовий сервіс").
Як це працює
Функція виконує декілька операцій для створення дійсного Solana Pay URL:
-
Префікс протоколу - Створює URL зі схемою протоколу
solana:(подібно доmailto:абоbitcoin:) -
Одержувач як шлях - Використовує адресу одержувача в base58 як шлях URL (наприклад,
solana:merchantWalletAddress123...) -
Конвертація суми - Перетворює суму в лампортах типу 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 Solana Pay, витягуючи всі параметри платежу. Ця функція виконує валідацію та конвертує суми з десяткових рядків назад у bigint lamport.
Параметри
url(string | URL) - URL Solana Pay для парсингу. Може бути рядком або об'єктом 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)
Генерує SVG QR-код, оптимізований для URL Solana Pay. Функція створює стилізовані, високоякісні QR-коди із закругленими кутами та налаштовуваними кольорами.
Параметри
url(string | URL) - URL Solana Pay для кодування в QR-кодіsize(number, за замовчуванням:512) - Ширина та висота в пікселяхbackground(string, за замовчуванням:'white') - Колір фону (шістнадцятковий або іменований колір). Має бути світлим для сумісності з гаманцями.color(string, за замовчуванням:'black') - Колір переднього плану/точок (шістнадцятковий або іменований колір). Має бути темним для контрасту.
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)
Створює повне повідомлення транзакції Solana для переказу коштів. Ця функція
автоматично визначає, чи потрібно створити переказ SOL або SPL токена на основі
параметра splToken, і формує всі необхідні інструкції. Функція встановлює
термін дії блокхешу для транзакції, використовуючи останній блокхеш від RPC
клієнта, і повертає повну непідписану транзакцію, готову для підписання та
відправки до RPC (тип TransactionMessageWithBlockhashLifetime, сумісний з
Solana Kit/Gill).
Параметри
-
rpc(Rpc<SolanaRpcApi>) - Solana RPC клієнт зgill. Створіть за допомогоюcreateSolanaClient(rpcUrl).rpc. -
sender(Address) - Адреса гаманця платника. Повинен бути профінансований обліковий запис, який підпише транзакцію. -
fields(CreateTransferFields) - Конфігурація переказу:recipient(Address, обов'язково) - Адреса гаманця призначенняamount(bigint, обов'язково) - Сума в лампортах (SOL) або атомарних одиницях токена (SPL)splToken(Address, необов'язково) - Адреса мінту SPL токена. Якщо не вказано, створюється переказ SOL.reference(Address | Address[], необов'язково) - Довідкова адреса(и) для відстеженняmemo(string, необов'язково) - Текст примітки в ланцюзі
Повертає
Promise<TransactionMessageWithBlockhashLifetime> - Повне повідомлення
транзакції з:
- Формат версії 0 (підтримує таблиці пошуку адрес)
- Термін дії блокхешу (транзакція втрачає чинність через ~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?