Stripe 결제 적용 테스트
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
}
|
||||
|
||||
if(!pageUnit) {
|
||||
dataStr = $('#listForm').serialize();
|
||||
dataStr = `$('#listForm').serialize();`
|
||||
} else {
|
||||
if($('#pageUnit').length){
|
||||
$('#pageUnit').val(pageUnit);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
64
src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeCnclC.jsp
Normal file
64
src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeCnclC.jsp
Normal 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>
|
||||
64
src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeSucsC.jsp
Normal file
64
src/main/webapp/WEB-INF/views/sopmal/ordr/PayStripeSucsC.jsp
Normal 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>
|
||||
Reference in New Issue
Block a user