From 5a3547d00c796aab8f0c8ac12e0310f7a5c4678a Mon Sep 17 00:00:00 2001 From: BJ Guillot Date: Mon, 4 Feb 2019 20:47:24 +0000 Subject: [PATCH] Amazon Pay Java SDK 3.5.0 --- CHANGES.txt | 6 + ...zon-pay-3.4.1.jar => amazon-pay-3.5.0.jar} | Bin 233645 -> 234217 bytes pom.xml | 2 +- .../request/ConfirmOrderReferenceRequest.java | 110 +++++++++++++++++- src/com/amazon/pay/request/RequestHelper.java | 30 +++-- .../amazon/pay/types/ServiceConstants.java | 6 +- tst/com/amazon/pay/TestConstants.java | 5 +- .../amazon/pay/impl/SignatureAndURLTest.java | 75 +++++++++++- .../pay/request/PaymentsAPIRequestTest.java | 12 +- 9 files changed, 229 insertions(+), 17 deletions(-) rename dist/{amazon-pay-3.4.1.jar => amazon-pay-3.5.0.jar} (82%) diff --git a/CHANGES.txt b/CHANGES.txt index 43d93a0..a3eff2f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,9 @@ +Version 3.5.0 - February 2019 +- ConfirmOrderReference API has four new request parameters: + SuccessUrl, FailureUrl, AuthorizationAmount, and AuthorizationCurrencyCode + For usage instructions, please consult the + Amazon Pay Strong Customer Authentication (SCA) Upgrade Integration Guide + Version 3.4.1 - October 2018 - Updated XMLInputFactory.newFactory() to XMLInputFactory.newInstance() in generateErrorException method (now consistent with 3.0.1 release). - Add parameter SupplementaryData to SetOrderAttributes and SetOrderReferenceDetails API calls. Only use this field at the specific direction of Amazon Pay. diff --git a/dist/amazon-pay-3.4.1.jar b/dist/amazon-pay-3.5.0.jar similarity index 82% rename from dist/amazon-pay-3.4.1.jar rename to dist/amazon-pay-3.5.0.jar index 9fab6f7d756e6e2fae73ca76919ba906da6ce0c1..0655eb82fc2a3d294d5f548d8354904171b510fd 100644 GIT binary patch delta 24478 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 z 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 diff --git a/pom.xml b/pom.xml index fdce8f3..e754013 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazon.pay amazon-pay-java-sdk jar - 3.4.1 + 3.5.0 commons-codec diff --git a/src/com/amazon/pay/request/ConfirmOrderReferenceRequest.java b/src/com/amazon/pay/request/ConfirmOrderReferenceRequest.java index ffea2b5..1550b2d 100644 --- a/src/com/amazon/pay/request/ConfirmOrderReferenceRequest.java +++ b/src/com/amazon/pay/request/ConfirmOrderReferenceRequest.java @@ -1,5 +1,5 @@ /** - * Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2016-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ */ package com.amazon.pay.request; +import com.amazon.pay.types.CurrencyCode; import java.io.Serializable; /** @@ -32,15 +33,22 @@ protected ConfirmOrderReferenceRequest getThis() { //required parameters private String amazonOrderReferenceId; + //optional parameters + private String successUrl; + private String failureUrl; + private String authorizationAmount; + private CurrencyCode authorizationCurrencyCode; + /** - * + * Constructor requires an order reference identifier. * @param amazonOrderReferenceId The order reference identifier. */ - public ConfirmOrderReferenceRequest(String amazonOrderReferenceId){ + public ConfirmOrderReferenceRequest(String amazonOrderReferenceId) { this.amazonOrderReferenceId = amazonOrderReferenceId; } /** + * The order reference identifier. * * @return AmazonOrderReferenceId */ @@ -48,6 +56,98 @@ public String getAmazonOrderReferenceId() { return amazonOrderReferenceId; } + /** + * @param currencyCode + * Three-digit currency code. In ISO 4217 format. + * + * @return ConfirmOrderReferenceRequest + * Container holding Confirm Order Reference operation parameters + */ + public ConfirmOrderReferenceRequest setAuthorizationCurrencyCode(final CurrencyCode currencyCode) { + this.authorizationCurrencyCode = currencyCode; + return this; + } + + /** + * Represents currency code for Confirm Order Reference request + * + * @return CurrencyCode + * Enum representing three-character currency code (ISO 4217) + */ + public CurrencyCode getAuthorizationCurrencyCode() { + return authorizationCurrencyCode; + } + + /** + * @param authorizationAmount + * The amount to authorize during MFA completion. + * Use this parameter if you want to set a payment + * amount that is different than the OrderTotal + * provided in the SetOrderReferenceDetails + * operation call. + * + * If this parameter is not set, the amount authorized + * during MFA will be equal to the OrderTotal. + * + * @return ConfirmOrderReferenceRequest + * Container holding Confirm Order Reference operation parameters + */ + public ConfirmOrderReferenceRequest setAuthorizationAmount(final String authorizationAmount) { + this.authorizationAmount = authorizationAmount; + return this; + } + + /** + * Represents the amount to be authorized during MFA completion. + * + * @return String + */ + public String getAuthorizationAmount() { + return authorizationAmount; + } + + /** + * @param successUrl + * The buyer is redirected to this URL if the MFA is successful. + * + * @return ConfirmOrderReferenceRequest + * Container holding Confirm Order Reference operation parameters + */ + public ConfirmOrderReferenceRequest setSuccessUrl(final String successUrl) { + this.successUrl = successUrl; + return this; + } + + /** + * Represents the URL buyer is redirected to when MFA is successful. + * + * @return String + */ + public String getSuccessUrl() { + return successUrl; + } + + /** + * @param failureUrl + * The buyer is redirected to this URL if the MFA is not successful. + * + * @return ConfirmOrderReferenceRequest + * Container holding Confirm Order Reference operation parameters + */ + public ConfirmOrderReferenceRequest setFailureUrl(final String failureUrl) { + this.failureUrl = failureUrl; + return this; + } + + /** + * Represents the URL buyer is redirected to when MFA is not successful. + * + * @return String + */ + public String getFailureUrl() { + return failureUrl; + } + /** * Returns a string representation of this object; useful for testing and * debugging. @@ -60,6 +160,10 @@ public String getAmazonOrderReferenceId() { public String toString() { return "ConfirmOrderReferenceRequest{" + "amazonOrderReferenceId=" + amazonOrderReferenceId + + ", authorizationAmount=" + authorizationAmount + + ", authorizationCurrencyCode=" + authorizationCurrencyCode + + ", successUrl=" + successUrl + + ", failureUrl=" + failureUrl + ", mwsAuthToken=" + getMwsAuthToken() + '}'; } diff --git a/src/com/amazon/pay/request/RequestHelper.java b/src/com/amazon/pay/request/RequestHelper.java index 96d893a..a47edca 100644 --- a/src/com/amazon/pay/request/RequestHelper.java +++ b/src/com/amazon/pay/request/RequestHelper.java @@ -1,5 +1,5 @@ /** - * Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2016-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -252,6 +252,22 @@ public String getPostURL(ConfirmOrderReferenceRequest request) { if (request.getAmazonOrderReferenceId() != null) { parameters.put(ServiceConstants.AMAZON_ORDER_REFERENCE_ID, request.getAmazonOrderReferenceId()); } + if (request.getSuccessUrl() != null) { + parameters.put(ServiceConstants.SUCCESS_URL, request.getSuccessUrl()); + } + if (request.getFailureUrl() != null) { + parameters.put(ServiceConstants.FAILURE_URL, request.getFailureUrl()); + } + + if (request.getAuthorizationAmount() != null) { + parameters.put(ServiceConstants.AUTHORIZATION_AMOUNT, request.getAuthorizationAmount()); + + if (request.getAuthorizationCurrencyCode() == null) { + request.setAuthorizationCurrencyCode(payConfig.getCurrencyCode()); + } + parameters.put(ServiceConstants.AUTHORIZATION_CURRENCEYCODE, request.getAuthorizationCurrencyCode().toString()); + } + addClientParameters(parameters, request); return Util.convertParameterMapToString(parameters); } @@ -298,9 +314,9 @@ public String getPostURL(CloseAuthorizationRequest request) { public String getPostURL(RefundRequest request) { Map parameters = new TreeMap(); parameters.put(ServiceConstants.ACTION, ServiceConstants.REFUND); - if (request.getRefundCurrencyCode() == null) + if (request.getRefundCurrencyCode() == null) { request.setRefundCurrencyCode(payConfig.getCurrencyCode()); - + } if (request.getAmazonCaptureId() != null) { parameters.put(ServiceConstants.AMAZON_CAPTURE_ID, request.getAmazonCaptureId()); } @@ -432,13 +448,13 @@ public String getPostURL(AuthorizeOnBillingAgreementRequest request) { request.setAuthorizationCurrencyCode(payConfig.getCurrencyCode()); if (request.getAmazonBillingAgreementId() != null) parameters.put(ServiceConstants.AMAZON_BILLING_AGREEMENT_ID, request.getAmazonBillingAgreementId()); - if (request.getAuthorizationReferenceId() != null) + if (request.getAuthorizationReferenceId() != null) parameters.put(ServiceConstants.AUTHORIZATION_REFERENCE_ID, request.getAuthorizationReferenceId()); - if (request.getAuthorizationAmount() != null) + if (request.getAuthorizationAmount() != null) parameters.put(ServiceConstants.AUTHORIZATION_AMOUNT, request.getAuthorizationAmount()); - if (request.getAuthorizationCurrencyCode() != null) + if (request.getAuthorizationCurrencyCode() != null) parameters.put(ServiceConstants.AUTHORIZATION_CURRENCEYCODE, request.getAuthorizationCurrencyCode().toString()); - if (request.getSellerAuthorizationNote() != null) + if (request.getSellerAuthorizationNote() != null) parameters.put(ServiceConstants.SELLER_AUTHORIZATION_NOTE, request.getSellerAuthorizationNote()); if (request.getTransactionTimeout() != null) parameters.put(ServiceConstants.TRANSACTION_TIMEOUT, request.getTransactionTimeout()); diff --git a/src/com/amazon/pay/types/ServiceConstants.java b/src/com/amazon/pay/types/ServiceConstants.java index e496eca..074c376 100644 --- a/src/com/amazon/pay/types/ServiceConstants.java +++ b/src/com/amazon/pay/types/ServiceConstants.java @@ -1,5 +1,5 @@ /** - * Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2016-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -93,6 +93,8 @@ public class ServiceConstants { public static final String ORDER_ATTRIBUTES_SELLER_ORDER_ID = "OrderAttributes.SellerOrderAttributes.SellerOrderId"; public static final String ORDER_ATTRIBUTES_STORE_NAME = "OrderAttributes.SellerOrderAttributes.StoreName"; public static final String ORDER_ATTRIBUTES_SUPPLEMENTARY_DATA = "OrderAttributes.SellerOrderAttributes.SupplementaryData"; + public static final String SUCCESS_URL = "SuccessUrl"; + public static final String FAILURE_URL = "FailureUrl"; // API Request Parameters - (Mostly) Required Parameters public static final String ACTION = "Action"; @@ -147,7 +149,7 @@ public class ServiceConstants { public static final String GET_MERCHANT_ACCOUNT_STATUS = "GetMerchantAccountStatus"; // SDK version - public static final String APPLICATION_LIBRARY_VERSION = "3.4.1"; + public static final String APPLICATION_LIBRARY_VERSION = "3.5.0"; public static final String GITHUB_SDK_NAME = "amazon-pay-sdk-java"; // Exponential backoff wait times (milliseconds) for retry operations diff --git a/tst/com/amazon/pay/TestConstants.java b/tst/com/amazon/pay/TestConstants.java index 97e7c62..6e192bb 100644 --- a/tst/com/amazon/pay/TestConstants.java +++ b/tst/com/amazon/pay/TestConstants.java @@ -1,5 +1,5 @@ /** - * Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2016-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -57,5 +57,8 @@ public class TestConstants { public static final int pageSize = 5; public static final String nextPageToken = "1eUc0QkJMVnJpcGgrbDNHclpIUT09IiwibWFya2V0cGxhY2VJZCI6IkEzQlhCMFlOM1hIMTdIIn0="; public static final String SUPPLEMENTARY_DATA = "{\"AirlineMetaData\" : {\"version\": 1.0, \"airlineCode\": \"PAX\", \"flightDate\": \"2018-03-24T20:29:19.22Z\", \"departureAirport\": \"CDG\", \"destinationAirport\": \"LUX\", \"bookedLastTime\": -1, \"classOfTravel\": \"F\", \"passengers\": {\"numberOfPassengers\": 4, \"numberOfChildren\": 1, \"numberOfInfants\": 1 }}, \"AccommodationMetaData\": {\"version\": 1.0, \"startDate\": \"2018-03-24T20:29:19.22Z\", \"endDate\": \"2018-03-24T20:29:19.22Z\", \"lengthOfStay\": 5, \"numberOfGuests\": 4, \"class\": \"Standard\", \"starRating\": 5, \"bookedLastTime\": -1 }, \"OrderMetaData\": {\"version\": 1.0, \"numberOfItems\": 3, \"type\": \"Digital\" }, \"BuyerMetaData\": {\"version\" : 1.0, \"isFirstTimeCustomer\" : true, \"numberOfPastPurchases\" : 2, \"numberOfDisputedPurchases\" : 3, \"hasOpenDispute\" : true, \"riskScore\" : 0.75 }}"; + public static final String AUTHORIZE_AMOUNT = "0.01"; + public static final String SUCCESS_URL = "https://pay.amazon.com/success.html"; + public static final String FAILURE_URL = "https://pay.amazon.com/failure.html"; } diff --git a/tst/com/amazon/pay/impl/SignatureAndURLTest.java b/tst/com/amazon/pay/impl/SignatureAndURLTest.java index d233769..8773aca 100644 --- a/tst/com/amazon/pay/impl/SignatureAndURLTest.java +++ b/tst/com/amazon/pay/impl/SignatureAndURLTest.java @@ -1,5 +1,5 @@ /** - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ import com.amazon.pay.request.RequestHelper; import com.amazon.pay.TestConstants; +import com.amazon.pay.request.ConfirmOrderReferenceRequest; import com.amazon.pay.request.GetOrderReferenceDetailsRequest; import com.amazon.pay.request.SetOrderReferenceDetailsRequest; import com.amazon.pay.response.model.Environment; @@ -117,4 +118,76 @@ public void testRequestParameterConstructorSignature_2() throws Exception { Assert.assertEquals(expectedURL, this.helper.getPostURL(request)); } + @Test + public void testRequestUrlAndSignatureForConfirmOrderReference() throws Exception { + // Non-MFA Confirm request + this.helper = new RequestHelper(config); + PowerMockito.stub(PowerMockito.method(Util.class, "getTimestamp")).toReturn(TestConstants.timeStamp); + final ConfirmOrderReferenceRequest request = + new ConfirmOrderReferenceRequest(TestConstants.amazonOrderReferenceId) + .setSellerId(TestConstants.overrideSellerId) + .setMWSAuthToken(TestConstants.mwsAuthToken); + final String action = "ConfirmOrderReference"; + final String signature = "mbJBrZKC4Jz8J%2BrhRqyfYsY6TkSapWOvCTlC%2BUDUTok%3D"; + final String expectedURL = + "AWSAccessKeyId=" + TestConstants.accessKey + + "&Action=" + action + + "&AmazonOrderReferenceId=" + TestConstants.amazonOrderReferenceId + + "&MWSAuthToken=" + TestConstants.mwsAuthToken + + "&SellerId=" + TestConstants.overrideSellerId + + "&Signature=" + signature + + "&SignatureMethod=HmacSHA256" + + "&SignatureVersion=2" + + "&Timestamp=" + TestConstants.urlEncoded_TimeStamp + + "&Version=2013-01-01"; + Assert.assertEquals(expectedURL, this.helper.getPostURL(request)); + + // Adding a curency code without an amount should result in same request + request.setAuthorizationCurrencyCode(CurrencyCode.EUR); + Assert.assertEquals(expectedURL, this.helper.getPostURL(request)); + + // Full MFA parameter set + final String mfaSignature = "KeZbecFqPMxhR4g35iFWsdLmq1rAgwdn4B2WTIFMTHg%3D"; + request.setSuccessUrl(TestConstants.SUCCESS_URL); + request.setFailureUrl(TestConstants.FAILURE_URL); + request.setAuthorizationAmount(TestConstants.AUTHORIZE_AMOUNT); + final String expectedURLforMFA = + "AWSAccessKeyId=" + TestConstants.accessKey + + "&Action=" + action + + "&AmazonOrderReferenceId=" + TestConstants.amazonOrderReferenceId + + "&AuthorizationAmount.Amount=" + TestConstants.AUTHORIZE_AMOUNT + + "&AuthorizationAmount.CurrencyCode=" + CurrencyCode.EUR + + "&FailureUrl=" + Util.urlEncode(TestConstants.FAILURE_URL) + + "&MWSAuthToken=" + TestConstants.mwsAuthToken + + "&SellerId=" + TestConstants.overrideSellerId + + "&Signature=" + mfaSignature + + "&SignatureMethod=HmacSHA256" + + "&SignatureVersion=2" + + "&SuccessUrl=" + Util.urlEncode(TestConstants.SUCCESS_URL) + + "&Timestamp=" + TestConstants.urlEncoded_TimeStamp + + "&Version=2013-01-01"; + Assert.assertEquals(expectedURLforMFA, this.helper.getPostURL(request)); + + // Partial MFA parameter set - not including FailureURL or CurrencyCode + // Should default to the Config object currency code in this scenario (USD instead of EUR) + final String partialMfaSignature = "vGiWtNsdtNKx3QGB%2BcNNq8tLisqwOeg2a5aIy3p6exw%3D"; + request.setAuthorizationCurrencyCode(null); + request.setFailureUrl(null); + final String expectedURLforPartialMFA = + "AWSAccessKeyId=" + TestConstants.accessKey + + "&Action=" + action + + "&AmazonOrderReferenceId=" + TestConstants.amazonOrderReferenceId + + "&AuthorizationAmount.Amount=" + TestConstants.AUTHORIZE_AMOUNT + + "&AuthorizationAmount.CurrencyCode=" + CurrencyCode.USD + + "&MWSAuthToken=" + TestConstants.mwsAuthToken + + "&SellerId=" + TestConstants.overrideSellerId + + "&Signature=" + partialMfaSignature + + "&SignatureMethod=HmacSHA256" + + "&SignatureVersion=2" + + "&SuccessUrl=" + Util.urlEncode(TestConstants.SUCCESS_URL) + + "&Timestamp=" + TestConstants.urlEncoded_TimeStamp + + "&Version=2013-01-01"; + Assert.assertEquals(expectedURLforPartialMFA, this.helper.getPostURL(request)); + } + } diff --git a/tst/com/amazon/pay/request/PaymentsAPIRequestTest.java b/tst/com/amazon/pay/request/PaymentsAPIRequestTest.java index df4f285..5c42fc0 100644 --- a/tst/com/amazon/pay/request/PaymentsAPIRequestTest.java +++ b/tst/com/amazon/pay/request/PaymentsAPIRequestTest.java @@ -1,5 +1,5 @@ /** - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -118,10 +118,18 @@ public void testCloseOrderReferenceRequest() { @Test public void testConfirmOrderReferenceRequest() { final ConfirmOrderReferenceRequest request = new ConfirmOrderReferenceRequest(TestConstants.amazonOrderReferenceId) - .setMWSAuthToken(TestConstants.mwsAuthToken); + .setMWSAuthToken(TestConstants.mwsAuthToken) + .setAuthorizationAmount(TestConstants.AUTHORIZE_AMOUNT) + .setAuthorizationCurrencyCode(CurrencyCode.EUR) + .setSuccessUrl(TestConstants.SUCCESS_URL) + .setFailureUrl(TestConstants.FAILURE_URL); Assert.assertEquals(request.getAmazonOrderReferenceId(),TestConstants.amazonOrderReferenceId); Assert.assertEquals(request.getMwsAuthToken(), TestConstants.mwsAuthToken); + Assert.assertEquals(request.getAuthorizationAmount(), TestConstants.AUTHORIZE_AMOUNT); + Assert.assertEquals(request.getAuthorizationCurrencyCode(), CurrencyCode.EUR); + Assert.assertEquals(request.getSuccessUrl(), TestConstants.SUCCESS_URL); + Assert.assertEquals(request.getFailureUrl(), TestConstants.FAILURE_URL); } @Test