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.
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();| Variable | Description |
|---|---|
QPAY_BASE_URL | QPay API base URL (e.g., https://merchant.qpay.mn) |
QPAY_USERNAME | QPay merchant username |
QPAY_PASSWORD | QPay merchant password |
QPAY_INVOICE_CODE | Default invoice code |
QPAY_CALLBACK_URL | Payment 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
| Method | Description | Returns |
|---|---|---|
getToken() | Authenticate and get token pair | TokenResponse |
refreshToken() | Refresh access token | TokenResponse |
createInvoice(req) | Create invoice with full options | InvoiceResponse |
createSimpleInvoice(req) | Create invoice with minimal fields | InvoiceResponse |
cancelInvoice(id) | Cancel an invoice | void |
getPayment(id) | Get payment details | PaymentDetail |
checkPayment(req) | Check payment status | PaymentCheckResponse |
listPayments(req) | List payments | PaymentListResponse |
cancelPayment(id, url, note) | Cancel a card payment | void |
refundPayment(id, url, note) | Refund a card payment | void |
createEbarimt(req) | Create electronic tax receipt | EbarimtResponse |
cancelEbarimt(id) | Cancel electronic tax receipt | EbarimtResponse |
Links
- Maven Central: io.github.qpay-sdk:qpay-javaÂ
- GitHub: github.com/qpay-sdk/qpay-javaÂ
Last updated on