The official SerikaPay library for Java 11+. Uses the JDK HttpClient; the only dependency is Gson.
Gradle:
implementation("dev.serika:serikapay-java:1.0.0")Maven:
<dependency>
<groupId>dev.serika</groupId>
<artifactId>serikapay-java</artifactId>
<version>1.0.0</version>
</dependency>Create a key under Developers → API keys in your wallet. Keep it on the server.
import dev.serika.serikapay.*;
import java.math.BigDecimal;
SerikaPay serika = new SerikaPay(System.getenv("SERIKA_SECRET_KEY"));
Payment payment = serika.payments().create(
PaymentCreateParams.builder()
.amount(new BigDecimal("4.99"))
.description("Sticker pack")
.customerEmail("fan@example.com")
.putMetadata("orderId", "1042")
.idempotencyKey("order_1042") // optional — generated if not set
.build());
System.out.println(payment.getStatus()); // completedAmounts are BigDecimal so coins never pick up floating-point error.
Payment p = serika.payments().retrieve("pay_m1x2y3");
PaymentList page = serika.payments().list(10); // page.getData(), page.hasMore()
serika.payments().refund("pay_m1x2y3"); // full refund
serika.payments().refund("pay_m1x2y3", new BigDecimal("2.00"));Balance balance = serika.balance().retrieve(); // EUR
TransactionList txs = serika.transactions().list(20, "spend");try {
Event event = Webhook.constructEvent(rawBody, request.getHeader("Serika-Signature"), System.getenv("SERIKA_WEBHOOK_SECRET"));
if ("payment.completed".equals(event.getType())) {
Payment paid = event.getPayment();
// fulfil the order
}
} catch (SignatureVerificationException e) {
response.setStatus(400);
}Read the body as a String before any JSON binding — in Spring, take @RequestBody String body.
Failed requests throw the unchecked SerikaPayException:
try {
serika.payments().create(PaymentCreateParams.builder().amount(new BigDecimal("4.99")).build());
} catch (SerikaPayException e) {
e.getType(); // "insufficient_balance"
e.getStatusCode(); // 400, or 0 for network failures ("connection_error")
e.getRaw(); // the raw error JSON
}SerikaPay serika = SerikaPay.builder(System.getenv("SERIKA_SECRET_KEY"))
.baseUrl("https://wallet-api.serika.dev") // default
.timeout(Duration.ofSeconds(30))
.maxRetries(2) // network errors, 429 and 5xx
.build();GET requests and payment creation (which always carries an idempotency key) are retried with exponential backoff; refunds are not. The client is thread-safe.
mvn testMIT