From df23cb37722d46a830c5879eac9f23d7a653596d Mon Sep 17 00:00:00 2001 From: Chaitanya Bhagwat Date: Mon, 19 Jan 2026 17:10:25 +0100 Subject: [PATCH] paylink response dto implementation aligned with docs --- .gitignore | 3 +- src/main/java/com/twikey/PaylinkGateway.java | 12 +- src/main/java/com/twikey/TwikeyClient.java | 1 - .../com/twikey/modal/DocumentRequests.java | 2 +- .../com/twikey/modal/PaylinkResponse.java | 108 ++++++++++++++++-- 5 files changed, 108 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 0b438f5..d9d3828 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ - +**/bin/ +**/.env target/ .mvn/ !**/src/main/**/target/ diff --git a/src/main/java/com/twikey/PaylinkGateway.java b/src/main/java/com/twikey/PaylinkGateway.java index 8d43947..a7ac2a2 100644 --- a/src/main/java/com/twikey/PaylinkGateway.java +++ b/src/main/java/com/twikey/PaylinkGateway.java @@ -14,7 +14,6 @@ import java.io.InputStreamReader; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.util.HashMap; import java.util.Map; import static com.twikey.TwikeyClient.HTTP_FORM_ENCODED; @@ -110,12 +109,11 @@ public void feed(PaylinkCallback callback,String... sideloads) throws IOExceptio JSONArray messagesArr = json.getJSONArray("Links"); isEmpty = messagesArr.isEmpty(); if (!isEmpty) { - for (int i = 0; i < messagesArr.length(); i++) { - JSONObject obj = messagesArr.getJSONObject(i); - callback.paylink(obj); - callback.paylink(PaylinkResponse.Paylink.fromJson(obj)); - } - + for (int i = 0; i < messagesArr.length(); i++) { + JSONObject obj = messagesArr.getJSONObject(i); + callback.paylink(obj); + callback.paylink(PaylinkResponse.Paylink.fromJson(obj)); + } } } } else { diff --git a/src/main/java/com/twikey/TwikeyClient.java b/src/main/java/com/twikey/TwikeyClient.java index a8521f7..40f5aa1 100644 --- a/src/main/java/com/twikey/TwikeyClient.java +++ b/src/main/java/com/twikey/TwikeyClient.java @@ -12,7 +12,6 @@ import java.security.GeneralSecurityException; import java.security.MessageDigest; import java.util.Map; -import java.util.Properties; import static java.nio.charset.StandardCharsets.UTF_8; diff --git a/src/main/java/com/twikey/modal/DocumentRequests.java b/src/main/java/com/twikey/modal/DocumentRequests.java index eefbf3a..f736882 100644 --- a/src/main/java/com/twikey/modal/DocumentRequests.java +++ b/src/main/java/com/twikey/modal/DocumentRequests.java @@ -318,7 +318,7 @@ public InviteRequest setPrefix(String prefix) { } public InviteRequest setExpiry(long epoch) { - this.ed = ed; + this.ed = String.valueOf(epoch); return this; } diff --git a/src/main/java/com/twikey/modal/PaylinkResponse.java b/src/main/java/com/twikey/modal/PaylinkResponse.java index 52c6f3e..133ddc3 100644 --- a/src/main/java/com/twikey/modal/PaylinkResponse.java +++ b/src/main/java/com/twikey/modal/PaylinkResponse.java @@ -6,17 +6,109 @@ public interface PaylinkResponse { record Paylink( long id, + long templateId, double amount, - String message, - String url + String msg, + String remittance, + PaylinkState state, + String url, + Customer customer, + Meta meta ) { public static Paylink fromJson(JSONObject json) { - return new Paylink( - json.getLong("id"), - json.getDouble("amount"), - json.optString("msg"), - json.getString("url") - ); + long id = json.getLong("id"); + long templateId = json.optLong("ct"); + double amount = json.getDouble("amount"); + String msg = json.optString("msg"); + String remittance = json.optString("ref"); + String stateStr = json.optString("state", null); + PaylinkState state = PaylinkState.parse(stateStr); + String url = json.optString("url"); + + Customer customer = null; + if (json.has("customer")) { + JSONObject customerJson = json.getJSONObject("customer"); + customer = new Customer() + .setEmail(customerJson.optString("email")) + .setFirstname(customerJson.optString("firstname")) + .setLastname(customerJson.optString("lastname")) + .setStreet(customerJson.optString("address")) + .setCity(customerJson.optString("city")) + .setZip(customerJson.optString("zip")) + .setCountry(customerJson.optString("country")) + .setNumber(customerJson.optString("customerNumber")) + .setLang(customerJson.optString("l")) + .setMobile(customerJson.optString("mobile")) + .setCompanyName(customerJson.optString("companyName")) + .setCoc(customerJson.optString("coc")); + } + + Meta meta = null; + if (json.has("meta")) { + meta = Meta.fromJson(json.getJSONObject("meta")); + } + + return new Paylink(id, templateId, amount, msg, remittance, state, url, customer, meta); + } + } + + record Meta( + boolean active, + String method, + String recurringId, + String expiry, + String type, + String invoice, + String sdd, + String tx, + String paymentMethod + ) { + public static Meta fromJson(JSONObject json) { + boolean active = json.optBoolean("active"); + String method = json.optString("method", null); + String recurringId = json.optString("recurringId", null); + String expiry = json.optString("expiry", null); + String type = json.optString("type", null); + String invoice = json.optString("invoice", null); + String sdd = json.optString("sdd", null); + String tx = json.optString("tx", null); + String paymentMethod = json.optString("paymentMethod", null); + + return new Meta(active, method, recurringId, expiry, type, invoice, sdd, tx, paymentMethod); + } + } + + + enum PaylinkState { + CREATED("created"), + STARTED("started"), + PENDING("pending"), + DECLINED("declined"), + PAID("paid"), + EXPIRED("expired"), + REFUNDED("refunded"); + + private final String id; + + PaylinkState(String id) { + this.id = id; + } + + public String id() { + return id; + } + + public static PaylinkState parse(String state) { + if (state == null) return PENDING; + return switch (state) { + case "created" -> CREATED; + case "started" -> STARTED; + case "declined" -> DECLINED; + case "paid" -> PAID; + case "expired" -> EXPIRED; + case "refunded" -> REFUNDED; + default -> PENDING; + }; } } }