Payzum Payments for Frappe / ERPNext
Accept crypto and stablecoin payments (USDC, USDT and more, multi-chain) in any Frappe or ERPNext site. Payzum is non-custodial: funds settle directly to your own wallet.
The app plugs into the official frappe/payments
framework: it registers a Payzum payment gateway that any consumer of
get_payment_gateway_controller (Payment Requests, web forms, custom code) can
use, exactly like the built-in gateways.
- Buyers are redirected to a hosted checkout page where they pick the asset and network; your site charges in fiat terms (e.g. 29.99 USD). No card fields, no PCI surface.
- Orders are fulfilled from the signed payment notification (HMAC-SHA-512,
verified by the official
payzumPython SDK), never from the buyer's browser return. - Redelivered notifications are idempotent, and a late
expiredevent can never downgrade an order that already settled.
Requirements
- Frappe v15+ with the payments app installed
- Python 3.10+
- A publicly reachable site URL (Payzum delivers notifications server-to-server)
Installation
bench get-app https://github.com/payzum-dev/frappe-payzum
bench --site yoursite install-app payzum_payments
Configuration
Open Payzum Settings (single doctype) on your site:
| Field | Value |
|---|---|
| API Key | From Dashboard → Settings → API Keys at merchant.payzum.com |
| Webhook Secret | Shown once, at merchant creation or rotation |
| Use Sandbox | Point at staging.payzum.com — isolated environment, separate API keys |
| Pay Currency | all (default) lets the buyer pick on the hosted page; or pin a code like usdcmatic |
Saving validates the API key against the live API.
Every invoice the app creates carries its own ipn_callback_url pointing back
at your site, so no webhook needs to be configured in the Payzum dashboard.
Usage from code
from payments.utils import get_payment_gateway_controller
controller = get_payment_gateway_controller("Payzum")
controller.validate_transaction_currency("USD")
url = controller.get_payment_url(
amount=29.99,
currency="USD",
title="Payment for SO-0001",
description="Sales Order SO-0001",
reference_doctype="Payment Request",
reference_docname="PR-0001",
payer_email="buyer@example.com",
)
# redirect the buyer to `url`
When the invoice settles, the reference document's on_payment_authorized("Completed")
is called — the same contract every gateway in frappe/payments honours.
Statuses
The gateway emits five payment statuses; only finished fulfils:
| Payzum status | Effect |
|---|---|
finished |
on_payment_authorized("Completed"), Integration Request → Completed |
expired, failed |
Integration Request → Failed |
waiting, partially_paid |
No change (partially_paid means underpaid) |
Tests
bench --site yoursite run-tests --app payzum_payments
The suite exercises the notification handler with genuinely signed bodies: signature rejection, replay-window rejection, fulfilment, idempotent redelivery, and the never-downgrade guard.
License
MIT
Metadata
Release files for payzum-payments 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| payzum_payments-0.2.0.tar.gz | 9.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| payzum_payments-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.8 kB
Release files / payzum_payments-0.2.0.tar.gz
| Download URL | payzum_payments-0.2.0.tar.gz |
|---|---|
| Size | 9.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b32e64083f585ac6fbc5e41f5c3d5c159cb12cbb0a088e94b99a9833079779f
|
|
BLAKE2b-256 checksum How to use checksums |
f246a5201dfc536ec955fe073dca3ef98ac1101ba978fd83b34087b44a7f9079
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.12
|
Release files / payzum_payments-0.2.0-py3-none-any.whl
| Download URL | payzum_payments-0.2.0-py3-none-any.whl |
|---|---|
| Size | 11.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
efc9c352876a9ab68218fa39c78da2f11d38cdddeee9fb3a235d2db8ff9e9cbe
|
|
BLAKE2b-256 checksum How to use checksums |
ccfaad791d460a44a6f6bca9b0846d2e61f063abbc1122553dff7f43f65aea43
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.12
|