Stripe 결제 적용 테스트

This commit is contained in:
이대환
2026-09-28 15:48:48 +09:00
parent 3a42bff138
commit 85bb5ec055
10 changed files with 673 additions and 16 deletions

View File

@@ -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<String, Object>
*/
@Transactional
public Map<String, Object> insertStripeSetle(Session stripe, BOPayVO payVO) throws Exception {
boolean payResult = true;
Map<String, Object> 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;
}
/**

View File

@@ -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<String, Object> 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

View File

@@ -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<String, String> 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";
}
}

View File

@@ -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 {

View File

@@ -82,7 +82,7 @@
}
if(!pageUnit) {
dataStr = $('#listForm').serialize();
dataStr = `$('#listForm').serialize();`
} else {
if($('#pageUnit').length){
$('#pageUnit').val(pageUnit);

View File

@@ -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 @@
</c:if>
<%-- 퀵계좌이체 끝 --%>
<%-- Stripe 시작 --%>
<%-- <c:if test="${'Y' eq payInfo.rltmAcntUseAt}">--%>
<div class="custom-radio is-medium">
<input type="radio" name="pg" id="st01" value="stripe">
<label for="st01">엔화 결제</label>
</div>
<%-- </c:if>--%>
<%-- Stripe 끝 --%>
<%-- toss 결제 시작 --%>
<c:if test="${'02' eq payInfo.setleSetupTyCd}">
<div class="custom-radio is-medium">
@@ -4656,11 +4669,11 @@
<span class="cartOrderBox__td"><span class="cartOrderBox__discountMinus">(-)</span><span id="dscntAmtSapn" class="comma">0</span><span class="priceUnit">${curUnit}</span></span>
</li>
</ul>
<div class="cartOrderBox__total" style="margin-bottom: 5px;">
<div class="cartOrderBox__total">
<span class="cartOrderBox__totalTh">총 결제금액</span>
<span class="cartOrderBox__td"><span id="setleAmtSapn" class="comma">0</span><span class="priceUnit">${curUnit}</span></span>
</div>
<div class="cartOrderBox__total" style="margin-top: 5px;">
<div class="cartOrderBox__total cartOrderBox__totalKr" style="margin-top: 10px;">
<span class="cartOrderBox__totalTh"></span>
<span class="cartOrderBox__totalTd"><span id="setleAmtKrSapn" class="comma">0</span><span class="priceUnit">${krUnit}</span></span>
</div>

View File

@@ -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 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<!-- <meta charset="UTF-8"> -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Pragma" content="no-cache" />
<script src="<c:url value='/pc/vendor/jquery-3.7.1.min.js'/>"></script>
<script type="text/javascript" language="javascript">
$(document).ready(function() {
$.ajax({
url : "<c:url value="/sopmal/stripe/checkout"/>",
type : "POST",
data : $('#order_info').serialize(),
success : function(res) {
console.log(res);
const data = JSON.parse(res.resBody.result);
window.location.href = data.checkoutUrl;
}
});
});
</script>
</head>
<body>
<%-- Controller에 넘어가는 값 --%>
<form name="order_info" id="order_info">
<input type="hidden" name="sopmalCd" class="sopmalCd" value="${data.setle.sopmalCd}" />
<input type="hidden" name="ordrInnb" class="ordrInnb" value="${data.setle.ordrInnb}" />
<input type="hidden" name="pgCmpnyNm" class="pgCmpnyNm" value="${data.setle.pgCmpnyNm}" />
<input type="hidden" name="setleTyCd" class="setleTyCd" value="${data.setle.setleTyCd}" />
<input type="hidden" name="goodsNm" class="goodsNm" value="${data.setle.goodsNm}"/>
<input type="hidden" name="setleAmt" class="setleAmt" value="${data.setle.wonSetleAmt}"/>
<input type="hidden" name="jpSetleAmt" class="jpSetleAmt" value="${data.setle.setleAmt}"/>
<input type="hidden" name="ordrrNm" class="ordrrNm" value="${data.ordr.ordrrNm}"/>
<input type="hidden" name="ordrrEmail" class="ordrrEmail" value="${data.ordr.ordrrEmail}"/>
<input type="hidden" name="ordrrMbtlnb" class="ordrrMbtlnb" value="${data.ordr.ordrrMbtlnb}"/>
<input type="hidden" name="mbrId" class="mbrId" value="${data.ordr.mbrId}"/>
<input type="hidden" name="mbrInnb" class="mbrInnb" value="${data.ordr.mbrInnb}" />
<input type="hidden" name="sesionId" class="sesionId" value="${data.ordr.sesionId}" />
<input type="hidden" name="subsvcInnb" id="subsvcInnb" value="${subsvcInnb}"/>
</form>
</body>
</html>

View File

@@ -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 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>결제 실패</title>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<script src="<c:url value='/pc/vendor/jquery-3.7.1.min.js'/>"></script>
<script>
$(document).ready(function() {
var returnUrl = '${returnUrl}';
var status = '${status}';
var payment_status = '${payment_status}';
var customer_details = '${customer_details}';
let form = $('<form></form>');
$(form).attr('method', 'post');
$(form).attr('action', returnUrl);
history.replaceState(null, '', returnUrl);
$(form).append($('<input/>', {type:'hidden', name:'sopmalCd', value:'${sopmalCd}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrInnb', value:'${ordrInnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'pgCmpnyNm', value:'${pgCmpnyNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'setleTyCd', value:'${setleTyCd}'}));
$(form).append($('<input/>', {type:'hidden', name:'goodsNm', value:'${goodsNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'setleAmt', value:'${setleAmt}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrNm', value:'${ordrrNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrEmail', value:'${ordrrEmail}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrMbtlnb', value:'${ordrrMbtlnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'mbrId', value:'${mbrId}'}));
$(form).append($('<input/>', {type:'hidden', name:'mbrInnb', value:'${mbrInnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'sesionId', value:'${sesionId}'}));
$(form).append($('<input/>', {type:'hidden', name:'message', value:'${message}'}));
$(form).append($('<input/>', {type:'hidden', name:'subsvcInnb', value:'${subsvcInnb}'}));
$(form).appendTo('body');
$(form).submit().remove();
});
</script>
</head>
<body>
<section>
<h1>결제 취소</h1>
</section>
</body>
</html>

View File

@@ -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 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>결제 성공</title>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<script src="<c:url value='/pc/vendor/jquery-3.7.1.min.js'/>"></script>
<script>
$(document).ready(function() {
var returnUrl = '${returnUrl}';
var status = '${status}';
var payment_status = '${payment_status}';
var customer_details = '${customer_details}';
let form = $('<form></form>');
$(form).attr('method', 'post');
$(form).attr('action', returnUrl);
history.replaceState(null, '', returnUrl);
$(form).append($('<input/>', {type:'hidden', name:'sopmalCd', value:'${sopmalCd}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrInnb', value:'${ordrInnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'pgCmpnyNm', value:'${pgCmpnyNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'setleTyCd', value:'${setleTyCd}'}));
$(form).append($('<input/>', {type:'hidden', name:'goodsNm', value:'${goodsNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'setleAmt', value:'${setleAmt}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrNm', value:'${ordrrNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrEmail', value:'${ordrrEmail}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrMbtlnb', value:'${ordrrMbtlnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'mbrId', value:'${mbrId}'}));
$(form).append($('<input/>', {type:'hidden', name:'mbrInnb', value:'${mbrInnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'sesionId', value:'${sesionId}'}));
$(form).append($('<input/>', {type:'hidden', name:'message', value:'${message}'}));
$(form).append($('<input/>', {type:'hidden', name:'subsvcInnb', value:'${subsvcInnb}'}));
$(form).appendTo('body');
$(form).submit().remove();
});
</script>
</head>
<body>
<section>
<h1>결제 성공</h1>
</section>
</body>
</html>