Solana Pay

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 lamports
label: "Coffee Shop",
message: "Thanks for your order!"
});
console.log(url.toString());
// solana:merchant...?amount=0.1&label=Coffee%20Shop&message=...

URL 参数

参数类型说明
recipientAddress商家钱包地址(必填)
amountbigintlamports 或代币最小单位的金额
splTokenAddressSPL 代币铸造地址(SOL 可省略)
referenceAddress[]用于追踪支付的唯一引用
labelstring钱包中显示的商家名称
messagestring支付前显示的信息
memostring附加在交易上的链上备注

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 SOL
reference: 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 source
document.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 purple
light: "#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 SOL
memo: "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 USDC
splToken: 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); // Address
console.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?

Table of Contents

Edit Page

管理者

©️ 2026 Solana 基金会版权所有
取得联系