Transaction Requests
Transações geradas pelo servidor para fluxos de checkout Solana Pay.
Receita
// API do comerciante retorna application/vnd.solana.transaction+json ou body conforme spec
import { createSolanaRpc } from "@solana/kit";Quando usar:
- Checkout precisa de swap, mint ou programa customizado - não transferência SOL simples.
- QR de PDV abre wallet com preview completo da transação.
- Pareamento com pubkeys de referência para reconciliação.
Exemplo prático
import { NextRequest, NextResponse } from "next/server";
import {
createSolanaRpc,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
address,
} from "@solana/kit";
export async function GET(req: NextRequest) {
const account = req.nextUrl.searchParams.get("account");
if (!account) return NextResponse.json({ error: "missing account" }, { status: 400 });
const rpc = createSolanaRpc(process.env.RPC_URL!);
const { value: bh } = await rpc.getLatestBlockhash().send();
// Construa transação com cliente como fee payer (param account)
let msg = createTransactionMessage({ version: 0 });
// anexe instruções do comerciante referenciando account como signer/payer
// serialize para transação wire base64 para wallet
return NextResponse.json({
transaction: "BASE64_WIRE_TX",
message: "Complete your purchase",
});
}O que isso demonstra:
- Pubkey do cliente chega como query param da wallet.
- Servidor constrói mensagem; cliente assina como fee payer.
- Retorne JSON no formato da spec para consumo da wallet.
Aprofundamento
Como funciona
- Wallet escaneia QR ou link → busca API do comerciante → exibe tx → usuário assina.
- Contas de referência ligam tx on-chain ao id do pedido.
- HTTPS obrigatório para confiança em produção.
Erros comuns
- Confiar em flag paid do client sem verificar RPC - fraude. Correção: job de confirmação no servidor.
- Param account não validado - construir txs para chaves escolhidas por atacante é OK mas registre abuso.
- Blockhash obsoleto em resposta em cache - falha na confirmação. Correção: gere por request.
- CORS ausente - wallet web não busca API. Correção: headers CORS de Actions conforme spec.
- Tx oversized - wallet rejeita. Correção: ALTs e instruções enxutas.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| URL de transferência simples | Pagamento SOL simples | Precisa swap/mint |
| Checkout custodial | Fiat on-ramps | Comerciante self-custody |
FAQs
App Router?
Providers em client layout.tsx; pages misturam server + client components.
Secrets?
Env de servidor apenas para keypairs; NEXT_PUBLIC_ para URLs RPC.
kit 7.0.0?
Todos os exemplos usam @solana/kit, não web3.js v1.
Wallet?
Assinatura apenas em client components.
Caching?
Revalide leituras on-chain com cuidado - chain é fonte da verdade.
Actions?
Endpoints HTTPS retornando JSON Solana Actions.
Mobile?
App React Native separado com MWA.
Testing?
Surfpool para integração; mock RPC em testes unitários.
Mainnet?
Arquivos env e program IDs separados.
Errors?
Decodifique logs de simulação para mensagens ao usuário.
Relacionados
- Noções Básicas de Solana Pay - intro QR
- Construindo uma Action - sobreposição com Actions
- API Routes para Transações - Next.js
Versões da stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 e LiteSVM 0.6.x.