> For the complete documentation index, see [llms.txt](https://docs.jgopay.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.jgopay.com/english/payment-methods.md).

# Payment Methods

MYR payments in Malaysia support multiple payment methods: **DuitNow QR** (QR code scan), **FPX Bank Transfer** (online banking redirect), and **TNG e-Wallet** (Touch 'n Go).

## Requirements

| Requirement        | Details                                                                    |
| ------------------ | -------------------------------------------------------------------------- |
| **Amount**         | Up to 2 decimal places                                                     |
| **Min Amount**     | 5.00 MYR                                                                   |
| **Max Amount**     | 50,000.00 MYR                                                              |
| **reference\_id**  | Alphanumeric only                                                          |
| **Payment Method** | `QR_PAYMENT` (DuitNow QR), `BANK_TRANSFER` (FPX), or `MOBILE_WALLET` (TNG) |

## Payment Options

### Option 1: DuitNow QR

Customers scan a DuitNow QR code using any Malaysian banking app. The QR code is displayed on the payment page.

| Property   | Value                                                                |
| ---------- | -------------------------------------------------------------------- |
| URL to use | `payment_url` — the payment page displays the DuitNow QR             |
| Flow       | Customer scans the QR with their banking app, callback on completion |

### Option 2: FPX Bank Transfer

Online banking payment via Malaysia's FPX network. Customers select their bank and are redirected to authorize the payment.

| Property   | Value                                                     |
| ---------- | --------------------------------------------------------- |
| URL to use | `gateway.redirect_url` — the bank authorization page      |
| Flow       | Customer authorizes at their bank, callback on completion |

> **Requirement:** When using `BANK_TRANSFER`, include `provider_channel_id` in `metadata` to specify the customer's bank. See [FPX Bank Codes](#fpx-bank-codes) below. Whether this field is required or optional depends on which upstream channel handles the request — to keep your integration portable across routing changes, **always send it**.

### Option 3: TNG e-Wallet (Touch 'n Go)

Pay using the Touch 'n Go e-Wallet. Customers are redirected to authorize the payment.

| Property   | Value                                               |
| ---------- | --------------------------------------------------- |
| URL to use | `gateway.redirect_url` — the TNG authorization page |
| Flow       | Customer authorizes in TNG, callback on completion  |

***

## Request Examples

### DuitNow QR

```json
{
  "amount": 100.00,
  "currency": "MYR",
  "reference_id": "ORDER20260325001",
  "customer_name": "Ahmad bin Ali",
  "customer_phone": "60123456789",
  "payment_method": "QR_PAYMENT"
}
```

### FPX Bank Transfer

```json
{
  "amount": 100.00,
  "currency": "MYR",
  "reference_id": "ORDER20260325002",
  "customer_name": "Ahmad bin Ali",
  "customer_phone": "60123456789",
  "payment_method": "BANK_TRANSFER",
  "metadata": {
    "provider_channel_id": "MB2U0227"
  }
}
```

> **`provider_channel_id` is required** for `BANK_TRANSFER` when routed through a channel that performs bank selection at the gateway (e.g. DuitNow B2C). If omitted on that path, the request fails with `MISSING_PROVIDER_CHANNEL`; if the value isn't in the allow-list, it fails with `INVALID_PROVIDER_CHANNEL`. Other upstream channels accept BANK\_TRANSFER without it (the customer picks the bank at the gateway page). Treat it as required and always send a valid code from the [FPX Bank Codes](#fpx-bank-codes) or [DuitNow (RPP) Bank Codes](#duitnow-rpp-bank-codes) tables below — your integration will then work regardless of which channel routing picks.

### TNG e-Wallet

```json
{
  "amount": 100.00,
  "currency": "MYR",
  "reference_id": "ORDER20260325003",
  "customer_name": "Ahmad bin Ali",
  "customer_phone": "60123456789",
  "payment_method": "MOBILE_WALLET"
}
```

### Field Notes

| Field                          | Value                | Notes                                                            |
| ------------------------------ | -------------------- | ---------------------------------------------------------------- |
| `amount`                       | `100.00`             | Up to 2 decimal places                                           |
| `currency`                     | `"MYR"`              | Malaysian Ringgit                                                |
| `reference_id`                 | `"ORDER20260325001"` | Alphanumeric only                                                |
| `customer_phone`               | `"60123456789"`      | Include `60` country code, no `+`                                |
| `payment_method`               | `"QR_PAYMENT"`       | Required — one of `QR_PAYMENT`, `BANK_TRANSFER`, `MOBILE_WALLET` |
| `metadata.provider_channel_id` | `"MB2U0227"`         | **Required for `BANK_TRANSFER` only.** See bank codes below      |

***

## FPX Bank Codes

Use these codes in `metadata.provider_channel_id` when calling `BANK_TRANSFER`. These route through the **FPX** (Financial Process Exchange) network.

| Code       | Bank Name            |
| ---------- | -------------------- |
| `ABB0233`  | Affin Bank           |
| `ABMB0212` | Alliance Bank        |
| `AGRO01`   | Agro Bank            |
| `AMBB0209` | Ambank               |
| `BCBB0235` | CIMB Bank            |
| `BIMB0340` | Bank Islam           |
| `BKRM0602` | Bank Rakyat          |
| `BMMB0341` | Bank Muamalat        |
| `BSN0601`  | BSN                  |
| `HLB0224`  | Hong Leong Bank      |
| `HSBC0223` | HSBC Bank            |
| `KFH0346`  | Kuwait Finance House |
| `MB2U0227` | Maybank              |
| `OCBC0229` | OCBC Bank            |
| `PBB0233`  | Public Bank          |
| `RHB0218`  | RHB Bank             |
| `SCB0216`  | Standard Chartered   |
| `UOB0226`  | UOB                  |

## DuitNow (RPP) Bank Codes

These codes also work in `metadata.provider_channel_id` for `BANK_TRANSFER`. They route through the **DuitNow Online Banking** (RPP) network.

| Code       | Bank Name     |
| ---------- | ------------- |
| `AFBQMYKL` | MBSB Bank     |
| `AGOBMYKL` | Agro Bank     |
| `ARBKMYKL` | Ambank        |
| `BIMBMYKL` | Bank Islam    |
| `BKCHMYKL` | Bank of China |
| `BKRMMYKL` | Bank Rakyat   |
| `BMMBMYKL` | Bank Muamalat |
| `BOBEMYK2` | Boost Bank    |
| `BSNAMYK1` | BSN           |
| `CIBBMYKL` | CIMB Bank     |
| `FNXSMYNB` | Finexus       |
| `HBMBMYKL` | HSBC Bank     |
| `MBLOMYNB` | MobilityOne   |
| `MFBBMYKL` | Alliance Bank |
| `OCBCMYKL` | OCBC Bank     |
| `PBBEMYKL` | Public Bank   |
| `PHBMMYKL` | Affin Bank    |
| `RJHIMYKL` | Al-Rajhi Bank |
| `UOVBMYKL` | UOB           |

> **Tip:** FPX codes and RPP codes may overlap for the same bank (e.g., Maybank has `MB2U0227` for FPX). Either type is accepted — use whichever your customer's bank supports.

***

## Withdrawals

MYR supports withdrawals (payouts) to Malaysian banks through the [Create Withdrawal](/english/create-withdrawal.md) endpoint.

### Withdrawal Request Example

```json
{
  "amount": 500.00,
  "currency": "MYR",
  "reference_id": "WD20260325001",
  "bank_code": "MY_MBB",
  "account_number": "1234567890",
  "account_name": "Ahmad bin Ali",
  "method": "BANK"
}
```

### Field Notes

| Field            | Value             | Notes                                                        |
| ---------------- | ----------------- | ------------------------------------------------------------ |
| `amount`         | `500.00`          | Up to 2 decimal places. Min 50.00 MYR, max 50,000.00 MYR     |
| `bank_code`      | `"MY_MBB"`        | See [Bank Codes](/english/bank-codes.md) for supported codes |
| `account_number` | `"1234567890"`    | Beneficiary bank account number                              |
| `account_name`   | `"Ahmad bin Ali"` | Must match bank account holder name                          |
| `method`         | `"BANK"`          | Always `BANK` for MYR withdrawals                            |

> See [Bank Codes](/english/bank-codes.md) for the full list of 31 supported Malaysian banks and e-wallets.

***

## Common Errors

| Error                      | Cause                                                                           | Fix                                                                                 |
| -------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| `MISSING_PROVIDER_CHANNEL` | `BANK_TRANSFER` without `metadata.provider_channel_id`                          | Include `provider_channel_id` in `metadata` — see [FPX Bank Codes](#fpx-bank-codes) |
| `INVALID_PROVIDER_CHANNEL` | `provider_channel_id` not in allowed list                                       | Use a code from the tables above                                                    |
| `INVALID_AMOUNT`           | Amount outside allowed range (deposits 5-50,000 MYR, withdrawals 50-50,000 MYR) | Check the limits above                                                              |
| `INVALID_BANK_CODE`        | Bank code not supported for MYR withdrawals                                     | See [Bank Codes](/english/bank-codes.md)                                            |
| `NO_GATEWAY_AVAILABLE`     | No active MYR gateway                                                           | Contact support                                                                     |
| `GATEWAY_ERROR`            | Gateway temporarily unavailable (e.g., bank limits reached)                     | Retry later or contact support                                                      |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.jgopay.com/english/payment-methods.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
