From 75d0d07e551bf644b306cf13b692973091c635ae Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Sun, 31 Jul 2022 10:27:10 +0300 Subject: [PATCH 01/14] add 3ds global support --- .../java/cc/protea/spreedly/Spreedly.java | 18 ++++- .../spreedly/model/SpreedlyAmexDetails.java | 28 +++++++ .../spreedly/model/SpreedlyAmexNetwork.java | 48 +++++++++++ .../spreedly/model/SpreedlyCreditNetwork.java | 46 +++++++++++ .../model/SpreedlyMastercardDetails.java | 29 +++++++ .../model/SpreedlyMastercardNetwork.java | 48 +++++++++++ .../model/SpreedlyMerchantProfile.java | 45 +++++++++++ .../model/SpreedlyMerchantProfileRequest.java | 49 ++++++++++++ .../spreedly/model/SpreedlyScaProvider.java | 80 +++++++++++++++++++ .../model/SpreedlyScaProviderRequest.java | 62 ++++++++++++++ .../spreedly/model/SpreedlyVisaDetails.java | 28 +++++++ .../spreedly/model/SpreedlyVisaNetwork.java | 48 +++++++++++ 12 files changed, 528 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyAmexDetails.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyAmexNetwork.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyCreditNetwork.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyMastercardDetails.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyMastercardNetwork.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfile.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfileRequest.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyScaProvider.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyScaProviderRequest.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyVisaDetails.java create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyVisaNetwork.java diff --git a/src/main/java/cc/protea/spreedly/Spreedly.java b/src/main/java/cc/protea/spreedly/Spreedly.java index 8c7536b..0e4f811 100644 --- a/src/main/java/cc/protea/spreedly/Spreedly.java +++ b/src/main/java/cc/protea/spreedly/Spreedly.java @@ -1,7 +1,6 @@ package cc.protea.spreedly; import cc.protea.spreedly.model.*; -import cc.protea.spreedly.model.internal.*; import java.util.ArrayList; import java.util.List; @@ -400,4 +399,21 @@ public SpreedlyTransactionResponse complete(String token) { return util.post("https://core.spreedly.com/v1/transactions/" + token + "/complete.xml", null, SpreedlyTransactionResponse.class); } + /** + * Completes a 3DS 2 transaction in the device fingerprint stage. + * For more details see https://docs.spreedly.com/guides/3dsecure2/ + * @param token transaction_token to complete + */ + public SpreedlyMerchantProfile create(final SpreedlyMerchantProfileRequest request) { + return util.post("https://core.spreedly.com/v1/merchant_profiles.xml", request, SpreedlyMerchantProfile.class); + } + + /** + * Adds a gateway account to the authenticated environment. One gateway account is required for each set of merchant account + * credentials. Spreedly stores and protects the credentials to be used to authenticate with gateway accounts for + * transaction processing. + */ + public SpreedlyScaProvider create(final SpreedlyScaProviderRequest request) { + return util.post("https://core.spreedly.com/v1/sca/providers.xml", request, SpreedlyScaProvider.class); + } } diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyAmexDetails.java b/src/main/java/cc/protea/spreedly/model/SpreedlyAmexDetails.java new file mode 100644 index 0000000..b8a2861 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyAmexDetails.java @@ -0,0 +1,28 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; + +@XmlRootElement(name = "amex") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyAmexDetails { + + @XmlElement(name = "acquirer_bin") public Long acquirerBin; + @XmlElement(name = "merchant_url") public String merchantUrl; + + public Long getAcquirerBin() { + return acquirerBin; + } + + public void setAcquirerBin(Long acquirerBin) { + this.acquirerBin = acquirerBin; + } + + public String getMerchantUrl() { + return merchantUrl; + } + + public void setMerchantUrl(String merchantUrl) { + this.merchantUrl = merchantUrl; + } + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyAmexNetwork.java b/src/main/java/cc/protea/spreedly/model/SpreedlyAmexNetwork.java new file mode 100644 index 0000000..30ebb9b --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyAmexNetwork.java @@ -0,0 +1,48 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; + +@XmlRootElement(name = "amex") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyAmexNetwork { + + @XmlElement(name = "acquirer_merchant_id") public Long acquirerMerchantId; + @XmlElement(name = "country_code") public String countryCode; + @XmlElement(name = "mcc") public Long mcc; + @XmlElement(name = "merchant_name") public String name; + + public Long getAcquirerMerchantId() { + return acquirerMerchantId; + } + + public void setAcquirerMerchantId(Long acquirerMerchantId) { + this.acquirerMerchantId = acquirerMerchantId; + } + + public String getCountryCode() { + return countryCode; + } + + public void setCountryCode(String countryCode) { + this.countryCode = countryCode; + } + + public Long getMcc() { + return mcc; + } + + public void setMcc(Long mcc) { + this.mcc = mcc; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyCreditNetwork.java b/src/main/java/cc/protea/spreedly/model/SpreedlyCreditNetwork.java new file mode 100644 index 0000000..cd319e3 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyCreditNetwork.java @@ -0,0 +1,46 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; +import java.util.ArrayList; +import java.util.List; + +@XmlRootElement(name = "card_networks") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyCreditNetwork { + + @XmlElementWrapper(name = "visa") + @XmlElement(name = "visa") + public SpreedlyVisaNetwork visa; + @XmlElementWrapper(name = "mastercard") + @XmlElement(name = "mastercard") + public SpreedlyMastercardNetwork mastercard; + @XmlElementWrapper(name = "amex") + @XmlElement(name = "amex") + public SpreedlyAmexNetwork amex; + + public SpreedlyVisaNetwork getVisa() { + return visa; + } + + public void setVisa(SpreedlyVisaNetwork visa) { + this.visa = visa; + } + + public SpreedlyMastercardNetwork getMastercard() { + return mastercard; + } + + public void setMastercard(SpreedlyMastercardNetwork mastercard) { + this.mastercard = mastercard; + } + + public SpreedlyAmexNetwork getAmex() { + return amex; + } + + public void setAmex(SpreedlyAmexNetwork amex) { + this.amex = amex; + } + + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardDetails.java b/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardDetails.java new file mode 100644 index 0000000..484f5f2 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardDetails.java @@ -0,0 +1,29 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; + +@XmlRootElement(name = "mastercard") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyMastercardDetails { + + @XmlElement(name = "acquirer_bin") public Long acquirerBin; + @XmlElement(name = "merchant_url") public String merchantUrl; + + public Long getAcquirerBin() { + return acquirerBin; + } + + public void setAcquirerBin(Long acquirerBin) { + this.acquirerBin = acquirerBin; + } + + public String getMerchantUrl() { + return merchantUrl; + } + + public void setMerchantUrl(String merchantUrl) { + this.merchantUrl = merchantUrl; + } + + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardNetwork.java b/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardNetwork.java new file mode 100644 index 0000000..6b4b204 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardNetwork.java @@ -0,0 +1,48 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; + +@XmlRootElement(name = "mastercard") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyMastercardNetwork { + + @XmlElement(name = "acquirer_merchant_id") public Long acquirerMerchantId; + @XmlElement(name = "country_code") public String countryCode; + @XmlElement(name = "mcc") public Long mcc; + @XmlElement(name = "merchant_name") public String name; + + public Long getAcquirerMerchantId() { + return acquirerMerchantId; + } + + public void setAcquirerMerchantId(Long acquirerMerchantId) { + this.acquirerMerchantId = acquirerMerchantId; + } + + public String getCountryCode() { + return countryCode; + } + + public void setCountryCode(String countryCode) { + this.countryCode = countryCode; + } + + public Long getMcc() { + return mcc; + } + + public void setMcc(Long mcc) { + this.mcc = mcc; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfile.java b/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfile.java new file mode 100644 index 0000000..2cf549c --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfile.java @@ -0,0 +1,45 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@XmlRootElement(name = "merchant_profile") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyMerchantProfile { + @XmlElement(name = "description") public String description; + @XmlElement(name = "token") public String token; + @XmlElementWrapper(name = "card_networks") + @XmlElement(name = "card_networks") + SpreedlyCreditNetwork creditNetwork; + @XmlElement(name = "created_at") public Date createdOn; + @XmlElement(name = "updated_at") public Date updatedOn; + + + public SpreedlyCreditNetwork getCreditNetwork() { + return creditNetwork; + } + public void setCreditNetwork(SpreedlyCreditNetwork creditNetwork) { + this.creditNetwork = creditNetwork; + } + public Date getCreatedOn() { + return createdOn; + } + public void setCreatedOn(final Date createdOn) { + this.createdOn = createdOn; + } + public Date getUpdatedOn() { + return updatedOn; + } + public void setUpdatedOn(final Date updatedOn) { + this.updatedOn = updatedOn; + } + public String getDescription() { + return description; + } + public void setDescription(final String description) { + this.description = description; + } + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfileRequest.java b/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfileRequest.java new file mode 100644 index 0000000..e7536e9 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfileRequest.java @@ -0,0 +1,49 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; + +@XmlRootElement(name = "merchant_profile") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyMerchantProfileRequest { + @XmlElement(name = "description") public String description; + @XmlElementWrapper(name = "amex") + @XmlElement(name = "amex") + public SpreedlyAmexNetwork amex; + @XmlElementWrapper(name = "visa") + @XmlElement(name = "visa") + public SpreedlyVisaNetwork visa; + @XmlElementWrapper(name = "mastercard") + @XmlElement(name = "mastercard") + public SpreedlyMastercardNetwork mastercard; + + public SpreedlyAmexNetwork getAmex() { + return amex; + } + + public void setAmex(SpreedlyAmexNetwork amex) { + this.amex = amex; + } + + public SpreedlyVisaNetwork getVisa() { + return visa; + } + + public void setVisa(SpreedlyVisaNetwork visa) { + this.visa = visa; + } + + public SpreedlyMastercardNetwork getMastercard() { + return mastercard; + } + + public void setMastercard(SpreedlyMastercardNetwork mastercard) { + this.mastercard = mastercard; + } + + public String getDescription() { + return description; + } + public void setDescription(final String description) { + this.description = description; + } +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyScaProvider.java b/src/main/java/cc/protea/spreedly/model/SpreedlyScaProvider.java new file mode 100644 index 0000000..3596300 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyScaProvider.java @@ -0,0 +1,80 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; +import java.util.Date; + +@XmlRootElement(name = "sca_provider") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyScaProvider { + + @XmlElement(name = "token") public String token; + @XmlElement(name = "type") public String type ; + @XmlElement(name = "created_at") public Date createdOn; + @XmlElement(name = "updated_at") public Date updatedOn; + @XmlElementWrapper(name = "visa") + @XmlElement(name = "visa") + public SpreedlyVisaDetails visa; + @XmlElementWrapper(name = "mastercard") + @XmlElement(name = "mastercard") + public SpreedlyMastercardDetails mastercard; + + public String isType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public SpreedlyVisaDetails getVisa() { + return visa; + } + + public void setVisa(SpreedlyVisaDetails visa) { + this.visa = visa; + } + + public SpreedlyMastercardDetails getMastercard() { + return mastercard; + } + + public void setMastercard(SpreedlyMastercardDetails mastercard) { + this.mastercard = mastercard; + } + + public SpreedlyAmexDetails getAmex() { + return amex; + } + + public void setAmex(SpreedlyAmexDetails amex) { + this.amex = amex; + } + + @XmlElementWrapper(name = "amex") + @XmlElement(name = "amex") + public SpreedlyAmexDetails amex; + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + + + public Date getCreatedOn() { + return createdOn; + } + public void setCreatedOn(final Date createdOn) { + this.createdOn = createdOn; + } + public Date getUpdatedOn() { + return updatedOn; + } + public void setUpdatedOn(final Date updatedOn) { + this.updatedOn = updatedOn; + } + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyScaProviderRequest.java b/src/main/java/cc/protea/spreedly/model/SpreedlyScaProviderRequest.java new file mode 100644 index 0000000..c028fca --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyScaProviderRequest.java @@ -0,0 +1,62 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; +import java.util.Date; + +@XmlRootElement(name = "sca_provider") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyScaProviderRequest { + + @XmlElement(name = "merchant_profile_key") public String merchantProfileKey; + @XmlElement(name = "type") public String type ; + @XmlElementWrapper(name = "visa") + @XmlElement(name = "visa") + public SpreedlyVisaDetails visa; + @XmlElementWrapper(name = "mastercard") + @XmlElement(name = "mastercard") + public SpreedlyMastercardDetails mastercard; + @XmlElementWrapper(name = "amex") + @XmlElement(name = "amex") + public SpreedlyAmexDetails amex; + + public String getMerchantProfileKey() { + return merchantProfileKey; + } + + public void setMerchantProfileKey(String merchantProfileKey) { + this.merchantProfileKey = merchantProfileKey; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public SpreedlyVisaDetails getVisa() { + return visa; + } + + public void setVisa(SpreedlyVisaDetails visa) { + this.visa = visa; + } + + public SpreedlyMastercardDetails getMastercard() { + return mastercard; + } + + public void setMastercard(SpreedlyMastercardDetails mastercard) { + this.mastercard = mastercard; + } + + public SpreedlyAmexDetails getAmex() { + return amex; + } + + public void setAmex(SpreedlyAmexDetails amex) { + this.amex = amex; + } + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyVisaDetails.java b/src/main/java/cc/protea/spreedly/model/SpreedlyVisaDetails.java new file mode 100644 index 0000000..dc8f37e --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyVisaDetails.java @@ -0,0 +1,28 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; + +@XmlRootElement(name = "visa") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyVisaDetails { + + @XmlElement(name = "acquirer_bin") public Long acquirerBin; + @XmlElement(name = "merchant_url") public String merchantUrl; + + public Long getAcquirerBin() { + return acquirerBin; + } + + public void setAcquirerBin(Long acquirerBin) { + this.acquirerBin = acquirerBin; + } + + public String getMerchantUrl() { + return merchantUrl; + } + + public void setMerchantUrl(String merchantUrl) { + this.merchantUrl = merchantUrl; + } + +} \ No newline at end of file diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyVisaNetwork.java b/src/main/java/cc/protea/spreedly/model/SpreedlyVisaNetwork.java new file mode 100644 index 0000000..4d1cd67 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyVisaNetwork.java @@ -0,0 +1,48 @@ +package cc.protea.spreedly.model; + +import javax.xml.bind.annotation.*; + +@XmlRootElement(name = "visa") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyVisaNetwork { + + @XmlElement(name = "acquirer_merchant_id") public Long acquirerMerchantId; + @XmlElement(name = "country_code") public String countryCode; + @XmlElement(name = "mcc") public Long mcc; + @XmlElement(name = "merchant_name") public String name; + + public Long getAcquirerMerchantId() { + return acquirerMerchantId; + } + + public void setAcquirerMerchantId(Long acquirerMerchantId) { + this.acquirerMerchantId = acquirerMerchantId; + } + + public String getCountryCode() { + return countryCode; + } + + public void setCountryCode(String countryCode) { + this.countryCode = countryCode; + } + + public Long getMcc() { + return mcc; + } + + public void setMcc(Long mcc) { + this.mcc = mcc; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + +} \ No newline at end of file From 019cf0fa65f7e7bafa0e9ad81cef54958fb76108 Mon Sep 17 00:00:00 2001 From: David Radchenko Date: Sun, 31 Jul 2022 11:42:33 +0300 Subject: [PATCH 02/14] Update Spreedly.java --- src/main/java/cc/protea/spreedly/Spreedly.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/cc/protea/spreedly/Spreedly.java b/src/main/java/cc/protea/spreedly/Spreedly.java index 0e4f811..bdf60e0 100644 --- a/src/main/java/cc/protea/spreedly/Spreedly.java +++ b/src/main/java/cc/protea/spreedly/Spreedly.java @@ -390,15 +390,6 @@ public SpreedlyPaymentMethod update(final SpreedlyPaymentMethod paymentMethod) { return util.put("https://core.spreedly.com/v1/payment_methods/" + paymentMethod.token + ".xml", paymentMethod, SpreedlyPaymentMethod.class); } - /** - * Completes a 3DS 2 transaction in the device fingerprint stage. - * For more details see https://docs.spreedly.com/guides/3dsecure2/ - * @param token transaction_token to complete - */ - public SpreedlyTransactionResponse complete(String token) { - return util.post("https://core.spreedly.com/v1/transactions/" + token + "/complete.xml", null, SpreedlyTransactionResponse.class); - } - /** * Completes a 3DS 2 transaction in the device fingerprint stage. * For more details see https://docs.spreedly.com/guides/3dsecure2/ From c494b82f2330b2d6b028bd43a8bde2651a0b5a16 Mon Sep 17 00:00:00 2001 From: David Radchenko Date: Sun, 31 Jul 2022 11:44:05 +0300 Subject: [PATCH 03/14] Update pom.xml --- pom.xml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 3784552..6a6c4c6 100644 --- a/pom.xml +++ b/pom.xml @@ -93,20 +93,13 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.1.1 + 2.9.1 attach-javadocs jar - - false - false - 1.8 - http://docs.oracle.com/javase/7/docs/api/ http://docs.oracle.com/javase/7/docs/api/ - none - From 19da57777d3593c2acba511887c09139032407d1 Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Sun, 31 Jul 2022 12:25:37 +0300 Subject: [PATCH 04/14] add 3ds global support --- .../spreedly/model/SpreedlyTransactionRequest.java | 13 +++++++++++++ .../spreedly/model/SpreedlyTransactionResponse.java | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java index 2bcbc7c..0b5beaf 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java @@ -101,6 +101,10 @@ public class SpreedlyTransactionRequest { */ @XmlElement(name = "three_ds_version") public String threeDsVersion; + /** + * Charge an SCA Authenticated payment method (already stored in the Spreedly environment) the specified amount. + */ + @XmlElement(name = "sca_authentication_token") public String scaAuthenticationToken; /** * @return A unique string generated by Spreedly to identify a gateway. */ @@ -350,4 +354,13 @@ public void setThreeDsVersion(String threeDsVersion) { this.threeDsVersion = threeDsVersion; } + + public String getScaAuthenticationToken() { + return scaAuthenticationToken; + } + + public void setScaAuthenticationToken(String scaAuthenticationToken) { + this.scaAuthenticationToken = scaAuthenticationToken; + } + } diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionResponse.java b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionResponse.java index 8732eff..e12c56c 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionResponse.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionResponse.java @@ -133,6 +133,11 @@ public class SpreedlyTransactionResponse implements SpreedlyErrorSetting { @XmlElement(name = "challenge_url") public String challengeUrl; @XmlElement(name = "challenge_form") public String challengeForm; + + /** + * Charge an SCA Authenticated payment method (already stored in the Spreedly environment) the specified amount. + */ + @XmlElement(name = "sca_authentication_token") public String scaAuthenticationToken; /** * @return Any positive whole number, for example 1234 = $12.34. @@ -594,4 +599,12 @@ public SpreedlyTransactionResponse setChallengeForm(String challengeForm) this.challengeForm = challengeForm; return this; } + + public String getScaAuthenticationToken() { + return scaAuthenticationToken; + } + + public void setScaAuthenticationToken(String scaAuthenticationToken) { + this.scaAuthenticationToken = scaAuthenticationToken; + } } From e60ea6021d4cc9d225737943f8d2fc9fdda756c2 Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Sun, 31 Jul 2022 12:26:55 +0300 Subject: [PATCH 05/14] add 3ds global support --- pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a6c4c6..3784552 100644 --- a/pom.xml +++ b/pom.xml @@ -93,13 +93,20 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9.1 + 3.1.1 attach-javadocs jar + + false + false + 1.8 + http://docs.oracle.com/javase/7/docs/api/ http://docs.oracle.com/javase/7/docs/api/ + none + From d524404e5dcd8ea21c1370d6966e6ecf4e7e55a3 Mon Sep 17 00:00:00 2001 From: David Radchenko Date: Sun, 31 Jul 2022 12:43:28 +0300 Subject: [PATCH 06/14] Update Spreedly.java --- src/main/java/cc/protea/spreedly/Spreedly.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/cc/protea/spreedly/Spreedly.java b/src/main/java/cc/protea/spreedly/Spreedly.java index bdf60e0..14572cc 100644 --- a/src/main/java/cc/protea/spreedly/Spreedly.java +++ b/src/main/java/cc/protea/spreedly/Spreedly.java @@ -390,6 +390,10 @@ public SpreedlyPaymentMethod update(final SpreedlyPaymentMethod paymentMethod) { return util.put("https://core.spreedly.com/v1/payment_methods/" + paymentMethod.token + ".xml", paymentMethod, SpreedlyPaymentMethod.class); } + public SpreedlyTransactionResponse complete(String token, SpreedlyCompleteRequest request) { + return (SpreedlyTransactionResponse)this.util.post("https://core.spreedly.com/v1/transactions/" + token + "/complete.xml", request, SpreedlyTransactionResponse.class); + } + /** * Completes a 3DS 2 transaction in the device fingerprint stage. * For more details see https://docs.spreedly.com/guides/3dsecure2/ From 32b5cd9e83fbec4a9ccac2c88752fa699c0df08c Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Mon, 1 Aug 2022 14:08:28 +0300 Subject: [PATCH 07/14] add 3ds global support --- pom.xml | 9 +++++++-- .../protea/spreedly/model/SpreedlyAmexNetwork.java | 12 ++++++------ .../spreedly/model/SpreedlyMastercardNetwork.java | 12 ++++++------ .../protea/spreedly/model/SpreedlyVisaNetwork.java | 12 ++++++------ 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index 3784552..5e415d6 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,8 @@ UTF-8 + 1.8 + 1.8 @@ -58,7 +60,11 @@ http [0.2,) - + + javax.xml.bind + jaxb-api + 2.3.0 + @@ -155,5 +161,4 @@ https://oss.sonatype.org/content/repositories/snapshots - diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyAmexNetwork.java b/src/main/java/cc/protea/spreedly/model/SpreedlyAmexNetwork.java index 30ebb9b..821bb6a 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyAmexNetwork.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyAmexNetwork.java @@ -6,24 +6,24 @@ @XmlAccessorType(XmlAccessType.FIELD) public class SpreedlyAmexNetwork { - @XmlElement(name = "acquirer_merchant_id") public Long acquirerMerchantId; - @XmlElement(name = "country_code") public String countryCode; + @XmlElement(name = "acquirer_merchant_id") public String acquirerMerchantId; + @XmlElement(name = "country_code") public Long countryCode; @XmlElement(name = "mcc") public Long mcc; @XmlElement(name = "merchant_name") public String name; - public Long getAcquirerMerchantId() { + public String getAcquirerMerchantId() { return acquirerMerchantId; } - public void setAcquirerMerchantId(Long acquirerMerchantId) { + public void setAcquirerMerchantId(String acquirerMerchantId) { this.acquirerMerchantId = acquirerMerchantId; } - public String getCountryCode() { + public Long getCountryCode() { return countryCode; } - public void setCountryCode(String countryCode) { + public void setCountryCode(Long countryCode) { this.countryCode = countryCode; } diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardNetwork.java b/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardNetwork.java index 6b4b204..b78698c 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardNetwork.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyMastercardNetwork.java @@ -6,24 +6,24 @@ @XmlAccessorType(XmlAccessType.FIELD) public class SpreedlyMastercardNetwork { - @XmlElement(name = "acquirer_merchant_id") public Long acquirerMerchantId; - @XmlElement(name = "country_code") public String countryCode; + @XmlElement(name = "acquirer_merchant_id") public String acquirerMerchantId; + @XmlElement(name = "country_code") public Long countryCode; @XmlElement(name = "mcc") public Long mcc; @XmlElement(name = "merchant_name") public String name; - public Long getAcquirerMerchantId() { + public String getAcquirerMerchantId() { return acquirerMerchantId; } - public void setAcquirerMerchantId(Long acquirerMerchantId) { + public void setAcquirerMerchantId(String acquirerMerchantId) { this.acquirerMerchantId = acquirerMerchantId; } - public String getCountryCode() { + public Long getCountryCode() { return countryCode; } - public void setCountryCode(String countryCode) { + public void setCountryCode(Long countryCode) { this.countryCode = countryCode; } diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyVisaNetwork.java b/src/main/java/cc/protea/spreedly/model/SpreedlyVisaNetwork.java index 4d1cd67..9665cd8 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyVisaNetwork.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyVisaNetwork.java @@ -6,24 +6,24 @@ @XmlAccessorType(XmlAccessType.FIELD) public class SpreedlyVisaNetwork { - @XmlElement(name = "acquirer_merchant_id") public Long acquirerMerchantId; - @XmlElement(name = "country_code") public String countryCode; + @XmlElement(name = "acquirer_merchant_id") public String acquirerMerchantId; + @XmlElement(name = "country_code") public Long countryCode; @XmlElement(name = "mcc") public Long mcc; @XmlElement(name = "merchant_name") public String name; - public Long getAcquirerMerchantId() { + public String getAcquirerMerchantId() { return acquirerMerchantId; } - public void setAcquirerMerchantId(Long acquirerMerchantId) { + public void setAcquirerMerchantId(String acquirerMerchantId) { this.acquirerMerchantId = acquirerMerchantId; } - public String getCountryCode() { + public Long getCountryCode() { return countryCode; } - public void setCountryCode(String countryCode) { + public void setCountryCode(Long countryCode) { this.countryCode = countryCode; } From 1fb0a8d1891d9d5b8bc8cf362711c2c17303fa91 Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Wed, 3 Aug 2022 00:58:56 +0300 Subject: [PATCH 08/14] add 3ds global support --- .../cc/protea/spreedly/model/SpreedlyCreditNetwork.java | 5 ----- .../cc/protea/spreedly/model/SpreedlyMerchantProfile.java | 1 - .../spreedly/model/SpreedlyMerchantProfileRequest.java | 6 ++---- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyCreditNetwork.java b/src/main/java/cc/protea/spreedly/model/SpreedlyCreditNetwork.java index cd319e3..70751d0 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyCreditNetwork.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyCreditNetwork.java @@ -1,20 +1,15 @@ package cc.protea.spreedly.model; import javax.xml.bind.annotation.*; -import java.util.ArrayList; -import java.util.List; @XmlRootElement(name = "card_networks") @XmlAccessorType(XmlAccessType.FIELD) public class SpreedlyCreditNetwork { - @XmlElementWrapper(name = "visa") @XmlElement(name = "visa") public SpreedlyVisaNetwork visa; - @XmlElementWrapper(name = "mastercard") @XmlElement(name = "mastercard") public SpreedlyMastercardNetwork mastercard; - @XmlElementWrapper(name = "amex") @XmlElement(name = "amex") public SpreedlyAmexNetwork amex; diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfile.java b/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfile.java index 2cf549c..cab0404 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfile.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfile.java @@ -10,7 +10,6 @@ public class SpreedlyMerchantProfile { @XmlElement(name = "description") public String description; @XmlElement(name = "token") public String token; - @XmlElementWrapper(name = "card_networks") @XmlElement(name = "card_networks") SpreedlyCreditNetwork creditNetwork; @XmlElement(name = "created_at") public Date createdOn; diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfileRequest.java b/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfileRequest.java index e7536e9..3e20472 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfileRequest.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyMerchantProfileRequest.java @@ -5,14 +5,12 @@ @XmlRootElement(name = "merchant_profile") @XmlAccessorType(XmlAccessType.FIELD) public class SpreedlyMerchantProfileRequest { - @XmlElement(name = "description") public String description; - @XmlElementWrapper(name = "amex") + @XmlElement(name = "description") + public String description; @XmlElement(name = "amex") public SpreedlyAmexNetwork amex; - @XmlElementWrapper(name = "visa") @XmlElement(name = "visa") public SpreedlyVisaNetwork visa; - @XmlElementWrapper(name = "mastercard") @XmlElement(name = "mastercard") public SpreedlyMastercardNetwork mastercard; From d8b141fe91213b3a8fb83858d52c429bc646aa7b Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Wed, 3 Aug 2022 01:50:06 +0300 Subject: [PATCH 09/14] add 3ds global support --- src/main/java/cc/protea/spreedly/Spreedly.java | 4 ---- .../protea/spreedly/model/SpreedlyScaProvider.java | 12 ++++++------ .../spreedly/model/SpreedlyScaProviderRequest.java | 3 --- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/main/java/cc/protea/spreedly/Spreedly.java b/src/main/java/cc/protea/spreedly/Spreedly.java index 14572cc..bdf60e0 100644 --- a/src/main/java/cc/protea/spreedly/Spreedly.java +++ b/src/main/java/cc/protea/spreedly/Spreedly.java @@ -390,10 +390,6 @@ public SpreedlyPaymentMethod update(final SpreedlyPaymentMethod paymentMethod) { return util.put("https://core.spreedly.com/v1/payment_methods/" + paymentMethod.token + ".xml", paymentMethod, SpreedlyPaymentMethod.class); } - public SpreedlyTransactionResponse complete(String token, SpreedlyCompleteRequest request) { - return (SpreedlyTransactionResponse)this.util.post("https://core.spreedly.com/v1/transactions/" + token + "/complete.xml", request, SpreedlyTransactionResponse.class); - } - /** * Completes a 3DS 2 transaction in the device fingerprint stage. * For more details see https://docs.spreedly.com/guides/3dsecure2/ diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyScaProvider.java b/src/main/java/cc/protea/spreedly/model/SpreedlyScaProvider.java index 3596300..2ec3013 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyScaProvider.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyScaProvider.java @@ -11,12 +11,16 @@ public class SpreedlyScaProvider { @XmlElement(name = "type") public String type ; @XmlElement(name = "created_at") public Date createdOn; @XmlElement(name = "updated_at") public Date updatedOn; - @XmlElementWrapper(name = "visa") @XmlElement(name = "visa") public SpreedlyVisaDetails visa; - @XmlElementWrapper(name = "mastercard") @XmlElement(name = "mastercard") public SpreedlyMastercardDetails mastercard; + @XmlElement(name = "amex") + public SpreedlyAmexDetails amex; + + public String getType() { + return type; + } public String isType() { return type; @@ -50,10 +54,6 @@ public void setAmex(SpreedlyAmexDetails amex) { this.amex = amex; } - @XmlElementWrapper(name = "amex") - @XmlElement(name = "amex") - public SpreedlyAmexDetails amex; - public String getToken() { return token; } diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyScaProviderRequest.java b/src/main/java/cc/protea/spreedly/model/SpreedlyScaProviderRequest.java index c028fca..4815338 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyScaProviderRequest.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyScaProviderRequest.java @@ -9,13 +9,10 @@ public class SpreedlyScaProviderRequest { @XmlElement(name = "merchant_profile_key") public String merchantProfileKey; @XmlElement(name = "type") public String type ; - @XmlElementWrapper(name = "visa") @XmlElement(name = "visa") public SpreedlyVisaDetails visa; - @XmlElementWrapper(name = "mastercard") @XmlElement(name = "mastercard") public SpreedlyMastercardDetails mastercard; - @XmlElementWrapper(name = "amex") @XmlElement(name = "amex") public SpreedlyAmexDetails amex; From f1807bd5bf0a73ee99baefe5ac8e59894d6a79d1 Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Mon, 8 Aug 2022 10:31:44 +0300 Subject: [PATCH 10/14] add 3ds global support --- .../spreedly/model/SpreedlyTransactionRequest.java | 2 +- .../spreedly/model/SpreedlyTransactionResponse.java | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java index 0b5beaf..b7024d7 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java @@ -102,7 +102,7 @@ public class SpreedlyTransactionRequest { @XmlElement(name = "three_ds_version") public String threeDsVersion; /** - * Charge an SCA Authenticated payment method (already stored in the Spreedly environment) the specified amount. + * The token received in response body of SCA Authenticate endpoint when performing an SCA Authentication on a specified payment method. */ @XmlElement(name = "sca_authentication_token") public String scaAuthenticationToken; /** diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionResponse.java b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionResponse.java index e12c56c..3d61d55 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionResponse.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionResponse.java @@ -134,11 +134,6 @@ public class SpreedlyTransactionResponse implements SpreedlyErrorSetting { @XmlElement(name = "challenge_form") public String challengeForm; - /** - * Charge an SCA Authenticated payment method (already stored in the Spreedly environment) the specified amount. - */ - @XmlElement(name = "sca_authentication_token") public String scaAuthenticationToken; - /** * @return Any positive whole number, for example 1234 = $12.34. */ @@ -599,12 +594,4 @@ public SpreedlyTransactionResponse setChallengeForm(String challengeForm) this.challengeForm = challengeForm; return this; } - - public String getScaAuthenticationToken() { - return scaAuthenticationToken; - } - - public void setScaAuthenticationToken(String scaAuthenticationToken) { - this.scaAuthenticationToken = scaAuthenticationToken; - } } From 97b7b65a8eea3801fced401f3ba9361c4b0ddefb Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Mon, 8 Aug 2022 10:40:56 +0300 Subject: [PATCH 11/14] add 3ds global support --- src/main/java/cc/protea/spreedly/Spreedly.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/cc/protea/spreedly/Spreedly.java b/src/main/java/cc/protea/spreedly/Spreedly.java index bdf60e0..eb2dd59 100644 --- a/src/main/java/cc/protea/spreedly/Spreedly.java +++ b/src/main/java/cc/protea/spreedly/Spreedly.java @@ -395,6 +395,14 @@ public SpreedlyPaymentMethod update(final SpreedlyPaymentMethod paymentMethod) { * For more details see https://docs.spreedly.com/guides/3dsecure2/ * @param token transaction_token to complete */ + public SpreedlyTransactionResponse complete(String token) { + return util.post("https://core.spreedly.com/v1/transactions/" + token + "/complete.xml", null, SpreedlyTransactionResponse.class); + } + + /** + * Create an SCA Provider on the given Merchant Profile. An SCA Provider can be used to run 3DS2 Global + * authentications on the authenticate endpoint or as part of authorize and purchase transactions. + */ public SpreedlyMerchantProfile create(final SpreedlyMerchantProfileRequest request) { return util.post("https://core.spreedly.com/v1/merchant_profiles.xml", request, SpreedlyMerchantProfile.class); } From bdcb8ff7b46904bafdeb4a3683f0aae3328c8cb3 Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Mon, 8 Aug 2022 16:24:50 +0300 Subject: [PATCH 12/14] add 3ds global support --- src/main/java/cc/protea/spreedly/Spreedly.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cc/protea/spreedly/Spreedly.java b/src/main/java/cc/protea/spreedly/Spreedly.java index eb2dd59..1f1f195 100644 --- a/src/main/java/cc/protea/spreedly/Spreedly.java +++ b/src/main/java/cc/protea/spreedly/Spreedly.java @@ -402,7 +402,7 @@ public SpreedlyTransactionResponse complete(String token) { /** * Create an SCA Provider on the given Merchant Profile. An SCA Provider can be used to run 3DS2 Global * authentications on the authenticate endpoint or as part of authorize and purchase transactions. - */ + */ public SpreedlyMerchantProfile create(final SpreedlyMerchantProfileRequest request) { return util.post("https://core.spreedly.com/v1/merchant_profiles.xml", request, SpreedlyMerchantProfile.class); } From 8ea9068085b9d51bfc64a265a00f451b04cb6bf0 Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Mon, 8 Aug 2022 17:49:31 +0300 Subject: [PATCH 13/14] add 3ds global support --- .../java/cc/protea/spreedly/Spreedly.java | 4 +- .../model/SpreedlyCompleteRequest.java | 57 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyCompleteRequest.java diff --git a/src/main/java/cc/protea/spreedly/Spreedly.java b/src/main/java/cc/protea/spreedly/Spreedly.java index 1f1f195..3e1d2b4 100644 --- a/src/main/java/cc/protea/spreedly/Spreedly.java +++ b/src/main/java/cc/protea/spreedly/Spreedly.java @@ -395,8 +395,8 @@ public SpreedlyPaymentMethod update(final SpreedlyPaymentMethod paymentMethod) { * For more details see https://docs.spreedly.com/guides/3dsecure2/ * @param token transaction_token to complete */ - public SpreedlyTransactionResponse complete(String token) { - return util.post("https://core.spreedly.com/v1/transactions/" + token + "/complete.xml", null, SpreedlyTransactionResponse.class); + public SpreedlyTransactionResponse complete(String token, SpreedlyCompleteRequest request) { + return util.post("https://core.spreedly.com/v1/transactions/" + token + "/complete.xml", request, SpreedlyTransactionResponse.class); } /** diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyCompleteRequest.java b/src/main/java/cc/protea/spreedly/model/SpreedlyCompleteRequest.java new file mode 100644 index 0000000..44c9251 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyCompleteRequest.java @@ -0,0 +1,57 @@ +package cc.protea.spreedly.model; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = {"entry"}) +@XmlRootElement(name = "context") +public class SpreedlyCompleteRequest { + + protected List entry; + + + public List getEntry() { + if (entry == null) { + entry = new ArrayList(); + } + return this.entry; + } + + public void setEntry(List entry) { + this.entry = entry; + } + + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = {"key", "value"}) + public static class Entry { + + @XmlElement(required = true) + protected String key; + @XmlElement(required = true) + protected Object value; + + public String getKey() { + return key; + } + + public void setKey(String value) { + this.key = value; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + } + +} \ No newline at end of file From 4c5298c0cfaae72962ea1a81226aebebee509a6c Mon Sep 17 00:00:00 2001 From: davidradchenko Date: Sat, 13 Aug 2022 00:14:19 +0300 Subject: [PATCH 14/14] add 3ds global support --- .../java/cc/protea/spreedly/Spreedly.java | 7 ++ .../SpreedlyScaAuthenticationResponse.java | 110 ++++++++++++++++++ .../model/SpreedlyTransactionRequest.java | 14 +++ 3 files changed, 131 insertions(+) create mode 100644 src/main/java/cc/protea/spreedly/model/SpreedlyScaAuthenticationResponse.java diff --git a/src/main/java/cc/protea/spreedly/Spreedly.java b/src/main/java/cc/protea/spreedly/Spreedly.java index 3e1d2b4..605a887 100644 --- a/src/main/java/cc/protea/spreedly/Spreedly.java +++ b/src/main/java/cc/protea/spreedly/Spreedly.java @@ -415,4 +415,11 @@ public SpreedlyMerchantProfile create(final SpreedlyMerchantProfileRequest reque public SpreedlyScaProvider create(final SpreedlyScaProviderRequest request) { return util.post("https://core.spreedly.com/v1/sca/providers.xml", request, SpreedlyScaProvider.class); } + + /** + * Authenticate a given payment method and amount against provided SCA Provider Key (specified in request URL). + */ + public SpreedlyScaAuthenticationResponse authenticateScaProvider(String scaProviderKey , final SpreedlyTransactionRequest request) { + return util.post("https://core.spreedly.com/v1/sca/providers/" + scaProviderKey + "/authenticate.xml", request, SpreedlyScaAuthenticationResponse.class); + } } diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyScaAuthenticationResponse.java b/src/main/java/cc/protea/spreedly/model/SpreedlyScaAuthenticationResponse.java new file mode 100644 index 0000000..2df30d0 --- /dev/null +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyScaAuthenticationResponse.java @@ -0,0 +1,110 @@ +package cc.protea.spreedly.model; + +import cc.protea.spreedly.model.internal.SpreedlyErrorSetting; +import cc.protea.spreedly.model.internal.SpreedlyNestedMapAdapter; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@XmlRootElement(name = "transaction") +@XmlAccessorType(XmlAccessType.FIELD) +public class SpreedlyScaAuthenticationResponse implements SpreedlyErrorSetting { + + /** + * Any positive whole number, for example 1234 = $12.34. + */ + @XmlElement(name = "amount") public Integer amountInCents; + /** + * Date and time of origination. + */ + @XmlElement(name = "created_at") public Date createdOn; + /** + * ISO 4217 Currency Code e.g., USD, MXN, EUR + */ + @XmlElement(name = "currency_code") public String currencyCode; + /** + * true if transaction was successful. + */ + public boolean succeeded; + /** + * The token uniquely identifying the transaction at Spreedly. + * This token can be passed into an authorize or purchase transaction via the sca_authentication_token field to automatically fill its payment_method_token and Third Party 3DS2 fields. + */ + public String token; + /** + * SCA Provider token that performs a Spreedly 3DS2 Global authentication before attempting the gateway transaction. + * Please see our Spreedly 3DS2 Global Guide for more info. + */ + @XmlElement(name = "sca_provider_key") public String scaProviderKey; + + public SpreedlyMessage message; + + public Integer getAmountInCents() { + return amountInCents; + } + + public void setAmountInCents(Integer amountInCents) { + this.amountInCents = amountInCents; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getCurrencyCode() { + return currencyCode; + } + + public void setCurrencyCode(String currencyCode) { + this.currencyCode = currencyCode; + } + + public boolean isSucceeded() { + return succeeded; + } + + public void setSucceeded(boolean succeeded) { + this.succeeded = succeeded; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getScaProviderKey() { + return scaProviderKey; + } + + public void setScaProviderKey(String scaProviderKey) { + this.scaProviderKey = scaProviderKey; + } + + public SpreedlyMessage getMessage() { + return message; + } + public SpreedlyScaAuthenticationResponse setMessage(final SpreedlyMessage message) { + this.message = message; + return this; + } + + public void setError(final String key, final String error) { + message = new SpreedlyMessage(); + message.key = key; + message.message = error; + this.succeeded = false; + } +} diff --git a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java index b7024d7..a130e6d 100644 --- a/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java +++ b/src/main/java/cc/protea/spreedly/model/SpreedlyTransactionRequest.java @@ -105,6 +105,13 @@ public class SpreedlyTransactionRequest { * The token received in response body of SCA Authenticate endpoint when performing an SCA Authentication on a specified payment method. */ @XmlElement(name = "sca_authentication_token") public String scaAuthenticationToken; + + /** + * SCA Provider token that performs a Spreedly 3DS2 Global authentication before attempting the gateway transaction. + * Please see our Spreedly 3DS2 Global Guide for more info. + */ + @XmlElement(name = "sca_provider_key") public String scaProviderKey; + /** * @return A unique string generated by Spreedly to identify a gateway. */ @@ -363,4 +370,11 @@ public void setScaAuthenticationToken(String scaAuthenticationToken) { this.scaAuthenticationToken = scaAuthenticationToken; } + public String getScaProviderKey() { + return scaProviderKey; + } + + public void setScaProviderKey(String scaProviderKey) { + this.scaProviderKey = scaProviderKey; + } }