Skip to main content
The fastest way to see a payment go through RadiumOne end to end: create a hosted-checkout session on your server, redirect the shopper to it, and confirm the result server-side once they return.

How it works

  1. Your server creates a checkout session with the amount and your success_url/cancel_url.
  2. Your website redirects the shopper to the returned checkout_url.
  3. The shopper pays on the RadiumOne-hosted page.
  4. RadiumOne redirects the shopper back to your success_url (or cancel_url).
  5. Your server confirms the final status with an authenticated request before fulfilling the order.

Before you begin

You need a sandbox secret key (r1sk_test_…). See Sandbox and API keys if you don’t have one yet.
Amounts are always integers in the currency’s minor unit. For example, 5000 for SGD means SGD 50.00.

See a working example

Clone an example cart that creates a session and redirects to hosted checkout, if you’d rather start from running code.

Steps

1

Create a checkout session

From your server, create a checkout session (API reference) for the order. Use one order_reference per order attempt — replaying the same reference within the session’s TTL safely returns the existing session instead of creating a duplicate.
Replaying order_reference matches it as-is, with no comparison of the rest of the body. If you send a different amount on the retry, RadiumOne silently keeps the original session’s amount instead of rejecting the request. See Prevent duplicate payments for the full guide.
2

Redirect the shopper

Redirect the shopper’s browser to data.checkout_url from the response. The shopper enters their card on the RadiumOne-hosted page — your site never sees it.
3

Handle the return page

RadiumOne redirects the shopper back to your success_url (or cancel_url if they cancel or the session expires). This return page may carry query parameters describing the outcome, but treat them as a hint only — don’t fulfill the order from them directly. If the shopper never returns to this page at all, see Confirm payment when the redirect never arrives.
4

Confirm the result server-side

From your server, retrieve the checkout session by ID (API reference) and check its status, order_reference, and amount before you fulfill the order.
Treat any client-side redirect or callback as a hint only. Always confirm the final payment status from your server, using an authenticated GET request or a webhook — never from a query parameter or browser postMessage alone.

Handle the result

A checkout session’s status is one of pending, processing, completed, failed, expired, or cancelled. Only fulfill the order once status is completed and the order_reference and amount match what you created — see Verify the payment result for the full signature and confirmation guide.

Test your integration

Use the sandbox test cards and scenarios in Test your integration to try approvals, declines, and timeouts before you move on.

Go-live notes

  • Swap your sandbox keys and hosts for production ones — see Moving to production.
  • Always confirm payment status from your server, never from the return-page query string alone.
  • Register your production webhook endpoint so you have a second, asynchronous confirmation path.
  • Work through the full go-live checklist before accepting real payments.

Next steps

Choose your integration

Compare hosted checkout with Elements + the Payments API.

Hosted checkout

Customize the checkout page, add 3DS, and go beyond the quickstart.

Webhooks

Get notified about payment events instead of polling.

Manage payments

Capture, void, refund, and track transactions.
Last modified on September 15, 2026