diff --git a/build.gradle b/build.gradle index 385d13d4..3e8602a6 100644 --- a/build.gradle +++ b/build.gradle @@ -157,7 +157,8 @@ dependencies { runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") implementation("io.jsonwebtoken:jjwt-jackson:0.11.5") - + // stripe + implementation "com.stripe:stripe-java:33.4.0" } ext { diff --git a/src/main/java/com/wb/domainserver/domain/gcone/ordr/ordr/service/BOOrdrService.java b/src/main/java/com/wb/domainserver/domain/gcone/ordr/ordr/service/BOOrdrService.java index 373be223..a7eb6982 100644 --- a/src/main/java/com/wb/domainserver/domain/gcone/ordr/ordr/service/BOOrdrService.java +++ b/src/main/java/com/wb/domainserver/domain/gcone/ordr/ordr/service/BOOrdrService.java @@ -3,12 +3,15 @@ package com.wb.domainserver.domain.gcone.ordr.ordr.service; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.nimbusds.jose.shaded.gson.Gson; +import com.stripe.StripeClient; +import com.stripe.model.Charge; +import com.stripe.model.Charge.PaymentMethodDetails; +import com.stripe.model.PaymentIntent; +import com.stripe.model.checkout.Session; import com.wb.domainserver.common.prop.PropertyService; -import com.wb.domainserver.domain.admin.instcSle.mtng.mapper.BOMaMtngMapper; import com.wb.domainserver.domain.admin.store.sopmal.mapper.BOMaSopmalMapper; import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService; import com.wb.domainserver.domain.admin.sys.comncd.vo.BOMaComncdVO; -import com.wb.domainserver.domain.gcone.goods.goods.service.BOGoodsService; import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper; import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderNoService; import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderService; @@ -56,9 +59,7 @@ import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; -import java.time.LocalDateTime; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; @@ -5612,6 +5613,113 @@ public class BOOrdrService{ } + /** + * 사용자 > 상품 > 구매/결제 > 회원구매하기 > Stirpe 결제 정보 등록 + * @param payVO + * @return Map + */ + @Transactional + public Map insertStripeSetle(Session stripe, BOPayVO payVO) throws Exception { + + boolean payResult = true; + Map content = new HashMap<>(); + BOOrderPgLogVO orderPgLogVO = new BOOrderPgLogVO(); + + orderPgLogVO.setOrdrInnb(new BigInteger(payVO.getOrderId())); + orderPgLogVO.setSopmalCd(payVO.getSopmalCd()); + orderPgLogVO.setPgCmpnyNm(payVO.getPgCmpnyNm()); + orderPgLogVO.setSetlerNm(payVO.getSetlerNm()); + orderPgLogVO.setSetleMthCd(payVO.getSetleTyCd()); + + try{ + + // 1. 주문상태 수정 ===================================================== + BOOrderVO orderVO = new BOOrderVO(); + orderVO.setSopmalCd(payVO.getSopmalCd()); + orderVO.setOrdrInnb(new BigInteger(payVO.getOrderId())); + orderVO.setOrdrSttusCd("25"); // 주문상태코드(25:결제확인) + + if (StringUtils.hasText(payVO.getMbrInnb())) { + orderVO.setMbrInnb(new BigInteger(payVO.getMbrInnb())); + } + + log.info("insertStripeSetle service start ::: "); + + // 주문 공통 전처리 ( 상태체크, 상태변경, 마일리지, 쿠폰, GC머니 ) + orderCommService.commonOrderPreProcess(payVO, orderVO); + + /* =============================================== + 결제 API >> DB select로 진행함 + ================================================== */ + StripeClient stripeClient = new StripeClient("sk_test_51TyR73GgW2hla0lOFbAPuSlGp3nDswNX54tikyI2OxFDtUU8LDC6ooahlgfV5qXPMD2y3V035UKhzz3LA1RcaF6700Lck9uPVR"); + PaymentIntent paymentIntent = stripeClient.v1() + .paymentIntents() + .retrieve(stripe.getPaymentIntent()); + Charge charge = paymentIntent.getLatestChargeObject(); + PaymentMethodDetails paymentMethodDetails = charge.getPaymentMethodDetails(); + PaymentMethodDetails.Card card = paymentMethodDetails.getCard(); + PaymentMethodDetails.Card.Installments installments = card.getInstallments(); + + /* =============================================== + 5. FM_ORDER_PG_LOG 등록값 셋팅 + ================================================== */ + orderPgLogVO.setDelngNb(StringUtil.isNullToString(stripe.getPaymentIntent())); // 거래번호 (결제키) + orderPgLogVO.setConfmDt(StringUtil.isNullToString(Instant.ofEpochSecond(stripe.getCreated()).atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime())); // 승인일시 + orderPgLogVO.setApvlnb(StringUtil.isNullToString("")); //승인번호 + orderPgLogVO.setCardCmpnyCd(StringUtil.isNullToString("")); //카드사코드 + orderPgLogVO.setCardCmpnyNm(StringUtil.isNullToString("")); //카드사명 + orderPgLogVO.setNintrAt(StringUtil.isNullToString("")); //무이자여부 + orderPgLogVO.setInstlmtMtCnt(installments.getPlan().getCount() != null ? Integer.parseInt(installments.getPlan().getCount().toString()):0); //할부개월수 + orderPgLogVO.setDelngAmt(stripe.getAmountTotal() != null ? new BigDecimal(stripe.getAmountTotal()) : BigDecimal.valueOf(0)); + orderPgLogVO.setEscwAt("N"); // 에스크로여부 + orderPgLogVO.setVirtlAcntVrifyKy(""); //매출증빙영수증URL + orderPgLogVO.setRsltMssageCn("정상처리-카드거래"); + orderPgLogVO.setRsltCd("0000"); + + // 6. FM_ORDER_SETLE 수정 ============================================== + BOOrderSetleVO orderSetleVO = new BOOrderSetleVO(); + orderSetleVO.setSopmalCd(payVO.getSopmalCd()); + orderSetleVO.setOrdrInnb(new BigInteger(payVO.getOrderId())); + orderSetleVO.setPgInnb(orderPgLogVO.getDelngNb()); + orderSetleVO.setCredtcardApvlnb(orderPgLogVO.getApvlnb()); + orderSetleVO.setSetleTyCd(payVO.getSetleTyCd()); + //orderSetleVO.setSetleMid(StringUtil.isNullToString(mapper.selectBOSopSetleMidKeyInqire(payVO))); // 쇼핑몰 결제 MID(상점키) 조회 + + log.info("insertStripeSetle service StripePayMap_orderSetleVO ::: {}", orderSetleVO); + + purchsMapper.updateOrderSetle(orderSetleVO); + + log.info("insertStripeSetle service StripePayMap_orderSetleVO end::: "); + + content.put("status", "0"); + content.put("message", "키움 결제 정보 등록을 완료 하였습니다."); + + try { + selectBOOrdrMssageSndngProcs(orderVO); + } catch (Exception e) { + log.debug("{} 메시지 발송 실패", payVO.getOrderId()); + } + + } catch (WnbtRestException wre) { + log.error("insertStripeSetle1 WnbtRestException : ", wre); + payResult = false; + throw wre; + } catch (Exception wre) { + log.error("insertStripeSetle1 Exception : ", wre); + payResult = false; + throw wre; + } finally { + log.info("insertStripeSetle1 order finally !!!!! {} ", payVO.getOrderId()); + // FM_ORDER_PG_LOG 등록 + ordrLogService.insertBOOrderPgLog(orderPgLogVO); + // 주문 로그 + ordrLogService.insertSetleOrderLog(payVO, payResult, "0000", "Stripe 결제 실패 [결제 정보 NULL]"); + } + + return content; + } + + /** diff --git a/src/main/java/com/wb/domainserver/domain/sopmal/ordr/controller/OrdrController.java b/src/main/java/com/wb/domainserver/domain/sopmal/ordr/controller/OrdrController.java index 1ba90f11..7bac9d9e 100644 --- a/src/main/java/com/wb/domainserver/domain/sopmal/ordr/controller/OrdrController.java +++ b/src/main/java/com/wb/domainserver/domain/sopmal/ordr/controller/OrdrController.java @@ -3,6 +3,9 @@ package com.wb.domainserver.domain.sopmal.ordr.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.nimbusds.jose.shaded.gson.Gson; +import com.stripe.model.Event; +import com.stripe.model.checkout.Session; +import com.stripe.net.Webhook; import com.wb.domainserver.common.msg.GconeMessageSource; import com.wb.domainserver.common.mvc.tags.ui.pagination.PaginationInfo; import com.wb.domainserver.common.prop.PaginationProperties; @@ -56,7 +59,6 @@ import com.wb.domainserver.util.util.Util; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.text.StringEscapeUtils; import org.apache.logging.log4j.util.Base64Util; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -68,15 +70,11 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; -import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.util.*; @@ -854,6 +852,8 @@ public class OrdrController { url = "sopmal/ordr/OrdrReqstTossPayR"; } else if ("tosspay".equals(pgCmpnyNm)||"kakaopay".equals(pgCmpnyNm)) { //||"naverpay".equals(pgCmpnyNm) 키움으로 이동 url = "sopmal/ordr/OrdrReqstTosspayPayR"; + } else if ("stripe".equals(pgCmpnyNm)) { // Stripe + url = "sopmal/ordr/OrdrReqstStripePayR"; } else if ("02".equals(setleTyCd)||"08".equals(setleTyCd)||"12".equals(setleTyCd)) { // 무통장, 마일리지, 충전형마일리지 url = "sopmal/ordr/OrdrReqstPayR"; } @@ -1557,6 +1557,110 @@ public class OrdrController { } + /** + * 사용자 > 상품 > 구매/결제 > 회원구매하기 > Stripe 결제 정보 등록 (webhook) + * @param payload + * @param sigHeader + * @return OrdrRspnsKiwoomPayR.jsp + */ + @Policy(AuthPolicy.RESTRICTED) + @RequestMapping(value="/insertStripeSetle") + public void insertStripeSetle(@RequestBody String payload, @RequestHeader("Stripe-Signature") String sigHeader) { + + try { + log.info("insertStripeSetle webhook start ::: "); + + Event event = Webhook.constructEvent( + payload, + sigHeader, + "whsec_CIdNAlgsnKjudtjCYY5i3QSUiXHZzXxt" + ); + + if ("checkout.session.completed".equals(event.getType())) { + Session session = (Session) event + .getDataObjectDeserializer() + .getObject() + .orElseThrow(); + + log.info("insertStripeSetle controller start ::: "); + + BOPayVO payVO = new BOPayVO(); + payVO.setOrderId(session.getMetadata().get("ordrInnb")); + payVO.setAmount(session.getMetadata().get("setleAmt")); + payVO.setSopmalCd(session.getMetadata().get("sopmalCd")); + payVO.setMbrInnb(session.getMetadata().get("mbrInnb")); + payVO.setMbrId(session.getMetadata().get("mbrId")); + payVO.setSesionId(session.getMetadata().get("sesionId")); + payVO.setPgCmpnyNm(session.getMetadata().get("pgCmpnyNm")); + payVO.setSetleTyCd(session.getMetadata().get("setleTyCd")); + payVO.setSetlerNm(session.getMetadata().get("ordrrNm")); + + log.info("insertStripeSetle controller payVO ::: {}", payVO); + + /* 쿠키 데이터 세팅 시작 */ + String agentId = session.getMetadata().get("agentId"); + String jSesionId = session.getMetadata().get("jSesionId"); + String ipAdres = session.getMetadata().get("ipAdres"); + String uMbrNm = session.getMetadata().get("uMbrNm"); + String uSysDvCd = session.getMetadata().get("uSysDvCd"); + String uSopmalCd = session.getMetadata().get("uSopmalCd"); + String uMbrDvCd = session.getMetadata().get("uMbrDvCd"); + + //agentId 쿠키 있을 경우 가져옴 + if (!"".equals(jSesionId)) { + payVO.setSessionId(jSesionId); + } + //gc_agent_id 가져옴 + if (!"".equals(agentId)) { + payVO.setAgentId(agentId); + } + payVO.setIpAdres(ipAdres); + + if (!"".equals(uMbrNm)) { + payVO.setMbrNm(uMbrNm); //회원명(관리자명) + } + if ("01".equals(uSysDvCd)) { + payVO.setDvCd("01"); + payVO.setSopmalCd(uSopmalCd); + payVO.setMbrDvCd(uMbrDvCd); + } else { + payVO.setDvCd("02"); + } + /* 쿠키 데이터 세팅 끝 */ + + Map content; + + try { + content = service.insertStripeSetle(session, payVO); + + log.info("insertStripeSetle controller content ::: {}", content); + } catch (WnbtRestException wre) { + log.info("insertStripeSetle : Stripe 결제 정보 등록 : 실패 WnbtRestException"); + log.error(wre.getMessage(), wre); + content = new HashMap<>() {{ + put("status", "1"); + put("message", wre.getMessage()); + }}; + } catch (Exception e) { + log.info("insertStripeSetle : Stripe 결제 정보 등록 : 실패"); + log.error(e.getMessage(), e); + + content = new HashMap<>() {{ + put("status", "1"); + put("message", "Stripe 결제 정보 등록이 실패하였습니다.\n관리자에게 문의하시기 바랍니다."); + }}; + } + + if ("0".equals(content.get("status"))) { + commonOrderPostProcess(payVO); + } + } + } catch (Exception e) { + log.debug("Webhook error ::: {}", e); + } + } + + /** * 사용자 > 상품 > 구매/결제 > 회원구매하기 > 주문완료 화면 이동 * @return OrdrComptR.jsp diff --git a/src/main/java/com/wb/domainserver/domain/sopmal/stripe/controller/StripeController.java b/src/main/java/com/wb/domainserver/domain/sopmal/stripe/controller/StripeController.java new file mode 100644 index 00000000..a3aeebaa --- /dev/null +++ b/src/main/java/com/wb/domainserver/domain/sopmal/stripe/controller/StripeController.java @@ -0,0 +1,237 @@ +package com.wb.domainserver.domain.sopmal.stripe.controller; + +import com.google.gson.JsonObject; +import com.stripe.StripeClient; +import com.stripe.exception.StripeException; +import com.stripe.model.checkout.Session; +import com.stripe.param.checkout.SessionCreateParams; +import com.wb.domainserver.domain.admin.store.sopmal.service.BOMaSopmalService; +import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO; +import com.wb.domainserver.response.WnbtResponse; +import com.wb.domainserver.response.WnbtResponseBody; +import com.wb.domainserver.security.authentication.AnonymousUser; +import com.wb.domainserver.security.authentication.MemberJwtContextHolder; +import com.wb.domainserver.security.authorization.annotation.AuthPolicy; +import com.wb.domainserver.security.authorization.annotation.Policy; +import com.wb.domainserver.util.cookie.CookieUtil; +import com.wb.domainserver.util.dataaccess.DataMap; +import com.wb.domainserver.util.util.Util; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Controller +@RequestMapping("/sopmal/stripe") +public class StripeController { + @Autowired + private BOMaSopmalService boMaSopmalService; + + private Util utilClass; + + /** + * stripe 결제 Url 호출 + * @return selectStripeTest.jsp + */ + @Policy(AuthPolicy.RESTRICTED) + @PostMapping(value = "/checkout", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity createCheckoutSession(HttpServletRequest request) throws Exception { + BOMaSopmalVO sopmalVO = new BOMaSopmalVO(); + sopmalVO.setSopmalCd(request.getParameter("sopmalCd")); + DataMap sopmalInfo = boMaSopmalService.selectBOSopmalUpdtForm(sopmalVO).get(0); + String domnAdres = sopmalInfo.get("pcDomnAdres").toString(); + domnAdres = "http://loc.soju1sake1.com:18500/sopmal/stripe"; + + StripeClient stripeClient = new StripeClient("sk_test_51TyR73GgW2hla0lOFbAPuSlGp3nDswNX54tikyI2OxFDtUU8LDC6ooahlgfV5qXPMD2y3V035UKhzz3LA1RcaF6700Lck9uPVR"); + SessionCreateParams.Builder paramsBuilder = SessionCreateParams.builder() + .setMode(SessionCreateParams.Mode.PAYMENT) + .setSuccessUrl(domnAdres + "/stripeSuccess?sessionId={CHECKOUT_SESSION_ID}") + .setCancelUrl(domnAdres + "/stripeCancel?sessionId={CHECKOUT_SESSION_ID}") + .setAdaptivePricing( + SessionCreateParams.AdaptivePricing.builder() + .setEnabled(false) + .build() + ); + + paramsBuilder.addLineItem( + SessionCreateParams.LineItem.builder() + .setQuantity(1L) + .setPriceData( + SessionCreateParams.LineItem.PriceData.builder() + .setCurrency("jpy") + .setUnitAmount(Long.parseLong(request.getParameter("jpSetleAmt"))) + .setProductData( + SessionCreateParams.LineItem.PriceData.ProductData.builder() + .setName(request.getParameter("goodsNm")) + .build() + ).build() + ).build() + ); + + paramsBuilder + .putMetadata("sopmalCd", request.getParameter("sopmalCd")) + .putMetadata("ordrInnb", request.getParameter("ordrInnb")) + .putMetadata("pgCmpnyNm", request.getParameter("pgCmpnyNm")) + .putMetadata("setleTyCd", request.getParameter("setleTyCd")) + .putMetadata("goodsNm", request.getParameter("goodsNm")) + .putMetadata("setleAmt", request.getParameter("setleAmt")) + .putMetadata("ordrrNm", request.getParameter("ordrrNm")) + .putMetadata("ordrrEmail", request.getParameter("ordrrEmail")) + .putMetadata("ordrrMbtlnb", request.getParameter("ordrrMbtlnb")) + .putMetadata("mbrId", request.getParameter("mbrId")) + .putMetadata("mbrInnb", request.getParameter("mbrInnb")) + .putMetadata("sesionId", request.getParameter("sesionId")) + .putMetadata("subsvcInnb", request.getParameter("subsvcInnb")); + + /* insertStripeSetle() 결제 정보 등록 파라미터 시작 */ + String agentId = ""; + String jSesionId = ""; + String ipAdres = ""; + String uMbrNm = ""; + String uSysDvCd = ""; + String uSopmalCd = ""; + String uMbrDvCd = ""; + + // 쿠키를 가져옴 + Cookie[] cookies = request.getCookies(); + + //agentId 쿠키 있을 경우 가져옴 + if (cookies != null) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals("JSESSIONID")) { + jSesionId = cookie.getValue(); + } + } + } + //gc_agent_id 가져옴 + if (CookieUtil.hasAgentCookie(request.getCookies())) { + agentId = CookieUtil.getAgentCookieValue(request.getCookies()); + } + Map util = new HashMap<>(); + util = utilClass.getRequestInfo(request); + ipAdres = util.get("XForwardedFor"); + + AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); + uMbrNm = user.getMbrNm(); //회원명(관리자명) + if ("01".equals(user.getSysDvCd())) { + uSopmalCd = user.getSopmalCd(); + uMbrDvCd = user.getMbrDvCd(); + } + paramsBuilder + .putMetadata("agentId", agentId) + .putMetadata("jSesionId", jSesionId) + .putMetadata("ipAdres", ipAdres) + .putMetadata("uMbrNm", uMbrNm) + .putMetadata("uSysDvCd", uSysDvCd) + .putMetadata("uSopmalCd", uSopmalCd) + .putMetadata("uMbrDvCd", uMbrDvCd); + /* insertStripeSetle() 결제 정보 등록 파라미터 끝 */ + + Session session = stripeClient.v1().checkout().sessions().create(paramsBuilder.build()); + + DataMap result = new DataMap(); + result.put("checkoutUrl", session.getUrl()); + + WnbtResponseBody body = new WnbtResponseBody(result); + WnbtResponse response = WnbtResponse.builder().resBody(body).build(); + + return ResponseEntity.ok(response); + } + + @Policy(AuthPolicy.RESTRICTED) + @RequestMapping(value = "/stripeSuccess") + public String stripeSuccess(ModelMap model, @RequestParam("sessionId") String sessionId) throws StripeException { + StripeClient stripeClient = new StripeClient("sk_test_51TyR73GgW2hla0lOFbAPuSlGp3nDswNX54tikyI2OxFDtUU8LDC6ooahlgfV5qXPMD2y3V035UKhzz3LA1RcaF6700Lck9uPVR"); + Session session = stripeClient.v1().checkout().sessions().retrieve(sessionId); + + String status = session.getStatus(); + String paymentStatus = session.getPaymentStatus(); + JsonObject customerDetails = null; + JsonObject rawJson = session.getRawJsonObject(); + if (rawJson != null + && rawJson.has("customer_details") + && !rawJson.get("customer_details").isJsonNull()) { + customerDetails = rawJson.getAsJsonObject("customer_details"); + } + + model.addAttribute("status", status); + model.addAttribute("payment_status", paymentStatus); + model.addAttribute("customer_details", customerDetails); + if("complete".equals(status) && "paid".equals(paymentStatus)) { + model.addAttribute("returnUrl", "/sopmal/ordr/selectOrdrCompt"); + model.addAttribute("message", "Stripe 결제 정보 등록을 완료 하였습니다."); + } else { + model.addAttribute("returnUrl", "/sopmal/ordr/selectOrdrFailr"); + model.addAttribute("message", "Stripe 결제 정보 등록을 실패 하였습니다."); + } + model.addAttribute("sopmalCd", session.getMetadata().get("sopmalCd")); + model.addAttribute("ordrInnb", session.getMetadata().get("ordrInnb")); + model.addAttribute("pgCmpnyNm", session.getMetadata().get("pgCmpnyNm")); + model.addAttribute("setleTyCd", session.getMetadata().get("setleTyCd")); + model.addAttribute("goodsNm", session.getMetadata().get("goodsNm")); + model.addAttribute("setleAmt", session.getMetadata().get("setleAmt")); + model.addAttribute("ordrrNm", session.getMetadata().get("ordrrNm")); + model.addAttribute("ordrrEmail", session.getMetadata().get("ordrrEmail")); + model.addAttribute("ordrrMbtlnb", session.getMetadata().get("ordrrMbtlnb")); + model.addAttribute("mbrId", session.getMetadata().get("mbrId")); + model.addAttribute("mbrInnb", session.getMetadata().get("mbrInnb")); + model.addAttribute("sesionId", session.getMetadata().get("sesionId")); + model.addAttribute("subsvcInnb", session.getMetadata().get("subsvcInnb")); + + return "sopmal/ordr/PayStripeSucsC"; + } + + @Policy(AuthPolicy.RESTRICTED) + @RequestMapping(value = "/stripeCancel") + public String stripeCancel(ModelMap model, @RequestParam("sessionId") String sessionId) throws StripeException { + StripeClient stripeClient = new StripeClient("sk_test_51TyR73GgW2hla0lOFbAPuSlGp3nDswNX54tikyI2OxFDtUU8LDC6ooahlgfV5qXPMD2y3V035UKhzz3LA1RcaF6700Lck9uPVR"); + Session session = stripeClient.v1().checkout().sessions().retrieve(sessionId); + + String status = session.getStatus(); + String paymentStatus = session.getPaymentStatus(); + JsonObject customerDetails = null; + JsonObject rawJson = session.getRawJsonObject(); + if (rawJson != null + && rawJson.has("customer_details") + && !rawJson.get("customer_details").isJsonNull()) { + customerDetails = rawJson.getAsJsonObject("customer_details"); + } + + model.addAttribute("status", status); + model.addAttribute("payment_status", paymentStatus); + model.addAttribute("customer_details", customerDetails); + if("complete".equals(status) && "paid".equals(paymentStatus)) { + model.addAttribute("returnUrl", "/sopmal/ordr/selectOrdrCompt"); + model.addAttribute("message", "Stripe 결제 정보 등록을 완료 하였습니다."); + } else { + model.addAttribute("returnUrl", "/sopmal/ordr/selectOrdrFailr"); + model.addAttribute("message", "Stripe 결제 정보 등록을 실패 하였습니다."); + } + model.addAttribute("sopmalCd", session.getMetadata().get("sopmalCd")); + model.addAttribute("ordrInnb", session.getMetadata().get("ordrInnb")); + model.addAttribute("pgCmpnyNm", session.getMetadata().get("pgCmpnyNm")); + model.addAttribute("setleTyCd", session.getMetadata().get("setleTyCd")); + model.addAttribute("goodsNm", session.getMetadata().get("goodsNm")); + model.addAttribute("setleAmt", session.getMetadata().get("setleAmt")); + model.addAttribute("ordrrNm", session.getMetadata().get("ordrrNm")); + model.addAttribute("ordrrEmail", session.getMetadata().get("ordrrEmail")); + model.addAttribute("ordrrMbtlnb", session.getMetadata().get("ordrrMbtlnb")); + model.addAttribute("mbrId", session.getMetadata().get("mbrId")); + model.addAttribute("mbrInnb", session.getMetadata().get("mbrInnb")); + model.addAttribute("sesionId", session.getMetadata().get("sesionId")); + model.addAttribute("subsvcInnb", session.getMetadata().get("subsvcInnb")); + + return "sopmal/ordr/PayStripeCnclC"; + } +} diff --git a/src/main/resources/static/pc/css/default.css b/src/main/resources/static/pc/css/default.css index 701d9b08..c1f776f3 100644 --- a/src/main/resources/static/pc/css/default.css +++ b/src/main/resources/static/pc/css/default.css @@ -9595,7 +9595,6 @@ main { .cartOrderBox__total { display: flex; align-items: center; - margin-bottom: 20px; } .cartOrderBox__totalTh { font-size: 16px; @@ -9619,6 +9618,7 @@ main { } .cartOrderBox__buyBtn { width: 100%; + margin-top: 20px; margin-bottom: 16px; } .cartOrderBox .product-btn-container { diff --git a/src/main/webapp/WEB-INF/views/sopmal/main/StrListFormR.jsp b/src/main/webapp/WEB-INF/views/sopmal/main/StrListFormR.jsp index 2fb264e1..73d14cc9 100644 --- a/src/main/webapp/WEB-INF/views/sopmal/main/StrListFormR.jsp +++ b/src/main/webapp/WEB-INF/views/sopmal/main/StrListFormR.jsp @@ -82,7 +82,7 @@ } if(!pageUnit) { - dataStr = $('#listForm').serialize(); + dataStr = `$('#listForm').serialize();` } else { if($('#pageUnit').length){ $('#pageUnit').val(pageUnit); diff --git a/src/main/webapp/WEB-INF/views/sopmal/ordr/MbrPurchsC.jsp b/src/main/webapp/WEB-INF/views/sopmal/ordr/MbrPurchsC.jsp index b931120b..0ca6fa9e 100644 --- a/src/main/webapp/WEB-INF/views/sopmal/ordr/MbrPurchsC.jsp +++ b/src/main/webapp/WEB-INF/views/sopmal/ordr/MbrPurchsC.jsp @@ -528,6 +528,7 @@ $(form).find('.pgContent').hide(); $(form).find('#' + id + 'Content').show(); + $('.cartOrderBox__totalKr').show(); //$(form).find('#setleSetupTyCd').val() === '01' ? $(form).find('#pg04Content').show() : $(form).find('#pg03Content').show(); if($(form).find('#setleSetupTyCd').val() === '01'){$(form).find('#pg04Content').show();} @@ -573,6 +574,9 @@ }); $(form).find('#setleTyCd').val('03'); + } else if('st01' === id){ //Stripe + $(form).find('#setleTyCd').val('stripe'); + $('.cartOrderBox__totalKr').hide(); } else { $(form).find('#setleTyCd').val(''); @@ -4239,6 +4243,15 @@ <%-- 퀵계좌이체 끝 --%> + <%-- Stripe 시작 --%> +<%-- --%> +
+ + +
+<%--
--%> + <%-- Stripe 끝 --%> + <%-- toss 결제 시작 --%>
@@ -4656,11 +4669,11 @@ (-)0${curUnit} -
+
총 결제금액 0${curUnit}
-
+
0${krUnit}
diff --git a/src/main/webapp/WEB-INF/views/sopmal/ordr/OrdrReqstStripePayR.jsp b/src/main/webapp/WEB-INF/views/sopmal/ordr/OrdrReqstStripePayR.jsp new file mode 100644 index 00000000..683f9fa5 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/sopmal/ordr/OrdrReqstStripePayR.jsp @@ -0,0 +1,66 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%> +<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%> + +<%-- + Class Name : OrsrReqstStripeR.jsp + Description : Stripe 주문 요청 + Modification Information + + 수정일 수정자 수정내용 + ------- -------- --------------------------- + 2026-09-17 이대환 최초 생성 +--%> + + + + + + + + + + + + + + + +<%-- Controller에 넘어가는 값 --%> +
+ + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeCnclC.jsp b/src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeCnclC.jsp new file mode 100644 index 00000000..b12a18f4 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeCnclC.jsp @@ -0,0 +1,64 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%> +<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%> + +<%-- + Class Name : PayStripeCnclC.jsp + Description : Stripe 결제 실패창 + Modification Information + + 수정일 수정자 수정내용 + ------- -------- --------------------------- + 2026-09-17 이대환 최초 생성 +--%> + + + + 결제 실패 + + + + + + +
+

결제 취소

+
+ + diff --git a/src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeSucsC.jsp b/src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeSucsC.jsp new file mode 100644 index 00000000..1c037000 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeSucsC.jsp @@ -0,0 +1,64 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%> +<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%> + +<%-- + Class Name : PayStripeSucsC.jsp + Description : Stripe 결제 성공창 + Modification Information + + 수정일 수정자 수정내용 + ------- -------- --------------------------- + 2026-09-17 이대환 최초 생성 +--%> + + + + 결제 성공 + + + + + + +
+

결제 성공

+
+ +