Migrating from Checkout Classic
Move an existing Classic integration to Checkout Modern: find out whether Modern covers you, which path applies, and how to switch over.
Before You Start​
- Creating a Modern project does not touch your Classic one. Your Classic project keeps taking payments until you switch your website over.
- Switching is a cutover, not a gradual move. The Classic and Modern plugins cannot run on the same website: you uninstall one and install the other, so expect a short break in payments and do it at a quiet hour. With a custom integration, build and test against your new Modern project on a separate website or environment, then switch.
- Your account and company data stay as they are. This is a change of integration, not of your Paysera account.
- A Modern project is a new project, with its own credentials and its own review. Plan for that review before it can collect payments.
- Building an integration your own merchants will use? Register on For Platforms and pass your integration ID, so the projects and orders you bring are recognised as yours.
Check That Modern Covers You​
Before you rebuild anything, confirm that everything you rely on today exists in Modern:
- Your market and payment methods. Checkout Modern is currently open to merchants in Lithuania, Latvia and Estonia. Check the methods your buyers use in the Payment Methods Reference.
- If your integration is custom, anything you built on Classic behaviour that has no direct equivalent in Modern.
- If your shop runs on a third-party platform, check with your platform first. Third-party platforms are gradually moving to Checkout Modern; until yours has, keep taking payments on Classic.
If something is missing, tell us before you rebuild rather than after.
Which Path Is Yours​
You Use a Paysera Plugin​
WooCommerce, PrestaShop, OpenCart or Shopify: there is no code to rebuild. Uninstall the Classic plugin, install the Checkout Modern plugin for your platform and enter the credentials of your Modern project. The two plugins cannot run side by side, so payments pause between the two steps. The orders in your shop are kept; read After You Switch for orders still pending and for refunds. See Plugins.
On Magento, stay on Classic for now; the Checkout Modern plugin is still in development.
You Built the Integration Yourself​
A custom integration on your own website, or your own module. The rest of this page is for you.
Your Shop Runs on Someone Else's Platform​
If a website builder, booking system or marketplace runs your shop, the migration is theirs to do, not yours. Platforms are gradually moving to Checkout Modern: ask yours when it is moving, keep taking payments on Classic until then, and point them to For Platforms.
We Can Recreate Your Project for You​
You do not have to fill in a new project from scratch. Ask Paysera Support and we copy your Classic project into a Modern project for you. This is open to every merchant with a Classic project, whatever its size.
- What we copy: the project name, description and policies, your websites (with their verification), the main support contact, the payout account and the logo.
- What we do not copy: your credentials, callback and return URLs, payment method settings and payment history.
- The new project arrives as a draft. You check the data, adjust what has changed, and submit it for review yourself.
- Your Classic project is untouched and keeps taking payments.
- What you still do yourself is the integration: new credentials, new API calls, as described below.
Classic to Modern Equivalents​
Checkout Modern is a new API, not a new version of Classic. None of your Classic code carries over. Use this table to find the Modern counterpart of what you already know, then build against the Modern documentation.
| Checkout Classic | Checkout Modern | |
|---|---|---|
| Credentials | Project ID and project password | client_id and client_secret |
| Authorisation | sign = md5(data + password) on every request | OAuth2 access token in an Authorization: Bearer header |
| Base URL | https://www.paysera.com | https://api.paysera.com |
| Starting a payment | Redirect the buyer to /pay/ with data and sign | Create an order, then create a payment link for it and redirect the buyer to its payment_URL |
| Result notification | callbackurl receives data, signed with ss1 and ss2 | redirect_urls.callback_url receives webhooks, signed in the X-Paysera-Signature header |
| Callback reply | Your callback answers with exactly OK in the body | Any 2xx response within about 10 seconds; failed deliveries are retried |
| Return URLs | accepturl, cancelurl | success_url, cancel_url, plus failure_url for failed payments |
| Statuses | A numeric status in the callback | Order statuses such as pending_payment, paid and canceled, and payment statuses such as settled, failed and refunded. See Payment Statuses |
| Test payments | test=1 in the request | Test Mode switched on for the project |
| Library | WebToPay PHP library | Paysera PHP SDK |
| Refunds | From the Received payments page of the project in your Paysera account, or as a transfer. There is no refund API | From the Paysera Merchant Portal or via the Refunds API |
| Before going live | Verify your domain, then submit the project for verification | Add your website, then submit the Modern project for its own review |
Amounts are in minor units in both, so 1999 means 19.99 EUR in each.
Step by Step​
- Create a Modern project. In the Paysera Merchant Portal, or ask us to recreate your Classic one. Leave your Classic project running.
- Get your credentials.
client_idandclient_secretreplace the project ID and password. See Obtaining Credentials. - Get an access token. Request it from the token endpoint with
grant_type=client_credentials, and send it on every call. See Authentication. - Create an order, then a payment link. The order response has no payment URL. Create a payment link with its
order_idand redirect the buyer topayment_URLfrom that response. Order creation has no idempotency key, so a retried call creates a second order: keep theorder_idbefore you retry. See Payment Orders and Payment Links. - Handle webhooks. Verify
X-Paysera-Signaturefirst: a hex-encoded HMAC-SHA256 of the raw body, keyed with yourclient_secret. Then route onevent.type: order events carryorder.status, payment events carrypayment.status. Answer with any 2xx within about 10 seconds. See Webhooks. - Add and verify your website. Add the website you take payments on to the project and verify it. Websites copied from your Classic project keep their verification.
- Test in Test Mode. It replaces
test=1, and moves no real money. See Test Mode. - Submit your project for review. Real payments start once the project is approved for payment collection.
- Switch over. Once the project is approved, replace your Classic integration with the Modern one on your live website. Keep your Classic project open: see After You Switch.
After You Switch​
Switching moves new payments to Modern. Everything paid on Classic stays on Classic.
- Your Classic payment history stays in your Classic project. It does not appear in your Modern project, so look up Classic payments in the Classic project.
- Classic payments are refunded on Classic. Classic has no refund API. Refund from the Received payments page of your Classic project, or send the money back as a transfer. Keep your Classic project open for as long as refunds for Classic payments may come in.
- With a plugin, the orders in your shop are kept. Orders belong to your shop, not to the Paysera plugin, so swapping plugins does not remove them. Once the Classic plugin is uninstalled, though, your shop no longer hears from Classic: an order that was still pending and gets paid on Classic does not change status in your shop, and a refund of a Classic order does not show in your shop. Check those orders in your Classic project and update them in your shop by hand.
- With a custom integration, your order history is yours to keep. Your Modern integration is most likely a new build. Either carry your existing order records over in a way that does not clash with your Modern orders, or start the Modern integration on a fresh database. We do not move order data for you.
Starting a Payment, Side by Side​
Classic: one signed redirect.
WebToPay::redirectToPayment([
'projectid' => 12345,
'sign_password' => '...',
'orderid' => 'A-1001',
'amount' => 1999,
'currency' => 'EUR',
'accepturl' => 'https://shop.example/ok',
'cancelurl' => 'https://shop.example/cancel',
'callbackurl' => 'https://shop.example/callback',
]);
Modern, call 1: create the order.
POST https://api.paysera.com/merchant-order/integration/v1/orders
Authorization: Bearer <access_token>
Content-Type: application/json
{
"purchase": {
"reference": "A-1001",
"amount": 1999,
"currency": "EUR"
},
"redirect_urls": {
"success_url": "https://shop.example/ok",
"failure_url": "https://shop.example/failed",
"cancel_url": "https://shop.example/cancel",
"callback_url": "https://shop.example/callback"
}
}
Modern, call 2: create a payment link with the order_id from call 1, then redirect the buyer to payment_URL from its response.
POST https://api.paysera.com/checkout-payment-link/integration/v1/payment-links
Authorization: Bearer <access_token>
Content-Type: application/json
{
"order_id": "<order_id>",
"name": "Order A-1001",
"experience": { "language": "en" },
"purchase": { "amount": 1999 }
}
Full request and response schemas: Create Order, Payment Links and Webhooks. The API Reference and the PHP SDK are the source of truth.
Field Mapping​
| Classic | Modern |
|---|---|
projectid | Not sent. The access token identifies the project |
orderid | purchase.reference (required; up to 255 characters: letters, digits, spaces and _ / ? : ( ) . , ' + -) |
amount | purchase.amount, in minor units |
currency | purchase.currency |
accepturl | redirect_urls.success_url |
cancelurl | redirect_urls.cancel_url |
| No equivalent | redirect_urls.failure_url, new: where the buyer lands after a failed payment |
callbackurl | redirect_urls.callback_url |
test | Test Mode on the project |
sign | No equivalent. Every call carries the access token instead |
ss1, ss2 | The X-Paysera-Signature header on the webhook |
Contact Paysera Support with your Classic project ID and what you are integrating. If you build integrations for many merchants, see For Platforms.
Related Documentation​
- Your First Payment - Complete end-to-end payment tutorial
- Payment Orders - Create and manage orders
- Webhooks - Handle status change notifications
- Checkout Classic - Documentation for your current integration