33import com .adyen .Client ;
44import com .adyen .checkout .ApplicationProperty ;
55import 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 .*;
107import com .adyen .service .checkout .PaymentsApi ;
118import com .adyen .service .exception .ApiException ;
129import jakarta .servlet .http .HttpServletRequest ;
1512import org .springframework .beans .factory .annotation .Autowired ;
1613import org .springframework .http .ResponseEntity ;
1714import org .springframework .web .bind .annotation .*;
15+ import org .springframework .web .servlet .view .RedirectView ;
1816
1917import java .io .IOException ;
2018import 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