Commerce Kit 目前处于测试阶段。API 可能会在正式发布前发生变动。更多详情请参阅 Commerce Kit 文档。
Solana Pay 是一种用于将支付请求编码为 URL 的标准协议。这些 URL 可以作为链接分享、生成二维码供移动钱包扫描,或用于以编程方式构建支付交易。
@solana-commerce/solana-pay
包提供了 URL 编码/解析、二维码生成和交易构建功能——兼容
@solana/kit。
安装
pnpm add @solana-commerce/solana-pay
创建支付 URL
使用 encodeURL 创建一个钱包可解析的 solana: 协议 URL:
import { encodeURL } from "@solana-commerce/solana-pay";const url = encodeURL({recipient: address("merchant-wallet-address"),amount: 100000000n, // 0.1 SOL in lamportslabel: "Coffee Shop",message: "Thanks for your order!"});console.log(url.toString());// solana:merchant...?amount=0.1&label=Coffee%20Shop&message=...
URL 参数
| 参数 | 类型 | 说明 |
|---|---|---|
recipient | Address | 商家钱包地址(必填) |
amount | bigint | lamports 或代币最小单位的金额 |
splToken | Address | SPL 代币铸造地址(SOL 可省略) |
reference | Address[] | 用于追踪支付的唯一引用 |
label | string | 钱包中显示的商家名称 |
message | string | 支付前显示的信息 |
memo | string | 附加在交易上的链上备注 |
SPL 代币支付
如需使用稳定币支付,请指定代币铸造地址:
import { encodeURL } from "@solana-commerce/solana-pay";const url = encodeURL({recipient: address("merchant-wallet"),amount: 25000000n, // 25 USDC (6 decimals)splToken: USDC_MINT,label: "My Store"});
使用引用追踪支付
生成唯一的引用以标识特定付款:
import { encodeURL } from "@solana-commerce/solana-pay";import { address, generateKeyPairSigner } from "@solana/kit";const orderReference = (await generateKeyPairSigner()).address;const url = encodeURL({recipient: address(MERCHANT_WALLET_ADDRESS),amount: 500000000n, // 0.5 SOLreference: orderReference,memo: `Order-${Date.now()}`});// Query the blockchain later for transactions containing this reference
生成二维码
使用 createQR 生成可被移动钱包扫描的二维码:
import { createQR, encodeURL } from "@solana-commerce/solana-pay";import { address } from "@solana/kit";const url = encodeURL({recipient: address(MERCHANT_WALLET_ADDRESS),amount: 100000000n,label: "Coffee Shop"});const qrCode = await createQR(url.toString(),400, // size in pixels"white", // background"black" // foreground);// Use as image sourcedocument.getElementById("qr").src = qrCode;
样式化二维码
如需带有品牌 logo 和自定义样式的二维码:
import { createStyledQRCode, encodeURL } from "@solana-commerce/solana-pay";const qr = await createStyledQRCode(url.toString(), {width: 600,margin: 3,color: {dark: "#9945FF", // Solana purplelight: "#FFFFFF"},errorCorrectionLevel: "H",dotStyle: "dots",cornerStyle: "extra-rounded",logo: "/your-logo.png",logoSize: 120});
构建交易
使用 createTransfer 构建完整的签名交易:
import { createTransfer } from "@solana-commerce/solana-pay";const transaction = await createTransfer(client.rpc,address(SENDER_WALLET_ADDRESS),{recipient: address(MERCHANT_WALLET_ADDRESS),amount: 100000000n, // 0.1 SOLmemo: "Coffee purchase"});
对于 SPL 代币,请包含 mint 地址:
const USDC_MINT = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const transaction = await createTransfer(client.rpc,address(SENDER_WALLET_ADDRESS),{recipient: address(MERCHANT_WALLET_ADDRESS),amount: 25000000n, // 25 USDCsplToken: USDC_MINT,reference: [orderReference],memo: "Order #12345"});
解析 URL
验证并提取 Solana Pay URL 中的数据:
import { parseURL, ParseURLError } from "@solana-commerce/solana-pay";try {const parsed = parseURL("solana:merchant...?amount=1.5&label=Store");console.log(parsed.recipient); // Addressconsole.log(parsed.amount); // 1500000000n (lamports)console.log(parsed.label); // "Store"} catch (error) {if (error instanceof ParseURLError) {console.error("Invalid URL:", error.message);}}
Is this page helpful?