Skip to main content

Maybank QR

Accept payments via Maybank QR from Malaysia's largest bank with 10+ million MAE by Maybank app users and extensive nationwide presence.

Overviewโ€‹

Maybank QR is the QR payment system from Maybank, Malaysia's largest bank. While DuitNow QR works across all Malaysian banks, Maybank QR is specifically for Maybank customers using the Maybank2u or MAE app.

Key Features:

  • โœ… Largest bank - 10+ million Maybank app users
  • โœ… Fast confirmation - Near real-time payment verification (typically within seconds)
  • โœ… High trust - Malaysia's most established bank
  • โœ… Wide reach - 400+ branches nationwide
  • โœ… Refund support - Full and partial refunds
  • โš ๏ธ Maybank only - Requires Maybank account

Supported Regionโ€‹

RegionCurrencyMin AmountMax AmountTransaction Limit
MalaysiaMYRRM 0.01RM 10,000RM 50,000/day*

*Daily limits vary by customer's account type

When to Use Maybank QR vs DuitNow QRโ€‹

FeatureMaybank QRDuitNow QR
BanksMaybank onlyAll Malaysian banks
Users10M+30M+
Max AmountRM 10,000RM 5,000
Settlement1-3 daysInstant
Best ForMaybank-heavy customer baseGeneral audience
Recommendation

Use DuitNow QR for wider reach. Use Maybank QR only if your customer base is predominantly Maybank users or you need higher transaction limits.

Implementationโ€‹

Create Source and Display QRโ€‹

const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});

// Create Maybank QR source
const source = await omise.sources.create({
type: 'maybank_qr',
amount: 10000, // RM 100.00
currency: 'MYR'
});

// Get QR code image URL
const qrCodeUrl = source.scannable_code.image.download_uri;

// Create charge
const charge = await omise.charges.create({
amount: 10000,
currency: 'MYR',
source: source.id
});

// Display QR code
res.render('maybank-qr', {
qr_code: qrCodeUrl,
charge_id: charge.id
});

QR Code Displayโ€‹

<div class="maybank-qr-payment">
<div class="maybank-header">
<img src="/banks/maybank-logo.svg" alt="Maybank">
<h3>Maybank QR Pay</h3>
</div>

<div class="qr-container">
<img id="qr-code" src="{{ qr_code_url }}" alt="Maybank QR Code">
</div>

<div class="amount">
<strong>RM {{ amount }}</strong>
</div>

<div id="status">
<p>Menunggu pembayaran...</p>
<div class="spinner"></div>
</div>

<div class="instructions">
<h4>Cara Bayar:</h4>
<ol>
<li>Buka app <strong>Maybank2u</strong> atau <strong>MAE</strong></li>
<li>Pilih "QR Pay" atau "Scan & Pay"</li>
<li>Imbas QR code di atas</li>
<li>Sahkan pembayaran dengan TAC atau biometrik</li>
</ol>
</div>

<div class="app-links">
<p><small>Perlu app Maybank?</small></p>
<a href="https://apps.apple.com/my/app/maybank2u/id715871551" target="_blank">
iOS
</a>
<a href="https://play.google.com/store/apps/details?id=com.maybank2u.life" target="_blank">
Android
</a>
</div>
</div>

<script>
// Poll for payment status
const chargeId = '{{ charge_id }}';

const pollInterval = setInterval(async () => {
const response = await fetch(`/api/charges/${chargeId}/status`);
const data = await response.json();

if (data.status === 'successful') {
clearInterval(pollInterval);
document.getElementById('status').innerHTML =
'<p class="success">โœ“ Pembayaran Berjaya!</p>';
setTimeout(() => window.location = '/payment-success', 1000);
} else if (data.status === 'failed') {
clearInterval(pollInterval);
document.getElementById('status').innerHTML =
'<p class="error">Pembayaran gagal. Sila cuba lagi.</p>';
}
}, 3000);

// Timeout after 5 minutes
setTimeout(() => {
clearInterval(pollInterval);
if (!document.querySelector('.success')) {
document.getElementById('status').innerHTML =
'<p class="error">QR code tamat tempoh. Sila jana semula.</p>';
}
}, 300000);
</script>

Refund Supportโ€‹

// Full or partial refund within 30 days
const refund = await omise.charges.refund('chrg_test_...', {
amount: 10000 // Full or partial
});

Testingโ€‹

Test Amount: RM 100.00 (10000 smallest unit) Expected: Successful payment in test mode

Best Practicesโ€‹

1. Show Maybank Brandingโ€‹

<div class="payment-header">
<img src="/banks/maybank-logo.svg" alt="Maybank" class="bank-logo">
<h3>Maybank QR Pay</h3>
<p class="note">Untuk pengguna Maybank sahaja</p>
</div>

2. Provide Alternativeโ€‹

// Show alternative for non-Maybank users
showPaymentOptions([
{
type: 'maybank_qr',
label: 'Maybank QR',
description: 'Untuk pengguna Maybank'
},
{
type: 'duitnow_qr',
label: 'DuitNow QR',
description: 'Semua bank & e-wallet',
recommended: true
}
]);

3. Handle Non-Maybank Usersโ€‹

<div class="payment-alternatives">
<p>Bukan pengguna Maybank?</p>
<button onclick="useDuitNowQR()">Guna DuitNow QR</button>
<button onclick="useFPX()">Guna FPX Banking</button>
</div>

FAQโ€‹

What is Maybank QR?

Maybank QR is the QR payment system from Maybank, Malaysia's largest bank. It works specifically with Maybank2u and MAE apps.

Can non-Maybank customers use it?

No, Maybank QR requires a Maybank account. For wider reach, use DuitNow QR which works with all Malaysian banks.

What are the transaction limits?
  • Minimum: RM 0.01
  • Maximum: RM 10,000 per transaction
  • Daily limit: Up to RM 50,000 (varies by account type)
Should I use Maybank QR or DuitNow QR?

Use DuitNow QR for general audience (works with all banks/e-wallets).

Use Maybank QR only if:

  • Your customers are predominantly Maybank users
  • You need higher transaction limits (RM 10,000 vs RM 5,000)
Can I refund Maybank QR payments?

Yes, full and partial refunds are supported within 30 days.

Next Stepsโ€‹

  1. Create Maybank QR source
  2. Display QR code
  3. Implement status polling
  4. Set up webhooks
  5. Provide DuitNow QR alternative
  6. Test with Maybank app
  7. Go live