Atome QR
Accept offline QR code payments from Atome users by displaying a scannable QR code that customers authorize through their Atome app.
Overviewโ
Atome QR is an offline QR-based payment method that allows customers to pay using their Atome Buy Now Pay Later account. Unlike the standard Atome redirect flow, customers scan a merchant-generated QR code and authorize payment directly in their Atome app.
Key Features:
- โ Offline authorization - Customer scans QR and pays in app
- โ Buy Now Pay Later - 3 interest-free installments
- โ No redirect needed - QR code displayed on merchant side
- โ 3 markets - Thailand, Singapore, Malaysia
- โ Instant approval - Real-time credit decision in app
Contact support@omise.co to enable Atome QR for your merchant account.
Supported Regionsโ
| Region | Currency | Min Amount | Max Amount | API Version |
|---|---|---|---|---|
| Thailand | THB | เธฟ20.00 | เธฟ50,000.00 | 2017-11-02 |
| Singapore | SGD | $1.50 | $3,000.00 | 2017-11-02 |
| Malaysia | MYR | RM10.00 | RM5,000.00 | 2017-11-02 |
How It Worksโ
Payment Flow:
- Merchant creates Atome QR source
- QR code displayed at checkout or POS
- Customer opens Atome app and scans QR
- Atome performs instant credit check
- Customer reviews 3-installment plan
- Customer confirms first payment
- Merchant receives webhook confirmation
Typical completion time: 30 seconds - 2 minutes
Implementationโ
Step 1: Create Sourceโ
- cURL
- Node.js
- PHP
curl https://api.omise.co/sources \
-u $OMISE_PUBLIC_KEY: \
-d "amount=50000" \
-d "currency=SGD" \
-d "type=atome_qr"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
const source = await omise.sources.create({
type: 'atome_qr',
amount: 50000, // SGD 500.00
currency: 'SGD'
});
// Get QR code URL
const qrCodeUrl = source.scannable_code.image.download_uri;
console.log('QR Code:', qrCodeUrl);
<?php
$source = OmiseSource::create([
'type' => 'atome_qr',
'amount' => 50000,
'currency' => 'SGD'
]);
$qrCodeUrl = $source['scannable_code']['image']['download_uri'];
?>
Step 2: Create Chargeโ
curl https://api.omise.co/charges \
-u $OMISE_SECRET_KEY: \
-d "amount=50000" \
-d "currency=SGD" \
-d "source=src_test_xxx"
Combined Requestโ
Create source and charge in one request:
curl https://api.omise.co/charges \
-u $OMISE_SECRET_KEY: \
-d "amount=50000" \
-d "currency=SGD" \
-d "source[type]=atome_qr"
Step 3: Display QR Codeโ
// Display QR code on your checkout page or POS
const qrCodeUrl = charge.source.scannable_code.image.download_uri;
// In your HTML
document.getElementById('qr-code').src = qrCodeUrl;
Step 4: Handle Webhookโ
app.post('/webhooks/omise', (req, res) => {
const event = req.body;
if (event.key === 'charge.complete') {
const charge = event.data;
if (charge.status === 'successful') {
// Payment successful - fulfill order
fulfillOrder(charge.metadata.order_id);
} else if (charge.status === 'failed') {
// Handle failure
handleFailedPayment(charge);
}
}
res.status(200).send('OK');
});
QR Code Expirationโ
The default QR code expiration is 12 hours. You can customize this between 30 seconds and 12 hours using the expires_at parameter:
curl https://api.omise.co/charges \
-u $OMISE_SECRET_KEY: \
-d "amount=50000" \
-d "currency=SGD" \
-d "source=src_test_xxx" \
-d "expires_at=2024-12-31T23:59:59Z"
Charge Status Valuesโ
| Status | Description |
|---|---|
pending | QR code displayed, awaiting customer scan |
successful | Payment completed |
failed | Payment declined or processing error |
expired | QR code validity period ended |
Failure Codesโ
| Code | Description |
|---|---|
payment_expired | QR code validity period ended |
payment_rejected | Atome declined the transaction |
failed_processing | General authorization failure |
Refundsโ
Atome QR charges can be partially or fully refunded within 60 days of the transaction date.
// Full or partial refund
const refund = await omise.charges.refund('chrg_test_xxx', {
amount: 25000 // Partial refund of SGD 250.00
});
Best Practicesโ
- Show installment breakdown - Display 3-payment schedule before QR
- Set appropriate expiry - Match QR validity to checkout session
- Clear instructions - Guide customers to open Atome app first
- Webhook handling - Always verify via webhook, not just polling
- Display eligibility - Show Atome eligibility requirements
FAQโ
What is Atome QR?
Atome QR is an offline QR-based Buy Now Pay Later payment method. Unlike the standard Atome redirect flow, customers scan a QR code displayed by the merchant and authorize the payment directly in their Atome app. The purchase is split into 3 interest-free monthly installments.
What's the difference between Atome and Atome QR?
Atome (redirect): Customer is redirected to Atome's website/app to complete payment. Better for online checkout flows.
Atome QR: Merchant displays a QR code that the customer scans with their Atome app. Better for in-store POS or when you want to keep customers on your page.
Both split the payment into 3 interest-free installments.
How long is the QR code valid?
By default, Atome QR codes are valid for 12 hours. You can customize this between 30 seconds and 12 hours using the expires_at parameter when creating the charge.
What happens if the customer fails the credit check?
If Atome declines the customer's application (insufficient credit, account issues, etc.), the charge will fail with a payment_rejected failure code. You should offer alternative payment methods in this case.
Can I refund Atome QR payments?
Yes, both full and partial refunds are supported within 60 days of the original transaction. Atome handles refunding the customer's installments accordingly.
What are the transaction limits?
Limits vary by region:
- Thailand: เธฟ20 - เธฟ50,000 THB
- Singapore: $1.50 - $3,000 SGD
- Malaysia: RM10 - RM5,000 MYR
Individual customer limits may be lower based on their Atome credit limit.
Related Resourcesโ
- Atome (Redirect) - Standard redirect flow
- QR Payments Overview - All QR methods
- Webhooks - Webhook handling
- Refunds - Refund policies