card_data is tokenized and captured by wallet elements.
Wallet and 3DS are complementary. If a wallet transaction returns
AWAITING_3DS, continue with either official 3DS flow (session-first or transaction-first), based on your organization architecture.Architecture
- Frontend creates a wallet transaction object with RinneJS.
- Frontend mounts Apple Pay and Google Pay elements.
onCapturereturns encryptedpayload.card_dataandpayload.payment_method.- Frontend sends payload data to your backend.
- Backend calls transaction create endpoint in self or merchant context.
Transaction endpoint context
| Context | Endpoint |
|---|---|
| Self (company) | POST /v1/transactions |
| Organization on behalf of merchant | POST /v1/merchants/{merchantId}/transactions |
Map RinneJS payload to API fields
| RinneJS payload | Rinne Core API field | Notes |
|---|---|---|
payload.card_data | card_data | Send as-is from frontend to backend |
payload.payment_method | payment_method | Usually CREDIT_CARD or DEBIT_CARD |
payload.transaction.details.amount | amount | Amount in cents |
payload.transaction.details.currency | currency | Usually BRL |
| Backend-generated UUID | request_id | Idempotency key |
Backend transaction request example
Backend handler example (Node.js)
server.ts
Frontend capture handling
InonCapture, always call fail() when backend processing fails so wallet UI can recover.
3DS behavior in wallet flows
Most wallet payloads already contain tokenized authentication data (network_token + cryptogram).
If the transaction still returns AWAITING_3DS, run your regular 3DS flow:
- Create a 3DS session.
- Complete challenge in frontend with
tds_session_id. - Call authenticate endpoint in your context:
- Self:
/v1/transactions/{transactionId}/authenticate - Merchant:
/v1/merchants/{merchantId}/transactions/{transactionId}/authenticate
- Self:
Optional policy flags for wallet card transactions
The same card transaction flags are available in wallet-backed card requests:require_3ds: true: use this when you want wallet transactions to deterministically enterAWAITING_3DSin your transaction-first flow.refuse_on_challenge: true: use this when you want challenge-triggered wallet transactions to fail fast asREFUSED(status_reason = CHALLENGE_NOT_ALLOWED) instead of requiring challenge handling.
Production checklist
Wallet checkout is ready for production when:
- You send wallet
card_dataonly to your backend. - You create transactions with idempotent
request_idvalues. - You call
fail()inonCapturefor all backend failures. - You handle
PROCESSING,APPROVED,REFUSED, andAWAITING_3DSoutcomes. - You use webhooks for final transaction state updates.

