BazPay for PrestaShop 8
Installed from the back office in about an hour, then worked from the order screen like any other PrestaShop payment — credit slips included. No shell access needed at any point.
- TypeModule
- Runs onPrestaShop 8.0+ · 1.7.8 on the legacy branch
- First installAbout an hour
- Reviewed
Install from the back office
No FTP, no shell, no composer. If you can install a theme you can install this, and every step below happens in screens you already use.
-
Upload the module
Modules → Module Manager → Upload a module, then drop in the zip. PrestaShop unpacks and installs it in one action, and the module appears in the payment group immediately.
-
Open the configuration
Find BazPay in the module list and press Configure. If you run multistore, set the shop context in the header first — configuring at group level writes the same keys to every shop, which is rarely what anyone intends.
-
Paste the sandbox keys
Both keys are visible in your BazPay dashboard the moment the account exists. Leave the environment on test until you have placed an order end to end.
-
Check the webhook registered
Saving a valid secret key writes the endpoint into your BazPay account automatically. It is
/module/bazpay/webhookon your own domain, and it needs friendly URLs enabled to be routable. -
Place a test order
Use a card from the testing guide and watch the order reach Payment accepted without you touching it. That is the whole integration proven.
Configure the module
The configuration screen is deliberately short. Four decisions matter; the rest have sensible defaults you can leave alone.
- Environment Test or live. The two are separate ledgers with separate keys, and a test key cannot reach live funds even by mistake.
- Methods Which of the enabled methods appear at checkout, and in what order. Lead with the method your market expects rather than with cards out of habit.
- Descriptor What the shopper sees on their statement. Use the trading name of the shop, not the holding company — unrecognised descriptors are a real source of disputes.
- Capture Immediate, or on shipment. On shipment authorises at checkout and takes the money when you validate the order, which suits made-to-order catalogues.
PrestaShop can round per item, per line or per total, and the choice changes the cart total by a cent or two. We charge exactly the total PrestaShop computed, so the setting itself is never a problem — but if you change it while orders are in flight, an authorisation taken under the old mode will not match a capture computed under the new one.
Working the order screen
This is the section worth reading twice. PrestaShop offers three actions that all produce a credit slip, and only two of them send anything to a payment gateway.
| Action | Reaches the gateway? | Use it when |
|---|---|---|
| Standard refund | Yes, full amount | The whole order is being returned and the money goes back the way it came. |
| Partial refund | Yes, the amount entered | One line is being returned, or you are compensating for a delivery problem. |
| Return products | No | Goods came back but you are refunding by voucher, or by another route entirely. |
| Cancel order | Voids, if not yet captured | The order is dead before shipment. After capture this becomes a refund. |
Partial refunds can be repeated until the captured total is exhausted. Each one produces its own credit slip and its own line in the settlement file, so the accounting stays traceable without a spreadsheet in the middle.
Order states it creates
The module adds one state of its own and otherwise uses PrestaShop's native ones. Adding a parallel set of statuses would break every report and every export you already have.
| State | Origin | Meaning |
|---|---|---|
| Awaiting BazPay payment | Added by the module | The shopper is at the bank or authenticating. No money has moved. |
| Payment accepted | Native | Set from the signed webhook, not from the shopper returning to the shop. |
| Payment error | Native | Declined or abandoned. The issuer reason code is written to the order note. |
| Refunded | Native | Set when the refund total reaches the captured total, not before. |
# Advanced Parameters → Logs, filtered to BazPay# a healthy payment, start to finish09:41:02 bazpay cart 10482 → payment created req_8Kd1Wm4pQz method=bancontact amount=42.00 EUR09:41:19 bazpay shopper returned from bank09:41:20 bazpay webhook payment.succeeded verified order 10482 → state 'Payment accepted'# if the third line is missing, the webhook is not arriving# and the order will sit in 'Awaiting BazPay payment' Advanced Parameters → Logs. Turn on debug mode in the module configuration first, and remember to turn it off again on a busy shop.
Multistore
Everything the module stores is shop-scoped: keys, enabled methods, descriptor and capture policy. Three storefronts under one PrestaShop installation can belong to three different entities and settle to three different accounts.
- Set the shop context before configuring, or values are written group-wide.
- Each shop registers its own webhook endpoint under its own domain.
- A shop with no keys simply does not offer BazPay; it does not error.
- Group-level configuration remains useful for the debug flag, which you want everywhere.
Theme and performance conflicts
Two settings account for most of the support we see on PrestaShop, and both live outside the module. Neither is a bug in PrestaShop or in the module — they are optimisations that assume all JavaScript is yours to rewrite.
Combine, Compress and Cache
Advanced Parameters → Performance. Combining JavaScript merges our loader into a bundle and it stops being able to mount the hosted fields, which shows up as a card form that renders empty. Turn JS combination off, or exclude our script from it. Compressing and caching are both fine.
Checkout overrides
Modules in override/controllers/front/ that rebuild the payment step sometimes
construct the method list themselves instead of calling the hook. When that happens no
third-party gateway appears, ours included. The fix is one call to the standard hook, and the
author of the checkout module will recognise the request.
Friendly URLs
Shop Parameters → Traffic & SEO. The webhook is a front-controller route, so friendly URLs must be on for it to resolve. With them off, we receive a 404 and the order sits in Awaiting BazPay payment indefinitely — which is exactly the symptom the webhooks guide describes debugging.
Common questions
- Will the module work with my one-page checkout module?
- Usually, and where it does not the cause is almost always an override of the payment step rather than anything on our side. The module registers through the standard paymentOptions hook, so any checkout that calls that hook will display it. Checkouts that build their own payment list by hand need one line added to that list.
- Does it support PrestaShop 1.7?
- Version 1.7.8 is served by the 3.x branch, which we still patch for security and scheme mandates but no longer extend with new methods. Anything from 8.0 upward should be on 4.x. If you are on 1.7.6 or older, the upgrade is worth doing for reasons that have nothing to do with payments.
- Why does a refund from the order screen sometimes not reach the gateway?
- Because PrestaShop has three buttons that look similar and only one of them moves money. Standard refund and partial refund both call the gateway. Return products only records that goods came back — it creates a credit slip but sends nothing to us, which is correct when you are refunding by another route.
- Can each shop in a multistore group use a different bank account?
- Yes. Keys are stored per shop, so each storefront can belong to a different legal entity, settle to a different IBAN and show its own descriptor on the shopper's statement. Set the shop context before you configure, or you will write the values to the whole group.
- The card form is blank on the live site but fine on staging. Why?
- Almost always because Combine, Compress and Cache is on in production and off in staging. Combining JavaScript rewrites our script into a bundle and breaks the hosted-fields loader. Turn off JS combination — or exclude our script from it — and the form returns.
Somewhere else to be
Cart plugins
- WooCommerce Plugin Block checkout and the classic shortcode, HPOS-ready, refunds from the order screen and a REST webhook route.
- Magento Extension Composer install, per-store-view method mixes, invoices mapped to captures and credit memos mapped to refunds.
- Shopware Plugin Rule Builder decides which methods appear, the state machine records what happened, Flow Builder reacts to it.
- OpenCart Extension A deliberately small build for small catalogues. Hosted fields, status mapping, and a short list of things it does not do.
Continue
Not sure this is the right route?
Send the platform, the version and the markets you sell into. An engineer answers with the plugin, the API path or an honest "not yet" — not a discovery call.