A JazzCash payment gateway lets customers pay your online business straight from their JazzCash mobile wallet, without typing card details and without you building a payment form. If you sell online in Pakistan, offering JazzCash at checkout removes a real barrier for customers who prefer wallets to cards.
This guide explains how JazzCash payments work with ZurvaPay, a hosted payment gateway for Pakistan. You will see what the customer experiences, how to accept JazzCash payments on your website step by step, how the API and payment notifications work, and the mistakes to avoid when you go live.
- What is a JazzCash payment gateway?
- Why accept JazzCash payments online
- How JazzCash payments work with ZurvaPay
- Features of the ZurvaPay JazzCash payment gateway
- JazzCash API integration: step by step
- Common mistakes to avoid
- Who it is for
- JazzCash with Easypaisa and Raast QR
- Frequently asked questions
What is a JazzCash payment gateway?
A payment gateway connects your website or app to a payment method and tells you, reliably, whether a customer has paid. A JazzCash payment gateway does this for JazzCash wallets: your server sends an order, the customer approves the payment from their wallet, and you receive a confirmation you can trust.
With ZurvaPay you do not manage that connection yourself. You keep your own order system, send the order to ZurvaPay through a simple API, and the customer pays on a secure, mobile-ready checkout page. When the payment is confirmed, ZurvaPay notifies your server automatically.
Why accept JazzCash payments online
- Customers already use wallets. Many shoppers in Pakistan pay from a mobile wallet instead of a bank card, so a store without a wallet option loses those sales.
- Fewer steps at checkout. The customer enters a mobile number and approves the request on their phone. There is no card number to type.
- No payment form to build or secure. ZurvaPay hosts the checkout, so you do not collect or store wallet credentials.
- One integration, more methods. The same API request supports Easypaisa and Raast QR as well, so you do not integrate each method separately.
How JazzCash payments work with ZurvaPay
Here is the journey from the customer's side:
- Choose JazzCash. On the ZurvaPay checkout, the customer selects JazzCash as the payment method.
- Enter the wallet number. They type their JazzCash mobile number in the 03XXXXXXXXX format. The Pay button stays disabled until the number is valid.
- Approve on the phone. A payment request is sent to their phone and they approve it in the JazzCash app.
- Return to your website. ZurvaPay confirms the payment and sends the customer back to your success page.
And from your server's side: you create the order, ZurvaPay returns a checkout URL, you redirect the customer to it, and ZurvaPay sends a signed notification (IPN) to your server when the payment is paid. That notification is the only thing you should trust to mark an order as paid.
Features of the ZurvaPay JazzCash payment gateway
Hosted, mobile-ready checkout
Your store name and logo appear on a clean payment page that works on phones. You do not build or maintain any payment form.
A simple payment gateway API
One server-side request starts a payment. It works from PHP, Laravel, WordPress, Python, Node.js, .NET, Java and Go, because it is a standard HTTPS request with a JSON response.
Signed payment notifications with automatic retries
When a payment is paid, ZurvaPay sends a signed IPN to your server. If your server does not answer with HTTP 200, ZurvaPay retries after about 2, 5, 15, 30, 60, 180 and 360 minutes, which makes 8 attempts in total.
Payment recovery
If a customer approves the payment but closes the page or loses connection, ZurvaPay re-checks the payment and confirms it automatically. An optional status API and cron job also let you complete any order that is still pending on your side.
Domain-locked API keys
Your public key identifies your business, your secret key stays on your server, and your callback URLs must be on the website domain approved for your account.
Merchant dashboard, invoices and withdrawals
Track transactions and pending payments, manage your API keys, send invoices that clients pay online, and request withdrawals to your registered bank account.
JazzCash API integration: step by step
Step 1: Open a merchant account
Registration is online. Open a merchant account, complete the KYC form in your dashboard and wait for approval. You can read how this works on the merchant onboarding page.
Step 2: Get your API keys and approve your domain
After approval, copy your public key and secret key from the dashboard and register the website domain that will use them. Keep the secret key on your server only. Never put it in browser or app code.
Step 3: Save the order, then start the payment
Save the order in your own database as pending, with a unique order identifier (up to 20 characters). Then send the payment request from your server:
curl -X POST "https://zurvapay.com/payment/initiate" \
-F "public_key=YOUR_PUBLIC_KEY" \
-F "identifier=ORD1790000000123" \
-F "currency=PKR" \
-F "amount=500" \
-F "details=Wallet Recharge" \
-F "ipn_url=https://yourdomain.com/zurvapay/ipn.php" \
-F "success_url=https://yourdomain.com/payment/success" \
-F "cancel_url=https://yourdomain.com/payment/cancel" \
-F "customer_name=John Doe" \
-F "customer_email=john@example.com"
A successful response contains a checkout URL. Redirect the customer to it.
Step 4: Verify the IPN on your server
When the customer has paid, ZurvaPay sends an IPN to your ipn_url. It carries two signatures, and you should verify both with your secret key before you mark the order as paid:
<?php
$expected = strtoupper(hash_hmac('sha256', $amount . $identifier, $secret));
$expectedStatus = strtoupper(hash_hmac('sha256', $status . '|' . $identifier . '|' . $amount, $secret));
if (!hash_equals($expected, $signature) || !hash_equals($expectedStatus, $statusSig) || $status !== 'success') {
http_response_code(400);
exit;
}
// mark the order as paid, then always answer HTTP 200
http_response_code(200);
echo json_encode(['status' => 'ok']);
Use the amount exactly as received, and answer quickly with HTTP 200 so ZurvaPay does not retry. The full parameter list and samples for PHP, Python and Node.js are in the ZurvaPay API documentation.
Step 5: Test with a small real payment
ZurvaPay works with live payments only, so test with a small amount before you launch. Confirm that your order moves from pending to paid after the IPN arrives.
Common mistakes to avoid
- Trusting the success page. The customer returning to your
success_urlis not proof of payment. Only the verified IPN is. - Exposing the secret key. It belongs on your server. If it leaks, generate new keys in the dashboard.
- Skipping signature checks. Without them anyone could post a fake "paid" request to your IPN address.
- Doing heavy work before replying. Answer HTTP 200 first, then process the order, otherwise the notification may be retried.
- Reusing order identifiers. Each identifier must be unique forever.
- Callback URLs on the wrong domain. They must be on the domain approved for your account.
Who it is for
A JazzCash payment gateway suits any online business in Pakistan that wants to be paid from wallets:
- Online stores and marketplaces
- Freelancers, agencies and consultants who send invoices
- SaaS and digital product sellers
- Schools, institutes and clinics collecting fees and appointments online
- Platforms that let users top up a wallet balance
If you build sites for several clients, you do not need a separate verification for each one. Add them as sub-merchants under your verified account, each with its own API keys, transactions and pending payments.
JazzCash with Easypaisa and Raast QR
JazzCash is one of several ways your customers can pay on the same ZurvaPay checkout. Easypaisa and Raast QR work through the same API request, so adding them takes no extra integration work. If your customers also ask about paying from a bank account or a card, read our guides to bank payments and card payments.
Frequently asked questions
How can I accept JazzCash payments on my website?
Open a ZurvaPay merchant account, get approved, copy your API keys and send one server-side request to the payment initiate endpoint. Redirect the customer to the returned checkout URL, where they choose JazzCash and approve the payment on their phone. Verify the signed IPN on your server to confirm the order.
Does my customer need a JazzCash account?
Yes. The customer pays from their own JazzCash wallet, so they need an active wallet number and must approve the request on their phone.
What happens if the customer pays but the page shows an error?
ZurvaPay re-checks such payments and, if they were paid, confirms them automatically and sends your IPN. With the optional status API and cron job, your own order can be completed even if every IPN attempt failed.
Is there a test mode?
No. ZurvaPay processes live payments only, so use a small amount for your first test.
How much does it cost?
Charges are configured per merchant account. Create an account or contact us to see the rate that applies to your business.
Can I earn by referring other businesses?
Yes. Agents refer merchants with a personal referral link and earn a commission when those merchants withdraw funds. See the agent program.
Start accepting JazzCash payments with ZurvaPay
If you want a JazzCash payment gateway that is quick to set up and simple to integrate, ZurvaPay gives you a hosted checkout, a straightforward API, signed notifications and automatic payment recovery in one place. Open a merchant account, read the API documentation, and learn more on the JazzCash payment gateway page.
JazzCash is a trademark of its respective owner. ZurvaPay is an independent payment gateway and is not affiliated with or endorsed by JazzCash.
Start accepting payments with ZurvaPay
Open a merchant account, connect your website with one API and get notified the moment a customer pays.
