Skip to main content

Checkout Flow

Create a checkout session for on-ramp payments.

import { ZenPays } from 'zenpays'

async function createCheckout() {
const zenpays = new ZenPays({
apiKey: process.env.ZENPAYS_API_KEY!,
})

// 1. Detect customer's location
const geo = await zenpays.checkout.detectGeo()
console.log('Detected country:', geo.country, 'Currency:', geo.currency)

// 2. Create checkout session
const session = await zenpays.checkout.createSession({
playerId: 'player_123',
amount: 100, // Amount in fiat currency
targetSettlementAsset: 'USDT',
successUrl: 'https://example.com/success',
cancelUrl: 'https://example.com/cancel',
})

console.log('Session created:', session.id)

// 3. Get available banks (if bank transfer)
const { banks } = await zenpays.checkout.getBanks(geo.currency)
console.log('Available banks:', banks.length)

// 4. Select optimal provider
const provider = await zenpays.checkout.selectProvider({
sessionId: session.id,
playerGeo: geo.country,
currency: geo.currency,
amount: 100,
paymentMethod: 'card',
targetSettlementAsset: 'USDT',
})

console.log('Selected provider:', provider.provider)
console.log('Widget URL:', provider.widgetUrl)
console.log('Embed mode:', provider.embedMode)

// 5. Redirect or embed widget
if (provider.embedMode === 'redirect') {
// Redirect to provider
window.location.href = provider.widgetUrl
}
else {
// Embed in iframe
const iframe = document.createElement('iframe')
iframe.src = provider.widgetUrl
iframe.style.width = '100%'
iframe.style.height = '600px'
document.body.appendChild(iframe)
}

// 6. Monitor order status
const checkStatus = async () => {
const order = await zenpays.checkout.getRampOrder(session.rampOrderId!)

switch (order.status) {
case 'pending':
console.log('Waiting for payment...')
break
case 'pending_funds':
console.log('Payment received, waiting for confirmation...')
break
case 'confirmed':
console.log('Payment confirmed!')
break
case 'matched':
console.log('Crypto matched!')
break
case 'cleared':
console.log('Order complete!')
return true
case 'failed':
console.log('Order failed')
return false
}

// Check again in 5 seconds
setTimeout(checkStatus, 5000)
}

checkStatus()
}

createCheckout()