From bc5e314c2dfa3a93ec6ac01ac62db8a503e621ad Mon Sep 17 00:00:00 2001 From: Patricia Date: Wed, 13 Apr 2022 11:57:01 +0100 Subject: [PATCH 1/3] pass thirdparty sdk to card verification --- .../processout/processout_sdk/ProcessOut.java | 48 +++++++++++++++++++ .../processout_sdk/TokenRequest.java | 7 +++ 2 files changed, 55 insertions(+) diff --git a/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java b/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java index 452f0b32..7188c6e8 100644 --- a/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java +++ b/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java @@ -469,6 +469,54 @@ public void shouldContinue(String source) { } } + /** + * Create a customer token from a card ID + * + * @param source Card ID used for the customer token + * @param customerId Customer ID created in backend + * @param tokenId Token ID created in backend + * @param thirdPartySDKVersion version of the 3rd party SDK being used for the calls. + * @param handler 3DS2 handler + * @param with Activity to display webviews and perform fingerprinting + */ + public void makeCardToken(@NonNull final String source, @NonNull final String customerId, @NonNull final String tokenId, final String thirdPartySDKVersion, @NonNull final ThreeDSHandler handler, @NonNull final Context with) { + try { + TokenRequest request = new TokenRequest(source, thirdPartySDKVersion); + final JSONObject body = new JSONObject(gson.toJson(request)); + + Network.getInstance(this.context, this.projectId).CallProcessOut("/customers/" + customerId + "/tokens/" + tokenId, Request.Method.PUT, body, new Network.NetworkResult() { + @Override + public void onError(Exception error) { + handler.onError(error); + } + + @Override + public void onSuccess(JSONObject json) { + // Handle the authorization result + AuthorizationResult result = gson.fromJson( + json.toString(), AuthorizationResult.class); + + CustomerAction cA = result.getCustomerAction(); + if (cA == null) { + // No customer action in the authorization result, we return the invoice id + handler.onSuccess(tokenId); + return; + } + + CustomerActionHandler customerActionHandler = new CustomerActionHandler(handler, new CardTokenWebView(with), with, new CustomerActionHandler.CustomerActionCallback() { + @Override + public void shouldContinue(String source) { + makeCardToken(source, customerId, tokenId, handler, with); + } + }); + customerActionHandler.handleCustomerAction(cA); + } + }); + } catch (JSONException e) { + handler.onError(e); + } + } + /** * Parses a intent uri * diff --git a/processout-sdk/src/main/java/com/processout/processout_sdk/TokenRequest.java b/processout-sdk/src/main/java/com/processout/processout_sdk/TokenRequest.java index 7b8d5148..fde583d9 100644 --- a/processout-sdk/src/main/java/com/processout/processout_sdk/TokenRequest.java +++ b/processout-sdk/src/main/java/com/processout/processout_sdk/TokenRequest.java @@ -9,8 +9,15 @@ class TokenRequest { private boolean verify = true; @SerializedName("enable_three_d_s_2") private boolean enableThreeDS2 = true; + @SerializedName("third_party_sdk_version") + private String thirdPartySDKVersion; TokenRequest(String source) { this.source = source; } + + TokenRequest(String source, String thirdPartySDKVersion) { + this.source = source; + this.thirdPartySDKVersion = thirdPartySDKVersion; + } } From 5baf915036e09dd48a1cb3f959ff0985bca99bee Mon Sep 17 00:00:00 2001 From: Patricia Date: Wed, 13 Apr 2022 12:00:05 +0100 Subject: [PATCH 2/3] add thirdpartysdk version to incremental auth --- .../processout_sdk/AuthorizationRequest.java | 6 +++ .../processout/processout_sdk/ProcessOut.java | 47 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/processout-sdk/src/main/java/com/processout/processout_sdk/AuthorizationRequest.java b/processout-sdk/src/main/java/com/processout/processout_sdk/AuthorizationRequest.java index 705794ee..4f36c96d 100644 --- a/processout-sdk/src/main/java/com/processout/processout_sdk/AuthorizationRequest.java +++ b/processout-sdk/src/main/java/com/processout/processout_sdk/AuthorizationRequest.java @@ -17,6 +17,12 @@ public AuthorizationRequest(String source, boolean incremental) { this.incremental = incremental; } + public AuthorizationRequest(String source, boolean incremental, String thirdPartySDKVersion) { + this.source = source; + this.incremental = incremental; + this.thirdPartySDKVersion = thirdPartySDKVersion; + } + public AuthorizationRequest(String source) { this.source = source; this.incremental = false; diff --git a/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java b/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java index 7188c6e8..aac3be74 100644 --- a/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java +++ b/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java @@ -391,6 +391,53 @@ public void shouldContinue(String source) { } } + /** + * Allow card payments authorization and marks the authorization as incremental (with 3DS2 support) + * + * @param invoiceId previously generated invoice + * @param source source to use for the charge (card token, etc.) + * @param thirdPartySDKVersion version of the 3rd party SDK being used for the calls. + * @param handler (Custom 3DS2 handler) + */ + public void makeIncrementalAuthorizationPayment(@NonNull final String invoiceId, @NonNull final String source, final String thirdPartySDKVersion, @NonNull final ThreeDSHandler handler, @NonNull final Context with) { + try { + // Generate the authorization body and forces 3DS2 + AuthorizationRequest authRequest = new AuthorizationRequest(source, true, thirdPartySDKVersion); + final JSONObject body = new JSONObject(gson.toJson(authRequest)); + + requestAuthorization(invoiceId, body, new RequestAuthorizationCallback() { + @Override + public void onError(Exception error) { + handler.onError(error); + } + + @Override + public void onSuccess(JSONObject json) { + // Handle the authorization result + AuthorizationResult result = gson.fromJson( + json.toString(), AuthorizationResult.class); + + CustomerAction cA = result.getCustomerAction(); + if (cA == null) { + // No customer action in the authorization result, we return the invoice id + handler.onSuccess(invoiceId); + return; + } + + CustomerActionHandler customerActionHandler = new CustomerActionHandler(handler, new PaymentWebView(with), with, new CustomerActionHandler.CustomerActionCallback() { + @Override + public void shouldContinue(String source) { + makeIncrementalAuthorizationPayment(invoiceId, source, handler, with); + } + }); + customerActionHandler.handleCustomerAction(cA); + } + }); + } catch (JSONException e) { + handler.onError(e); + } + } + /** * Increments the authorization of an applicable invoice by a given amount * From 63facf2919bf39f3b19002e3df821a9a9373cfff Mon Sep 17 00:00:00 2001 From: Patricia Date: Wed, 13 Apr 2022 12:26:40 +0100 Subject: [PATCH 3/3] bump sdk version -> 2.16 --- .../src/main/java/com/processout/processout_sdk/ProcessOut.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java b/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java index aac3be74..b7af1132 100644 --- a/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java +++ b/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java @@ -33,7 +33,7 @@ public class ProcessOut { - public static final String SDK_VERSION = "v2.15.0"; + public static final String SDK_VERSION = "v2.16.0"; private String projectId; private Context context;