- a payment method (
PawPayments) plugged into the standard BillManager payment flow, - a small CGI page for client‑initiated top‑ups that credit the client account on payment.
Download the plugin (.zip)
Ready-to-install
pawpayments-billmgr-<version>.zip (includes install.sh).View source on GitHub
Source, releases, and issue tracker.
| Property | Value |
|---|---|
| GitHub | pawpayments/billmgr-plugin |
| Download | Latest release .zip |
| BillManager | 6.x (tested on 5.437+) |
| PHP | 7.4 (BillManager bundles 7.4 by default; 8.x also works) |
| Required access | root on the BillManager host (installer writes into /usr/local/mgr5/) |
| HTTPS | Required — Paw delivers webhooks over TLS only |
File layout
After installation the files live under/usr/local/mgr5/:
Install
The release ships aninstall.sh that copies everything into place and reloads the BillManager core worker.
Configure the payment method
Use the BillManager UI: Settings → Payment methods → Add → Module: PawPayments and fill the wizard.| Field | Description |
|---|---|
| Name | Visible name (e.g. PawPayments Crypto). |
| Currency | The fiat currency you bill in. PawPayments accepts USD, EUR, GBP, CAD, AUD, CHF, JPY, NZD, SGD, HKD, NGN, KRW, ILS, RON, ARS, INR, IDR, MXN, MYR, TRY, PLN, BRL, THB. Unsupported BillManager currencies are rejected with VALIDATION_ERROR when the invoice is created. |
| Project | The BillManager project this method is available in. |
| API Key | Merchant API key from the Paw dashboard. |
| API Base URL | https://api.pawpayments.com (or leave empty to use the default). |
| Invoice TTL (seconds) | Default 3600. |
paymethod to your project (paymethod2project) and to a group (paymethod2group) for it to appear in the customer area.
Webhook URLs
| Purpose | URL |
|---|---|
| Checkout | https://<your-server>/mancgi/pawpaymentsresult.php |
| Top‑up | https://<your-server>/mancgi/pawpaymentstopup_result.php |
/mancgi/ is proxied to the BillManager ihttpd (port 1500):
Lifecycle
Checkout. The CGI builds a Paw invoice viaPOST /api/v2/invoices, redirects to payment_url, and on webhook success calls payment.setpaid exactly once — payment status is checked first, so retries never re‑mark a payment as paid.
Top‑up. The customer enters an amount on pawpaymentstopup.php; the CGI creates a Paw invoice and stores its order_id. The webhook handler verifies the signature, checks externalid for duplicates, and creates a BillManager payment row already marked as paid — BillManager itself converts that row into account credit on the next billing cycle event.
Webhooks carrying a permanent_address_id are silently acknowledged with 200 OK.
Smoke test
Missing data with HTTP 200 — confirms the script loads and parses JSON.
End‑to‑end check with a valid signature:
OK with HTTP 200.
Troubleshooting
| Symptom | Cause / Fix |
|---|---|
| PawPayments does not appear in Add payment method | XML manifest not loaded. Run killall core (BillManager auto‑restarts the worker) or service ihttpd restart. Check that /usr/local/mgr5/etc/xml/billmgr_mod_pmpawpayments.xml exists. |
mgrctl paymethod.add ... ERROR missed(currency) | The mgrctl wizard is stateful — pass parameters in the right step or use the UI / direct DB seed. |
Webhook returns Payment not found | The BillManager payment row referenced by extra does not exist, or it has no project / profile. Configure projects, profiles, and accounts before testing. |
Webhook returns Invalid signature | The API key on the payment method does not match the one used to issue the invoice. Update Settings → Payment methods → PawPayments → API Key and re‑issue. |
| Top‑up not crediting funds | The CGI creates a payment row marked as paid; BillManager itself converts it to credit on the next billing cycle event. Check tail -f /usr/local/mgr5/var/billmgr.log. |
Nginx returns 502 Bad Gateway for /mancgi/... | ihttpd is not listening on the address Nginx is proxying to. Confirm ss -tlnp | grep 1500 and update proxy_pass. |
Uninstall
payment rows even after the method is removed.
