Skip to main content

DuitNow Online Banking/Wallets (OBW)

Accept payments from Malaysian customers through their bank's online banking portal or digital wallet using DuitNow OBW.

Overviewโ€‹

DuitNow OBW (Online Banking/Wallets) enables merchants to accept payments through customers' bank online banking portals and digital wallets. It uses a redirect-based flow where customers authenticate and authorize payments on their bank's secure platform.

Key Features:

  • โœ… 18+ banks supported - All major Malaysian banks
  • โœ… Secure bank authentication - Customers authorize on their bank's platform
  • โœ… Redirect flow - Simple redirect integration
  • โœ… Real-time confirmation - Instant payment verification
  • โœ… 180-day refund window - Full and partial refunds supported
Enablement Required

Contact support@omise.co to enable DuitNow OBW for your merchant account.

Supported Regionโ€‹

RegionCurrencyMin AmountMax AmountAPI Version
MalaysiaMYRRM1.00RM20,000.002017-11-02

Supported Banksโ€‹

Bank CodeBank Name
affinAffin Bank
allianceAlliance Bank
agroAGRONet
ambankAmBank
islamBank Islam
muamalatBank Muamalat
rakyatBank Rakyat
bsnBSN
cimbCIMB Clicks
hongleongHong Leong Bank
hsbcHSBC
kfhKFH
maybank2uMaybank2U
ocbcOCBC
publicbankPublic Bank
rhbRHB Bank
scStandard Chartered
uobUOB

How It Worksโ€‹

Payment Flow:

  1. Customer selects DuitNow OBW and chooses their bank
  2. Merchant creates source with bank code
  3. Customer redirected to bank's online banking
  4. Customer logs in and confirms payment with OTP
  5. Customer returns to merchant site
  6. Webhook confirms payment status

Typical completion time: 1-3 minutes

Implementationโ€‹

Step 1: Create Sourceโ€‹

curl https://api.omise.co/sources \
-u $OMISE_PUBLIC_KEY: \
-d "amount=150000" \
-d "currency=MYR" \
-d "type=duitnow_obw" \
-d "bank=maybank2u"

Step 2: Create Chargeโ€‹

curl https://api.omise.co/charges \
-u $OMISE_SECRET_KEY: \
-d "amount=150000" \
-d "currency=MYR" \
-d "return_uri=https://example.com/payment/complete" \
-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=150000" \
-d "currency=MYR" \
-d "return_uri=https://example.com/payment/complete" \
-d "source[type]=duitnow_obw" \
-d "source[bank]=maybank2u"

Step 3: Redirect Customerโ€‹

// Redirect to bank's online banking portal
window.location.href = charge.authorize_uri;

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') {
fulfillOrder(charge.metadata.order_id);
} else if (charge.status === 'failed') {
notifyCustomer(charge.metadata.order_id, charge.failure_message);
}
}

res.status(200).send('OK');
});

Bank Selection UIโ€‹

Display a bank selection dropdown for customers:

<div class="bank-selection">
<label for="bank">Select your bank:</label>
<select id="bank" name="bank" required>
<option value="">-- Choose Bank --</option>
<option value="maybank2u">Maybank2U</option>
<option value="cimb">CIMB Clicks</option>
<option value="publicbank">Public Bank</option>
<option value="rhb">RHB Bank</option>
<option value="hongleong">Hong Leong Bank</option>
<option value="ambank">AmBank</option>
<option value="affin">Affin Bank</option>
<option value="alliance">Alliance Bank</option>
<option value="islam">Bank Islam</option>
<option value="muamalat">Bank Muamalat</option>
<option value="rakyat">Bank Rakyat</option>
<option value="bsn">BSN</option>
<option value="hsbc">HSBC</option>
<option value="ocbc">OCBC</option>
<option value="sc">Standard Chartered</option>
<option value="uob">UOB</option>
</select>
</div>

Charge Status Valuesโ€‹

StatusDescription
pendingAwaiting customer authorization at bank
successfulPayment completed
failedPayment declined or processing error
expiredCustomer didn't complete within 7 days

Failure Codesโ€‹

CodeDescription
payment_expiredAuthorization window closed
payment_rejectedBank declined transaction
failed_processingGeneral processing error
invalid_accountNo valid account for payment
insufficient_fundInsufficient balance or limit

Refundsโ€‹

DuitNow OBW supports full and partial refunds within 180 days of the transaction:

// Full or partial refund
const refund = await omise.charges.refund('chrg_test_xxx', {
amount: 50000 // Partial refund of MYR 500.00
});

Best Practicesโ€‹

  1. Show bank logos - Display recognizable bank logos for selection
  2. Indicate processing - Show loading state during redirect
  3. Handle timeouts - Customer has 7 days to complete payment
  4. Webhook priority - Always use webhook for order fulfillment
  5. Mobile optimization - Bank portals work on mobile devices

FAQโ€‹

What is DuitNow OBW?

DuitNow OBW (Online Banking/Wallets) is a payment method that allows Malaysian customers to pay directly through their bank's online banking portal. Customers select their bank, get redirected to log in, and authorize the payment with OTP verification.

What's the difference between DuitNow OBW and DuitNow QR?

DuitNow OBW: Customer is redirected to their bank's online banking portal to authorize payment. Better for desktop and web checkout flows.

DuitNow QR: Customer scans a QR code with any banking app or e-wallet. Better for in-store payments and mobile-first experiences.

Both are part of Malaysia's DuitNow payment infrastructure.

Which banks are supported?

DuitNow OBW supports 18+ Malaysian banks including Maybank, CIMB, Public Bank, RHB, Hong Leong, AmBank, Affin, Alliance, Bank Islam, Bank Muamalat, Bank Rakyat, BSN, HSBC, OCBC, Standard Chartered, and UOB.

How long does the customer have to complete payment?

Customers have up to 7 days to complete the payment after the charge is created. However, individual bank session timeouts may be shorter. If payment isn't completed, the charge status becomes expired.

Can I refund DuitNow OBW payments?

Yes, both full and partial refunds are supported within 180 days of the original transaction date.

Is DuitNow OBW better than FPX?

DuitNow OBW and FPX both enable online banking payments in Malaysia. DuitNow OBW is the newer standard under PayNet's DuitNow infrastructure. Both work similarly - choose based on your existing integration or PayNet/FPX availability for your merchant account.