Procházet zdrojové kódy

지원 #1017 [FRONT] 네이버페이 찜하기 기능 확인 임시 커밋

card007 před 4 roky
rodič
revize
24f7732fbe

+ 161 - 34
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -4,8 +4,10 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 import java.net.URL;
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -1493,11 +1495,14 @@ public class TsfOrderService {
 		StringBuilder sb = new StringBuilder();
 		// http://ldfront.style24.com/pg/create/npay/goodsxml?product%5B0%5D%5Bid%5D=A83F-DP568S&product%5B0%5D%5BoptionManageCodes%5D=14019445-2&supplementSearch=true&optionSearch=true
 		// product%5B0%5D%5Bid%5D=A83F-DP568S&product%5B0%5D%5BoptionManageCodes%5D=14019445-2&supplementSearch=true&optionSearch=true
+		// http://ldfront.style24.com/pg/create/npay/goodsxml?product%5B0%5D%5Bid%5D=STYS00000143&product%5B0%5D%5BoptionManageCodes%5D=14237291-10/14237321-4/14237322-6&supplementSearch=true&optionSearch=true
+		// product%5B0%5D%5Bid%5D=STYS00000143&product%5B0%5D%5BoptionManageCodes%5D=14237291-10/14237321-4/14237322-6&supplementSearch=true&optionSearch=true
 		// 이스케이프코드 : %5B = [  ,   %5D = ]
 
 		try {
 			String goodsCdStr 				= "";
 			String optionManageCodesStr 	= "";
+			String optionManageCodes 		= "";
 			String queryStr 				= request.getQueryString();
 			String[] arr1 					= queryStr.split("product");
 
@@ -1521,8 +1526,10 @@ public class TsfOrderService {
 						} else if (arr3[0].contains("optionManageCodes")) {
 							if ("".equals(optionManageCodesStr)) {
 								optionManageCodesStr = optionManageCodesStr + arr3[1];
+								optionManageCodes = optionManageCodes + arr3[1];
 							} else {
 								optionManageCodesStr = optionManageCodesStr + "," + arr3[1];
+								optionManageCodes = optionManageCodes + "/" + arr3[1];
 							}
 						}
 					}
@@ -1742,30 +1749,40 @@ public class TsfOrderService {
 																								if (stockQtySave5 < Integer.parseInt(goods5stockQty[g5])) stockQty = Integer.parseInt(goods5stockQty[g5]);
 
 																								// 세트상품은 최대 5개이므로 마무리.
-																								sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																								if (optionManageCodes.equals(manageCode.toString())) {
+																									sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																								}
 																							}
 																						}
 																					}
 																				} else {
-																					sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																					if (optionManageCodes.equals(manageCode.toString())) {
+																						sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																					}
 																				}
 																			}
 																		}
 																	}
 																} else {
-																	sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																	if (optionManageCodes.equals(manageCode.toString())) {
+																		sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																	}
 																}
 															}
 														}
 													}
 												} else {
-													sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+													if (optionManageCodes.equals(manageCode.toString())) {
+														sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+													}
 												}
 											}
 										}
 									}
 								} else {
-									sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+									if (optionManageCodes.equals(manageCode.toString())) {
+										sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+									}
 								}
 							}
 						}
@@ -1915,25 +1932,27 @@ public class TsfOrderService {
 
 						// 옵션 옵션조합정보
 						for(GoodsStock optInfo : optList) {
-							sb.append("\t\t\t<combination>\n");
-							sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
-							sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
-							sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
-							sb.append("\t\t\t\t<status>true</status>\n");
-
-							// 옵션 옵션조합정보 색상
-							sb.append("\t\t\t\t<options>\n");
-							sb.append("\t\t\t\t\t<name>색상</name>\n");
-							sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd1()).append("</id>\n");
-							sb.append("\t\t\t\t</options>\n");
-
-							// 옵션 옵션조합정보 사이즈
-							sb.append("\t\t\t\t<options>\n");
-							sb.append("\t\t\t\t\t<name>사이즈</name>\n");
-							sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd2()).append("</id>\n");
-							sb.append("\t\t\t\t</options>\n");
-
-							sb.append("\t\t\t</combination>\n");
+							if (optionManageCode.equals(optInfo.getOptCd())) {
+								sb.append("\t\t\t<combination>\n");
+								sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
+								sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
+								sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
+								sb.append("\t\t\t\t<status>true</status>\n");
+
+								// 옵션 옵션조합정보 색상
+								sb.append("\t\t\t\t<options>\n");
+								sb.append("\t\t\t\t\t<name>색상</name>\n");
+								sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd1()).append("</id>\n");
+								sb.append("\t\t\t\t</options>\n");
+
+								// 옵션 옵션조합정보 사이즈
+								sb.append("\t\t\t\t<options>\n");
+								sb.append("\t\t\t\t\t<name>사이즈</name>\n");
+								sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd2()).append("</id>\n");
+								sb.append("\t\t\t\t</options>\n");
+
+								sb.append("\t\t\t</combination>\n");
+							}
 						}
 					} else {// 입점업체 상품 정보
 						// 옵션 아이템정보 색상
@@ -1950,16 +1969,18 @@ public class TsfOrderService {
 
 						// 옵션 옵션조합정보
 						for(GoodsStock optInfo : optList) {
-							sb.append("\t\t\t<combination>\n");
-							sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
-							sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
-							sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
-							sb.append("\t\t\t\t<status>true</status>\n");
-							sb.append("\t\t\t\t<options>\n");
-							sb.append("\t\t\t\t\t<name>옵션</name>\n");
-							sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd()).append("</id>\n");
-							sb.append("\t\t\t\t</options>\n");
-							sb.append("\t\t\t</combination>\n");
+							if (optionManageCode.equals(optInfo.getOptCd())) {
+								sb.append("\t\t\t<combination>\n");
+								sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
+								sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
+								sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
+								sb.append("\t\t\t\t<status>true</status>\n");
+								sb.append("\t\t\t\t<options>\n");
+								sb.append("\t\t\t\t\t<name>옵션</name>\n");
+								sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd()).append("</id>\n");
+								sb.append("\t\t\t\t</options>\n");
+								sb.append("\t\t\t</combination>\n");
+							}
 						}
 					}
 
@@ -2197,4 +2218,110 @@ public class TsfOrderService {
 		
 		return result;
 	}
+
+	/**
+	 * 네이버페이 찜하기 정보 전송
+	 * @param
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 08. 17
+	 */
+	public GagaMap sendZzimToNC(Goods goods, HttpServletRequest request, HttpServletResponse response) throws IOException {
+		GagaMap result = new GagaMap();
+		// 1.0, 2.0  일때 구분값 처리
+		URL _url = new URL(env.getProperty("naverPay.zzim.api.url"));
+		String ENCODING = "UTF-8";
+
+		HttpsURLConnection conn = (HttpsURLConnection)_url.openConnection();
+
+		conn.setDoInput(true);
+		conn.setDoOutput(true);
+		conn.setUseCaches(false);
+		conn.setRequestMethod("POST");
+		conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+
+		// 네이버페이 기본정보
+		String shopId			= env.getProperty("naverPay.shop.id");								// shopId
+		String certificationKey	= env.getProperty("naverPay.certification.key");					// 네이버페이 인증키
+		String goodsUrl 		= env.getProperty("domain.front");									// 상품 경로
+		goodsUrl			   += "/goods/detail/form?goodsCd=" + goods.getGoodsCd();
+		if ("Y".equals(goods.getSelfGoodsYn())) {
+			goodsUrl		   += "&colorCd=" + goods.getColorCd();
+		} else {
+			goodsUrl		   += "&colorCd=XX";
+		}
+		String goodsImgUrl		= env.getProperty("upload.goods.view") + "/" + goods.getSysImgNm();	// 상품 이미지 경로
+
+		// 상품정보 설정
+		StringBuilder sb = new StringBuilder();
+		_urlEncode(sb, "SHOP_ID", shopId);
+		sb.append('&');
+		_urlEncode(sb, "CERTI_KEY", certificationKey);
+		sb.append('&');
+		_urlEncode(sb, "ITEM_ID", goods.getGoodsCd());
+		sb.append('&');
+		_urlEncode(sb, "ITEM_NAME", goods.getGoodsNm());
+		sb.append('&');
+		_urlEncode(sb, "ITEM_UPRICE", String.valueOf(goods.getCurrPrice()));
+		sb.append('&');
+		_urlEncode(sb, "ITEM_IMAGE", goodsImgUrl);
+		sb.append('&');
+		_urlEncode(sb, "ITEM_URL", goodsUrl);
+		sb.append('&');
+		_urlEncode(sb, "RESERVE1", "");
+		sb.append('&');
+		_urlEncode(sb, "RESERVE2", "");
+		sb.append('&');
+		_urlEncode(sb, "RESERVE3", "");
+		sb.append('&');
+		_urlEncode(sb, "RESERVE4", "");
+		sb.append('&');
+		_urlEncode(sb, "RESERVE5", "");
+
+		// 주문 등록 API 호출
+		Writer writer = new OutputStreamWriter(conn.getOutputStream(), ENCODING);
+		writer.write(sb.toString());
+
+		writer.flush();
+		writer.close();
+
+		int respCode = conn.getResponseCode();
+		log.info("CHECK RESP CODE ::::: {}", respCode);
+
+		if (respCode != 200) {
+			throw new RuntimeException(String.format("NC Response fail : %d %s", respCode, conn.getResponseMessage()));
+		}
+
+		BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+
+		String itemId = reader.readLine();
+
+		if (StringUtils.isNotBlank(itemId)) {
+			String popupUrl = env.getProperty("naverPay.zzim.popup.url");
+			log.info("popupUrl >>> {}", popupUrl);
+			result.put("state", "success");
+			result.put("action", popupUrl);
+			result.put("shopId", shopId);
+			result.put("itemId", itemId);
+		} else {
+			throw new IllegalStateException(String.format("NC Response fail : %d %s", reader.readLine().toString()));
+		}
+
+		conn.disconnect();
+
+		return result;
+	}
+
+	private void _urlEncode(StringBuilder sb, String key, String value) {
+		String ENCODING = "UTF-8";
+		try {
+			sb.append(URLEncoder.encode(key, ENCODING));
+			sb.append('=');
+			sb.append(URLEncoder.encode(value, ENCODING));
+		}
+		catch(UnsupportedEncodingException e) {
+			//일어나지 않음
+			throw new Error(e);
+		}
+	}
 }

+ 13 - 0
src/main/java/com/style24/front/biz/web/TsfPgController.java

@@ -24,6 +24,7 @@ import com.style24.front.biz.service.TsfCustomerService;
 import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.persistence.domain.CustContactHst;
+import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Payment;
 
@@ -206,4 +207,16 @@ public class TsfPgController extends TsfBaseController {
 	public void createNpayGoodsXml(HttpServletRequest request, HttpServletResponse response) throws Exception {
 		orderService.createNpayGoodsXml50(request, response);
 	}
+
+	/**
+	 * 네이버 페이 찜하기 전송
+	 * @param model
+	 * @return
+	 * @throws Exception
+	 */
+	@ResponseBody
+	@PostMapping("/create/npay/zzim")
+	public GagaMap nPayReq(@RequestBody Goods goods, HttpServletRequest request, HttpServletResponse response) throws Exception {
+		return orderService.sendZzimToNC(goods, request, response);
+	}
 }

+ 2 - 0
src/main/resources/config/application-locd.yml

@@ -94,6 +94,8 @@ naverPay:
     order.api.url: https://test-api.pay.naver.com/o/customer/api/order/v20/register
     order.pc.url: https://test-order.pay.naver.com/customer/buy/
     order.mobile.url: https://test-m.pay.naver.com/o/customer/buy/
+    zzim.api.url: https://test-pay.naver.com/customer/api/wishlist.nhn
+    zzim.popup.url: https://test-pay.naver.com/customer/wishlistPopup.nhn
     access.license: 01000100005b15bb8faab722d100d589f34bd64843659e37a168b3617443c4f52a3fda45b8
     secret.key: AQABAADtZ/jOC1Y3LNsyI0TWwCMvPfrg0sqM9pnxliSegbjSqQ==
     port.address: http://sandbox.api.naver.com/Checkout/MallService5

+ 2 - 0
src/main/resources/config/application-style.yml

@@ -106,6 +106,8 @@ naverPay:
     order.api.url: https://test-api.pay.naver.com/o/customer/api/order/v20/register
     order.pc.url: https://test-order.pay.naver.com/customer/buy/
     order.mobile.url: https://test-m.pay.naver.com/o/customer/buy/
+    zzim.api.url: https://test-pay.naver.com/customer/api/wishlist.nhn
+    zzim.popup.url: https://test-pay.naver.com/customer/wishlistPopup.nhn
     access.license: 01000100005b15bb8faab722d100d589f34bd64843659e37a168b3617443c4f52a3fda45b8
     secret.key: AQABAADtZ/jOC1Y3LNsyI0TWwCMvPfrg0sqM9pnxliSegbjSqQ==
     port.address: http://sandbox.api.naver.com/Checkout/MallService5

+ 55 - 2
src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDetailFormMob.html

@@ -21,6 +21,10 @@
 <script type="text/javascript" th:src="${@environment.getProperty('naverPay.button.mobile.js.url')}" src="" charset="UTF-8"></script>
 <script type="text/javascript" src="https://wcs.naver.net/wcslog.js"></script>
 <form id="nPayForm" name="nPayForm"></form>
+<form id="nPayWishForm" name="nPayWishForm" method="get">
+	<input type="hidden" name="SHOP_ID" />
+	<input type="hidden" name="ITEM_ID" />
+</form>
 <form name="cartForm" id="cartForm" method="post">
 		<input type="hidden" name="mode">
 		<input type="hidden" name="goodsCd" th:value="${params.goodsCd}" />
@@ -196,7 +200,7 @@
 
 									<script th:inline="javascript">
 										if(!wcs_add) var wcs_add = {};
-										wcs_add["wa"] = "${@environment.getProperty('naverPay.common.certification.key')}";
+										wcs_add["wa"] = [[${@environment.getProperty('naverPay.common.certification.key')}]];
 										wcs.inflow("style24.com");
 										wcs_do();
 									</script>
@@ -207,9 +211,10 @@
 											BUTTON_KEY              : "[[${buttonKey}]]",       // 네이버페이에서 제공받은 버튼 인증 키 입력
 											TYPE                    : "MA",                      // 버튼 모음 종류 설정
 											COLOR                   : 1,                        // 버튼 모음의 색 설정
-											COUNT                   : 1,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
+											COUNT                   : 2,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
 											ENABLE                  : "Y",                      // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
 											BUY_BUTTON_HANDLER      : buy_nc,                   // 구매하기 버튼 이벤트 Handler 함수 등록, 품절인 경우 not_buy_nc 함수 사용
+											WISHLIST_BUTTON_HANDLER : wishlist_nc,              // 찜하기 버튼 이벤트 Handler 함수 등록
 											"":""
 										});
 
@@ -296,6 +301,54 @@
 											mcxDialog.alert("죄송합니다. 네이버페이로 구매가 불가한 상품입니다.");
 											return false;
 										}
+										
+										<!-- 찜하기 -->
+										function wishlist_nc() {
+											let goodsCd = "[[${goodsInfo.goodsCd}]]";
+											let goodsNm = "[[${goodsInfo.goodsNm}]]";
+											let colorCd = "[[${goodsInfo.colorCd}]]";
+											let currPrice = "[[${goodsInfo.currPrice}]]";
+											let sysImgNm = "[[${goodsInfo.sysImgNm}]]";
+											let selfGoodsYn = "[[${goodsInfo.selfGoodsYn}]]";
+											
+											let data = {};
+											data.goodsCd = goodsCd;
+											data.goodsNm = goodsNm;
+											data.colorCd = colorCd;
+											data.currPrice = currPrice;
+											data.sysImgNm = sysImgNm;
+											data.selfGoodsYn = selfGoodsYn;
+											
+											let jsonData = JSON.stringify(data);
+											
+											$.ajax({
+												type: "POST",
+												url: "/pg/create/npay/zzim",
+												dataType: 'json',
+												data: jsonData,
+												beforeSend: function (xhr, settings) {
+													xhr.setRequestHeader("AJAX", "true");
+													xhr.setRequestHeader('Accept', 'application/json');
+													xhr.setRequestHeader('Content-Type', 'application/json');
+												},
+												error: function (xhr, status, error) {
+													mcxDialog.alert(status + '; ' + error);
+												},
+												success: function (result) {
+													if (result.state == "success") {
+														$('#nPayWishForm input[name=SHOP_ID]').val(result.shopId);
+														$('#nPayWishForm input[name=ITEM_ID]').val(result.itemId);
+														
+														window.open('about:blank', 'popupView');
+														document.nPayWishForm.target = 'popupView';
+														document.nPayWishForm.action = result.action;
+														document.nPayWishForm.submit();
+													} else {
+														mcxDialog.alert(result.message);
+													}
+												}
+											});
+										}
 									</script>
 								</th:block>
 							</th:block>

+ 56 - 2
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html

@@ -20,6 +20,10 @@
 <th:block layout:fragment="content">
 	<script type="text/javascript" src="https://wcs.naver.net/wcslog.js"></script>
 	<form id="nPayForm" name="nPayForm"></form>
+	<form id="nPayWishForm" name="nPayWishForm" method="get">
+		<input type="hidden" name="SHOP_ID" />
+		<input type="hidden" name="ITEM_ID" />
+	</form>
 	<form name="cartForm" id="cartForm" method="post">
 		<input type="hidden" name="mode">
 		<input type="hidden" name="goodsCd" th:value="${params.goodsCd}" />
@@ -1070,7 +1074,7 @@
 
 								<script th:inline="javascript">
 									if(!wcs_add) var wcs_add = {};
-									wcs_add["wa"] = "${@environment.getProperty('naverPay.common.certification.key')}";
+									wcs_add["wa"] = [[${@environment.getProperty('naverPay.common.certification.key')}]];
 									wcs.inflow("style24.com");
 									wcs_do();
 								</script>
@@ -1081,9 +1085,10 @@
 										BUTTON_KEY              : "[[${buttonKey}]]",       // 네이버페이에서 제공받은 버튼 인증 키 입력
 										TYPE                    : "MA",                      // 버튼 모음 종류 설정
 										COLOR                   : 1,                        // 버튼 모음의 색 설정
-										COUNT                   : 1,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
+										COUNT                   : 2,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
 										ENABLE                  : "Y",                      // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
 										BUY_BUTTON_HANDLER      : buy_nc,                   // 구매하기 버튼 이벤트 Handler 함수 등록, 품절인 경우 not_buy_nc 함수 사용
+										WISHLIST_BUTTON_HANDLER : wishlist_nc,              // 찜하기 버튼 이벤트 Handler 함수 등록
 										"":""
 									});
 
@@ -1238,6 +1243,55 @@
 										mcxDialog.alert("죄송합니다. 네이버페이로 구매가 불가한 상품입니다.");
 										return false;
 									}
+
+									<!-- 찜하기 -->
+									function wishlist_nc() {
+										let goodsCd			= "[[${goodsInfo.goodsCd}]]";
+										let goodsNm			= "[[${goodsInfo.goodsNm}]]";
+										let colorCd			= "[[${goodsInfo.colorCd}]]";
+										let currPrice		= "[[${goodsInfo.currPrice}]]";
+										let sysImgNm		= "[[${goodsInfo.sysImgNm}]]";
+										let selfGoodsYn		= "[[${goodsInfo.selfGoodsYn}]]";
+										
+										let data = {};
+										data.goodsCd		= goodsCd;
+										data.goodsNm		= goodsNm;
+										data.colorCd		= colorCd;
+										data.currPrice		= currPrice;
+										data.sysImgNm		= sysImgNm;
+										data.selfGoodsYn	= selfGoodsYn;
+										
+										let jsonData = JSON.stringify(data);
+										
+										$.ajax( {
+											type		: "POST",
+											url 		: "/pg/create/npay/zzim",
+											dataType 	: 'json',
+											data		: jsonData,
+											beforeSend : function(xhr, settings) {
+												xhr.setRequestHeader("AJAX"			, "true");
+												xhr.setRequestHeader('Accept'		, 'application/json');
+												xhr.setRequestHeader('Content-Type'	, 'application/json');
+											},
+											error: function(xhr, status, error) {
+												mcxDialog.alert(status + '; ' + error);
+											},
+											success : function(result) {
+												if (result.state == "success") {
+													$('#nPayWishForm input[name=SHOP_ID]').val(result.shopId);
+													$('#nPayWishForm input[name=ITEM_ID]').val(result.itemId);
+													console.log(result);
+													
+													window.open('about:blank', 'popupView');
+													document.nPayWishForm.target = 'popupView';
+													document.nPayWishForm.action = result.action;
+													document.nPayWishForm.submit();
+												} else {
+													mcxDialog.alert(result.message);
+												}
+											}
+										});
+									}
 								</script>
 							</th:block>
 						</th:block>

+ 56 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html

@@ -24,6 +24,10 @@
 <script type="text/javascript" src="https://wcs.naver.net/wcslog.js"></script>
 
 <form id="nPayForm" name="nPayForm"></form>
+<form id="nPayWishForm" name="nPayWishForm" method="get">
+	<input type="hidden" name="SHOP_ID" />
+	<input type="hidden" name="ITEM_ID" />
+</form>
 <div id="container" class="container pd deal" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
 	<div class="wrap">
 		<!-- 상품 대표설명 -->
@@ -270,7 +274,7 @@
 									<th:block th:with="buttonKey=${@environment.getProperty('naverPay.button.key')}">
 										<script th:inline="javascript">
 											if(!wcs_add) var wcs_add = {};
-											wcs_add["wa"] = "${@environment.getProperty('naverPay.common.certification.key')}";
+											wcs_add["wa"] = [[${@environment.getProperty('naverPay.common.certification.key')}]];
 											wcs.inflow("style24.com");
 											wcs_do();
 										</script>
@@ -282,9 +286,10 @@
 												BUTTON_KEY              : "[[${buttonKey}]]",       // 네이버페이에서 제공받은 버튼 인증 키 입력
 												TYPE                    : "C",                      // 버튼 모음 종류 설정
 												COLOR                   : 1,                        // 버튼 모음의 색 설정
-												COUNT                   : 1,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
+												COUNT                   : 2,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
 												ENABLE                  : "Y",                      // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
 												BUY_BUTTON_HANDLER      : buy_nc,                   // 구매하기 버튼 이벤트 Handler 함수 등록, 품절인 경우 not_buy_nc 함수 사용
+												WISHLIST_BUTTON_HANDLER : wishlist_nc,              // 찜하기 버튼 이벤트 Handler 함수 등록
 												"":""
 											});
 
@@ -340,6 +345,55 @@
 												mcxDialog.alert("죄송합니다. 네이버페이로 구매가 불가한 상품입니다.");
 												return false;
 											}
+											
+											<!-- 찜하기 -->
+											function wishlist_nc() {
+												let goodsCd			= "[[${goodsInfo.goodsCd}]]";
+												let goodsNm			= "[[${goodsInfo.goodsNm}]]";
+												let colorCd			= "[[${goodsInfo.colorCd}]]";
+												let currPrice		= "[[${goodsInfo.currPrice}]]";
+												let sysImgNm		= "[[${goodsInfo.sysImgNm}]]";
+												let selfGoodsYn		= "[[${goodsInfo.selfGoodsYn}]]";
+												
+												let data = {};
+												data.goodsCd		= goodsCd;
+												data.goodsNm		= goodsNm;
+												data.colorCd		= colorCd;
+												data.currPrice		= currPrice;
+												data.sysImgNm		= sysImgNm;
+												data.selfGoodsYn	= selfGoodsYn;
+												
+												let jsonData = JSON.stringify(data);
+												
+												$.ajax( {
+													type		: "POST",
+													url 		: "/pg/create/npay/zzim",
+													dataType 	: 'json',
+													data		: jsonData,
+													beforeSend : function(xhr, settings) {
+														xhr.setRequestHeader("AJAX"			, "true");
+														xhr.setRequestHeader('Accept'		, 'application/json');
+														xhr.setRequestHeader('Content-Type'	, 'application/json');
+													},
+													error: function(xhr, status, error) {
+														mcxDialog.alert(status + '; ' + error);
+													},
+													success : function(result) {
+														if (result.state == "success") {
+															$('#nPayWishForm input[name=SHOP_ID]').val(result.shopId);
+															$('#nPayWishForm input[name=ITEM_ID]').val(result.itemId);
+															console.log(result);
+															
+															window.open('about:blank', 'popupView');
+															document.nPayWishForm.target = 'popupView';
+															document.nPayWishForm.action = result.action;
+															document.nPayWishForm.submit();
+														} else {
+															mcxDialog.alert(result.message);
+														}
+													}
+												});
+											}
 											//]]>
 										</script>
 									</th:block>

+ 55 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -19,6 +19,10 @@
 <body>
 <th:block layout:fragment="content">
 <form id="nPayForm" name="nPayForm"></form>
+<form id="nPayWishForm" name="nPayWishForm" method="get">
+	<input type="hidden" name="SHOP_ID" />
+	<input type="hidden" name="ITEM_ID" />
+</form>
 <div id="container" class="container pd" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
 <script src="//developers.kakao.com/sdk/js/kakao.min.js"></script>
 <script type="text/javascript" src="https://wcs.naver.net/wcslog.js"></script>
@@ -389,7 +393,7 @@
 
 										<script th:inline="javascript">
 											if(!wcs_add) var wcs_add = {};
-											wcs_add["wa"] = "${@environment.getProperty('naverPay.common.certification.key')}";
+											wcs_add["wa"] = [[${@environment.getProperty('naverPay.common.certification.key')}]];
 											wcs.inflow("style24.com");
 											wcs_do();
 										</script>
@@ -400,9 +404,10 @@
 												BUTTON_KEY              : "[[${buttonKey}]]",       // 네이버페이에서 제공받은 버튼 인증 키 입력
 												TYPE                    : "C",                      // 버튼 모음 종류 설정
 												COLOR                   : 1,                        // 버튼 모음의 색 설정
-												COUNT                   : 1,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
+												COUNT                   : 2,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
 												ENABLE                  : "Y",                      // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
 												BUY_BUTTON_HANDLER      : buy_nc,                   // 구매하기 버튼 이벤트 Handler 함수 등록, 품절인 경우 not_buy_nc 함수 사용
+												WISHLIST_BUTTON_HANDLER : wishlist_nc,              // 찜하기 버튼 이벤트 Handler 함수 등록
 												"":""
 											});
 
@@ -540,6 +545,54 @@
 												mcxDialog.alert("죄송합니다. 네이버페이로 구매가 불가한 상품입니다.");
 												return false;
 											}
+
+											<!-- 찜하기 -->
+											function wishlist_nc() {
+												let goodsCd			= "[[${goodsInfo.goodsCd}]]";
+												let goodsNm			= "[[${goodsInfo.goodsNm}]]";
+												let colorCd			= "[[${goodsInfo.colorCd}]]";
+												let currPrice		= "[[${goodsInfo.currPrice}]]";
+												let sysImgNm		= "[[${goodsInfo.sysImgNm}]]";
+												let selfGoodsYn		= "[[${goodsInfo.selfGoodsYn}]]";
+												
+												let data = {};
+												data.goodsCd		= goodsCd;
+												data.goodsNm		= goodsNm;
+												data.colorCd		= colorCd;
+												data.currPrice		= currPrice;
+												data.sysImgNm		= sysImgNm;
+												data.selfGoodsYn	= selfGoodsYn;
+												
+												let jsonData = JSON.stringify(data);
+												
+												$.ajax( {
+													type		: "POST",
+													url 		: "/pg/create/npay/zzim",
+													dataType 	: 'json',
+													data		: jsonData,
+													beforeSend : function(xhr, settings) {
+														xhr.setRequestHeader("AJAX"			, "true");
+														xhr.setRequestHeader('Accept'		, 'application/json');
+														xhr.setRequestHeader('Content-Type'	, 'application/json');
+													},
+													error: function(xhr, status, error) {
+														mcxDialog.alert(status + '; ' + error);
+													},
+													success : function(result) {
+														if (result.state == "success") {
+															$('#nPayWishForm input[name=SHOP_ID]').val(result.shopId);
+															$('#nPayWishForm input[name=ITEM_ID]').val(result.itemId);
+
+															window.open('about:blank', 'popupView');
+															document.nPayWishForm.target = 'popupView';
+															document.nPayWishForm.action = result.action;
+															document.nPayWishForm.submit();
+														} else {
+															mcxDialog.alert(result.message);
+														}
+													}
+												});
+											}
 											//]]>
 										</script>
 									</th:block>

+ 102 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html

@@ -369,9 +369,10 @@
 										BUTTON_KEY              : "[[${buttonKey}]]",       // 네이버페이에서 제공받은 버튼 인증 키 입력
 										TYPE                    : "C",                      // 버튼 모음 종류 설정
 										COLOR                   : 1,                        // 버튼 모음의 색 설정
-										COUNT                   : 1,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
+										COUNT                   : 2,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
 										ENABLE                  : "Y",                      // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
 										BUY_BUTTON_HANDLER      : buy_nc,                   // 구매하기 버튼 이벤트 Handler 함수 등록, 품절인 경우 not_buy_nc 함수 사용
+										WISHLIST_BUTTON_HANDLER : wishlist_nc,              // 찜하기 버튼 이벤트 Handler 함수 등록
 										"":""
 									});
 
@@ -427,6 +428,55 @@
 										mcxDialog.alert("죄송합니다. 네이버페이로 구매가 불가한 상품입니다.");
 										return false;
 									}
+									
+									<!-- 찜하기 -->
+									function wishlist_nc() {
+										let goodsCd			= "[[${goodsInfo.goodsCd}]]";
+										let goodsNm			= "[[${goodsInfo.goodsNm}]]";
+										let colorCd			= "[[${goodsInfo.colorCd}]]";
+										let currPrice		= "[[${goodsInfo.currPrice}]]";
+										let sysImgNm		= "[[${goodsInfo.sysImgNm}]]";
+										let selfGoodsYn		= "[[${goodsInfo.selfGoodsYn}]]";
+										
+										let data = {};
+										data.goodsCd		= goodsCd;
+										data.goodsNm		= goodsNm;
+										data.colorCd		= colorCd;
+										data.currPrice		= currPrice;
+										data.sysImgNm		= sysImgNm;
+										data.selfGoodsYn	= selfGoodsYn;
+										
+										let jsonData = JSON.stringify(data);
+										
+										$.ajax( {
+											type		: "POST",
+											url 		: "/pg/create/npay/zzim",
+											dataType 	: 'json',
+											data		: jsonData,
+											beforeSend : function(xhr, settings) {
+												xhr.setRequestHeader("AJAX"			, "true");
+												xhr.setRequestHeader('Accept'		, 'application/json');
+												xhr.setRequestHeader('Content-Type'	, 'application/json');
+											},
+											error: function(xhr, status, error) {
+												mcxDialog.alert(status + '; ' + error);
+											},
+											success : function(result) {
+												if (result.state == "success") {
+													$('#nPayWishForm input[name=SHOP_ID]').val(result.shopId);
+													$('#nPayWishForm input[name=ITEM_ID]').val(result.itemId);
+													console.log(result);
+													
+													window.open('about:blank', 'popupView');
+													document.nPayWishForm.target = 'popupView';
+													document.nPayWishForm.action = result.action;
+													document.nPayWishForm.submit();
+												} else {
+													mcxDialog.alert(result.message);
+												}
+											}
+										});
+									}
 									//]]>
 								</script>
 							</th:block>
@@ -554,9 +604,10 @@
 									BUTTON_KEY              : "[[${buttonKey}]]",       // 네이버페이에서 제공받은 버튼 인증 키 입력
 									TYPE                    : "C",                      // 버튼 모음 종류 설정
 									COLOR                   : 1,                        // 버튼 모음의 색 설정
-									COUNT                   : 1,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
+									COUNT                   : 2,                        // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
 									ENABLE                  : "Y",                      // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
 									BUY_BUTTON_HANDLER      : buy_nc,                   // 구매하기 버튼 이벤트 Handler 함수 등록, 품절인 경우 not_buy_nc 함수 사용
+									WISHLIST_BUTTON_HANDLER : wishlist_nc,              // 찜하기 버튼 이벤트 Handler 함수 등록
 									"":""
 								});
 
@@ -613,6 +664,55 @@
 									return false;
 								}
 								//]]>
+								
+								<!-- 찜하기 -->
+								function wishlist_nc() {
+									let goodsCd			= "[[${goodsInfo.goodsCd}]]";
+									let goodsNm			= "[[${goodsInfo.goodsNm}]]";
+									let colorCd			= "[[${goodsInfo.colorCd}]]";
+									let currPrice		= "[[${goodsInfo.currPrice}]]";
+									let sysImgNm		= "[[${goodsInfo.sysImgNm}]]";
+									let selfGoodsYn		= "[[${goodsInfo.selfGoodsYn}]]";
+									
+									let data = {};
+									data.goodsCd		= goodsCd;
+									data.goodsNm		= goodsNm;
+									data.colorCd		= colorCd;
+									data.currPrice		= currPrice;
+									data.sysImgNm		= sysImgNm;
+									data.selfGoodsYn	= selfGoodsYn;
+									
+									let jsonData = JSON.stringify(data);
+									
+									$.ajax( {
+										type		: "POST",
+										url 		: "/pg/create/npay/zzim",
+										dataType 	: 'json',
+										data		: jsonData,
+										beforeSend : function(xhr, settings) {
+											xhr.setRequestHeader("AJAX"			, "true");
+											xhr.setRequestHeader('Accept'		, 'application/json');
+											xhr.setRequestHeader('Content-Type'	, 'application/json');
+										},
+										error: function(xhr, status, error) {
+											mcxDialog.alert(status + '; ' + error);
+										},
+										success : function(result) {
+											if (result.state == "success") {
+												$('#nPayWishForm input[name=SHOP_ID]').val(result.shopId);
+												$('#nPayWishForm input[name=ITEM_ID]').val(result.itemId);
+												console.log(result);
+												
+												window.open('about:blank', 'popupView');
+												document.nPayWishForm.target = 'popupView';
+												document.nPayWishForm.action = result.action;
+												document.nPayWishForm.submit();
+											} else {
+												mcxDialog.alert(result.message);
+											}
+										}
+									});
+								}
 							</script>
 						</th:block>
 					</div>