> ## Documentation Index
> Fetch the complete documentation index at: https://docs.centipidbilling.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Paynow

> Set up Paynow so Zimbabwean subscribers pay with EcoCash or OneMoney from the captive portal or subscriber portal, with each result confirmed by a status poll.

# Collect payments with Paynow

`PAYNOW` collects **EcoCash** and **OneMoney** by Paynow's Mobile Express
Checkout. The payer enters their number on the portal, a PIN prompt appears on
their phone, and they approve it there. They never leave the portal page.

Offered in the country catalog for **Zimbabwe (ZW)**.

Centipid Billing follows Paynow's
[Express Checkout API](https://developers.paynow.co.zw/docs/paynow/express_checkout_transactions/)
the way the [official PHP SDK](https://github.com/paynow/Paynow-PHP-SDK) calls it:

1. `POST /interface/remotetransaction` sends the PIN prompt to the payer's number.
2. Paynow posts the result to Centipid's result URL when the payer answers.
3. Centipid reads the transaction's poll URL to confirm it.

Nothing is credited until Paynow reports the transaction `Paid`
(`Awaiting Delivery` and `Delivered` also count as paid).

## Before you start

Register a Paynow merchant account at [paynow.co.zw](https://www.paynow.co.zw)
for the ISP, and have it approved for Mobile Express Checkout.

**Currency.** Paynow has no currency field: each integration is set up in one
currency, and amounts are read in it. Create the integration in the currency
your Centipid account bills in, USD or ZWG. An account billing in ZAR cannot use
Paynow; checkout refuses it rather than charge the wrong amount.

## Configure the gateway

<Steps>
  <Step title="Create an integration in Paynow">
    Open **Receive Payments → 3rd Party Integrations** and create an
    integration in your billing currency. Paynow emails the integration ID and
    key.
  </Step>

  <Step title="Open Settings → Payments → Paynow in Centipid">
    Enter the **Integration ID** and **Integration key**, then switch to Paynow.
  </Step>

  <Step title="Run a controlled test payment">
    Pay a small amount from the captive portal, approve the prompt on the
    phone, and confirm the payment reaches the ledger.
  </Step>
</Steps>

There is nothing to paste into Paynow: the result URL is sent with every
transaction.

## Credentials

| Field | Required | Notes |
| - | - | - |
| Integration ID | Yes | The number Paynow shows for the integration. |
| Integration key | Yes | Signs every message both ways. Stored encrypted, never shown again. |

## How a payment completes

Every message to and from Paynow carries a hash: the upper-case SHA-512 of its
values followed by the integration key. Centipid checks it on every reply, every
result post and every status poll.

* A result post with a missing or wrong hash is rejected (`401`) and credits
  nothing.
* A result post with a good hash only starts a status check. The status check
  re-reads the transaction from Paynow before anything is credited.
* Centipid also checks the status every 5 seconds for about 3 minutes after the
  prompt is sent. That check connects the payer if the result post is lost.
* A repeated result post settles the same payment once. It never provisions the
  subscriber twice.

## Networks

The portal only asks for a number, so Centipid picks the wallet from the prefix:

| Prefix | Wallet |
| - | - |
| 077, 078 | EcoCash (Econet) |
| 071 | OneMoney (NetOne) |

Any other number, Telecel (073) for example, is refused before a prompt is sent.
Paynow's Express Checkout also offers InnBucks and O'mari, but those need the
payer to scan a code or type a one-time PIN, which the portal does not ask for.

## Troubleshooting

* **"Unable to send the Paynow payment prompt"**: the integration ID or key is
  wrong, or the integration is not enabled for Mobile Express Checkout. Paynow's
  exact error is in the application log.
* **Test payments fail straight away**: a new integration starts in test mode,
  and Paynow only sets it live after one successful test payment. In test mode
  Paynow accepts only its test numbers (`0771111111` succeeds after 5 seconds,
  `0773333333` is cancelled after 30) and only when the payer email is one of
  the merchant account's login emails. Real phones work once Paynow sets the
  integration live.
* **"Enter an EcoCash or OneMoney number"**: the number's prefix is not in the
  table above.
* **"Paynow takes payments in USD or ZWG only"**: the account bills in ZAR.
* **The payer paid but did not connect**: search the payment by Paynow's
  reference, shown in the Paynow transaction list.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.