Pay50 for WooCommerce

Description

Pay50 for WooCommerce lets your store accept credit and debit card payments through the Pay50 payment gateway. Card details are entered directly on your checkout page (server-to-server integration) — there is no hosted payment page — and are transmitted securely to the Pay50 API for authorization. When a 3-D Secure challenge is required, it can be shown as a full-page redirect (default) or, once your domain is whitelisted with Pay50 support, inside an iframe that keeps the customer on your site.

Features

  • Frictionless (2DS) card payments captured instantly.
  • 3-D Secure (3DS) challenge flow with automatic bank-OTP redirect and return handling.
  • SHA-512 request/response signing for every API call.
  • Client- and server-side card validation (Luhn checksum, expiry, CVV) and live card-brand detection.
  • Card-on-file: optionally save the card at checkout and receive a token for merchant-initiated charges.
  • Post-purchase upsell funnels: rule-based offers on the order-received page, charged to the saved card token.
  • Status enquiry and automatic pending-order reconciliation via WP-Cron (or an external system cron).
  • High-Performance Order Storage (HPOS) compatible.
  • Sensitive data (card number, CVV, expiry) is never written to logs.

Requires WooCommerce. This plugin adds a payment method to WooCommerce and does not function on its own.

External services

This plugin connects to the Pay50 payment gateway API to authorize and settle card payments. This connection is required for the plugin to work as a payment method — without it, no payment can be processed.

What is sent, and when: when a customer places an order using Pay50 (and during any related status check, 3DS capture, or saved-card upsell charge), the plugin sends the following to the Pay50 gateway endpoint you configure in the settings, over HTTPS:

  • Card data entered at checkout — card number, expiry date and CVV — used solely to authorize that payment.
  • Billing details, and shipping details when provided — name, address, email and phone number.
  • Order reference, amount and currency.
  • Browser fingerprint values (user agent, language, screen size, timezone, accept header) required for 3-D Secure risk checks.
  • When “Save Card for Upsells” is enabled: a request to store the card on file so post-purchase upsells can be charged to the returned token (no card number/CVV is re-sent for those charges).

What is received: the plugin receives payment results via the return URL (after a 3DS challenge) and via asynchronous webhook callbacks, and it can query transaction status on demand.

Data is transmitted only to the Pay50 gateway base URL configured in the plugin settings (your Pay50 live or sandbox endpoint). The plugin does not send data to the plugin developer and does not “phone home.”

Because raw card data is transmitted from your server, your store falls under PCI-DSS SAQ D scope. Ensure your hosting and site meet the relevant PCI-DSS requirements before going live.

  • Service provider: Pay50
  • Terms of Service: https://pay50.com/terms
  • Privacy Policy: https://pay50.com/privacy

Legal disclosure — Pay50 Remit Ltd. (last updated May 14, 2026)

  • FINTRAC MSB Registration Number: N300000269
  • Incorporation: BC1578975 (British Columbia)
  • Business Number: 736578238BC0001
  • Registered Office: 555 Burrard St, Vancouver, BC, V7X 1M8, Canada

Pay50 is a registered Money Services Business (MSB) in Canada under the Proceeds of Crime (Money Laundering) and Terrorist Financing Act (PCMLTFA). FINTRAC registration does not constitute an endorsement, license, or approval of its services. Services provided include foreign exchange, money transferring, issuing/redeeming money orders, virtual currency dealing, and payment service provider (PSP) activities.

All suspicious transactions are reported to FINTRAC. Large cash and virtual currency transactions (CAD $10,000 or more) are reported as required by law. Pay50 is PCI DSS compliant, and customer funds and records are handled in accordance with Canadian AML/ATF regulations.

Installation

  1. Upload the pay50-for-woocommerce folder to /wp-content/plugins/, or install the plugin ZIP through Plugins Add New Upload Plugin.
  2. Activate the plugin through the Plugins menu. WooCommerce must be installed and active.
  3. Go to WooCommerce Settings Payments Pay50 and enable the gateway.
  4. Enter your Pay50 APP ID, Secret Key, and Base URLs (live and sandbox), and set your currency code.
  5. In your Pay50 merchant portal, register the Return URL and Webhook URL shown in the plugin’s settings notice.
  6. With Test Mode enabled, run a test transaction to confirm the integration before going live.

FAQ

Does this plugin require WooCommerce?

Yes. It registers a WooCommerce payment method and does nothing without WooCommerce active.

Where are card details processed?

Card details are collected on your checkout page and sent server-to-server to the Pay50 gateway for authorization. No hosted payment page is used, which places your store in PCI-DSS SAQ D scope.

Does it support 3-D Secure?

Yes. Both frictionless (2DS) and challenge (3DS) flows are supported, including the bank-OTP redirect and return handling.

What happens if a customer closes the browser during 3DS?

A scheduled reconciliation task (WP-Cron every 15 minutes, or an external system cron) queries the gateway and updates the order to its final status.

Can it issue refunds from WooCommerce?

Not in this version — the Pay50 gateway API used here does not expose a refund endpoint. Refunds must be handled in the Pay50 merchant portal.

Where can I get support?

Email plugin@pay50.com for help with installation, configuration, or bugs.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Pay50 for WooCommerce” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.2.9

  • Security: the Live/Test Base URL settings are now restricted to https:// URLs on the pay50.com domain. These settings are also used to build the checkoutlibrary script/style URLs on the 3DS iframe page, so an unrestricted value could have been used to load a remote script/style from any host.

1.2.8

  • New: post-purchase upsell 3DS challenges are now also reconciled via webhook, not just the return URL — a webhook notification for a pending upsell previously had no dedicated handling.

1.2.7

  • Fix: retrying a payment on the same order with a different card (e.g. via the order-pay “Pay” link after a failed order) reused the same gateway ORDER_ID, so a slow/abandoned first attempt’s callback could be mistaken for the current attempt’s result — occasionally showing “successful” for a payment that actually failed. Each retry now gets a uniquified ORDER_ID, and callbacks are checked against the order’s current attempt before being trusted.

1.2.6

  • Fix: the 3DS iframe capture page registered the gateway’s own script/style assets without a version, which could let browsers keep serving a stale cached copy. Both now carry an explicit version.

1.2.5

  • Changed: the upsell 3DS challenge no longer runs in an embedded popup iframe — accepting an upsell that needs authentication now closes the popup and uses the same full-page redirect/iframe pages (and the same “3DS Capture Display” setting) as the main checkout. Fixes the return landing somewhere other than the thank-you page.

1.2.4

  • New: automatic Status Enquiry safety net for both the main checkout and the upsell funnel. A short cascade of background checks now runs after every return/webhook (success or failure) and after every upsell 3DS challenge starts, so orders reconcile even without the customer clicking anything. Already-paid orders only get a confirmation check (a mismatch is flagged for review, never auto-reversed).

1.2.3

  • New: “Already paid? Check again” button in the upsell 3DS challenge popup — if the challenge iframe loses its connection (e.g. switching to mobile view mid-payment can drop it) before reporting back, this manually re-queries Pay50 for the real status and finalizes or rolls back the pending upsell accordingly.

1.2.2

  • Removed: the upsell popup’s “Custom code” (Custom HTML/CSS/JS) fields have been removed — WordPress.org no longer permits plugins to let users save and echo back arbitrary custom code. The existing structured appearance controls (colors, background, buttons, layout) are unaffected.
  • Fix: several inline <style>/<script> blocks (admin funnel metrics page, order “Re-check Status” button, 3DS redirect pages, upsell 3DS result page) are now registered/enqueued through the standard WordPress script/style APIs instead of being echoed directly as HTML.
  • Fix: a test-mode-only diagnostic log in the gateway return handler could log a gateway-return field before it was sanitized. It’s now sanitized first, matching the rest of the handler.
  • Fix: the “Test Mode active” / “Live Mode active” gateway admin notice no longer appears on every wp-admin screen — it’s now limited to the WooCommerce settings, order, and Plugins screens where it’s actionable.
  • Fix: removed leftover placeholder text in the Terms of Service / Privacy Policy lines of the External Services disclosure.

1.2.1

  • Fix: upsell 3DS challenge return verification incorrectly compared two TXN_IDs that Pay50 never intends to match (enrollment-stage vs. capture-stage), causing “Payment verification failed” even when the card was genuinely charged. Verification now matches the main checkout flow (HASH + ORDER_ID only).
  • Fix: the 3DS challenge iframe on the upsell popup now replaces the popup’s normal content instead of appending below it, so the popup no longer grows/overflows while the challenge is active.

1.2.0

  • Fix: post-purchase upsell (card-on-file) charges that come back “Enrolled” (3DS challenge required) now complete the challenge through the same Payment Capture endpoint used by regular checkout, instead of failing outright. The challenge runs inline, in an iframe, inside the thank-you-page upsell popup.

1.1.0

  • New: optional iframe-based 3DS capture display (in addition to the default full-page redirect) — requires emailing your domain to Pay50 support for whitelisting first.
  • New: send additional conditional-mandatory fields recommended by the updated Pay50 spec — BROWSER_ACCEPT_LANGUAGE, OS_TYPE, OS_VERSION, DEVICE_MODEL, and SOURCE_URL — on both checkout and card-on-file upsell charges, to improve authorization success rates.

1.0.0

  • Initial public release.
  • Frictionless (2DS) and 3-D Secure (3DS) card payments via the Pay50 gateway.
  • SHA-512 signing of every API request and verification of every response/webhook.
  • Client- and server-side card validation (Luhn, expiry, CVV) and live card-brand detection.
  • Card-on-file: optional save-card at checkout with token-based merchant-initiated charges.
  • Post-purchase upsell funnels (rule builder + thank-you modal) charged to the saved token.
  • Status enquiry and automatic pending-order reconciliation (WP-Cron or external cron).
  • Optional consent, date-of-birth, and card issue-date fields. HPOS compatible.