Overview
Secure Fields lets you embed individual, PCI-compliant card input fields (card number, expiry date, CVV) directly into your custom checkout UI. Each field is rendered in a secure iframe managed by Yuno, so sensitive card data never touches your servers.
Secure Fields gives you complete design freedom while keeping your PCI scope at SAQ-A level (the simplest compliance level. Card data never touches your servers).
Prerequisites
- Yuno API keys (Authentication)
@yuno-payments/sdk-web installed (SDK Overview)
- A custom checkout page where you control the form layout
Integration Flow
Create a checkout session (server-side)
const session = await createCheckoutSession({
amount: { currency: 'USD', value: 75.00 },
country: 'US',
merchant_order_id: 'order-456',
workflow: 'SDK_SECURE_FIELDS',
});
Initialize the SDK
const yuno = await Yuno.initialize({
publicApiKey: 'your-public-api-key',
checkoutSession: session.checkout_session,
country: 'US',
});
Mount individual Secure Fields
Create container elements for each field and mount them:<form id="payment-form">
<label>Card Number</label>
<div id="yuno-card-number"></div>
<label>Expiry Date</label>
<div id="yuno-expiry"></div>
<label>CVV</label>
<div id="yuno-cvv"></div>
<button type="submit">Pay</button>
</form>
const secureFields = yuno.mountSecureFields({
cardNumber: { elementSelector: '#yuno-card-number' },
expiryDate: { elementSelector: '#yuno-expiry' },
cvv: { elementSelector: '#yuno-cvv' },
onReady: () => console.log('Secure Fields ready'),
onFieldChange: (field, event) => {
if (event.error) {
showFieldError(field, event.error.message);
} else {
clearFieldError(field);
}
},
});
Generate a one-time token
When the user submits the form, generate a token from the secure fields:document.getElementById('payment-form').addEventListener('submit', async (e) => {
e.preventDefault();
try {
const { token } = await secureFields.generateToken({
cardHolderName: 'Dee Hock',
});
// Send token to your server to create the payment
await createPayment(token);
} catch (error) {
console.error('Tokenization failed:', error);
}
});
The one-time token expires after a single use. Generate a new token for each payment attempt.
Create payment and handle 3DS
Use the token server-side to create the payment, then call continuePayment() client-side for 3DS:
Styling Secure Fields
You can style the iframe inputs to match your design system:
const secureFields = yuno.mountSecureFields({
styles: {
base: {
fontSize: '16px',
color: '#333',
fontFamily: 'Inter, sans-serif',
},
focus: { borderColor: '#0066FF' },
error: { color: '#E53E3E' },
},
});
See Customization for the full list of style properties.