Skip to main content

Skrill

Skrill Quick Checkout lets customers pay on Skrill's hosted page at pay.skrill.com. Your store never sees card numbers — customers enter their payment details directly on Skrill's site. Once payment is complete, Skrill sends a signed server-to-server callback that confirms the order automatically.

This makes Skrill a good fit for stores that want a simple, globally-recognised wallet payment option without handling PCI compliance for card data.

Prerequisites

  • A Skrill merchant account with Quick Checkout enabled
  • Your Skrill merchant email address (the email you use to log in to Skrill)
  • Your Skrill secret word (set in your Skrill merchant settings — see Step 2 below)
  • A publicly reachable HTTPS store URL so Skrill can deliver the status callback
Add-on Extension

Skrill is a separate add-on available from the J2Commerce Extensions Store. It is not included with the core J2Commerce component.

Installation

  1. Purchase and download the payment_skrill.zip package from the J2Commerce website.
  2. Go to System -> Install -> Extensions.
  3. Upload the payment_skrill.zip package file.
  4. The plugin installs and enables automatically.

To configure it, go to J2Commerce -> Payments -> Payment Methods and click Skrill.


Setup

Step 1: Enter your merchant email and secret word

  1. Open the Skrill plugin settings at J2Commerce -> Payments -> Payment Methods -> Skrill.
  2. Make sure Sandbox Mode is set to No for a live store (or Yes during testing — see Sandbox Testing below).
  3. Enter your Merchant Email — the email address registered with your Skrill merchant account.
  4. Enter your Merchant ID — the numeric ID from your Skrill dashboard.
  5. Enter your Secret Word — you will set this in Skrill in the next step.

Step 2: Set the secret word in your Skrill account

The secret word is a password you choose. You set the same value in both J2Commerce and your Skrill account. Skrill uses it to sign the status callback, and J2Commerce uses it to verify that the callback is genuine.

  1. Log in to your Skrill merchant account at https://www.skrill.com.
  2. Go to Settings -> Developer Tools (the exact menu path may vary by Skrill account type).
  3. Find the Secret Word or Merchant Settings section.
  4. Enter the same secret word you typed in J2Commerce.
  5. Save your Skrill settings.
Must match exactly

The secret word in J2Commerce and in your Skrill account must be identical, including uppercase and lowercase letters. A mismatch causes every callback to fail with a signature error, and orders will stay in their initial status after payment.

Step 3: Copy the status URL into your Skrill account

The status URL is the address Skrill calls after each payment to confirm the result. J2Commerce generates this URL automatically.

  1. In the Skrill plugin settings, look for the Status URL field. It displays a read-only URL with a Copy button.
  2. Click Copy to copy the URL.
  3. In your Skrill merchant account, go to Settings -> Developer Tools -> Merchant Settings (or the equivalent section).
  4. Paste the URL into the Status URL field.
  5. Save your Skrill settings.
Localhost will not work

Skrill's servers cannot reach localhost or 127.0.0.1. During development, use a tunnelling tool such as ngrok to expose your local site with a public HTTPS URL. Paste the ngrok URL into the Status URL Override field (see the configuration table below) rather than changing your Skrill dashboard each time.

Step 4: Set order statuses

Order statuses tell J2Commerce what to do with an order when Skrill reports each payment outcome. If you skip the Confirmed Payment Status, paid orders will pass signature verification but remain in their initial status — they will never advance automatically.

  1. Click the Order Statuses tab in the plugin settings.
  2. Set Confirmed Payment Status to the status you want when payment succeeds (for example, "Confirmed").
  3. Set Pending Payment Status for orders Skrill has not yet settled.
  4. Set Failed Payment Status for cancelled, failed, or chargeback events.
  5. Optionally set Refunded Status for when you mark an order as refunded from the admin.
  6. Click Save.
Dashboard warning

If Confirmed Payment Status is left empty, a red warning banner appears on the J2Commerce dashboard. Paid orders validate correctly but stay on their original status until you configure this setting.


How a Payment Works

Understanding the flow helps you troubleshoot if something goes wrong.

  1. The customer selects Skrill at checkout and clicks Pay Now via Skrill.
  2. The browser is redirected to pay.skrill.com with a signed form containing the order details.
  3. The customer completes payment on Skrill's hosted page.
  4. Skrill sends a server-to-server POST to your Status URL with an MD5 signature.
  5. J2Commerce verifies the signature, the receiving email, and the payment amount — then advances the order status.
  6. The customer's browser is redirected back to your store, which shows a "payment being processed" message at this point.

The order status change (and any confirmation email) happens when the status callback arrives — not when the browser returns. There is typically a delay of a few seconds between the two.


Configuration Reference

Credentials tab

FieldDescriptionRecommended value
Sandbox ModeEnable for testing with a Skrill test accountNo (live); Yes (testing)
Merchant IDYour numeric Skrill Merchant IDFrom your Skrill dashboard
Merchant EmailEmail registered with your Skrill accountYour Skrill account email
Secret WordShared secret for MD5 callback signingSet the same value in Skrill
Sandbox Merchant IDMerchant ID for your sandbox test accountOnly required when Sandbox = Yes
Sandbox Merchant EmailEmail for your sandbox test accountOnly required when Sandbox = Yes
Sandbox Secret WordSecret word for your sandbox test accountOnly required when Sandbox = Yes
Status URLRead-only. Auto-generated URL to paste into Skrill's merchant settingsCopy and paste into Skrill
Status URL OverrideOverride the auto-detected URL. Use this for ngrok/reverse-proxy setupsLeave empty on standard hosting
Debug LoggingLog Skrill activity to logs/payment_skrill.phpNo (production); Yes (troubleshooting)

Display tab

FieldDescriptionRecommended value
Display NameName shown at checkout"Skrill" or "Pay with Skrill"
Display ImagePayment logo shown at checkoutUpload via Media Manager
Show Dashboard IconShow a quick-access icon on the J2Commerce dashboardOptional
TemplateLayout template: Bootstrap 5 or UIkitMatch your site's framework
Recipient DescriptionShort text shown on the Skrill page next to your name (max 30 chars)Your store name
Return Button TextText for the "back to store" button on Skrill's confirmation page"Return to store"
Logo URLHTTPS URL of your logo shown on Skrill's payment pageYour logo URL (optional)

Messages tab

FieldDescription
Pre-Payment MessageOptional HTML message shown before the redirect button
Post-Payment MessageOptional HTML message shown after the customer returns from Skrill
Cancel MessageOptional HTML message shown when the customer cancels on Skrill

Restrictions tab

FieldDescription
Geo ZoneRestrict Skrill to customers in a specific geographic zone. Leave at 0 for all customers
Minimum SubtotalHide Skrill for orders below this amount. Enter 0 for no minimum
Maximum SubtotalHide Skrill for orders above this amount. Enter 0 for no maximum

Order Statuses tab

FieldWhen it applies
Confirmed Payment StatusSkrill sends status=2 (payment processed). Required.
Pending Payment StatusSkrill sends status=0 (payment pending)
Failed Payment StatusSkrill sends status=-1 (cancelled), -2 (failed), or -3 (chargeback)
Refunded StatusAdmin clicks Mark as Refunded in the order view

Sandbox Testing

Skrill provides a separate test environment with a dedicated test merchant account.

  1. Set Sandbox Mode to Yes in the plugin.
  2. Fill in the Sandbox Merchant ID, Sandbox Merchant Email, and Sandbox Secret Word fields — these come from your Skrill test account, not your live account.
  3. Because Skrill's status callbacks require a public URL, you need to use a tunnel:
    • Install ngrok and run ngrok http 443 (or your local port).
    • Copy the https://...ngrok.io URL ngrok gives you.
    • Add your full status URL using that ngrok host in the Status URL Override field: https://your-tunnel.ngrok.io/index.php?option=com_ajax&group=j2commerce&plugin=payment_skrill&format=raw&task=status
  4. Place a test order and complete payment on Skrill's sandbox. The callback should arrive within a few seconds and advance the order status.
  5. When finished, set Sandbox Mode back to No and clear the Status URL Override field.

Limitations

Skrill Quick Checkout has some important limitations to be aware of before choosing it as your payment gateway.

No programmatic refunds. Skrill does not provide a refund API for Quick Checkout. To refund a customer, you must log in to your Skrill merchant dashboard and issue the refund there. In J2Commerce, the Mark as Refunded button in the order admin only updates the order status — it does not contact Skrill. The confirmation dialog explains this before you click.

No saved cards. Skrill Quick Checkout is a hosted redirect. There is no tokenization or saved-payment-method feature. Returning customers must re-enter their details (or log in to Skrill) each time.

No automatic subscription renewals. Because Skrill does not support merchant-initiated charges, J2Commerce subscriptions cannot be renewed automatically via Skrill. Use a gateway with tokenization support (such as Stripe or Braintree) if you sell subscription products.

Multi-currency is supported. Skrill accepts over 40 currencies. J2Commerce sends the order's display-currency amount and currency code, so customers are charged in your store's selected currency rather than a base currency conversion.


What's New vs the J2Store Version

If you previously used the Skrill plugin with J2Store, here is what changed in J2Commerce 6.

AreaJ2StoreJ2Commerce 6
ArchitectureFOF 2 frameworkNative Joomla 6 MVC, fully namespaced
Callback securityMD5 check onlyMD5 signature + receiver email check + amount tolerance check
Multi-currencyBase currency onlyFull CurrencyHelper::gatewayAmount() — correct amount in display currency
Order eventsDirect database writesOrderModel::updateOrderStatus() — triggers emails and action-log entries
Dashboard healthNoneRed banners for missing credentials and missing confirmed status
Debug loggingNoneOptional Joomla log (logs/payment_skrill.php)
SandboxShared credentialsSeparate sandbox credentials tab
Refund UXSilent status changeConfirmation dialog with explicit note to refund in Skrill dashboard

Troubleshooting

Order stays in "New" or initial status after payment

Cause 1 — Confirmed Payment Status not set. Go to the Order Statuses tab and choose a status for Confirmed Payment Status. A dashboard warning will be visible if this is missing.

Cause 2 — Status URL unreachable. Skrill could not deliver the callback. Check that the Status URL is correctly pasted in your Skrill account settings. Test it by enabling Debug Logging and checking logs/payment_skrill.php for incoming requests. If running on localhost, use ngrok and the Status URL Override field.

Cause 3 — Wrong secret word. The secret word in J2Commerce and in your Skrill account must match exactly. A signature mismatch appears in the log as "Status callback check 1 FAIL: signature mismatch". Re-copy the secret word from J2Commerce and paste it into Skrill (or the other way around).

"Skrill Merchant Email or Secret Word is not configured" warning on dashboard

Open the Skrill plugin settings and fill in the Merchant Email and Secret Word fields under the Skrill Credentials tab. Both must be non-empty.

Signature mismatch in the log

The most common causes are:

  • The secret word does not match between J2Commerce and Skrill.
  • The Merchant ID field is empty or incorrect — the signature calculation requires it.
  • The status URL is receiving requests from a source other than Skrill (a scanner or test tool).

Enable Debug Logging, place a test order, and check logs/payment_skrill.php for the exact fields received in the callback.

Status callback arrives but amount check fails

This is logged as "Status callback check 3 FAIL: amount mismatch". The amount Skrill reports (mb_amount) differs from the order's gateway amount by more than 0.01. Check that:

  • No currency conversion error affected the order.
  • The currency code in J2Commerce matches a currency accepted by your Skrill account.

Customer redirected back but order not confirmed yet

This is expected behaviour. The browser return happens immediately after the customer pays on Skrill. The status callback — which confirms the order — arrives a few seconds later as a separate server-to-server request. The store shows a "payment being processed" message on the return page. If the order does not advance within a minute, see the steps above.

Sandbox mode left on in production

A yellow warning banner on the J2Commerce dashboard reads "Skrill is in SANDBOX mode. No real transactions will be processed." Go to J2Commerce -> Payments -> Payment Methods -> Skrill, set Sandbox Mode to No, and save.