Let customers pay using GrabPay via Nomupay across Southeast Asia.
GrabPay via Nomupay is a Southeast Asian digital wallet operated by Grab, available across Cambodia, Indonesia, Malaysia, Myanmar, Philippines, Singapore, Thailand, and Vietnam. Nomupay settles MYR via the Malaysia account and PHP via the Philippines account β separate regional accounts are required.
One off payment
Refunds
Recurring
Cancel
β
β
x
x
Nomupay uses separate regional accounts for MYR (Malaysia) and PHP (Philippines) settlement. Confirm with Nomupay which account is needed for your target markets.
Use the payment method type NOMUPAY_GRABPAY wherever the code below references YOUR_PAYMENT_METHOD_TYPE.
Primer Checkout (recommended)
Universal Checkout (legacy)
Headless Universal Checkout (legacy)
Primer Checkout is our latest web SDK, built around declarative web components. Once GrabPay is enabled in your Dashboard, the default <primer-checkout> layout renders it automatically alongside your other methods β no payment-method-specific markup is required.
Only reach for primer-payment-method if youβre building a custom layout and need to place GrabPay at a specific position. The element only renders when the type is enabled in your Dashboard and returned by the server for this checkout.
If GrabPay canβt be shown in a popup, Universal Checkout redirects the customer back to your site using the returnUrl passed in the redirect options. See Handle redirects & deep links for the full flow.
Redirect-based payment methods present a webpage or open a third-party app for the customer to authorize the payment. To return to your app once the customer has authorized the payment, include the urlScheme parameter when configuring PrimerPaymentMethodOptions.
let settings = PrimerSettings( // ... paymentMethodOptions: PrimerPaymentMethodOptions( urlScheme: "your-url-scheme://" // e.g. primer://, yourscheme:// ) // ...)
When the customer is redirected back to your app, iOS calls application(_:continue:restorationHandler:). Forward the call to the Primer SDK so the checkout can continue the flow.
class MyViewController: UIViewController { func startUniversalCheckout() { Primer.shared.showUniversalCheckout(clientToken: self.clientToken) }}
Check the customization guide to learn how to customize payment method buttons.
GrabPay requires a Native UI Manager to be presented to the customer.
// π Create the payment method managerlet nativeUIPaymentMethodManager = try PrimerHeadlessUniversalCheckout.NativeUIManager( paymentMethodType: "YOUR_PAYMENT_METHOD_TYPE")// π Show the payment methodtry nativeUIPaymentMethodManager.showPaymentMethod(intent: .checkout)
See NativeUIManager.init for the full API. As many redirect-based payment methods share this approach, we recommend centralizing the implementation β see the worked example in the Native UI Manager guide.
Use the payment method type NOMUPAY_GRABPAY wherever the code below references YOUR_PAYMENT_METHOD_TYPE.
class CheckoutActivity : AppCompatActivity() { private fun setupObservers() { viewModel.clientToken.observe(this) { clientToken -> showUniversalCheckout(clientToken) } } private fun showUniversalCheckout(clientToken: String) { Primer.instance.showUniversalCheckout(this, clientToken) }}
Check the customization guide to learn how to customize payment method buttons.
GrabPay requires a Native UI Manager to be presented to the customer.
// π Create the payment method managerval nativeUiManager = PrimerHeadlessUniversalCheckoutNativeUiManager.newInstance("YOUR_PAYMENT_METHOD_TYPE")// π Show the payment methodnativeUiManager.showPaymentMethod(this, PrimerSessionIntent.CHECKOUT)
See NativeUiManager.newInstance for the full API. As many redirect-based payment methods share this approach, we recommend centralizing the implementation β see the worked example in the Native UI Manager guide.