Skip to content

Commit c60b78d

Browse files
authored
Implement shopper redirect handling in CheckoutResource (#569)
1 parent 2197751 commit c60b78d

File tree

1 file changed

+52
-5
lines changed

1 file changed

+52
-5
lines changed

checkout-example/src/main/java/com/adyen/checkout/api/CheckoutResource.java

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import com.adyen.Client;
44
import com.adyen.checkout.ApplicationProperty;
55
import com.adyen.enums.Environment;
6-
import com.adyen.model.checkout.Amount;
7-
import com.adyen.model.checkout.CreateCheckoutSessionRequest;
8-
import com.adyen.model.checkout.CreateCheckoutSessionResponse;
9-
import com.adyen.model.checkout.LineItem;
6+
import com.adyen.model.checkout.*;
107
import com.adyen.service.checkout.PaymentsApi;
118
import com.adyen.service.exception.ApiException;
129
import jakarta.servlet.http.HttpServletRequest;
@@ -15,6 +12,7 @@
1512
import org.springframework.beans.factory.annotation.Autowired;
1613
import org.springframework.http.ResponseEntity;
1714
import org.springframework.web.bind.annotation.*;
15+
import org.springframework.web.servlet.view.RedirectView;
1816

1917
import java.io.IOException;
2018
import java.util.Arrays;
@@ -59,7 +57,8 @@ public ResponseEntity<CreateCheckoutSessionResponse> sessions(@RequestHeader Str
5957
// (optional) set WEB to filter out payment methods available only for this platform
6058
checkoutSession.setChannel(CreateCheckoutSessionRequest.ChannelEnum.WEB);
6159
checkoutSession.setReference(orderRef); // required
62-
checkoutSession.setReturnUrl(request.getScheme() + "://" + host + "/redirect?orderRef=" + orderRef);
60+
checkoutSession.setReturnUrl(request.getScheme() + "://" + host + "/api/handleShopperRedirect"); // Redirect flow
61+
6362
checkoutSession.setAmount(amount);
6463
// set lineItems required for some payment methods (ie Klarna)
6564
checkoutSession.setLineItems(Arrays.asList(
@@ -71,4 +70,52 @@ public ResponseEntity<CreateCheckoutSessionResponse> sessions(@RequestHeader Str
7170
var response = paymentsApi.sessions(checkoutSession);
7271
return ResponseEntity.ok().body(response);
7372
}
73+
74+
/**
75+
* {@code GET /api/handleShopperRedirect} : Handle redirect during payment. This gets called during the redirect flow, you can specify this in the `returnUrl`-field when constructing the /payments request to Adyen.
76+
*
77+
* @return the {@link RedirectView} with status {@code 302}
78+
* @throws IOException from Adyen API.
79+
* @throws ApiException from Adyen API.
80+
*/
81+
@GetMapping("/handleShopperRedirect")
82+
public RedirectView redirect(@RequestParam(required = false) String payload, @RequestParam(required = false) String redirectResult) throws IOException, ApiException {
83+
// Sends a request to /payments/completionDetails when redirect occurs
84+
PaymentCompletionDetails completionDetails = new PaymentCompletionDetails();
85+
if (redirectResult != null && !redirectResult.isEmpty()) {
86+
// For redirect, you are redirected to an Adyen domain to complete the 3DS2 challenge
87+
// After completing the 3DS2 challenge, you get the redirect result from Adyen in the returnUrl
88+
// We then pass the redirectResult to the /completionDetails call to Adyen.
89+
completionDetails.redirectResult(redirectResult);
90+
} else if (payload != null && !payload.isEmpty()) {
91+
completionDetails.payload(payload);
92+
}
93+
94+
PaymentDetailsRequest detailsRequest = new PaymentDetailsRequest();
95+
detailsRequest.setDetails(completionDetails);
96+
97+
log.info("Sending request to /payments/details {}", detailsRequest);
98+
PaymentDetailsResponse paymentDetailsResponse = paymentsApi.paymentsDetails(detailsRequest);
99+
log.info("Adyen: /payments/details response: {}", paymentDetailsResponse);
100+
101+
// Handle redirect after getting the /payment/completionDetails paymentDetailsResponse
102+
String redirectURL = "/result/";
103+
switch (paymentDetailsResponse.getResultCode()) {
104+
case AUTHORISED:
105+
redirectURL += "success";
106+
break;
107+
case PENDING:
108+
case RECEIVED:
109+
redirectURL += "pending";
110+
break;
111+
case REFUSED:
112+
redirectURL += "failed";
113+
break;
114+
default:
115+
redirectURL += "error";
116+
break;
117+
}
118+
return new RedirectView(redirectURL + "?reason=" + paymentDetailsResponse.getResultCode());
119+
}
120+
74121
}

0 commit comments

Comments
 (0)