33import PodoeMarket .podoemarket .common .entity .*;
44import PodoeMarket .podoemarket .common .entity .type .OrderStatus ;
55import PodoeMarket .podoemarket .order .dto .request .OrderInfoRequestDTO ;
6+ import PodoeMarket .podoemarket .order .dto .response .NicepayApproveResponseDTO ;
67import PodoeMarket .podoemarket .order .dto .response .OrderCompleteResponseDTO ;
78import PodoeMarket .podoemarket .order .dto .request .OrderRequestDTO ;
89import PodoeMarket .podoemarket .common .repository .ApplicantRepository ;
1314import PodoeMarket .podoemarket .order .dto .response .OrderItemResponseDTO ;
1415import PodoeMarket .podoemarket .service .MailSendService ;
1516import org .springframework .beans .factory .annotation .Value ;
17+ import org .springframework .http .HttpEntity ;
18+ import org .springframework .http .HttpHeaders ;
19+ import org .springframework .http .MediaType ;
20+ import org .springframework .http .ResponseEntity ;
1621import org .springframework .transaction .annotation .Transactional ;
1722import lombok .RequiredArgsConstructor ;
1823import lombok .extern .slf4j .Slf4j ;
1924import org .springframework .stereotype .Service ;
25+ import org .springframework .util .LinkedMultiValueMap ;
26+ import org .springframework .util .MultiValueMap ;
27+ import org .springframework .web .client .RestTemplate ;
2028
2129import java .net .URLEncoder ;
2230import java .nio .charset .StandardCharsets ;
2331import java .text .DecimalFormat ;
2432import java .util .List ;
33+ import java .util .Map ;
2534import java .util .UUID ;
2635
2736@ RequiredArgsConstructor
@@ -38,6 +47,12 @@ public class OrderService {
3847 @ Value ("${cloud.aws.s3.url}" )
3948 private String bucketURL ;
4049
50+ @ Value ("${nicepay.client-id}" )
51+ private String clientId ;
52+
53+ @ Value ("${nicepay.secret-key}" )
54+ private String secretKey ;
55+
4156 public OrderItemResponseDTO getOrderItemInfo (UserEntity userInfo , OrderInfoRequestDTO dto ) {
4257 try {
4358 final ProductEntity orderProduct = getProduct (dto .getProductId ());
@@ -121,6 +136,75 @@ public OrderInfoResponseDTO orderSuccess(Long orderId) {
121136 }
122137 }
123138
139+ @ Transactional
140+ public String handleNicepayReturn (Map <String , String > params ) {
141+ log .info ("NICEPAY RETURN PARAMS = {}" , params );
142+
143+ try {
144+ String resultCode = params .get ("authResultCode" );
145+ String authToken = params .get ("authToken" );
146+ String tid = params .get ("tid" );
147+ String orderIdStr = params .get ("orderId" );
148+ String amount = params .get ("amount" ) != null ? params .get ("amt" ) : params .get ("amount" );
149+
150+ if (orderIdStr == null ) {
151+ throw new RuntimeException ("orderId가 존재하지 않음" );
152+ }
153+
154+ Long orderId = Long .valueOf (orderIdStr );
155+
156+ // 1) 인증 결과 실패
157+ if (!"0000" .equals (resultCode )) {
158+ throw new RuntimeException ("인증 실패" );
159+ }
160+
161+ // 2) NICEPAY 서버 승인 API 호출
162+ NicepayApproveResponseDTO approveResult = callApprove (authToken , amount );
163+
164+ if (approveResult == null || !"0000" .equals (approveResult .getResultCode ())) {
165+ throw new RuntimeException ("승인 API 실패" );
166+ }
167+
168+ // 3) DB 주문 상태 업데이트
169+ OrdersEntity order = orderRepo .findById (orderId ).orElseThrow (() -> new RuntimeException ("Order not found" ));
170+
171+ order .setTid (tid );
172+ order .setOrderStatus (OrderStatus .PASS );
173+
174+ log .info ("결제 완료 처리됨: orderId={}, tid={}" , orderId , tid );
175+
176+ // 4) 성공 redirect URL 반환
177+ return "https://www.podo-store.com/purchase/success?orderId=" + orderId ;
178+ } catch (Exception e ) {
179+ throw e ;
180+ }
181+ }
182+
183+ public NicepayApproveResponseDTO callApprove (String tid , String amount ) {
184+ RestTemplate restTemplate = new RestTemplate ();
185+ String url = "https://webapi.nicepay.co.kr/webapi/payments/approve" ;
186+
187+ MultiValueMap <String , String > body = new LinkedMultiValueMap <>();
188+ body .add ("clientId" , clientId );
189+ body .add ("secretKey" , secretKey );
190+ body .add ("tid" , tid );
191+ body .add ("amount" , amount );
192+
193+ HttpHeaders headers = new HttpHeaders ();
194+ headers .setContentType (MediaType .APPLICATION_FORM_URLENCODED );
195+
196+ HttpEntity <MultiValueMap <String , String >> entity = new HttpEntity <>(body , headers );
197+
198+ try {
199+ ResponseEntity <NicepayApproveResponseDTO > res = restTemplate .postForEntity (url , entity , NicepayApproveResponseDTO .class );
200+
201+ return res .getBody ();
202+ } catch (Exception e ) {
203+ log .error ("승인 API 호출 실패" , e );
204+ return null ;
205+ }
206+ }
207+
124208 // =============== private (protected) method ===============
125209 private ProductEntity getProduct (UUID id ) {
126210 try {
0 commit comments