Solana Pay

Solana Pay 是一个开源支付框架,可在 Solana 上实现即时、几乎零费用的交易。
通过 Shopify 集成,已被数百万企业信赖,它通过完全消除传统支付中介来彻底改变商业模式。
核心功能
Solana Pay 的特点包括:
- 直接结算: 支付直接从客户钱包到商家钱包,可使用 SOL 或任何 SPL 代币。无需银行、处理器或中介抽成。
- 即时确认: 由于 Solana 的亚秒级结算,资金在确认后立即到账。
- 通用兼容性: 一次实现即可兼容所有 Solana 钱包和应用程序。
所有功能通过两种基本请求类型实现:
转账请求(简单支付)
用于预设交易的非交互式 URL。所有信息都编码在 URL 中。
solana:mvines9iiHiQTysrwkJjGf2gb9Ex9jXJX8ns3qwf2kN?amount=0.01&spl-token=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
交易请求(动态支付)
交互式 URL,可在服务器端构建复杂交易。
钱包向您的服务器发送 HTTP 请求,服务器返回基于实时数据构建的自定义交易。
集成选项
Solana Pay 提供以下功能:
- 二维码: 实现即时的线下支付
- 可分享链接: 适用于任何平台
- 嵌入式按钮: 提供无缝的结账体验
- 自定义流程: 支持多方交易、条件访问、部分签名
为什么重要
Solana Pay 用简单的 URL 替代了整个传统支付体系。无需与多个钱包集成或处理复杂的交易流程,您只需创建标准化链接,这些链接可在任何地方自动工作。
**传统支付流程:**客户 → 银行 → 支付处理器 → 您的银行 → 您(几天后,扣除手续费)
**Solana Pay 流程:**客户 → 您(即时,几乎无手续费)
参考
参考是 Solana Pay 技术栈中最重要的部分之一。由于您的后端不会向网络提交交易,而只是返回钱包签名的交易响应,因此没有交易签名可以帮助确定支付是否完成。
reference 是一个唯一的公钥,作为非签名者、非可写账户包含在交易中。它不会影响交易行为,但作为一个跟踪标识符。
流程如下:
- 为每个支付请求生成一个唯一的参考(公钥)
- 将其作为参数包含在您的交易请求 URL 中
- 将其作为非签名账户添加到您的交易指令中
- 使用参考跟踪交易
您可以使用 Solana 的 getSignaturesForAddress RPC 方法或 @solana/pay 库的 findReference 辅助工具来定位包含您参考的交易,如下所示:
ts
useEffect(() => {
// Poll the network for transactions that include the reference address
const interval = setInterval(async () => {
try {
// Find transactions that include the reference address
const signatureInfo = await findReference(connection, reference, {
until: mostRecentNotifiedTransaction.current, // Only look for transactions after the most recent one we've found
finality: "confirmed",
});
// Update the most recent transaction with the transaction we just found
mostRecentNotifiedTransaction.current = signatureInfo.signature;
// Toast notification
displayToast(signatureInfo.signature);
} catch (e) {
if (e instanceof FindReferenceError) {
// No transaction found yet, ignore this error
return;
}
console.error("Unknown error", e);
}
}, 1000); // Check for new transactions every second
return () => {
clearInterval(interval);
};
}, [reference]);二维码生成
使用 @solana/pay 库将任何交易请求转换为可扫描的二维码:
ts
import { createQR, encodeURL, TransactionRequestURLFields } from '@solana/pay';
const urlParams: TransactionRequestURLFields = {
link: new URL("https://yourapi.com/pay"),
};
const solanaUrl = encodeURL(urlParams);
const qr = createQR(
solanaUrl,
400,
"transparent"
);