From c105b42e1aea7832bb4e3cce65f78a91c4cef24a Mon Sep 17 00:00:00 2001 From: AnasNaouchi Date: Fri, 12 Jan 2024 13:20:05 +0700 Subject: [PATCH 01/11] Add wechat_pay source --- src/main/java/co/omise/models/Source.java | 13 ++++++++ src/main/java/co/omise/models/SourceType.java | 4 ++- .../co/omise/live/LiveChargeRequestTest.java | 32 +++++++++++++++++++ .../java/co/omise/models/SourceTypeTest.java | 1 + 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/omise/models/Source.java b/src/main/java/co/omise/models/Source.java index fdaf148e..2b9fc328 100644 --- a/src/main/java/co/omise/models/Source.java +++ b/src/main/java/co/omise/models/Source.java @@ -25,6 +25,7 @@ public class Source extends Model { private ChargeStatus chargeStatus; private String currency; private String email; + private String ip; private FlowType flow; @JsonProperty("installment_term") private long installmentTerm; @@ -88,10 +89,16 @@ public void setCurrency(String currency) { public String getEmail() { return this.email; } + public String getIp() { + return this.ip; + } public void setEmail(String email) { this.email = email; } + public void setIp(String ip) { + this.ip = ip; + } public FlowType getFlow() { return this.flow; @@ -217,6 +224,8 @@ public static class CreateRequestBuilder extends RequestBuilder { private String currency; @JsonProperty private String email; + @JsonProperty + private String ip; @JsonProperty("installment_term") private long installmentTerm; @JsonProperty("mobile_number") @@ -281,6 +290,10 @@ public CreateRequestBuilder email(String email) { this.email = email; return this; } + public CreateRequestBuilder ip(String ip) { + this.ip = ip; + return this; + } public CreateRequestBuilder installmentTerm(long installmentTerm) { this.installmentTerm = installmentTerm; diff --git a/src/main/java/co/omise/models/SourceType.java b/src/main/java/co/omise/models/SourceType.java index eb4bfb74..ad853348 100644 --- a/src/main/java/co/omise/models/SourceType.java +++ b/src/main/java/co/omise/models/SourceType.java @@ -82,7 +82,9 @@ public enum SourceType { @JsonProperty("atome") Atome, @JsonProperty("duitnow_obw") - DuitNowOBW; + DuitNowOBW, + @JsonProperty("wechat_pay") + WechatPay; @Override public String toString() { diff --git a/src/test/java/co/omise/live/LiveChargeRequestTest.java b/src/test/java/co/omise/live/LiveChargeRequestTest.java index 42eba0b6..782cf6dc 100644 --- a/src/test/java/co/omise/live/LiveChargeRequestTest.java +++ b/src/test/java/co/omise/live/LiveChargeRequestTest.java @@ -637,4 +637,36 @@ public void testLiveChargeWithDuitNowOBW() throws IOException, OmiseException { assertEquals("affin", charge.getSource().getBank()); assertEquals(FlowType.Redirect, charge.getSource().getFlow()); } + @Test + @Ignore("only hit the network when we need to.") + public void testLiveChargeWithWechatPay() throws IOException, OmiseException { + + Request sourceRequest = new Source.CreateRequestBuilder() + .type(SourceType.WechatPay) + .amount(15000) + .currency("THB") + .ip("127.0.0.1") + .build(); + + Source source = client.sendRequest(sourceRequest); + + Request createChargeRequest = + new Charge.CreateRequestBuilder() + .source(source.getId()) + .amount(15000) + .currency("THB") + .returnUri("http://example.com/") + .build(); + + Charge charge = client.sendRequest(createChargeRequest); + + System.out.println("created charge: " + charge.getId()); + + assertNotNull(charge.getId()); + assertEquals(15000, charge.getAmount()); + assertEquals("THB", charge.getCurrency()); + assertEquals("127.0.0.1", charge.getSource().getIp()); + assertEquals(SourceType.WechatPay, charge.getSource().getType()); + assertEquals(FlowType.AppRedirect, charge.getSource().getFlow()); + } } diff --git a/src/test/java/co/omise/models/SourceTypeTest.java b/src/test/java/co/omise/models/SourceTypeTest.java index ef8061d7..4f4cd2b4 100644 --- a/src/test/java/co/omise/models/SourceTypeTest.java +++ b/src/test/java/co/omise/models/SourceTypeTest.java @@ -36,5 +36,6 @@ public void checkStringValue() { assertEquals("mobile_banking_ktb", SourceType.MobileBankingKtb.toString()); assertEquals("atome", SourceType.Atome.toString()); assertEquals("duitnow_obw", SourceType.DuitNowOBW.toString()); + assertEquals("wechat_pay", SourceType.WechatPay.toString()); } } From e0c212c5c7ab39d9ce990ad2eb0b0a986f9015bd Mon Sep 17 00:00:00 2001 From: AnasNaouchi Date: Mon, 15 Jan 2024 16:37:50 +0700 Subject: [PATCH 02/11] Set ip as required for wechat_pay source --- src/main/java/co/omise/models/Source.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/co/omise/models/Source.java b/src/main/java/co/omise/models/Source.java index 2b9fc328..9e3c7d7f 100644 --- a/src/main/java/co/omise/models/Source.java +++ b/src/main/java/co/omise/models/Source.java @@ -360,6 +360,9 @@ public CreateRequestBuilder platformType(PlatformType platformType) { @Override protected RequestBody payload() throws IOException { + if (type == SourceType.WechatPay && (ip == null || ip.isEmpty())) { + throw new IllegalArgumentException("IP address is required for WeChat Pay Source."); + } return serialize(); } } From cf0f203e1876e3c37edd5a6bf96aeac0f147b536 Mon Sep 17 00:00:00 2001 From: AnasNaouchi Date: Wed, 17 Jan 2024 15:08:39 +0700 Subject: [PATCH 03/11] Remove check for ip --- src/main/java/co/omise/models/Source.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/co/omise/models/Source.java b/src/main/java/co/omise/models/Source.java index 9e3c7d7f..2b9fc328 100644 --- a/src/main/java/co/omise/models/Source.java +++ b/src/main/java/co/omise/models/Source.java @@ -360,9 +360,6 @@ public CreateRequestBuilder platformType(PlatformType platformType) { @Override protected RequestBody payload() throws IOException { - if (type == SourceType.WechatPay && (ip == null || ip.isEmpty())) { - throw new IllegalArgumentException("IP address is required for WeChat Pay Source."); - } return serialize(); } } From ab43827055e2eae85ffb6e0731eb29ae9df92ec3 Mon Sep 17 00:00:00 2001 From: Anas Naouchi <113893333+AnasNaouchi@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:09:46 +0700 Subject: [PATCH 04/11] Update src/main/java/co/omise/models/Source.java Co-authored-by: Daniel Fowler --- src/main/java/co/omise/models/Source.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/omise/models/Source.java b/src/main/java/co/omise/models/Source.java index 2b9fc328..1abd0408 100644 --- a/src/main/java/co/omise/models/Source.java +++ b/src/main/java/co/omise/models/Source.java @@ -89,7 +89,8 @@ public void setCurrency(String currency) { public String getEmail() { return this.email; } - public String getIp() { + + public String getIp() { return this.ip; } From f102a79028f68c3e8eb3212a5cbd16744c231447 Mon Sep 17 00:00:00 2001 From: Anas Naouchi <113893333+AnasNaouchi@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:09:53 +0700 Subject: [PATCH 05/11] Update src/main/java/co/omise/models/Source.java Co-authored-by: Daniel Fowler --- src/main/java/co/omise/models/Source.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/co/omise/models/Source.java b/src/main/java/co/omise/models/Source.java index 1abd0408..d0fde4ca 100644 --- a/src/main/java/co/omise/models/Source.java +++ b/src/main/java/co/omise/models/Source.java @@ -97,6 +97,7 @@ public String getIp() { public void setEmail(String email) { this.email = email; } + public void setIp(String ip) { this.ip = ip; } From b440c4df230fc8eb47148d2b74650163ea86c35f Mon Sep 17 00:00:00 2001 From: AnasNaouchi Date: Wed, 17 Jan 2024 15:11:19 +0700 Subject: [PATCH 06/11] Add getBody method to the request --- src/main/java/co/omise/requests/Request.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/co/omise/requests/Request.java b/src/main/java/co/omise/requests/Request.java index 3a8feb61..6517f1fd 100644 --- a/src/main/java/co/omise/requests/Request.java +++ b/src/main/java/co/omise/requests/Request.java @@ -1,9 +1,12 @@ package co.omise.requests; +import java.io.IOException; + import co.omise.Client; import co.omise.models.OmiseObjectBase; import okhttp3.HttpUrl; import okhttp3.RequestBody; +import okio.Buffer; /** * Request is a base class, all extending classes would act as a holder class that encapsulate the information @@ -69,6 +72,16 @@ public String getContentType() { public RequestBody getPayload() { return payload; } + public String getBodyToString(){ + try { + final Buffer buffer = new Buffer(); + payload.writeTo(buffer); + return buffer.readUtf8(); + } + catch (final IOException e) { + return "Unable to process payload"; + } + } public ResponseType getType() { return type; From 9faf87bc579b49ba381f9c6c7136d383914c595e Mon Sep 17 00:00:00 2001 From: AnasNaouchi Date: Wed, 17 Jan 2024 15:15:06 +0700 Subject: [PATCH 07/11] Add description to function --- src/main/java/co/omise/requests/Request.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/omise/requests/Request.java b/src/main/java/co/omise/requests/Request.java index 6517f1fd..02fb489e 100644 --- a/src/main/java/co/omise/requests/Request.java +++ b/src/main/java/co/omise/requests/Request.java @@ -72,7 +72,13 @@ public String getContentType() { public RequestBody getPayload() { return payload; } - public String getBodyToString(){ + + /** + * Gets payload (request params). + * + * @return the payload as a readable string + */ + public String getPayloadToString(){ try { final Buffer buffer = new Buffer(); payload.writeTo(buffer); From 59f4c8bb3909fc3ca08df9a070aee1a386c66e1b Mon Sep 17 00:00:00 2001 From: AnasNaouchi Date: Thu, 18 Jan 2024 13:01:02 +0700 Subject: [PATCH 08/11] Fix exception --- src/main/java/co/omise/requests/Request.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/co/omise/requests/Request.java b/src/main/java/co/omise/requests/Request.java index 02fb489e..0cde9b29 100644 --- a/src/main/java/co/omise/requests/Request.java +++ b/src/main/java/co/omise/requests/Request.java @@ -78,15 +78,10 @@ public RequestBody getPayload() { * * @return the payload as a readable string */ - public String getPayloadToString(){ - try { - final Buffer buffer = new Buffer(); - payload.writeTo(buffer); - return buffer.readUtf8(); - } - catch (final IOException e) { - return "Unable to process payload"; - } + public String getPayloadToString() throws IOException { + final Buffer buffer = new Buffer(); + payload.writeTo(buffer); + return buffer.readUtf8(); } public ResponseType getType() { From 503d3ee945abf7c30d7c082f12410e100c20066d Mon Sep 17 00:00:00 2001 From: Anas Naouchi <113893333+AnasNaouchi@users.noreply.github.com> Date: Fri, 19 Jan 2024 09:45:26 +0700 Subject: [PATCH 09/11] Format Co-authored-by: Daniel Fowler --- src/main/java/co/omise/models/Source.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/co/omise/models/Source.java b/src/main/java/co/omise/models/Source.java index d0fde4ca..dbf71a56 100644 --- a/src/main/java/co/omise/models/Source.java +++ b/src/main/java/co/omise/models/Source.java @@ -292,6 +292,7 @@ public CreateRequestBuilder email(String email) { this.email = email; return this; } + public CreateRequestBuilder ip(String ip) { this.ip = ip; return this; From 76dcfbd11ad58fe17b17d135b7d072235d814f35 Mon Sep 17 00:00:00 2001 From: AnasNaouchi Date: Fri, 19 Jan 2024 10:02:06 +0700 Subject: [PATCH 10/11] Rename SourceType --- src/main/java/co/omise/models/SourceType.java | 2 +- src/test/java/co/omise/live/LiveChargeRequestTest.java | 4 ++-- src/test/java/co/omise/models/SourceTypeTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/co/omise/models/SourceType.java b/src/main/java/co/omise/models/SourceType.java index ad853348..087e60b3 100644 --- a/src/main/java/co/omise/models/SourceType.java +++ b/src/main/java/co/omise/models/SourceType.java @@ -84,7 +84,7 @@ public enum SourceType { @JsonProperty("duitnow_obw") DuitNowOBW, @JsonProperty("wechat_pay") - WechatPay; + WeChatPay; @Override public String toString() { diff --git a/src/test/java/co/omise/live/LiveChargeRequestTest.java b/src/test/java/co/omise/live/LiveChargeRequestTest.java index 782cf6dc..0b510eb8 100644 --- a/src/test/java/co/omise/live/LiveChargeRequestTest.java +++ b/src/test/java/co/omise/live/LiveChargeRequestTest.java @@ -642,7 +642,7 @@ public void testLiveChargeWithDuitNowOBW() throws IOException, OmiseException { public void testLiveChargeWithWechatPay() throws IOException, OmiseException { Request sourceRequest = new Source.CreateRequestBuilder() - .type(SourceType.WechatPay) + .type(SourceType.WeChatPay) .amount(15000) .currency("THB") .ip("127.0.0.1") @@ -666,7 +666,7 @@ public void testLiveChargeWithWechatPay() throws IOException, OmiseException { assertEquals(15000, charge.getAmount()); assertEquals("THB", charge.getCurrency()); assertEquals("127.0.0.1", charge.getSource().getIp()); - assertEquals(SourceType.WechatPay, charge.getSource().getType()); + assertEquals(SourceType.WeChatPay, charge.getSource().getType()); assertEquals(FlowType.AppRedirect, charge.getSource().getFlow()); } } diff --git a/src/test/java/co/omise/models/SourceTypeTest.java b/src/test/java/co/omise/models/SourceTypeTest.java index 4f4cd2b4..bcf4b3b6 100644 --- a/src/test/java/co/omise/models/SourceTypeTest.java +++ b/src/test/java/co/omise/models/SourceTypeTest.java @@ -36,6 +36,6 @@ public void checkStringValue() { assertEquals("mobile_banking_ktb", SourceType.MobileBankingKtb.toString()); assertEquals("atome", SourceType.Atome.toString()); assertEquals("duitnow_obw", SourceType.DuitNowOBW.toString()); - assertEquals("wechat_pay", SourceType.WechatPay.toString()); + assertEquals("wechat_pay", SourceType.WeChatPay.toString()); } } From 0d4250601869d2dc78a94b1a98ab4cec2641062c Mon Sep 17 00:00:00 2001 From: AnasNaouchi Date: Mon, 22 Jan 2024 02:00:26 +0700 Subject: [PATCH 11/11] Add tests for WeChatPay ip enforcement --- .../co/omise/requests/SourceRequestTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/test/java/co/omise/requests/SourceRequestTest.java b/src/test/java/co/omise/requests/SourceRequestTest.java index 01b4c6a2..9cd3652b 100644 --- a/src/test/java/co/omise/requests/SourceRequestTest.java +++ b/src/test/java/co/omise/requests/SourceRequestTest.java @@ -1,5 +1,8 @@ package co.omise.requests; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + import co.omise.models.OmiseException; import co.omise.models.Source; import co.omise.models.SourceType; @@ -45,4 +48,40 @@ public void testCreateInstallment() throws IOException, OmiseException { assertEquals("thb", source.getCurrency()); assertEquals("redirect", source.getFlow().toString()); } + + @Test + public void testWeChatPaySourceIpMustBeNullWhenEmpty() throws IOException { + Request request = new TestSourceRequestBuilder() + .type(SourceType.WeChatPay) + .amount(500000) + .currency("thb") + .build(); + + // The key must exist in the request with a value of null + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(request.getPayloadToString()); + + assertTrue(rootNode.has("ip")); + assertNull(rootNode.get("ip").textValue()); + + } + + @Test + public void testWeChatPaySourceIpMustHaveValueWhenPassed() throws IOException { + String ip = "127.0.0.1"; + Request request = new TestSourceRequestBuilder() + .type(SourceType.WeChatPay) + .amount(500000) + .ip(ip) + .currency("thb") + .build(); + + // The key must exist in the request with the passed value + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(request.getPayloadToString()); + + assertTrue(rootNode.has("ip")); + assertEquals(rootNode.get("ip").textValue(), ip); + + } }