Crypto payments for OpenCart 3 and 4

The NoHoldPay extension gives OpenCart the same non-custodial flow as every other non-custodial integration: the buyer is redirected to a hosted checkout, pays a wallet you control, and a signed webhook moves the order forward. Two builds ship, one per OpenCart generation, and they install differently. Pick the right one first. The fee is 0.5% per confirmed payment.

Pick your build

OpenCart 3.0.x

Install noholdpay-opencart-3.ocmod.zip. OpenCart 3 has no native way for one extension to register several payment methods, so the build ships a modification that does it. After uploading through Extensions, then Installer, you must open Extensions, then Modifications, and click Refresh. Skip that and your coin groups will not appear at checkout. Re-run Refresh after any theme change or OpenCart upgrade.

OpenCart 4.0.x

Install noholdpay-opencart-4.ocmod.zip. On 4.x the extension registers each coin group as a native payment option, so there is no Modifications step and nothing patches core files. Upload, install, edit, done.

Install one build only, matched to your version. Both builds are available as release archives from the plugin repository.

Configuration, in order

  1. Under Extensions, choose Payments, install NoHoldPay, and open Edit.
  2. Paste your API key. The pk_test_ prefix runs testnets, pk_live_ runs mainnet, and nothing else changes between the two. Use the Test connection button before saving.
  3. Copy the Webhook URL from the settings screen, register it on your API key in the NoHoldPay dashboard, and paste the generated signing secret back. Your store must be reachable over public HTTPS for deliveries to arrive.
  4. Map each NoHoldPay state to an OpenCart order status. Treat the Confirmed mapping as your safe-to-fulfil signal and leave everything earlier as not-yet-paid.
  5. Set Status to Enabled, save, and place a test order.

Coin groups on OpenCart

Groups work the same way as in the WooCommerce plugin: name a set of coins, give it an optional logo and a default coin, and it shows up as its own payment method at checkout. The restrict toggle decides whether buyers can leave the group's coins on the hosted checkout or are held to them. On 3.x, remember the Modifications Refresh after changing groups, because that is what materializes them as separate payment methods.

How the order is protected

The payment amount is computed server-side from the order, webhooks are HMAC-signed and verified against your signing secret, and a confirmed status is double-checked against the API before the order advances. A spoofed or replayed callback fails the signature check. A signed but mismatched one fails the re-verification. The order only moves when both agree.

Common questions

My coin groups do not show at checkout on OpenCart 3. Why?
Almost always the Modifications Refresh step. OpenCart 3 needs Extensions, then Modifications, then Refresh after the extension is installed and after any theme change or upgrade. Without it the modification that registers each group as a payment method is not applied.
Can I run the extension on a localhost or staging store?
You can install and explore it, but webhooks need a publicly reachable HTTPS URL to arrive, so payment statuses will not update on a purely local store. Use a testnet key on a public staging domain for a realistic dry run.
Do OpenCart 3 and 4 behave differently for buyers?
No. Both redirect to the same hosted checkout and advance orders on the same signed webhooks. The differences are administrative: the 3.x build needs the Modifications Refresh and patches via ocmod, while the 4.x build registers payment options natively.
What does switching from test to live involve?
Swap the pk_test_ key for a pk_live_ key and re-register the webhook on the live key. The mode is fixed by the key prefix, so there is no separate sandbox toggle to forget. Your status mappings and coin groups carry over unchanged.