2.3 KiB
2.3 KiB
title, description
| title | description |
|---|---|
| Payments & Commerce | Build checkout flows, payment buttons, and QR-based payment requests using Solana Pay conventions, Kit instruction builders, and Kora for gasless flows. |
Payments and commerce (optional)
When payments are in scope
Use this guidance when the user asks about:
- checkout flows, tips, payment buttons
- payment request URLs / QR codes
- fee abstraction / gasless transactions
Building payments with Kit (default)
Build payment flows directly on @solana/kit + @solana-program/*:
- SOL transfers:
getTransferSolInstructionfrom@solana-program/system - Token transfers: the
tokenProgram()plugin from@solana-program/token(client.token—transferToATAauto-derives and creates the recipient ATA) - Reference/idempotency: attach a memo (
@solana-program/memo) or a unique reference account to correlate on-chain settlement with an order - Confirmation: track signature status to the commitment level your UX needs (
confirmedfor UI feedback,finalizedfor irreversible fulfillment)
Solana Pay (payment requests / QR)
Use the Solana Pay URL spec for request-based payments (point-of-sale, invoices, QR codes):
solana:<recipient>?amount=..&spl-token=..&reference=..&label=..&message=..- Verify settlement server-side by finding the transaction via the
referencekey and validating recipient, mint, and amount from chain state.
Kora (gasless / fee abstraction)
Consider Kora when you need:
- sponsored transactions (user doesn't pay gas)
- users paying fees in tokens other than SOL
- a trusted signing / paymaster component
Kora ships a Kit plugin (koraPlugin / createKitKoraClient from @solana/kora).
UX and security checklist for payments
- Always show recipient + amount + token clearly before signing.
- Protect against replay (use unique references / memoing where appropriate).
- Confirm settlement by querying chain state, not by trusting client-side callbacks.
- Handle partial failures gracefully (transaction sent but not confirmed).
- Provide clear error messages for common failure modes (insufficient balance, rejected signature).
- Test settlement logic against Surfpool — set up buyer/merchant token accounts with
surfnet_setTokenAccountand assert post-transaction balances (see testing.md).