Contents

Stripe - Plugixa Car Rental

Stripe PRO is a payment method that sends the customer to Stripe Checkout, the payment page hosted by Stripe, and brings them back to their booking once they have paid. Card details are typed on Stripe’s page and never reach your site. Customers see it as Card (Stripe): “Pay now by card on Stripe’s secure page. Your booking is confirmed as soon as the payment goes through.”

Set it up under Plugixa Car Rental -> Settings -> Stripe. Everything on Payments about the payments ledger, refunds and payment statuses applies to Stripe payments too.

Stripe is an app, on by default in Pro. If the Stripe section is missing from Settings, switch it on in the App manager.

The Stripe settings: the card payments switch and secret key, then the webhook card with the endpoint address, the events to send and the signing secret

Setting it up

1. Save your secret key

The first card is Card payments by Stripe: “The customer pays by card on Stripe’s own checkout page and is brought back to their booking, which is confirmed as soon as the payment goes through.”

Field Notes
Offer card payment by Stripe The switch that offers Stripe to customers. Off by default. Saved with the page’s Save button.
Secret key “Starts with sk_. A test key (sk_test_) takes no real money.” Saved with the card’s own Save keys button.

Copy the secret key from the developers section of your Stripe dashboard. No publishable key is needed: the payment page is Stripe’s own.

Stripe is offered to customers only when the switch is on and a secret key is saved. With the switch on and no key, the screen warns: “Stripe is switched on but has no secret key, so customers are not offered it yet.”

2. Add the webhook

The second card is Webhook. It explains: “Lets Stripe confirm a payment even when the customer closes the page before coming back, and tells the site about delayed payments, refunds made in the Stripe dashboard and disputes.”

  1. Copy the Endpoint address shown on the card with the copy button beside it. It is built from your site’s own address and ends in /payment/webhook/stripe. Always copy it from this screen rather than typing it, so it is right for your site and permalink settings.

  2. In the Stripe dashboard, add a webhook endpoint with that address.

  3. Select the events listed under Events to send on the card. The field holds the whole list, comma separated, ready to copy:

    Event What the plugin does
    checkout.session.completed Records the card payment. A delayed method such as a bank debit completes unpaid, and is only announced as processing
    checkout.session.async_payment_succeeded Records a delayed payment once the money arrives
    checkout.session.async_payment_failed Records a Failed row; the booking stays unpaid
    checkout.session.expired Nothing recorded; announced
    refund.created, refund.updated Records a refund made in the Stripe dashboard once it has succeeded
    refund.failed Nothing recorded; announced
    charge.dispute.created, charge.dispute.closed Nothing recorded; announced

    “Announced” means the action plugixa_car_rental_payment_notice fires with payment_processing, checkout_expired, refund_failed, dispute_opened or dispute_closed, so a snippet can alert you. See Hooks.

  4. Copy the endpoint’s signing secret from Stripe and paste it into Signing secret (“Starts with whsec_.”), then press Save keys.

3. Save and test

Press Save for the switch. Use your Stripe test key first, make a booking through the booking form and pay with one of Stripe’s test cards. Then replace the test key and the test endpoint’s signing secret with the live ones.

There is no separate test mode switch. The mode follows the key: an sk_test_ key works against Stripe’s test data, an sk_live_ key takes real money. Test and live endpoints have different signing secrets.

How the keys are kept

The secret key and the signing secret are encrypted before they are stored and are never sent back to the browser. Once one is saved, its field is empty with a “Stored” placeholder showing a hint of the key, and a Remove button beside it. Type into the field and press Save keys to replace a key.

If the server cannot encrypt (OpenSSL is missing), the screen says so and no key can be stored. Ask your host to enable OpenSSL.

What the customer sees

  1. On the details step of the booking form the customer chooses Card (Stripe) among the payment methods you offer. If Pay part now PRO is on, they also choose how much to pay now.
  2. The booking is saved first, as Pending, and the car is held for 35 minutes. Then the customer is sent to Stripe Checkout.
  3. The Checkout page shows one line, “Car rental” followed by the booking reference, for the amount due now. The customer’s email address is filled in and the page follows the customer’s language.
  4. After paying, the customer comes back to your site and sees “Thank you. Your payment for booking ADR-2026-0001 was received; the confirmation is on its way by email.”

The Checkout session closes after about 30 minutes, a little before the car’s hold runs out, so a customer cannot pay for a car that has been released.

If the payment cannot be started, the booking form shows “The card payment could not be started. Please try again, or choose another way to pay.”

If the customer leaves Stripe’s page with its back link, they return to see “You left the payment page, so nothing was charged and booking ADR-2026-0001 is not confirmed.” The booking stays pending and unpaid until its hold runs out.

How a payment is confirmed

A payment is recorded in two independent ways, and either is enough:

Route What happens
The customer’s return Stripe sends the browser back with the Checkout session’s id. The plugin asks Stripe, with your secret key, whether that session is paid, and records the payment only if Stripe says so.
The webhook Stripe posts checkout.session.completed to your endpoint. The plugin checks the signature with your signing secret, then records the payment.

Both normally arrive. The payment is still recorded once: it is identified by Stripe’s payment intent id (pi_...), and a payment already in the ledger is not written again.

The amount recorded is the amount Stripe reports it collected, never a figure from the browser. Once the payment is recorded, a pending booking is Confirmed and its payment status becomes Paid or Partially paid.

If the customer took so long that the car was booked by somebody else in the meantime, the money is still recorded, because it was taken, and the booking is left for you to refund or rebook. The action plugixa_car_rental_payment_unplaced fires so a snippet can alert you.

Without a signing secret

The signing secret is optional, but leave it empty and every webhook is ignored: nothing can be verified, so nothing is believed. Payments are then recorded only when the customer comes back to your site, and a customer who pays and closes the tab leaves a booking that is paid at Stripe and unpaid on your site. Set the signing secret.

A webhook with a wrong signature, one signed more than five minutes ago (a replay), or for an event not in the list, is ignored and still answered with success so Stripe does not keep retrying. An event that was accepted but could not be written at that moment is answered with an error, and Stripe sends it again.

Webhooks keep being accepted while the secret key is saved, even with the switch off, so a payment begun before you switched Stripe off still lands.

Refunds

A refund of a Stripe payment made from the booking’s payments panel is sent to Stripe first and recorded with Stripe’s refund id (re_...). If Stripe refuses it, nothing is recorded and Stripe’s message is shown, or “Stripe did not make the refund.” Stripe then reports the same refund to the webhook, and it is recognised and not recorded twice.

A refund made in the Stripe dashboard arrives by webhook and is recorded against the booking whose payment it refunds, once it has succeeded.

Amounts and currencies

  • The currency is the booking’s own: your store currency, or the currency the customer chose if Currencies PRO is set to charge in it. It must be a currency your Stripe account accepts.
  • Amounts are sent in the currency’s smallest unit: multiplied by 100, except for these zero-decimal currencies, which are sent as whole numbers: BIF, CLP, DJF, GNF, JPY, KMF, KRW, MGA, PYG, RWF, UGX, VND, VUV, XAF, XOF, XPF.

What is sent to Stripe

The plugin talks to Stripe’s API from your server only when a customer starts a card payment or comes back from one, when a dispute arrives, or when you refund a Stripe payment. There is no Stripe script on your pages.

When a payment starts
Amount and currency The amount due now
Booking reference As the line’s name, the client reference and metadata
Booking id and payment type As metadata
Customer email When the booking has one
Return and cancel addresses On your site

A refund sends the payment intent id, the amount, and the booking and payment ids as metadata. No name, phone number, address, licence or card data is sent by the plugin. See Privacy and uninstall.

Developers can adjust the Checkout session with the plugixa_car_rental_stripe_checkout_params filter, for example to add a statement descriptor. The amount, metadata and addresses cannot be changed that way.

Quick Links