Accept payments
WooCommerce plugin
VezmoPay for WooCommerce adds cards, US bank payments (ACH), Apple Pay and Google Pay to any WooCommerce store. No code is needed, and card data never reaches your server.
| Download | vezmopay-woocommerce.zip (latest release) · all releases and changelog |
| Requires | WordPress 6.0+, WooCommerce 8.0+, PHP 7.4+ |
| Checkout | Classic (shortcode) checkout and Cart & Checkout Blocks |
| Order storage | HPOS (High-Performance Order Storage) compatible |
| PCI scope | SAQ‑A: card fields are always hosted by VezmoPay |
| Updates | Delivered in wp-admin like any other plugin. Each package is checked against the checksum published with its release. |
| License | GPL-2.0-or-later |
Choose an integration mode
You pick the mode under Integration mode in the plugin settings, and you can switch at any time. In every mode the payment form is rendered by VezmoPay, so card numbers never touch your page.
| Mode | Where the customer pays | Built on |
|---|---|---|
| Inline payment element (default) | On your checkout, inside a VezmoPay form | Secure Payments + vezmo.js |
| Secure iframe | On your pay page, inside a VezmoPay iframe | Secure Payments |
| Hosted checkout | Redirected to a VezmoPay payment-link page | Paylinks |
Inline mode falls back to the iframe on its own if the SDK can't load. If a payment link can't take payments yet, for example because the account isn't activated to receive money, hosted mode keeps the customer on your checkout and shows an error.
Install and connect
Install the plugin
Download the zip, then in wp-admin go to Plugins → Add New → Upload Plugin, choose the file, and activate it.
Connect your VezmoPay account
Open WooCommerce → Settings → Payments → VezmoPay, set Environment to Test, and click Connect with VezmoPay. Sign in and approve. The plugin then creates and saves the API key, registers the webhook and your trusted origin, and stores the webhook secret, so you never copy a credential by hand. (The webhook is registered automatically only on an
https://store; on plainhttp, add it as described under manual setup.)Place a test order
In Test mode the standard test cards work inside the VezmoPay form:
4242 4242 4242 4242succeeds,4000 0000 0000 3220asks for 3D Secure, and4000 0000 0000 0002is declined.Go live
Switch Environment to Live and connect again, or paste a live key. Then click Test connection. Live payments need an approved, charges-enabled VezmoPay account.
Manual setup (without Connect)
If you'd rather paste credentials yourself, open VezmoPay → Developers and do the following:
- API keys: create a key with the permissions
secure-payment.create,paylink.create,paylink.read,payment.read,account.readandaccount.update. Paste the key and secret into the plugin, then click Test connection. The secret is shown only once, and creating a new key deactivates your previous one. - Webhooks: add the endpoint
https://your-store.example/wp-json/vezmopay/v1/webhookforpayment.successandpayment.failed, then paste itswhsec_…secret into Webhook secret. See Webhooks. - Trusted origins (inline element mode): add your store's origin, e.g.
https://your-store.example. Without it, customers are sent to the VezmoPay secure page to pay instead of seeing the form on your checkout.
To keep secrets out of the database, define them in wp-config.php. Constants override anything saved in the settings.
define( 'VEZMOPAY_TEST_API_KEY', 'vzm_xxxxxxxxxxxxxxxx' );
define( 'VEZMOPAY_TEST_API_SECRET', '…' );
define( 'VEZMOPAY_LIVE_API_KEY', 'vzm_xxxxxxxxxxxxxxxx' );
define( 'VEZMOPAY_LIVE_API_SECRET', '…' );How orders are completed
The plugin never takes the browser's or a webhook's word for a payment. Before it changes an order, it fetches the payment from the VezmoPay API.
| VezmoPay payment | WooCommerce order |
|---|---|
CAPTURED | Processing / Completed, with the transaction ID stored |
| ACH submitted, still settling | On hold until the ACH debit settles (see Bank payments) |
FAILED | Failed, with the reason in an order note |
REFUNDED | Refunded |
| Amount differs from the order total | On hold. It is never completed automatically. |
A missed confirmation can't strand an order. Signed webhooks, a reconciliation job that runs every five minutes, and a manual Order actions → Check VezmoPay payment status all settle orders independently. Payment creation uses an idempotency key, so refreshes and double clicks never charge twice.
Good to know
Found a problem? Open an issue on GitHub and attach the redacted vezmopay log if you can.