Skip to Content
SDKsJava

Java SDK

Java client library for the QPay V2 API. Uses the Java 17+ HttpClient, builder-pattern request construction, Jackson JSON serialization, and synchronized token management.

Maven Central GitHub

Requirements: Java 17+, Maven or Gradle

Installation

Maven

<dependency> <groupId>io.github.qpay-sdk</groupId> <artifactId>qpay-java</artifactId> <version>1.0.0</version> </dependency>

Gradle

implementation 'io.github.qpay-sdk:qpay-java:1.0.0'

Gradle (Kotlin DSL)

implementation("io.github.qpay-sdk:qpay-java:1.0.0")

Configuration

Builder Pattern

import mn.qpay.sdk.QPayConfig; QPayConfig config = QPayConfig.builder() .baseURL("https://merchant.qpay.mn") .username("YOUR_USERNAME") .password("YOUR_PASSWORD") .invoiceCode("YOUR_INVOICE_CODE") .callbackURL("https://yoursite.com/payment/callback") .build();

Environment Variables

QPayConfig config = QPayConfig.fromEnv();
VariableDescription
QPAY_BASE_URLQPay API base URL (e.g., https://merchant.qpay.mn)
QPAY_USERNAMEQPay merchant username
QPAY_PASSWORDQPay merchant password
QPAY_INVOICE_CODEDefault invoice code
QPAY_CALLBACK_URLPayment callback URL

Custom HttpClient

import java.net.http.HttpClient; import java.time.Duration; HttpClient httpClient = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(60)) .build(); QPayClient client = new QPayClient(config, httpClient);

Quick Start

import mn.qpay.sdk.*; import mn.qpay.sdk.models.*; QPayConfig config = QPayConfig.fromEnv(); QPayClient client = new QPayClient(config); InvoiceResponse invoice = client.createSimpleInvoice( CreateSimpleInvoiceRequest.builder() .invoiceCode(config.getInvoiceCode()) .senderInvoiceNo("ORDER-001") .invoiceDescription("Payment for Order #001") .amount(50000.0) .callbackURL(config.getCallbackURL()) .build() ); System.out.println("Invoice ID: " + invoice.getInvoiceId()); System.out.println("QR Image: " + invoice.getQrImage()); System.out.println("Short URL: " + invoice.getQPayShortUrl()); for (var url : invoice.getUrls()) { System.out.println(" " + url.getName() + ": " + url.getLink()); }

Create Invoice

Simple Invoice

CreateSimpleInvoiceRequest request = CreateSimpleInvoiceRequest.builder() .invoiceCode("YOUR_INVOICE_CODE") .senderInvoiceNo("ORDER-003") .invoiceDescription("Simple payment") .amount(25000.0) .callbackURL("https://yoursite.com/payment/callback") .build(); InvoiceResponse invoice = client.createSimpleInvoice(request);

Cancel Invoice

client.cancelInvoice("invoice-id-here");

Check Payment

import mn.qpay.sdk.models.common.Offset; PaymentCheckRequest request = PaymentCheckRequest.builder() .objectType("INVOICE") .objectId("INVOICE_ID") .offset(new Offset(1, 10)) .build(); PaymentCheckResponse response = client.checkPayment(request); if (response.getCount() > 0) { System.out.println("Payment received! Paid: " + response.getPaidAmount()); for (PaymentCheckResponse.PaymentCheckRow row : response.getRows()) { System.out.println(" " + row.getPaymentId() + ": " + row.getPaymentStatus() + " (" + row.getPaymentAmount() + " " + row.getPaymentCurrency() + ")"); } } else { System.out.println("No payment yet"); }

List Payments

PaymentListRequest request = PaymentListRequest.builder() .objectType("INVOICE") .objectId("INVOICE_ID") .startDate("2024-01-01") .endDate("2024-12-31") .offset(new Offset(1, 20)) .build(); PaymentListResponse response = client.listPayments(request); System.out.println("Total: " + response.getCount()); for (PaymentListResponse.PaymentListItem item : response.getRows()) { System.out.println(" " + item.getPaymentId() + " | " + item.getPaymentAmount() + " MNT | " + item.getPaymentStatus()); }

Get details for a single payment:

PaymentDetail detail = client.getPayment("payment-id-here"); System.out.println("Payment " + detail.getPaymentId() + ": " + detail.getPaymentStatus());

Webhook Handling

QPay sends a POST request to your callbackURL when a payment completes.

Spring Boot

import mn.qpay.sdk.*; import mn.qpay.sdk.models.*; import org.springframework.web.bind.annotation.*; @RestController public class QPayCallbackController { private final QPayClient qpayClient; public QPayCallbackController() { this.qpayClient = new QPayClient(QPayConfig.fromEnv()); } @PostMapping("/api/qpay/callback") public Map<String, String> handleCallback(@RequestBody Map<String, String> body) { String paymentId = body.get("payment_id"); PaymentCheckResponse result = qpayClient.checkPayment( PaymentCheckRequest.builder() .objectType("INVOICE") .objectId(paymentId) .build() ); if (result.getCount() > 0) { // Payment verified -- update your order status System.out.println("Payment confirmed: " + paymentId); } return Map.of("status", "ok"); } }

Error Handling

All API errors throw QPayException, which is a RuntimeException:

try { client.createSimpleInvoice(request); } catch (QPayException e) { System.err.println("Status: " + e.getStatusCode()); // e.g., 400 System.err.println("Code: " + e.getCode()); // e.g., "INVOICE_CODE_INVALID" System.err.println("Message: " + e.getMessage()); System.err.println("Raw body: " + e.getRawBody()); }

Error Code Constants

import mn.qpay.sdk.ErrorCodes; try { client.getPayment("invalid-id"); } catch (QPayException e) { if (ErrorCodes.PAYMENT_NOTFOUND.equals(e.getCode())) { System.out.println("Payment does not exist"); } else if (ErrorCodes.AUTHENTICATION_FAILED.equals(e.getCode())) { System.out.println("Authentication failed"); } else if (ErrorCodes.PERMISSION_DENIED.equals(e.getCode())) { System.out.println("Permission denied"); } else { System.out.println("Unexpected error: " + e); } }

API Reference

MethodDescriptionReturns
getToken()Authenticate and get token pairTokenResponse
refreshToken()Refresh access tokenTokenResponse
createInvoice(req)Create invoice with full optionsInvoiceResponse
createSimpleInvoice(req)Create invoice with minimal fieldsInvoiceResponse
cancelInvoice(id)Cancel an invoicevoid
getPayment(id)Get payment detailsPaymentDetail
checkPayment(req)Check payment statusPaymentCheckResponse
listPayments(req)List paymentsPaymentListResponse
cancelPayment(id, url, note)Cancel a card paymentvoid
refundPayment(id, url, note)Refund a card paymentvoid
createEbarimt(req)Create electronic tax receiptEbarimtResponse
cancelEbarimt(id)Cancel electronic tax receiptEbarimtResponse
Last updated on