Merge branch 'master' of http://subsub8729@vcs.iten.co.kr/2025_PROJECT/mjgo_git
http://subsub8729@vcs.iten.co.kr/2025_PROJECT/mjgo_git Conflicts: src/main/webapp/publish/css/style.css
@5eeb4871e8e9f8af49d13982de26684140aae591
--- pom.xml
+++ pom.xml
... | ... | @@ -585,7 +585,7 @@ |
| 585 | 585 |
|
| 586 | 586 |
<defaultGoal>install</defaultGoal> |
| 587 | 587 |
<directory>${basedir}/target</directory>
|
| 588 |
- <finalName>ROOT</finalName> |
|
| 588 |
+ <finalName>mjgo</finalName> |
|
| 589 | 589 |
<pluginManagement> |
| 590 | 590 |
<plugins> |
| 591 | 591 |
<plugin> |
--- src/main/java/itn/let/mjo/pay/service/MjonPayTossService.java
... | ... | @@ -1,31 +0,0 @@ |
| 1 | -package itn.let.mjo.pay.service; | |
| 2 | - | |
| 3 | -import itn.com.cmm.LoginVO; | |
| 4 | - | |
| 5 | -import java.io.IOException; | |
| 6 | -import java.util.List; | |
| 7 | -import java.util.Map; | |
| 8 | - | |
| 9 | -public interface MjonPayTossService { | |
| 10 | - Map<String, Object> processTossConfirm(String paymentKey, String orderId, String amount, LoginVO loginVO) throws Exception; | |
| 11 | - | |
| 12 | - /** | |
| 13 | - * 토스페이먼츠 가상계좌 입금 콜백(웹훅) 처리. | |
| 14 | - * 입금이 완료(DONE)된 주문에 대해 mj_pg 상태를 결제완료로 바꾸고 캐시/포인트를 적립한다. | |
| 15 | - * @param orderId 상점 주문번호 (MOID) | |
| 16 | - * @return 처리결과(credited: 실제 적립 여부, message) | |
| 17 | - */ | |
| 18 | - Map<String, Object> processTossVbankDeposit(String orderId) throws Exception; | |
| 19 | - | |
| 20 | -// public int selectBLineMberCnt(String mberId) throws Exception; | |
| 21 | -// | |
| 22 | -// public int insertPrePayInfo(MjonPrePayVO mjonPrePayVO) throws Exception; | |
| 23 | -// | |
| 24 | -// public List<MjonPrePayVO> selectPrePayList(MjonPrePayVO mjonPrePayVO) throws Exception; | |
| 25 | -// | |
| 26 | -// public int deletePrePayInfo(MjonPrePayVO mjonPrePayVO) throws Exception; | |
| 27 | -// | |
| 28 | -// public MjonPrePayVO selectPrePayInfo(MjonPrePayVO mjonPrePayVO) throws Exception; | |
| 29 | -// | |
| 30 | -// public int updatePrePayModify(MjonPrePayVO mjonPrePayVO) throws Exception; | |
| 31 | -} |
--- src/main/java/itn/let/mjo/pay/service/MjonPayVO.java
+++ src/main/java/itn/let/mjo/pay/service/MjonPayVO.java
... | ... | @@ -246,6 +246,6 @@ |
| 246 | 246 |
private String managerNm; // 담당자명 |
| 247 | 247 |
private String prePaymentYn; // 선불결제여부 N:후불제고객 |
| 248 | 248 |
private String dept; // 회원종류 p:개인 c:기업 |
| 249 |
- |
|
| 250 |
- |
|
| 249 |
+ |
|
| 250 |
+ |
|
| 251 | 251 |
} |
--- src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java
+++ src/main/java/itn/let/mjo/pay/service/impl/MjonPayDAO.java
... | ... | @@ -201,11 +201,6 @@ |
| 201 | 201 |
return update("mjonPayDAO.updateMjonPgStatus", refundVO);
|
| 202 | 202 |
} |
| 203 | 203 |
|
| 204 |
- // 토스 가상계좌 입금완료 처리: PG_STATUS 0(입금대기) → 1(결제완료). 멱등 처리를 위해 0인 건만 갱신. |
|
| 205 |
- public int updateTossVbankDeposit(MjonPayVO mjonPayVO) throws Exception {
|
|
| 206 |
- return update("mjonPayDAO.updateTossVbankDeposit", mjonPayVO);
|
|
| 207 |
- } |
|
| 208 |
- |
|
| 209 | 204 |
@SuppressWarnings("unchecked")
|
| 210 | 205 |
public List<MjonPayVO> selectPayDayChart(MjonPayVO mjonPayVO) throws Exception{
|
| 211 | 206 |
return (List<MjonPayVO>)list("mjonPayDAO.selectPayDayChart", mjonPayVO);
|
--- src/main/java/itn/let/mjo/pay/service/impl/MjonPayTossServiceImpl.java
... | ... | @@ -1,398 +0,0 @@ |
| 1 | -package itn.let.mjo.pay.service.impl; | |
| 2 | - | |
| 3 | -import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; | |
| 4 | -import egovframework.rte.fdl.idgnr.EgovIdGnrService; | |
| 5 | -import itn.com.cmm.LoginVO; | |
| 6 | -import itn.let.mjo.pay.service.MjonPayService; | |
| 7 | -import itn.let.mjo.pay.service.MjonPayTossService; | |
| 8 | - | |
| 9 | -import javax.annotation.Resource; | |
| 10 | -import java.io.*; | |
| 11 | -import java.util.Map; | |
| 12 | - | |
| 13 | -import itn.let.mjo.msgdata.service.MjonMsgDataService; | |
| 14 | -import itn.let.mjo.pay.service.MjonPayVO; | |
| 15 | -import itn.let.sym.site.service.JoinSettingVO; | |
| 16 | -import itn.let.uat.uia.service.impl.MberManageDAO; | |
| 17 | -import itn.let.uss.umt.service.MberManageVO; | |
| 18 | -import org.springframework.beans.factory.annotation.Value; | |
| 19 | -import org.springframework.stereotype.Service; | |
| 20 | - | |
| 21 | -import java.nio.charset.StandardCharsets; | |
| 22 | -import java.util.*; | |
| 23 | - | |
| 24 | -import java.net.HttpURLConnection; | |
| 25 | -import java.net.URL; | |
| 26 | -import java.util.Base64; | |
| 27 | -import java.util.HashMap; | |
| 28 | - | |
| 29 | -import org.json.JSONObject; | |
| 30 | - | |
| 31 | -@Service("mjonPayTossService") | |
| 32 | -public class MjonPayTossServiceImpl extends EgovAbstractServiceImpl implements MjonPayTossService { | |
| 33 | - | |
| 34 | - @Resource(name="mjonPrePayDAO") | |
| 35 | - private MjonPrePayDAO mjonPrePayDAO; | |
| 36 | - | |
| 37 | - @Resource(name="mjonPayDAO") | |
| 38 | - private MjonPayDAO mjonPayDAO; | |
| 39 | - | |
| 40 | - /** 캐시/회원잔액 적립 공용 서비스 (insertCash → mj_cash + LETTNGNRLMBER.USER_MONEY) */ | |
| 41 | - @Resource(name="mjonPayService") | |
| 42 | - private MjonPayService mjonPayService; | |
| 43 | - | |
| 44 | - /** 포인트 ID 생성기 */ | |
| 45 | - @Resource(name="egovMjonPointIdGnrService") | |
| 46 | - private EgovIdGnrService idgenMjonPointId; | |
| 47 | - | |
| 48 | - /** 가입설정(포인트 적립비율) 조회 */ | |
| 49 | - @Resource(name="MjonMsgDataService") | |
| 50 | - private MjonMsgDataService mjonMsgDataService; | |
| 51 | - | |
| 52 | - /** mberManageDAO */ | |
| 53 | - @Resource(name="mberManageDAO") | |
| 54 | - private MberManageDAO mberManageDAO; | |
| 55 | - | |
| 56 | - /** 토스 시크릿 키 (globals_*.properties, 콜론 없이 키 본문만 저장 → 인증 시 코드에서 ':' 부착) */ | |
| 57 | - @Value("#{globalSettings['Globals.pay.toss.secretKey']}") | |
| 58 | - private String tossSecretKey; | |
| 59 | - | |
| 60 | - /** 토스 Basic 인증 헤더값 = Base64(secretKey + ":") */ | |
| 61 | - private String tossBasicAuth() { | |
| 62 | - return Base64.getEncoder().encodeToString((tossSecretKey + ":").getBytes(StandardCharsets.UTF_8)); | |
| 63 | - } | |
| 64 | - | |
| 65 | - /** | |
| 66 | - * 토스페이먼츠 결제 승인 및 내역 저장 | |
| 67 | - * @param paymentKey 토스 결제 고유 키 | |
| 68 | - * @param orderId 상점 주문번호 (MOID) | |
| 69 | - * @param amount 결제 금액 | |
| 70 | - * @param loginVO 로그인 사용자 정보 | |
| 71 | - * @return 처리 결과 Map | |
| 72 | - */ | |
| 73 | - @Override | |
| 74 | - public Map<String, Object> processTossConfirm(String paymentKey, String orderId, String amount, LoginVO loginVO) throws Exception { | |
| 75 | - | |
| 76 | - // 1. 토스 승인 API 호출 설정 | |
| 77 | - String encodedKey = tossBasicAuth(); | |
| 78 | - | |
| 79 | - URL url = new URL("https://api.tosspayments.com/v1/payments/confirm"); | |
| 80 | - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); | |
| 81 | - connection.setRequestMethod("POST"); | |
| 82 | - connection.setRequestProperty("Authorization", "Basic " + encodedKey); | |
| 83 | - connection.setRequestProperty("Content-Type", "application/json"); | |
| 84 | - connection.setDoOutput(true); | |
| 85 | - | |
| 86 | - // API 요청 바디 생성 (JSON 형식) | |
| 87 | - String jsonBody = String.format("{\"paymentKey\":\"%s\",\"orderId\":\"%s\",\"amount\":%s}", | |
| 88 | - paymentKey, orderId, amount); | |
| 89 | - | |
| 90 | - try (OutputStream os = connection.getOutputStream()) { | |
| 91 | - os.write(jsonBody.getBytes(StandardCharsets.UTF_8)); | |
| 92 | - } | |
| 93 | - | |
| 94 | - // 2. 응답 수신 처리 | |
| 95 | - int responseCode = connection.getResponseCode(); | |
| 96 | - InputStream responseStream = (responseCode == 200) ? connection.getInputStream() : connection.getErrorStream(); | |
| 97 | - | |
| 98 | - StringBuilder resBuilder = new StringBuilder(); | |
| 99 | - try (BufferedReader reader = new BufferedReader(new InputStreamReader(responseStream, StandardCharsets.UTF_8))) { | |
| 100 | - String line; | |
| 101 | - while ((line = reader.readLine()) != null) { | |
| 102 | - resBuilder.append(line); | |
| 103 | - } | |
| 104 | - } | |
| 105 | - | |
| 106 | - if (responseCode != 200) { | |
| 107 | - throw new Exception("토스 결제 승인 실패: " + resBuilder.toString()); | |
| 108 | - } | |
| 109 | - | |
| 110 | - // 3. 응답 데이터 파싱 및 mj_pg 테이블 매핑 | |
| 111 | - JSONObject resObj = new JSONObject(resBuilder.toString()); | |
| 112 | - String method = resObj.getString("method"); // 결제수단 (카드, 가상계좌 등) | |
| 113 | - | |
| 114 | - // 회원 정보 상세 조회 (연락처 등 매핑용) | |
| 115 | - MberManageVO mberManageVO = mberManageDAO.selectMber(loginVO.getId()); | |
| 116 | - | |
| 117 | - // 기존 쿼리의 parameterClass인 VO 객체 생성 및 값 세팅 | |
| 118 | - MjonPayVO payVO = new MjonPayVO(); | |
| 119 | - | |
| 120 | - // [공통 정보 세팅] | |
| 121 | - payVO.setMoid(orderId); // #moid# (idgen으로 생성된 PK) | |
| 122 | - payVO.setPgCode("TOSS"); // #pgCode# | |
| 123 | - payVO.setTid(resObj.getString("paymentKey")); // #tid# | |
| 124 | - payVO.setAmt(String.valueOf(resObj.getLong("totalAmount"))); // #amt# | |
| 125 | - payVO.setGoodsName(resObj.getString("orderName")); // #goodsName# | |
| 126 | - payVO.setMid(resObj.optString("mId")); // #mid# (상점ID 추가) | |
| 127 | - | |
| 128 | - // 고객 정보 매핑 (연락처/이메일 누락 방지) | |
| 129 | - payVO.setUserId(loginVO.getId()); // #userId# | |
| 130 | - payVO.setEmail(mberManageVO.getMberEmailAdres()); // #email# | |
| 131 | - payVO.setPhone(mberManageVO.getMoblphonNo()); // #phone# | |
| 132 | - payVO.setMobile(mberManageVO.getMoblphonNo()); // #mobile# | |
| 133 | - payVO.setBuyerName(loginVO.getName()); // #buyerName# | |
| 134 | - | |
| 135 | - payVO.setResultCode("0000"); // #resultCode# | |
| 136 | - payVO.setResultMsg("정상처리 되었습니다."); // #resultMsg# | |
| 137 | - payVO.setAfterPayYn("N"); // #afterPayYn# (선불 고정) | |
| 138 | - | |
| 139 | - // CASH(공급가액) 계산: 부가세 제외 금액 (기존 시스템과 동일 산식: 결제금액/11*10) | |
| 140 | - // 토스 응답의 suppliedAmount와 1원 단위로 어긋나 세금계산서/정산 금액과 불일치하는 것을 방지하기 위해 | |
| 141 | - // 기존 setCashVatNotIncluded() 와 동일한 산식으로 통일한다. | |
| 142 | - long totalAmt = resObj.getLong("totalAmount"); | |
| 143 | - long cashAmount = Math.round(totalAmt / 11.0 * 10); | |
| 144 | - payVO.setCash(Double.parseDouble(String.valueOf(cashAmount))); // #cash# | |
| 145 | - | |
| 146 | - // 4. 결제 수단별 상세 분기 처리 | |
| 147 | - if ("가상계좌".equals(method)) { | |
| 148 | - JSONObject vAccount = resObj.getJSONObject("virtualAccount"); | |
| 149 | - String bankCode = vAccount.getString("bankCode"); | |
| 150 | - | |
| 151 | - payVO.setPayMethod("VBANK"); // #payMethod# | |
| 152 | - payVO.setPgStatus("0"); // #pgStatus# (0: 입금 대기) | |
| 153 | - payVO.setVbankNum(vAccount.getString("accountNumber")); // #vbankNum# | |
| 154 | - payVO.setVbankCode(vAccount.getString("bankCode")); // #vbankCode# | |
| 155 | - | |
| 156 | - // --- 은행 코드 -> 한글명 변환 --- | |
| 157 | - String bankName = ""; | |
| 158 | - switch (bankCode) { | |
| 159 | - case "20": bankName = "우리은행"; break; | |
| 160 | - case "88": bankName = "신한은행"; break; | |
| 161 | - case "11": bankName = "농협"; break; | |
| 162 | - case "04": bankName = "국민은행"; break; | |
| 163 | - case "03": bankName = "기업은행"; break; | |
| 164 | - case "81": bankName = "하나은행"; break; | |
| 165 | - case "07": bankName = "수협"; break; | |
| 166 | - case "31": bankName = "대구은행"; break; | |
| 167 | - case "32": bankName = "부산은행"; break; | |
| 168 | - case "34": bankName = "광주은행"; break; | |
| 169 | - case "37": bankName = "전북은행"; break; | |
| 170 | - case "39": bankName = "경남은행"; break; | |
| 171 | - case "71": bankName = "우체국"; break; | |
| 172 | - case "23": bankName = "SC제일"; break; | |
| 173 | - case "45": bankName = "새마을금고"; break; | |
| 174 | - case "48": bankName = "신협"; break; | |
| 175 | - case "02": bankName = "산업은행"; break; | |
| 176 | - case "90": bankName = "카카오뱅크"; break; | |
| 177 | - case "92": bankName = "토스뱅크"; break; | |
| 178 | - case "89": bankName = "케이뱅크"; break; | |
| 179 | - default: bankName = "기타은행(" + bankCode + ")"; break; | |
| 180 | - } | |
| 181 | - payVO.setVbankName(bankName); | |
| 182 | - | |
| 183 | - // 입금 기한 가공 (YYYYMMDD 형식) | |
| 184 | - String dueDate = vAccount.getString("dueDate").substring(0, 10).replace("-", ""); | |
| 185 | - payVO.setVbankExpDate(dueDate); // #vbankExpDate# | |
| 186 | - | |
| 187 | - } else if ("카드".equals(method)) { | |
| 188 | - JSONObject card = resObj.getJSONObject("card"); | |
| 189 | - payVO.setPayMethod("CARD"); // #payMethod# | |
| 190 | - payVO.setPgStatus("1"); // #pgStatus# (1: 결제 완료)String issuerCode = card.getString("issuerCode"); | |
| 191 | - String issuerCode = card.getString("issuerCode"); | |
| 192 | - payVO.setCardCode(issuerCode); // #cardCode# | |
| 193 | - | |
| 194 | - | |
| 195 | - // --- 카드사 코드 -> 한글명 변환 시작 --- | |
| 196 | - String cardName = ""; | |
| 197 | - switch (issuerCode) { | |
| 198 | - case "36": cardName = "씨티"; break; | |
| 199 | - case "31": cardName = "삼성"; break; | |
| 200 | - case "61": cardName = "현대"; break; | |
| 201 | - case "11": cardName = "농협"; break; | |
| 202 | - case "91": cardName = "카카오뱅크"; break; | |
| 203 | - case "26": cardName = "비씨"; break; | |
| 204 | - case "21": cardName = "하나"; break; | |
| 205 | - case "41": cardName = "신한"; break; | |
| 206 | - case "51": cardName = "롯데"; break; | |
| 207 | - case "15": cardName = "우리"; break; | |
| 208 | - case "01": cardName = "외환"; break; | |
| 209 | - case "12": cardName = "수협"; break; | |
| 210 | - case "46": cardName = "광주"; break; | |
| 211 | - case "33": cardName = "전북"; break; | |
| 212 | - case "62": cardName = "제주"; break; | |
| 213 | - case "35": cardName = "KDB산업"; break; | |
| 214 | - default: cardName = "기타카드(" + issuerCode + ")"; break; | |
| 215 | - } | |
| 216 | - payVO.setCardName(cardName); // #cardName#에 한글명 세팅 | |
| 217 | - | |
| 218 | - } else if ("간편결제".equals(method)) { | |
| 219 | - JSONObject easyPay = resObj.getJSONObject("easyPay"); | |
| 220 | - String provider = easyPay.getString("provider"); | |
| 221 | - | |
| 222 | - payVO.setPayMethod("SPAY"); // #payMethod# | |
| 223 | - payVO.setPgStatus("1"); | |
| 224 | - payVO.setSpayMethod("M"); // #spayMethod# | |
| 225 | - payVO.setCardName(provider); // #cardName# | |
| 226 | - | |
| 227 | - // 기존 SPAY_DIV 코드 매핑 + 토스페이(TOS) 추가 | |
| 228 | - if ("카카오페이".equals(provider)) { | |
| 229 | - payVO.setSpayDiv("KKO"); | |
| 230 | - } else if ("네이버페이".equals(provider)) { | |
| 231 | - payVO.setSpayDiv("NAV"); | |
| 232 | - } else if ("토스페이".equals(provider)) { | |
| 233 | - payVO.setSpayDiv("TOS"); // 요청하신 토스페이 코드 추가 | |
| 234 | - } | |
| 235 | - } | |
| 236 | - | |
| 237 | - // 5. DB INSERT 실행 | |
| 238 | - mjonPayDAO.insertMjPg(payVO); | |
| 239 | - | |
| 240 | - // 5-1. 캐시/포인트 적립 | |
| 241 | - // - 카드/간편결제: 즉시 결제완료(pgStatus=1)이므로 바로 적립 | |
| 242 | - // - 가상계좌(VBANK): 아직 입금 전(pgStatus=0)이므로 적립하지 않음. | |
| 243 | - // 실제 입금이 완료되면 토스 입금 콜백(processTossVbankDeposit)에서 적립한다. | |
| 244 | - if (!"VBANK".equals(payVO.getPayMethod())) { | |
| 245 | - creditCashAndPoint(payVO, loginVO.getId()); | |
| 246 | - } | |
| 247 | - | |
| 248 | - // 컨트롤러 응답용 결과 Map 구성 | |
| 249 | - Map<String, Object> result = new HashMap<>(); | |
| 250 | - result.put("PG_STATUS", payVO.getPgStatus()); | |
| 251 | - result.put("MOID", payVO.getMoid()); | |
| 252 | - result.put("VBANK_NUM", payVO.getVbankNum()); | |
| 253 | - result.put("VBANK_NAME", payVO.getVbankName()); | |
| 254 | - result.put("VBANK_EXP_DATE", payVO.getVbankExpDate()); | |
| 255 | - result.put("AMT", payVO.getAmt()); | |
| 256 | - | |
| 257 | - return result; | |
| 258 | - } | |
| 259 | - | |
| 260 | - /** | |
| 261 | - * 토스페이먼츠 가상계좌 입금 콜백(웹훅) 처리. | |
| 262 | - * 입금 완료(DONE)된 주문에 대해서만 mj_pg 상태를 결제완료로 바꾸고 캐시/포인트를 적립한다. | |
| 263 | - * 중복 콜백/재시도에 대비해 멱등(idempotent)하게 동작한다. | |
| 264 | - */ | |
| 265 | - @Override | |
| 266 | - public Map<String, Object> processTossVbankDeposit(String orderId) throws Exception { | |
| 267 | - | |
| 268 | - Map<String, Object> result = new HashMap<>(); | |
| 269 | - result.put("credited", false); | |
| 270 | - | |
| 271 | - if (orderId == null || orderId.isEmpty()) { | |
| 272 | - result.put("message", "orderId 없음"); | |
| 273 | - return result; | |
| 274 | - } | |
| 275 | - | |
| 276 | - // 1. 우리 DB의 결제내역 조회 (없으면 우리쪽 주문이 아님) | |
| 277 | - MjonPayVO dbPay = mjonPayDAO.selectPayInfoByMoid(orderId); | |
| 278 | - if (dbPay == null) { | |
| 279 | - result.put("message", "존재하지 않는 주문번호: " + orderId); | |
| 280 | - return result; | |
| 281 | - } | |
| 282 | - // 이미 처리(결제완료)된 주문이면 중복 콜백 → 무시 | |
| 283 | - if ("1".equals(dbPay.getPgStatus())) { | |
| 284 | - result.put("message", "이미 처리된 주문: " + orderId); | |
| 285 | - return result; | |
| 286 | - } | |
| 287 | - | |
| 288 | - // 2. 토스 결제조회 API로 실제 상태 재확인 (위변조 방지: 콜백 본문만 신뢰하지 않음) | |
| 289 | - JSONObject payInfo = callTossPaymentByOrderId(orderId); | |
| 290 | - String status = payInfo.optString("status"); | |
| 291 | - if (!"DONE".equals(status)) { | |
| 292 | - // 입금 전(WAITING_FOR_DEPOSIT)이거나 취소/만료 등 → 적립하지 않음 | |
| 293 | - result.put("message", "입금완료 상태 아님: " + status); | |
| 294 | - return result; | |
| 295 | - } | |
| 296 | - | |
| 297 | - // 3. mj_pg 상태를 결제완료(1)로 변경 — PG_STATUS='0' 조건으로 멱등 처리 | |
| 298 | - MjonPayVO updVO = new MjonPayVO(); | |
| 299 | - updVO.setMoid(orderId); | |
| 300 | - int updated = mjonPayDAO.updateTossVbankDeposit(updVO); | |
| 301 | - if (updated == 0) { | |
| 302 | - // 동시 콜백 등으로 이미 다른 요청이 처리함 → 중복 적립 방지 | |
| 303 | - result.put("message", "상태 변경 대상 없음(이미 처리됨): " + orderId); | |
| 304 | - return result; | |
| 305 | - } | |
| 306 | - | |
| 307 | - // 4. 캐시/포인트 적립 | |
| 308 | - long totalAmt = payInfo.getLong("totalAmount"); | |
| 309 | - dbPay.setAmt(String.valueOf(totalAmt)); | |
| 310 | - dbPay.setPayMethod("VBANK"); | |
| 311 | - creditCashAndPoint(dbPay, dbPay.getUserId()); | |
| 312 | - | |
| 313 | - result.put("credited", true); | |
| 314 | - result.put("message", "입금 적립 완료: " + orderId); | |
| 315 | - return result; | |
| 316 | - } | |
| 317 | - | |
| 318 | - /** | |
| 319 | - * 캐시/포인트 적립 공통 처리. | |
| 320 | - * - 캐시: 공급가액(결제금액/11*10)을 mj_cash 에 적립하고 회원 잔액(USER_MONEY) 갱신 | |
| 321 | - * - 포인트: 문자 미할인 회원만 가입설정 비율만큼 mj_point 에 적립하고 회원 포인트 갱신 | |
| 322 | - * | |
| 323 | - * 주의: 첫결제 이벤트 회원에 대한 포인트 0원 처리/이벤트 회원정보 갱신 등의 특수 로직은 | |
| 324 | - * 포함하지 않는다. (해당 처리가 필요하면 MjonPayServiceImpl 의 일반 결제 흐름 참고) | |
| 325 | - * | |
| 326 | - * @param payVO amt(결제금액, 부가세포함)/moid/payMethod 가 세팅된 VO | |
| 327 | - * @param userId 적립 대상 회원 ID | |
| 328 | - */ | |
| 329 | - private void creditCashAndPoint(MjonPayVO payVO, String userId) throws Exception { | |
| 330 | - | |
| 331 | - // 공급가액 = 결제금액 / 11 * 10 (부가세 제외) | |
| 332 | - long supply = Math.round(Double.parseDouble(payVO.getAmt()) / 11.0 * 10); | |
| 333 | - String methodKo = payMethodKo(payVO.getPayMethod()); | |
| 334 | - | |
| 335 | - // --- 캐시 적립 (mj_cash + 회원 잔액 갱신) --- | |
| 336 | - payVO.setUserId(userId); | |
| 337 | - payVO.setFrstRegisterId(userId); | |
| 338 | - payVO.setCash(supply); | |
| 339 | - payVO.setOrderId(payVO.getMoid()); // 주문번호 | |
| 340 | - payVO.setMsgGroupId(null); // 충전이므로 발송그룹 없음 | |
| 341 | - payVO.setMemo(methodKo + " " + supply + " 충전"); | |
| 342 | - // insertCash() 내부에서 cashId 생성 + insertCash + updateMemberCash 수행 | |
| 343 | - mjonPayService.insertCash(payVO); | |
| 344 | - | |
| 345 | - // --- 포인트 적립 (문자 발송단가 미할인 회원만) --- | |
| 346 | - int isMsgSalePrice = mjonPayDAO.selectMsgSalePriceCnt(userId); | |
| 347 | - if (isMsgSalePrice == 0) { | |
| 348 | - JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); | |
| 349 | - float pointPer = (sysJoinSetVO != null) ? sysJoinSetVO.getPointPer() : 0; | |
| 350 | - int point = Math.round(supply * pointPer / 100f); | |
| 351 | - | |
| 352 | - payVO.setPointId(idgenMjonPointId.getNextStringId()); | |
| 353 | - payVO.setPoint(point); | |
| 354 | - payVO.setPointMemo(methodKo + " " + point + " 충전"); | |
| 355 | - mjonPayDAO.insertPoint(payVO); // mj_point | |
| 356 | - mjonPayDAO.updateMemberPoint(payVO); // 회원 포인트 갱신 | |
| 357 | - } | |
| 358 | - } | |
| 359 | - | |
| 360 | - /** 토스 결제수단 코드 → 캐시/포인트 메모용 한글명 */ | |
| 361 | - private String payMethodKo(String payMethod) { | |
| 362 | - if ("CARD".equals(payMethod)) return "신용카드"; | |
| 363 | - if ("SPAY".equals(payMethod)) return "간편결제"; | |
| 364 | - if ("VBANK".equals(payMethod)) return "가상계좌"; | |
| 365 | - if ("BANK".equals(payMethod)) return "계좌이체"; | |
| 366 | - if ("CELLPHONE".equals(payMethod)) return "휴대폰"; | |
| 367 | - return ""; | |
| 368 | - } | |
| 369 | - | |
| 370 | - /** | |
| 371 | - * 토스 결제조회 API (주문번호 기준) 호출. | |
| 372 | - * GET https://api.tosspayments.com/v1/payments/orders/{orderId} | |
| 373 | - */ | |
| 374 | - private JSONObject callTossPaymentByOrderId(String orderId) throws Exception { | |
| 375 | - String encodedKey = tossBasicAuth(); | |
| 376 | - | |
| 377 | - URL url = new URL("https://api.tosspayments.com/v1/payments/orders/" + orderId); | |
| 378 | - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); | |
| 379 | - connection.setRequestMethod("GET"); | |
| 380 | - connection.setRequestProperty("Authorization", "Basic " + encodedKey); | |
| 381 | - | |
| 382 | - int responseCode = connection.getResponseCode(); | |
| 383 | - InputStream responseStream = (responseCode == 200) ? connection.getInputStream() : connection.getErrorStream(); | |
| 384 | - | |
| 385 | - StringBuilder resBuilder = new StringBuilder(); | |
| 386 | - try (BufferedReader reader = new BufferedReader(new InputStreamReader(responseStream, StandardCharsets.UTF_8))) { | |
| 387 | - String line; | |
| 388 | - while ((line = reader.readLine()) != null) { | |
| 389 | - resBuilder.append(line); | |
| 390 | - } | |
| 391 | - } | |
| 392 | - | |
| 393 | - if (responseCode != 200) { | |
| 394 | - throw new Exception("토스 결제조회 실패(" + orderId + "): " + resBuilder.toString()); | |
| 395 | - } | |
| 396 | - return new JSONObject(resBuilder.toString()); | |
| 397 | - } | |
| 398 | -} |
--- src/main/java/itn/let/mjo/pay/web/MjonPayTossController.java
... | ... | @@ -1,193 +0,0 @@ |
| 1 | -package itn.let.mjo.pay.web; | |
| 2 | - | |
| 3 | -import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; | |
| 4 | -import itn.com.cmm.LoginVO; | |
| 5 | -import itn.let.mjo.mjocommon.MjonCommon; | |
| 6 | -import itn.let.mjo.msgcampain.service.MjonCandidateService; | |
| 7 | -import itn.let.mjo.pay.service.MjonPayService; | |
| 8 | -import itn.let.mjo.pay.service.MjonPayTossService; | |
| 9 | -import itn.let.mjo.payva.service.VacsVactService; | |
| 10 | -import itn.let.sym.grd.service.MberGrdService; | |
| 11 | -import itn.let.sym.site.service.EgovSiteManagerService; | |
| 12 | -import itn.let.uss.umt.service.EgovMberManageService; | |
| 13 | -import itn.let.uss.umt.service.EgovUserManageService; | |
| 14 | -import itn.let.utl.user.service.MjonNoticeSendUtil; | |
| 15 | -import org.slf4j.Logger; | |
| 16 | -import org.slf4j.LoggerFactory; | |
| 17 | -import org.springframework.beans.factory.annotation.Value; | |
| 18 | -import org.springframework.stereotype.Controller; | |
| 19 | -import org.springframework.web.bind.annotation.RequestMapping; | |
| 20 | -import org.springframework.web.bind.annotation.ResponseBody; | |
| 21 | -import org.springframework.web.servlet.mvc.support.RedirectAttributes; | |
| 22 | - | |
| 23 | -import javax.annotation.Resource; | |
| 24 | -import javax.servlet.http.HttpServletRequest; | |
| 25 | -import java.io.BufferedReader; | |
| 26 | -import java.util.Map; | |
| 27 | - | |
| 28 | -import org.json.JSONObject; | |
| 29 | - | |
| 30 | -@Controller | |
| 31 | -public class MjonPayTossController { | |
| 32 | - private static final Logger LOGGER = LoggerFactory.getLogger(MjonPayController.class); | |
| 33 | - | |
| 34 | - @Resource(name = "mjonPayService") | |
| 35 | - private MjonPayService mjonPayService; | |
| 36 | - | |
| 37 | - @Resource(name = "mberManageService") | |
| 38 | - private EgovMberManageService mberManageService; | |
| 39 | - | |
| 40 | - @Resource(name = "mjonCandidateService") | |
| 41 | - private MjonCandidateService mjonCandidateService; | |
| 42 | - | |
| 43 | - //전용계좌 서비스 | |
| 44 | - @Resource(name = "vacsVactService") | |
| 45 | - private VacsVactService vacsVactService; | |
| 46 | - | |
| 47 | - /** userManageService */ | |
| 48 | - @Resource(name = "userManageService") | |
| 49 | - private EgovUserManageService userManageService; | |
| 50 | - | |
| 51 | - /** 사이트 설정 */ | |
| 52 | - @Resource(name = "egovSiteManagerService") | |
| 53 | - EgovSiteManagerService egovSiteManagerService; | |
| 54 | - | |
| 55 | - /** 알림전송 Util */ | |
| 56 | - @Resource(name = "mjonNoticeSendUtil") | |
| 57 | - private MjonNoticeSendUtil mjonNoticeSendUtil; | |
| 58 | - | |
| 59 | - @Resource(name="MjonCommon") | |
| 60 | - private MjonCommon mjonCommon; | |
| 61 | - | |
| 62 | - @Resource(name = "mberGrdService") | |
| 63 | - MberGrdService mberGrdService; | |
| 64 | - @Resource(name = "mjonPayTossService") | |
| 65 | - MjonPayTossService mjonPayTossService; | |
| 66 | - | |
| 67 | - /** KG 모빌리언스 설정 */ | |
| 68 | - // CARD | |
| 69 | - @Value("#{globalSettings['Globals.pay.kgm.card.cnSvcid']}") | |
| 70 | - private String globalCnSvcid; | |
| 71 | - @Value("#{globalSettings['Globals.pay.kgm.card.payMode']}") | |
| 72 | - private String globalCnPayMode; | |
| 73 | - | |
| 74 | - // BANK | |
| 75 | - @Value("#{globalSettings['Globals.pay.kgm.bank.raSvcid']}") | |
| 76 | - private String globalRaSvcid; | |
| 77 | - @Value("#{globalSettings['Globals.pay.kgm.bank.payMode']}") | |
| 78 | - private String globalRaPayMode; | |
| 79 | - | |
| 80 | - // MOBILE | |
| 81 | - @Value("#{globalSettings['Globals.pay.kgm.mobile.mcSvcid']}") | |
| 82 | - private String globalMcSvcid; | |
| 83 | - @Value("#{globalSettings['Globals.pay.kgm.mobile.payMode']}") | |
| 84 | - private String globalMcPayMode; | |
| 85 | - | |
| 86 | - @RequestMapping(value = "/web/member/pay/tossSuccess.do") | |
| 87 | - public String tossSuccess(HttpServletRequest request | |
| 88 | - , RedirectAttributes redirectAttributes) throws Exception { | |
| 89 | - | |
| 90 | - LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated() ? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser() : null; | |
| 91 | - if(loginVO == null) return "redirect:/web/user/login/login.do"; | |
| 92 | - | |
| 93 | - // 파라미터 수신 | |
| 94 | - String paymentKey = request.getParameter("paymentKey"); | |
| 95 | - String orderId = request.getParameter("orderId"); | |
| 96 | - String amount = request.getParameter("amount"); | |
| 97 | - | |
| 98 | - try { | |
| 99 | - // 비즈니스 로직 호출 | |
| 100 | - Map<String, Object> result = mjonPayTossService.processTossConfirm(paymentKey, orderId, amount, loginVO); | |
| 101 | - | |
| 102 | - // 가상계좌일 경우 화면에 띄울 데이터 전달 | |
| 103 | - if ("0".equals(result.get("PG_STATUS"))) { | |
| 104 | - redirectAttributes.addFlashAttribute("vbankInfo", result); | |
| 105 | - redirectAttributes.addFlashAttribute("isVbankIssued", "Y"); | |
| 106 | - return "redirect:/web/member/pay/PayView.do"; // 결제뷰로 이동 | |
| 107 | - } | |
| 108 | - | |
| 109 | - return "redirect:/web/member/pay/PayList.do"; // 일반 결제는 리스트로 이동 | |
| 110 | - | |
| 111 | - } catch (Exception e) { | |
| 112 | - redirectAttributes.addFlashAttribute("message", e.getMessage()); | |
| 113 | - return "redirect:/web/member/pay/tossFail.do"; | |
| 114 | - } | |
| 115 | - } | |
| 116 | - | |
| 117 | - | |
| 118 | - @RequestMapping(value = "/web/member/pay/tossFail.do") | |
| 119 | - public String tossFail(HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception { | |
| 120 | - | |
| 121 | - String code = request.getParameter("code"); | |
| 122 | - String message = request.getParameter("message"); | |
| 123 | - | |
| 124 | - // 로그 기록 | |
| 125 | - LOGGER.error("결제 실패 원인: [{}] {}", code, message); | |
| 126 | - | |
| 127 | - // 다시 결제 화면으로 보낼 때 실패 메시지를 전달 | |
| 128 | - // FlashAttribute는 리다이렉트 후 한 번만 유지되는 데이터입니다. | |
| 129 | - redirectAttributes.addFlashAttribute("payErrorMsg", message); | |
| 130 | - redirectAttributes.addFlashAttribute("payErrorCode", code); | |
| 131 | - | |
| 132 | - return "redirect:/web/member/pay/PayView.do"; | |
| 133 | - } | |
| 134 | - | |
| 135 | - /** | |
| 136 | - * 토스페이먼츠 가상계좌 입금 콜백(웹훅). | |
| 137 | - * 토스 서버 → 우리 서버로 호출되는 server-to-server 요청이므로 로그인 세션이 없다. | |
| 138 | - * (context-security.xml 에서 /web/toss/webhook/** 는 security="none" 으로 허용) | |
| 139 | - * | |
| 140 | - * 콜백 본문(JSON)에서 orderId/status 만 추출한 뒤, 실제 입금완료 여부는 | |
| 141 | - * 서비스에서 토스 결제조회 API로 재확인한 후 캐시/포인트를 적립한다. | |
| 142 | - * 토스는 2xx 응답을 받지 못하면 재시도하므로, 처리 성공 시 항상 "OK"(200)를 반환한다. | |
| 143 | - */ | |
| 144 | - @RequestMapping(value = "/web/toss/webhook/deposit.do") | |
| 145 | - @ResponseBody | |
| 146 | - public String tossDepositWebhook(HttpServletRequest request, javax.servlet.http.HttpServletResponse response) { | |
| 147 | - | |
| 148 | - try { | |
| 149 | - // 1. 요청 본문(JSON) 읽기 | |
| 150 | - StringBuilder sb = new StringBuilder(); | |
| 151 | - try (BufferedReader reader = request.getReader()) { | |
| 152 | - String line; | |
| 153 | - while ((line = reader.readLine()) != null) { | |
| 154 | - sb.append(line); | |
| 155 | - } | |
| 156 | - } | |
| 157 | - String raw = sb.toString(); | |
| 158 | - LOGGER.info("토스 입금 콜백 수신: {}", raw); | |
| 159 | - | |
| 160 | - if (raw.isEmpty()) { | |
| 161 | - return "OK"; | |
| 162 | - } | |
| 163 | - | |
| 164 | - // 2. orderId / status 추출 (DEPOSIT_CALLBACK 평면 구조 / PAYMENT_STATUS_CHANGED data 구조 모두 대응) | |
| 165 | - JSONObject body = new JSONObject(raw); | |
| 166 | - String orderId; | |
| 167 | - String status; | |
| 168 | - if (body.has("data")) { | |
| 169 | - JSONObject data = body.getJSONObject("data"); | |
| 170 | - orderId = data.optString("orderId"); | |
| 171 | - status = data.optString("status"); | |
| 172 | - } else { | |
| 173 | - orderId = body.optString("orderId"); | |
| 174 | - status = body.optString("status"); | |
| 175 | - } | |
| 176 | - | |
| 177 | - // 3. 입금완료(DONE) 콜백만 적립 처리 (그 외 상태는 무시하되 200 응답) | |
| 178 | - if ("DONE".equals(status)) { | |
| 179 | - Map<String, Object> result = mjonPayTossService.processTossVbankDeposit(orderId); | |
| 180 | - LOGGER.info("토스 입금 콜백 처리결과: {}", result); | |
| 181 | - } | |
| 182 | - | |
| 183 | - } catch (Exception e) { | |
| 184 | - // 처리 중 오류(네트워크/DB 등)는 500을 반환해 토스의 재시도를 유도한다. | |
| 185 | - // processTossVbankDeposit 은 멱등하므로 재시도되어도 중복 적립되지 않는다. | |
| 186 | - LOGGER.error("토스 입금 콜백 처리 오류", e); | |
| 187 | - response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR); | |
| 188 | - return "FAIL"; | |
| 189 | - } | |
| 190 | - | |
| 191 | - return "OK"; | |
| 192 | - } | |
| 193 | -} |
--- src/main/java/itn/let/mjo/pay/web/MjonPayV2Controller.java
+++ src/main/java/itn/let/mjo/pay/web/MjonPayV2Controller.java
... | ... | @@ -1,26 +1,22 @@ |
| 1 | 1 |
package itn.let.mjo.pay.web; |
| 2 | 2 |
|
| 3 |
-import java.io.BufferedReader; |
|
| 4 |
-import java.io.InputStream; |
|
| 5 |
-import java.io.InputStreamReader; |
|
| 6 |
-import java.io.OutputStream; |
|
| 7 |
-import java.net.HttpURLConnection; |
|
| 8 |
-import java.net.URL; |
|
| 9 |
-import java.nio.charset.StandardCharsets; |
|
| 10 | 3 |
import java.text.SimpleDateFormat; |
| 11 |
-import java.util.*; |
|
| 4 |
+import java.util.ArrayList; |
|
| 5 |
+import java.util.Arrays; |
|
| 6 |
+import java.util.Calendar; |
|
| 7 |
+import java.util.Date; |
|
| 8 |
+import java.util.List; |
|
| 9 |
+import java.util.Random; |
|
| 12 | 10 |
|
| 13 | 11 |
import javax.annotation.Resource; |
| 14 | 12 |
import javax.servlet.http.HttpServletRequest; |
| 15 | 13 |
import javax.servlet.http.HttpServletResponse; |
| 16 | 14 |
import javax.servlet.http.HttpSession; |
| 17 | 15 |
|
| 18 |
-import org.json.JSONObject; |
|
| 19 | 16 |
import org.slf4j.Logger; |
| 20 | 17 |
import org.slf4j.LoggerFactory; |
| 21 | 18 |
import org.springframework.beans.factory.annotation.Value; |
| 22 | 19 |
import org.springframework.stereotype.Controller; |
| 23 |
-import org.springframework.ui.Model; |
|
| 24 | 20 |
import org.springframework.ui.ModelMap; |
| 25 | 21 |
import org.springframework.web.bind.annotation.ModelAttribute; |
| 26 | 22 |
import org.springframework.web.bind.annotation.RequestMapping; |
... | ... | @@ -1881,6 +1877,5 @@ |
| 1881 | 1877 |
|
| 1882 | 1878 |
return rtnVal; |
| 1883 | 1879 |
} |
| 1884 |
- |
|
| 1885 |
- |
|
| 1880 |
+ |
|
| 1886 | 1881 |
} |
--- src/main/resources/egovframework/egovProps/globals_dev.properties
+++ src/main/resources/egovframework/egovProps/globals_dev.properties
... | ... | @@ -115,11 +115,6 @@ |
| 115 | 115 |
Globals.pay.kgm.mobile.mcSvcid=170622040674 |
| 116 | 116 |
Globals.pay.kgm.mobile.payMode=00 |
| 117 | 117 |
|
| 118 |
-#토스페이먼츠 설정 (시크릿키는 콜론 없이 키 본문만 저장) - 라이브(위젯) 키 |
|
| 119 |
-Globals.pay.toss.secretKey=live_gsk_DnyRpQWGrNbko96YwQk7rKwv1M9E |
|
| 120 |
-#토스 클라이언트키(공개키) - 프론트 위젯 초기화용 - 라이브(위젯) 키 |
|
| 121 |
-Globals.pay.toss.clientKey=live_gck_QbgMGZzorz59DZpopZElVl5E1em4 |
|
| 122 |
- |
|
| 123 | 118 |
#Slack |
| 124 | 119 |
Globals.slack.hooks.url=https://hooks.slack.com/services/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 |
| 125 | 120 |
Globals.slack.channel.name=\ud14c\uc2a4\ud2b8_mjon\uba54\uc2dc\uc9c0 |
--- src/main/resources/egovframework/egovProps/globals_local.properties
+++ src/main/resources/egovframework/egovProps/globals_local.properties
... | ... | @@ -30,10 +30,10 @@ |
| 30 | 30 |
Globals.DriverClassName=com.mysql.jdbc.Driver |
| 31 | 31 |
#Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc |
| 32 | 32 |
#Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc?characterEncoding=UTF-8&useUnicode=true&serverTimezone=Asia/Seoul |
| 33 |
-Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc?useUnicode=true&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Seoul |
|
| 33 |
+Globals.Url=jdbc:mysql://192.168.0.60:3309/mjgo?useUnicode=true&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Seoul |
|
| 34 | 34 |
|
| 35 |
-Globals.UserName= mjonUr |
|
| 36 |
-Globals.Password= mjon!@#$ |
|
| 35 |
+Globals.UserName= mjgoUr |
|
| 36 |
+Globals.Password= itntest123 |
|
| 37 | 37 |
#Globals.Url=jdbc:mysql://192.168.0.125:3306/mjon |
| 38 | 38 |
|
| 39 | 39 |
#Globals.DriverClassName=com.mysql.jdbc.Driver |
... | ... | @@ -122,11 +122,6 @@ |
| 122 | 122 |
#MOBILE |
| 123 | 123 |
Globals.pay.kgm.mobile.mcSvcid=170622040674 |
| 124 | 124 |
Globals.pay.kgm.mobile.payMode=00 |
| 125 |
- |
|
| 126 |
-#토스페이먼츠 설정 (시크릿키는 콜론 없이 키 본문만 저장) - 라이브(위젯) 키 |
|
| 127 |
-Globals.pay.toss.secretKey=live_gsk_DnyRpQWGrNbko96YwQk7rKwv1M9E |
|
| 128 |
-#토스 클라이언트키(공개키) - 프론트 위젯 초기화용 - 라이브(위젯) 키 |
|
| 129 |
-Globals.pay.toss.clientKey=live_gck_QbgMGZzorz59DZpopZElVl5E1em4 |
|
| 130 | 125 |
|
| 131 | 126 |
#Slack |
| 132 | 127 |
Globals.slack.hooks.url=https://hooks.slack.com/services/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 |
--- src/main/resources/egovframework/egovProps/globals_prod.properties
+++ src/main/resources/egovframework/egovProps/globals_prod.properties
... | ... | @@ -27,7 +27,7 @@ |
| 27 | 27 |
|
| 28 | 28 |
# mysql |
| 29 | 29 |
Globals.DriverClassName=com.mysql.jdbc.Driver |
| 30 |
-Globals.Url=jdbc:mysql://10.12.107.14:3306/mjon_advc?useUnicode=true&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Seoul |
|
| 30 |
+Globals.Url=jdbc:mysql://1.201.116.6:3306/mjon_advc?useUnicode=true&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Seoul |
|
| 31 | 31 |
Globals.UserName= mjonUr |
| 32 | 32 |
Globals.Password= mjon!@#$ |
| 33 | 33 |
|
... | ... | @@ -102,11 +102,6 @@ |
| 102 | 102 |
#MOBILE |
| 103 | 103 |
Globals.pay.kgm.mobile.mcSvcid=220613125202 |
| 104 | 104 |
Globals.pay.kgm.mobile.payMode=10 |
| 105 |
- |
|
| 106 |
-#토스페이먼츠 설정 (시크릿키는 콜론 없이 키 본문만 저장) - 라이브(위젯) 키 |
|
| 107 |
-Globals.pay.toss.secretKey=live_gsk_DnyRpQWGrNbko96YwQk7rKwv1M9E |
|
| 108 |
-#토스 클라이언트키(공개키) - 프론트 위젯 초기화용 - 라이브(위젯) 키 |
|
| 109 |
-Globals.pay.toss.clientKey=live_gck_QbgMGZzorz59DZpopZElVl5E1em4 |
|
| 110 | 105 |
|
| 111 | 106 |
#Slack |
| 112 | 107 |
Globals.slack.hooks.url=https://hooks.slack.com/services/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 |
--- src/main/resources/egovframework/spring/com/context-security.xml
+++ src/main/resources/egovframework/spring/com/context-security.xml
... | ... | @@ -11,8 +11,6 @@ |
| 11 | 11 |
<security:http pattern="/images/**" security="none"/> |
| 12 | 12 |
<security:http pattern="/js/**" security="none"/> |
| 13 | 13 |
<security:http pattern="/resource/**" security="none"/> |
| 14 |
- <!-- 토스페이먼츠 가상계좌 입금 콜백(웹훅) - 토스 서버에서 호출하는 server-to-server 요청이라 인증 제외 --> |
|
| 15 |
- <security:http pattern="/web/toss/webhook/**" security="none"/> |
|
| 16 | 14 |
<security:http pattern="\A/WEB-INF/jsp/.*\Z" request-matcher="regex" security="none"/> |
| 17 | 15 |
|
| 18 | 16 |
<egov-security:config id="securityConfig" |
--- src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml
... | ... | @@ -1456,19 +1456,9 @@ |
| 1456 | 1456 |
, CANCEL_TIME = DATE(NOW()) |
| 1457 | 1457 |
</isEqual> |
| 1458 | 1458 |
WHERE MOID = #moid# |
| 1459 |
- |
|
| 1459 |
+ |
|
| 1460 | 1460 |
</update> |
| 1461 |
- |
|
| 1462 |
- <!-- 토스 가상계좌 입금완료 처리 (PG_STATUS 0:입금대기 → 1:결제완료). 멱등 처리를 위해 0인 건만 갱신 --> |
|
| 1463 |
- <update id="mjonPayDAO.updateTossVbankDeposit" parameterClass="mjonPayVO"> |
|
| 1464 |
- UPDATE MJ_PG |
|
| 1465 |
- SET PG_STATUS = '1', |
|
| 1466 |
- RESULT_CODE = '0000', |
|
| 1467 |
- RESULT_MSG = '입금이 정상 처리되었습니다.' |
|
| 1468 |
- WHERE MOID = #moid# |
|
| 1469 |
- AND PG_STATUS = '0' |
|
| 1470 |
- </update> |
|
| 1471 |
- |
|
| 1461 |
+ |
|
| 1472 | 1462 |
<select id="mjonPayDAO.selectPayDayChartDashboard" parameterClass="mjonPayVO" resultClass="mjonPayVO"> |
| 1473 | 1463 |
|
| 1474 | 1464 |
SELECT |
--- src/main/webapp/WEB-INF/jsp/web/pay/PayView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/pay/PayView.jsp
... | ... | @@ -6,9 +6,6 @@ |
| 6 | 6 |
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> |
| 7 | 7 |
<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> |
| 8 | 8 |
|
| 9 |
-<%-- 토스 클라이언트키(공개키)는 환경별 globals_*.properties 에서 주입 --%> |
|
| 10 |
-<spring:eval expression="@globalSettings['Globals.pay.toss.clientKey']" var="tossClientKey"/> |
|
| 11 |
- |
|
| 12 | 9 |
<style> |
| 13 | 10 |
/*.charg_cont .area_tab li{ width: calc((100% - 80px)/5);}*/
|
| 14 | 11 |
</style> |
... | ... | @@ -16,180 +13,485 @@ |
| 16 | 13 |
<!-- KG 모빌리언스 --> |
| 17 | 14 |
<script src="https://mup.mobilians.co.kr/js/ext/ext_inc_comm.js"></script> |
| 18 | 15 |
<script type="text/javascript" src="<c:url value='/js/MJUtill.js'/>"></script> |
| 19 |
-<script src="https://js.tosspayments.com/v1/payment-widget"></script> |
|
| 20 | 16 |
|
| 21 | 17 |
<script> |
| 18 |
+//탭이동 |
|
| 19 |
+var tabType = "${tabType}";
|
|
| 22 | 20 |
|
| 23 |
- let paymentWidget; |
|
| 24 |
- let paymentMethodWidget; |
|
| 21 |
+$(document).ready(function(){
|
|
| 22 |
+ //다음 결제시 결제수단 SELECT |
|
| 23 |
+ getNextPayMethod(); |
|
| 25 | 24 |
|
| 26 |
- $(document).ready(function(){
|
|
| 27 |
- |
|
| 28 |
- // 서버에서 보낸 payErrorMsg가 있는지 확인 |
|
| 29 |
- var errorMsg = "${payErrorMsg}";
|
|
| 30 |
- |
|
| 31 |
- if (errorMsg && errorMsg !== "") {
|
|
| 32 |
- // 사용자에게 익숙한 alert 띄우기 |
|
| 33 |
- alert("결제에 실패하였습니다.\n사유: " + errorMsg);
|
|
| 34 |
- } |
|
| 35 |
- |
|
| 36 |
- // 토스페이먼츠 위젯 초기화 세팅 (clientKey는 서버 globals_*.properties 에서 주입) |
|
| 37 |
- const clientKey = '${tossClientKey}';
|
|
| 38 |
- const customerKey = 'test_customer_1234'; // 테스트용 가상 고객 ID (실제 연동 시에는 로그인한 유저의 고유 ID를 넣으세요) |
|
| 39 |
- paymentWidget = PaymentWidget(clientKey, customerKey); |
|
| 40 |
- |
|
| 41 |
- // 초기 충전금액(입력값 기준, 공급가액) |
|
| 42 |
- var initSupply = parseInt(($("#price").val() || '0').replace(/[^0-9]/g, ''), 10) || 0;
|
|
| 43 |
- var initAmount = initSupply + Math.round(initSupply * 0.1); |
|
| 44 |
- |
|
| 45 |
- // 결제수단 및 약관 위젯 화면에 렌더링 |
|
| 46 |
- paymentMethodWidget = paymentWidget.renderPaymentMethods('#payment-method', { value: initAmount });
|
|
| 47 |
- paymentWidget.renderAgreement('#agreement');
|
|
| 48 |
- |
|
| 49 |
- // 선택한 결제수단 → 아래 신용카드 타이틀 텍스트 동기화 |
|
| 50 |
- try {
|
|
| 51 |
- if (paymentMethodWidget && typeof paymentMethodWidget.on === 'function') {
|
|
| 52 |
- // 위젯 렌더 완료 후 초기 반영 + 선택 변경 감지(폴링: v1은 select 이벤트 미보장) |
|
| 53 |
- paymentMethodWidget.on('ready', function () {
|
|
| 54 |
- updatePayMethodTitle(); |
|
| 55 |
- setInterval(updatePayMethodTitle, 100); |
|
| 56 |
- }); |
|
| 57 |
- // select 이벤트가 지원되면 즉시 반영 |
|
| 58 |
- paymentMethodWidget.on('paymentMethodSelect', updatePayMethodTitle);
|
|
| 59 |
- } |
|
| 60 |
- } catch (e) { /* 이벤트 미지원 환경 무시 */ }
|
|
| 61 |
- |
|
| 62 |
- // 초기 금액 표시 갱신 |
|
| 63 |
- updatePrice(initSupply); |
|
| 64 |
- |
|
| 65 |
- // 금액 추가 버튼 클릭 |
|
| 66 |
- $('.add_money .btn').on('click', function () {
|
|
| 67 |
- var addAmount = Number($(this).data('price'));
|
|
| 68 |
- var currentValue = $("#price").val().replace(/[^0-9]/g, '');
|
|
| 69 |
- currentValue = currentValue ? Number(currentValue) : 0; |
|
| 70 |
- var total = currentValue + addAmount; |
|
| 71 |
- $("#price").val(numberWithCommas(total));
|
|
| 72 |
- updatePrice(total); |
|
| 73 |
- }); |
|
| 74 |
- |
|
| 75 |
- // 직접 입력 |
|
| 76 |
- $("#price").on('input', function () {
|
|
| 77 |
- var value = $(this).val().replace(/[^0-9]/g, ''); |
|
| 78 |
- value = value ? Number(value) : 0; |
|
| 79 |
- $(this).val(numberWithCommas(value)); |
|
| 80 |
- updatePrice(value); |
|
| 81 |
- }); |
|
| 82 |
- }); |
|
| 83 |
- |
|
| 84 |
- // 금액 업데이트 (price = 공급가액) |
|
| 85 |
- function updatePrice(price) {
|
|
| 86 |
- var $message = $('.input_message');
|
|
| 87 |
- |
|
| 88 |
- var supplyPrice = price; |
|
| 89 |
- var vatPrice = Math.round(supplyPrice * 0.1); |
|
| 90 |
- var lastPrice = supplyPrice + vatPrice; |
|
| 91 |
- |
|
| 92 |
- // 화면 표시 |
|
| 93 |
- $('#supplyPriceStr').text(numberWithCommas(supplyPrice));
|
|
| 94 |
- $('#vatPriceStr').text(numberWithCommas(vatPrice));
|
|
| 95 |
- $('#lastPriceStr').text(numberWithCommas(lastPrice));
|
|
| 96 |
- |
|
| 97 |
- // 토스 결제 금액 변경 |
|
| 98 |
- if (typeof paymentMethodWidget !== 'undefined') {
|
|
| 99 |
- paymentMethodWidget.updateAmount(lastPrice); |
|
| 100 |
- } |
|
| 101 |
- |
|
| 102 |
- // 충전금액 제한 체크 |
|
| 103 |
- if (price > 150000 || price < 5000) {
|
|
| 104 |
- $(".money_input").addClass('error');
|
|
| 105 |
- $message.addClass('active');
|
|
| 106 |
- if (price < 5001) {
|
|
| 107 |
- $message.find(".msg").text("최소 충전금액 5천원 이상 입력해주세요.");
|
|
| 108 |
- } else {
|
|
| 109 |
- $message.find(".msg").text("휴대폰 결제는 최대 150,000원까지 입력 가능합니다.");
|
|
| 110 |
- } |
|
| 111 |
- } else {
|
|
| 112 |
- $(".money_input").removeClass('error');
|
|
| 113 |
- $message.removeClass('active');
|
|
| 114 |
- } |
|
| 25 |
+ // 충전금액 세팅 |
|
| 26 |
+ setPriceMake(); |
|
| 27 |
+ |
|
| 28 |
+ setNumberOnly();//숫자만입력 |
|
| 29 |
+ |
|
| 30 |
+ // 전용계좌 화면으로 이동 |
|
| 31 |
+ if (tabType == "2") {
|
|
| 32 |
+ $("#btnDdedicatedAccount").trigger("click");
|
|
| 115 | 33 |
} |
| 116 | 34 |
|
| 117 |
- // 선택된 결제수단명을 신용카드 타이틀에 반영 |
|
| 118 |
- function updatePayMethodTitle() {
|
|
| 119 |
- try {
|
|
| 120 |
- var sel = paymentMethodWidget.getSelectedPaymentMethod(); |
|
| 121 |
- if (!sel || !sel.method) return; |
|
| 35 |
+ // 등급제 대상 여부 |
|
| 36 |
+ //getMberGrdChk(); |
|
| 37 |
+}); |
|
| 122 | 38 |
|
| 123 |
- var method = sel.method; // 카드 / 가상계좌 / 계좌이체 / 휴대폰 / 간편결제 ... |
|
| 124 |
- var label = (method === '카드') ? '신용·체크카드' : method; |
|
| 125 |
- |
|
| 126 |
- var $t = $('#payMethodTitle');
|
|
| 127 |
- if ($t.length && $t.text() !== label) {
|
|
| 128 |
- $t.text(label); |
|
| 129 |
- } |
|
| 130 |
- } catch (e) { /* 위젯 준비 전 호출 무시 */ }
|
|
| 131 |
- } |
|
| 132 |
- |
|
| 133 |
- // 후불제여부 체크 |
|
| 134 |
- function getMjUserAfterPayCheck() {
|
|
| 135 |
- var isAfterPay = false; |
|
| 136 |
- |
|
| 137 |
- $.ajax({
|
|
| 138 |
- type: "POST", |
|
| 139 |
- url: "/web/main/selectUserAfterPayAjax.do", |
|
| 140 |
- data: {},
|
|
| 141 |
- dataType:'json', |
|
| 142 |
- async: false, |
|
| 143 |
- success: function (data) {
|
|
| 144 |
- if (data.isSuccess) {
|
|
| 145 |
- if (data.isAfterPay == true) {
|
|
| 146 |
- isAfterPay = true; |
|
| 39 |
+//다음 결제시 결제수단 SELECT |
|
| 40 |
+function getNextPayMethod() {
|
|
| 41 |
+ var nextPayMethod = ""; |
|
| 42 |
+ $.ajax({
|
|
| 43 |
+ type: "POST", |
|
| 44 |
+ url: "/web/member/pay/selectLastPayMethodAjax.do", |
|
| 45 |
+ data: {},
|
|
| 46 |
+ dataType:'json', |
|
| 47 |
+ async: false, |
|
| 48 |
+ success: function (data) {
|
|
| 49 |
+ if (data.isSuccess) {
|
|
| 50 |
+ if (data.nextPayMethod != '') {
|
|
| 51 |
+ nextPayMethod = data.nextPayMethod; |
|
| 52 |
+ |
|
| 53 |
+ // 버튼 영역 |
|
| 54 |
+ $(".btn_tab").removeClass("active");
|
|
| 55 |
+ // 금액 영역 |
|
| 56 |
+ $(".area_tabcont").removeClass("on");
|
|
| 57 |
+ |
|
| 58 |
+ if (nextPayMethod == "CARD") {
|
|
| 59 |
+ $(".btn_charge1").addClass("active");
|
|
| 60 |
+ $("#tab2_1").addClass("area_tabcont on");
|
|
| 147 | 61 |
} |
| 62 |
+ else if (nextPayMethod == "VBANK") {
|
|
| 63 |
+ $(".btn_charge2").addClass("active");
|
|
| 64 |
+ $("#tab2_2").addClass("area_tabcont on");
|
|
| 65 |
+ } |
|
| 66 |
+ else if (nextPayMethod == "CELLPHONE") {
|
|
| 67 |
+ $(".btn_charge3").addClass("active");
|
|
| 68 |
+ $("#tab2_3").addClass("area_tabcont on");
|
|
| 69 |
+ } |
|
| 70 |
+ else if (nextPayMethod == "BANK") {
|
|
| 71 |
+ $(".btn_charge4").addClass("active");
|
|
| 72 |
+ $("#tab2_4").addClass("area_tabcont on");
|
|
| 73 |
+ } |
|
| 74 |
+ else if (nextPayMethod == "NAV") {
|
|
| 75 |
+ $(".btn_charge5").addClass("active");
|
|
| 76 |
+ $("#tab2_5").addClass("area_tabcont on");
|
|
| 77 |
+ } |
|
| 78 |
+ else if (nextPayMethod == "KKO") {
|
|
| 79 |
+ $(".btn_charge6").addClass("active");
|
|
| 80 |
+ $("#tab2_6").addClass("area_tabcont on");
|
|
| 81 |
+ } |
|
| 82 |
+ else if (nextPayMethod == "TOS") {
|
|
| 83 |
+ $(".btn_charge7").addClass("active");
|
|
| 84 |
+ $("#tab2_7").addClass("area_tabcont on");
|
|
| 85 |
+ } |
|
| 86 |
+ else if (nextPayMethod == "PYC") {
|
|
| 87 |
+ $(".btn_charge8").addClass("active");
|
|
| 88 |
+ $("#tab2_8").addClass("area_tabcont on");
|
|
| 89 |
+ } |
|
| 90 |
+ |
|
| 91 |
+ // 체크박스 |
|
| 92 |
+ $("input:checkbox[id='agree']").prop("checked", true);
|
|
| 148 | 93 |
} |
| 149 |
- }, |
|
| 150 |
- error: function (e) {
|
|
| 94 |
+ } |
|
| 95 |
+ }, |
|
| 96 |
+ error: function (e) {
|
|
| 97 |
+ |
|
| 98 |
+ } |
|
| 99 |
+ }); |
|
| 100 |
+} |
|
| 151 | 101 |
|
| 152 |
- } |
|
| 153 |
- }); |
|
| 154 |
- |
|
| 155 |
- return isAfterPay; |
|
| 102 |
+// 다음 결제시 결제수단 UPDATE |
|
| 103 |
+function setNextPayMethod() {
|
|
| 104 |
+ var nextPayMethod = ""; |
|
| 105 |
+ if ($("input:checkbox[id='agree']").is(":checked") == true) {
|
|
| 106 |
+ var $currentTab = $('.area_tab').children('.active').index();
|
|
| 107 |
+ if ($currentTab == 0) {
|
|
| 108 |
+ nextPayMethod = "CARD"; |
|
| 109 |
+ } else if ($currentTab == 1) {
|
|
| 110 |
+ nextPayMethod = "VBANK"; |
|
| 111 |
+ } else if ($currentTab==2) {
|
|
| 112 |
+ nextPayMethod = "CELLPHONE"; |
|
| 113 |
+ } else if ($currentTab==3) {
|
|
| 114 |
+ nextPayMethod = "BANK"; |
|
| 115 |
+ } else {
|
|
| 116 |
+ if ($currentTab == 4) {
|
|
| 117 |
+ nextPayMethod = "NAV"; // 네이버페이 |
|
| 118 |
+ } else if ($currentTab==5) {
|
|
| 119 |
+ nextPayMethod = "KKO"; // 카카오페이 |
|
| 120 |
+ } else if ($currentTab==6) {
|
|
| 121 |
+ nextPayMethod = "TOS"; // 토스페이 |
|
| 122 |
+ } else if ($currentTab==7) {
|
|
| 123 |
+ nextPayMethod = "PYC"; // 페이코 |
|
| 124 |
+ } |
|
| 125 |
+ } |
|
| 156 | 126 |
} |
| 157 |
- |
|
| 158 |
- function pgOpenerPopup(){
|
|
| 159 |
- // 후불제여부 체크 (기존 로직 유지) |
|
| 160 |
- if (getMjUserAfterPayCheck() == true) {
|
|
| 161 |
- alert("후불제 고객은 해당 서비스를 이용할수 없습니다.");
|
|
| 162 |
- return false; |
|
| 163 |
- } |
|
| 164 |
- |
|
| 165 |
- // 충전금액(공급가액) 추출 |
|
| 166 |
- var chargePrice = parseInt(($("#price").val() || '0').replace(/[^0-9]/g, ''), 10);
|
|
| 167 |
- if (isNaN(chargePrice) || chargePrice < 5000) {
|
|
| 168 |
- alert("최소 충전금액 5천원 이상 입력해주세요.");
|
|
| 169 |
- return false; |
|
| 170 |
- } |
|
| 171 |
- |
|
| 172 |
- // 최종 결제금액(부가세 포함) |
|
| 173 |
- var lastPrice = chargePrice + Math.round(chargePrice * 0.1); |
|
| 174 |
- |
|
| 175 |
- // 토스페이먼츠 결제창 바로 호출 |
|
| 176 |
- paymentWidget.requestPayment({
|
|
| 177 |
- orderId: 'ORDER_' + new Date().getTime(), // 고유한 상점 주문번호 생성 |
|
| 178 |
- orderName: '문자온 충전 ' + lastPrice + '원', |
|
| 179 |
- successUrl: window.location.origin + '/web/member/pay/tossSuccess.do', // 결제 성공 시 이동할 URL |
|
| 180 |
- failUrl: window.location.origin + '/web/member/pay/tossFail.do', // 결제 실패 시 이동할 URL |
|
| 181 |
- customerEmail: $('#mberEmailAdres').val(), // 로그인한 사용자의 이메일 매핑
|
|
| 182 |
- customerName: $('#mberNm').val(), // 로그인한 사용자의 이름 매핑
|
|
| 183 |
- customerMobilePhone: $('#moblphonNo').val()
|
|
| 184 |
- }).catch(function (error) {
|
|
| 185 |
- if (error.code === 'USER_CANCEL') {
|
|
| 186 |
- alert('결제를 취소하셨습니다.');
|
|
| 187 |
- } else {
|
|
| 188 |
- alert(error.message); |
|
| 189 |
- } |
|
| 190 |
- }); |
|
| 127 |
+ else {
|
|
| 128 |
+ nextPayMethod = ""; |
|
| 191 | 129 |
} |
| 130 |
+ |
|
| 131 |
+ // 업데이트 |
|
| 132 |
+ $.ajax({
|
|
| 133 |
+ type: "POST", |
|
| 134 |
+ url: "/web/member/pay/updateNextPayMethodAjax.do", |
|
| 135 |
+ data: {"nextPayMethod" : nextPayMethod},
|
|
| 136 |
+ dataType:'json', |
|
| 137 |
+ async: false, |
|
| 138 |
+ success: function (data) {
|
|
| 139 |
+ if (data.isSuccess) {
|
|
| 192 | 140 |
|
| 141 |
+ } |
|
| 142 |
+ }, |
|
| 143 |
+ error: function (e) {
|
|
| 144 |
+ |
|
| 145 |
+ } |
|
| 146 |
+ }); |
|
| 147 |
+} |
|
| 148 |
+ |
|
| 149 |
+ |
|
| 150 |
+//결제수단 상태 체크 |
|
| 151 |
+function checkPayTypeStatusAjax(payMethod) {
|
|
| 152 |
+ |
|
| 153 |
+ document.payTypeForm.payTypeCode.value = payMethod; |
|
| 154 |
+ |
|
| 155 |
+ var payTypeForm = new FormData(document.payTypeForm); |
|
| 156 |
+ var statusChk = "Y"; |
|
| 157 |
+ $.ajax({
|
|
| 158 |
+ type: "POST", |
|
| 159 |
+ url: "/web/member/pay/checkPayTypeStatusAjax.do", |
|
| 160 |
+ data: payTypeForm, |
|
| 161 |
+ dataType:'json', |
|
| 162 |
+ async: false, |
|
| 163 |
+ processData: false, |
|
| 164 |
+ contentType: false, |
|
| 165 |
+ cache: false, |
|
| 166 |
+ success: function (returnData) {
|
|
| 167 |
+ if("success"==returnData.result){
|
|
| 168 |
+ //결제수단 사용 |
|
| 169 |
+ statusChk = "Y"; |
|
| 170 |
+ |
|
| 171 |
+ }else if("statusFail"==returnData.result){
|
|
| 172 |
+ //회원상태 이용정지 |
|
| 173 |
+ alert(returnData.message); |
|
| 174 |
+ statusChk = "B"; |
|
| 175 |
+ |
|
| 176 |
+ } else if("tempNotUse"==returnData.result){
|
|
| 177 |
+ //결제수단 미사용 |
|
| 178 |
+ alert(returnData.message); |
|
| 179 |
+ statusChk = "N"; |
|
| 180 |
+ |
|
| 181 |
+ } |
|
| 182 |
+ }, |
|
| 183 |
+ error: function (e) {
|
|
| 184 |
+ alert("시스템 에러가 발생하였습니다..");
|
|
| 185 |
+ console.log("ERROR : ", e);
|
|
| 186 |
+ statusChk = "N"; |
|
| 187 |
+ } |
|
| 188 |
+ }); |
|
| 189 |
+ |
|
| 190 |
+ return statusChk; |
|
| 191 |
+ |
|
| 192 |
+} |
|
| 193 |
+ |
|
| 194 |
+// 후불제여부 체크 |
|
| 195 |
+function getMjUserAfterPayCheck() {
|
|
| 196 |
+ var isAfterPay = false; |
|
| 197 |
+ |
|
| 198 |
+ $.ajax({
|
|
| 199 |
+ type: "POST", |
|
| 200 |
+ url: "/web/main/selectUserAfterPayAjax.do", |
|
| 201 |
+ data: {},
|
|
| 202 |
+ dataType:'json', |
|
| 203 |
+ async: false, |
|
| 204 |
+ success: function (data) {
|
|
| 205 |
+ if (data.isSuccess) {
|
|
| 206 |
+ if (data.isAfterPay == true) {
|
|
| 207 |
+ isAfterPay = true; |
|
| 208 |
+ } |
|
| 209 |
+ } |
|
| 210 |
+ }, |
|
| 211 |
+ error: function (e) {
|
|
| 212 |
+ |
|
| 213 |
+ } |
|
| 214 |
+ }); |
|
| 215 |
+ |
|
| 216 |
+ return isAfterPay; |
|
| 217 |
+} |
|
| 218 |
+ |
|
| 219 |
+/* 문서 파일 팝업 */ |
|
| 220 |
+var pg_opener = null; |
|
| 221 |
+function pgOpenerPopup(){
|
|
| 222 |
+ // 후불제여부 체크 |
|
| 223 |
+ if (getMjUserAfterPayCheck() == true) {
|
|
| 224 |
+ alert("후불제 고객은 해당 서비스를 이용할수 없습니다.");
|
|
| 225 |
+ return false; |
|
| 226 |
+ } |
|
| 227 |
+ |
|
| 228 |
+ var $currentTab = $('.area_tab').children('.active').index();
|
|
| 229 |
+ var lastPrice = parseInt($("#price").val(), 10);
|
|
| 230 |
+ |
|
| 231 |
+ if(lastPrice == "" || lastPrice == "0" || lastPrice == null || lastPrice == undefined){
|
|
| 232 |
+ //충전금액 |
|
| 233 |
+ alert("충전금액을 선택해주세요.");
|
|
| 234 |
+ return false; |
|
| 235 |
+ } |
|
| 236 |
+ else if(lastPrice < 5500){
|
|
| 237 |
+ //충전금액 |
|
| 238 |
+ alert("최소 충전금액 5천원 이상 선택해주세요.");
|
|
| 239 |
+ return false; |
|
| 240 |
+ } |
|
| 241 |
+ |
|
| 242 |
+ // 다음 결제시 결제수단 UPDATE |
|
| 243 |
+ setNextPayMethod(); |
|
| 244 |
+ |
|
| 245 |
+ var payMethod = ""; |
|
| 246 |
+ document.pgForm.action = "/web/member/pay/PayActionAjax.do"; |
|
| 247 |
+ |
|
| 248 |
+ if ($currentTab == 0) {
|
|
| 249 |
+ payMethod = "CARD"; |
|
| 250 |
+ } else if ($currentTab == 1) {
|
|
| 251 |
+ payMethod = "VBANK"; |
|
| 252 |
+ } else if ($currentTab==2) {
|
|
| 253 |
+ payMethod = "CELLPHONE"; |
|
| 254 |
+ } else if ($currentTab==3) {
|
|
| 255 |
+ payMethod = "BANK"; |
|
| 256 |
+ } else {
|
|
| 257 |
+ payMethod = "SPAY"; |
|
| 258 |
+ } |
|
| 259 |
+ $('input[name=payMethod]').val(payMethod);
|
|
| 260 |
+ |
|
| 261 |
+ //결제수단 상태 체크 |
|
| 262 |
+ var payStatus = checkPayTypeStatusAjax(payMethod); |
|
| 263 |
+ |
|
| 264 |
+ if(payStatus == "N") {
|
|
| 265 |
+ //결제수단 미사용상태 |
|
| 266 |
+ return false; |
|
| 267 |
+ } else if(payStatus == "B") {
|
|
| 268 |
+ //회원정지상태 로그아웃 새로고침 |
|
| 269 |
+ location.reload(true); |
|
| 270 |
+ return false; |
|
| 271 |
+ } |
|
| 272 |
+ |
|
| 273 |
+ var docWidth = screen.availWidth; |
|
| 274 |
+ var docHeight = screen.availHeight; |
|
| 275 |
+ |
|
| 276 |
+ var scX = window.screenX||window.screenLeft||0; |
|
| 277 |
+ var scY = window.screenY||window.screenTop||0; |
|
| 278 |
+ |
|
| 279 |
+ var popupX = scX + (docWidth - 185) / 2; |
|
| 280 |
+ var popupY = scY + (docHeight - 195) / 2; |
|
| 281 |
+ |
|
| 282 |
+ // 결제창 호출 |
|
| 283 |
+ if ($currentTab == 0) {
|
|
| 284 |
+ // 나이스페이 => CARD(카드결제) |
|
| 285 |
+ pg_opener = window.open('', 'pg_opener', "width=545, height=830, left="+popupX+", top="+popupY, "location = no","status= no","toolbars= no");
|
|
| 286 |
+ |
|
| 287 |
+ document.pgForm.method = "post"; |
|
| 288 |
+ document.pgForm.target = "pg_opener" ; |
|
| 289 |
+ document.pgForm.submit(); |
|
| 290 |
+ } else if ($currentTab == 1) {
|
|
| 291 |
+ // 전용계좌 |
|
| 292 |
+ } else if ($currentTab == 2) {
|
|
| 293 |
+ // KG 모빌리언스 => MOBILE(휴대폰결제) |
|
| 294 |
+ kgmPayMobileRequest(); |
|
| 295 |
+ } else if ($currentTab==3) {
|
|
| 296 |
+ // KG 모빌리언스 => BANK(즉시이체) |
|
| 297 |
+ kgmPayBankRequest(); |
|
| 298 |
+ } else {
|
|
| 299 |
+ var cnDirect = ""; |
|
| 300 |
+ var mstr = ""; |
|
| 301 |
+ if ($currentTab == 4) {
|
|
| 302 |
+ cnDirect = "NAV:00:N"; // 네이버페이 |
|
| 303 |
+ mstr = "NAV"; |
|
| 304 |
+ } else if ($currentTab==5) {
|
|
| 305 |
+ cnDirect = "KKO:00:N"; // 카카오페이 |
|
| 306 |
+ mstr = "KKO"; |
|
| 307 |
+ } else if ($currentTab==6) {
|
|
| 308 |
+ cnDirect = "TOS:00:N"; // 토스페이 |
|
| 309 |
+ mstr = "TOS"; |
|
| 310 |
+ } else if ($currentTab==7) {
|
|
| 311 |
+ cnDirect = "PYC:00:N"; // 페이코 |
|
| 312 |
+ mstr = "PYC"; |
|
| 313 |
+ } |
|
| 314 |
+ |
|
| 315 |
+ // KG 모빌리언스 => SPAY(간편결제) |
|
| 316 |
+ kgmPayCardRequest(cnDirect, mstr); |
|
| 317 |
+ } |
|
| 318 |
+} |
|
| 319 |
+ |
|
| 320 |
+//KG 모빌리언스 => CARD |
|
| 321 |
+function kgmPayCardRequest(cnDirect, mstr) {
|
|
| 322 |
+ $.ajax({
|
|
| 323 |
+ type: "POST", |
|
| 324 |
+ url: "/web/member/pay/kgmCardEncodeAjax.do", |
|
| 325 |
+ data: {"Prdtprice": $("#price").val()},
|
|
| 326 |
+ dataType:'json', |
|
| 327 |
+ async: false, |
|
| 328 |
+ success: function (data) {
|
|
| 329 |
+ if (data.isSuccess) {
|
|
| 330 |
+ var form = document.payCardForm; |
|
| 331 |
+ form.CASH_GB.value = data.CASH_GB; |
|
| 332 |
+ form.CN_SVCID.value = data.CN_SVCID; |
|
| 333 |
+ form.PAY_MODE.value = data.PAY_MODE; |
|
| 334 |
+ form.VER.value = data.VER; |
|
| 335 |
+ form.Prdtprice.value = data.Prdtprice; |
|
| 336 |
+ form.Prdtnm.value = data.Prdtnm; |
|
| 337 |
+ form.Tradeid.value = data.Tradeid; |
|
| 338 |
+ form.Siteurl.value = data.Siteurl; |
|
| 339 |
+ form.Okurl.value = data.Okurl; |
|
| 340 |
+ form.Notiurl.value = data.Notiurl; |
|
| 341 |
+ form.CALL_TYPE.value = data.CALL_TYPE; |
|
| 342 |
+ form.Failurl.value = data.Failurl; |
|
| 343 |
+ form.Userid.value = data.Userid; |
|
| 344 |
+ form.Username.value = data.Username; |
|
| 345 |
+ form.MSTR.value = mstr; |
|
| 346 |
+ form.Payeremail.value = data.Payeremail; |
|
| 347 |
+ form.Cryptyn.value = data.Cryptyn; |
|
| 348 |
+ form.Cryptstring.value = data.Cryptstring; |
|
| 349 |
+ form.Closeurl.value = data.Closeurl; |
|
| 350 |
+ form.CN_BILLTYPE.value = data.CN_BILLTYPE; |
|
| 351 |
+ form.CN_TAX.value = data.CN_TAX; |
|
| 352 |
+ form.CN_TAXFREE.value = data.CN_TAXFREE; |
|
| 353 |
+ form.CN_FREEINTEREST.value = data.CN_FREEINTEREST; |
|
| 354 |
+ form.CN_POINT.value = data.CN_POINT; |
|
| 355 |
+ form.Termregno.value = data.Termregno; |
|
| 356 |
+ form.APP_SCHEME.value = data.APP_SCHEME; |
|
| 357 |
+ form.CN_FIXCARDCD.value = data.CN_FIXCARDCD; |
|
| 358 |
+ form.CN_DIRECT.value = cnDirect; |
|
| 359 |
+ form.CN_INSTALL.value = data.CN_INSTALL; |
|
| 360 |
+ form.Deposit.value = data.Deposit; |
|
| 361 |
+ |
|
| 362 |
+ //아래와 같이 ext_inc_comm.js에 선언되어 있는 함수를 호출 |
|
| 363 |
+ MCASH_PAYMENT(form); |
|
| 364 |
+ } |
|
| 365 |
+ else {
|
|
| 366 |
+ alert("Msg : " + data.msg);
|
|
| 367 |
+ } |
|
| 368 |
+ }, |
|
| 369 |
+ error: function (e) {
|
|
| 370 |
+ alert("ERROR : " + JSON.stringify(e));
|
|
| 371 |
+ } |
|
| 372 |
+ }); |
|
| 373 |
+} |
|
| 374 |
+ |
|
| 375 |
+//KG 모빌리언스 => MOBILE |
|
| 376 |
+function kgmPayMobileRequest() {
|
|
| 377 |
+ $.ajax({
|
|
| 378 |
+ type: "POST", |
|
| 379 |
+ url: "/web/member/pay/kgmMobileEncodeAjax.do", |
|
| 380 |
+ data: {"Prdtprice": $("#price").val()},
|
|
| 381 |
+ dataType:'json', |
|
| 382 |
+ async: false, |
|
| 383 |
+ success: function (data) {
|
|
| 384 |
+ if (data.isSuccess) {
|
|
| 385 |
+ var form = document.payMobileForm; |
|
| 386 |
+ form.CASH_GB.value = data.CASH_GB; |
|
| 387 |
+ form.Okurl.value = data.Okurl; |
|
| 388 |
+ form.MC_SVCID.value = data.MC_SVCID; |
|
| 389 |
+ form.Prdtnm.value = data.Prdtnm; |
|
| 390 |
+ form.Prdtprice.value = data.Prdtprice; |
|
| 391 |
+ form.Siteurl.value = data.Siteurl; |
|
| 392 |
+ form.PAY_MODE.value = data.PAY_MODE; |
|
| 393 |
+ form.Tradeid.value = data.Tradeid; |
|
| 394 |
+ form.LOGO_YN.value = data.LOGO_YN; |
|
| 395 |
+ form.CALL_TYPE.value = data.CALL_TYPE; |
|
| 396 |
+ form.MC_AUTHPAY.value = data.MC_AUTHPAY; |
|
| 397 |
+ form.Notiurl.value = data.Notiurl; |
|
| 398 |
+ form.MC_AUTOPAY.value = data.MC_AUTOPAY; |
|
| 399 |
+ form.Closeurl.value = data.Closeurl; |
|
| 400 |
+ form.MC_PARTPAY.value = data.MC_PARTPAY; |
|
| 401 |
+ form.Failurl.value = data.Failurl; |
|
| 402 |
+ form.MC_No.value = data.MC_No; |
|
| 403 |
+ form.MC_FIXNO.value = data.MC_FIXNO; |
|
| 404 |
+ form.MC_Cpcode.value = data.MC_Cpcode; |
|
| 405 |
+ form.Userid.value = data.Userid; |
|
| 406 |
+ form.Item.value = data.Item; |
|
| 407 |
+ form.Prdtcd.value = data.Prdtcd; |
|
| 408 |
+ form.Payeremail.value = data.Payeremail; |
|
| 409 |
+ form.MC_DEFAULTCOMMID.value = data.MC_DEFAULTCOMMID; |
|
| 410 |
+ form.MC_FIXCOMMID.value = data.MC_FIXCOMMID; |
|
| 411 |
+ form.MSTR.value = data.MSTR; |
|
| 412 |
+ form.Sellernm.value = data.Sellernm; |
|
| 413 |
+ form.Sellertel.value = data.Sellertel; |
|
| 414 |
+ form.Notiemail.value = data.Notiemail; |
|
| 415 |
+ form.IFRAME_NAME.value = data.IFRAME_NAME; |
|
| 416 |
+ form.INFOAREA_YN.value = data.INFOAREA_YN; |
|
| 417 |
+ form.FOOTER_YN.value = data.FOOTER_YN; |
|
| 418 |
+ form.HEIGHT.value = data.HEIGHT; |
|
| 419 |
+ form.PRDT_HIDDEN.value = data.PRDT_HIDDEN; |
|
| 420 |
+ form.EMAIL_HIDDEN.value = data.EMAIL_HIDDEN; |
|
| 421 |
+ form.CONTRACT_HIDDEN.value = data.CONTRACT_HIDDEN; |
|
| 422 |
+ form.Cryptyn.value = data.Cryptyn; |
|
| 423 |
+ form.Cryptstring.value = data.Cryptstring; |
|
| 424 |
+ form.MC_EZ_YN.value = data.MC_EZ_YN; |
|
| 425 |
+ form.MC_EZ_KEY.value = data.MC_EZ_KEY; |
|
| 426 |
+ form.MC_PUSH_KEY.value = data.MC_PUSH_KEY; |
|
| 427 |
+ |
|
| 428 |
+ //아래와 같이 ext_inc_comm.js에 선언되어 있는 함수를 호출 |
|
| 429 |
+ MCASH_PAYMENT(form); |
|
| 430 |
+ } |
|
| 431 |
+ else {
|
|
| 432 |
+ alert("Msg : " + data.msg);
|
|
| 433 |
+ } |
|
| 434 |
+ }, |
|
| 435 |
+ error: function (e) {
|
|
| 436 |
+ alert("ERROR : " + JSON.stringify(e));
|
|
| 437 |
+ } |
|
| 438 |
+ }); |
|
| 439 |
+} |
|
| 440 |
+ |
|
| 441 |
+//KG 모빌리언스 => BANK |
|
| 442 |
+function kgmPayBankRequest() {
|
|
| 443 |
+ $.ajax({
|
|
| 444 |
+ type: "POST", |
|
| 445 |
+ url: "/web/member/pay/kgmBankEncodeAjax.do", |
|
| 446 |
+ data: {"Prdtprice": $("#price").val()},
|
|
| 447 |
+ dataType:'json', |
|
| 448 |
+ async: false, |
|
| 449 |
+ success: function (data) {
|
|
| 450 |
+ if (data.isSuccess) {
|
|
| 451 |
+ var form = document.payBankForm; |
|
| 452 |
+ form.CASH_GB.value = data.CASH_GB; |
|
| 453 |
+ form.Okurl.value = data.Okurl; |
|
| 454 |
+ form.RA_SVCID.value = data.RA_SVCID; |
|
| 455 |
+ form.Prdtnm.value = data.Prdtnm; |
|
| 456 |
+ form.Prdtprice.value = data.Prdtprice; |
|
| 457 |
+ form.Siteurl.value = data.Siteurl; |
|
| 458 |
+ form.PAY_MODE.value = data.PAY_MODE; |
|
| 459 |
+ form.Tradeid.value = data.Tradeid; |
|
| 460 |
+ form.LOGO_YN.value = data.LOGO_YN; |
|
| 461 |
+ form.CALL_TYPE.value = data.CALL_TYPE; |
|
| 462 |
+ form.Notiurl.value = data.Notiurl; |
|
| 463 |
+ form.Closeurl.value = data.Closeurl; |
|
| 464 |
+ form.Failurl.value = data.Failurl; |
|
| 465 |
+ form.Userid.value = data.Userid; |
|
| 466 |
+ form.Item.value = data.Item; |
|
| 467 |
+ form.Prdtcd.value = data.Prdtcd; |
|
| 468 |
+ form.Payeremail.value = data.Payeremail; |
|
| 469 |
+ form.MSTR.value = data.MSTR; |
|
| 470 |
+ form.Notiemail.value = data.Notiemail; |
|
| 471 |
+ form.IFRAME_NAME.value = data.IFRAME_NAME; |
|
| 472 |
+ form.INFOAREA_YN.value = data.INFOAREA_YN; |
|
| 473 |
+ form.FOOTER_YN.value = data.FOOTER_YN; |
|
| 474 |
+ form.HEIGHT.value = data.HEIGHT; |
|
| 475 |
+ form.PRDT_HIDDEN.value = data.PRDT_HIDDEN; |
|
| 476 |
+ form.EMAIL_HIDDEN.value = data.EMAIL_HIDDEN; |
|
| 477 |
+ form.CONTRACT_HIDDEN.value = data.CONTRACT_HIDDEN; |
|
| 478 |
+ form.Cryptyn.value = data.Cryptyn; |
|
| 479 |
+ form.Cryptstring.value = data.Cryptstring; |
|
| 480 |
+ form.Deposit.value = data.Deposit; |
|
| 481 |
+ form.Billyn.value = "N"; |
|
| 482 |
+ |
|
| 483 |
+ //아래와 같이 ext_inc_comm.js에 선언되어 있는 함수를 호출 |
|
| 484 |
+ MCASH_PAYMENT(form); |
|
| 485 |
+ } |
|
| 486 |
+ else {
|
|
| 487 |
+ alert("Msg : " + data.msg);
|
|
| 488 |
+ } |
|
| 489 |
+ }, |
|
| 490 |
+ error: function (e) {
|
|
| 491 |
+ alert("ERROR : " + JSON.stringify(e));
|
|
| 492 |
+ } |
|
| 493 |
+ }); |
|
| 494 |
+} |
|
| 193 | 495 |
|
| 194 | 496 |
/* 윈도우팝업 열기 */ |
| 195 | 497 |
function infoPop(pageUrl){
|
... | ... | @@ -200,6 +502,280 @@ |
| 200 | 502 |
document.infoPopForm.target = "infoPop"; |
| 201 | 503 |
document.infoPopForm.submit(); |
| 202 | 504 |
} |
| 505 |
+ |
|
| 506 |
+// 사용안함 |
|
| 507 |
+function setPrice(obj, price){
|
|
| 508 |
+ var tmp = $(obj).closest('.flex').find('.tempPrice');
|
|
| 509 |
+ if(tmp.val() == ''){
|
|
| 510 |
+ tmp.val('0');
|
|
| 511 |
+ } |
|
| 512 |
+ tmp.val(parseInt(tmp.val()) + parseInt(price)) ; |
|
| 513 |
+} |
|
| 514 |
+ |
|
| 515 |
+//전용계좌 받기 새화면 |
|
| 516 |
+function payVAListAjax(){
|
|
| 517 |
+ var sendData= ''; |
|
| 518 |
+ $("#tab2_2").load("/web/member/pay/selectPayVAViewAjax.do", sendData ,function(response, status, xhr){
|
|
| 519 |
+ }); |
|
| 520 |
+} |
|
| 521 |
+ |
|
| 522 |
+//신규 전용 계좌 받기 |
|
| 523 |
+function fnNewBankAccount(){
|
|
| 524 |
+ // 후불제여부 체크 |
|
| 525 |
+ if (getMjUserAfterPayCheck() == true) {
|
|
| 526 |
+ alert("후불제 고객은 해당 서비스를 이용할수 없습니다.");
|
|
| 527 |
+ return false; |
|
| 528 |
+ } |
|
| 529 |
+ |
|
| 530 |
+ //결제수단 상태 체크 |
|
| 531 |
+ if(checkPayTypeStatusAjax("VBANK") == "N") {
|
|
| 532 |
+ return false; |
|
| 533 |
+ } |
|
| 534 |
+ |
|
| 535 |
+ var bankCd = $("#bankCd").val();
|
|
| 536 |
+ |
|
| 537 |
+ if(bankCd == ''){
|
|
| 538 |
+ |
|
| 539 |
+ alert("은행을 선택해 주세요.");
|
|
| 540 |
+ return false; |
|
| 541 |
+ |
|
| 542 |
+ } |
|
| 543 |
+ |
|
| 544 |
+ // 다음 결제시 결제수단 UPDATE |
|
| 545 |
+ setNextPayMethod(); |
|
| 546 |
+ |
|
| 547 |
+ var data = new FormData(document.pgForm); |
|
| 548 |
+ url = "/web/member/pay/updateVacsAccountUsrIdAjax.do"; |
|
| 549 |
+ |
|
| 550 |
+ $.ajax({
|
|
| 551 |
+ type: "POST", |
|
| 552 |
+ url: url, |
|
| 553 |
+ data: data, |
|
| 554 |
+ dataType:'json', |
|
| 555 |
+ async: false, |
|
| 556 |
+ processData: false, |
|
| 557 |
+ contentType: false, |
|
| 558 |
+ cache: false, |
|
| 559 |
+ success: function (returnData, status) {
|
|
| 560 |
+ if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
|
|
| 561 |
+ if("fail"==returnData.result){
|
|
| 562 |
+ |
|
| 563 |
+ alert(returnData.message); |
|
| 564 |
+ return false; |
|
| 565 |
+ |
|
| 566 |
+ }else if("loginFail"==returnData.result){
|
|
| 567 |
+ |
|
| 568 |
+ alert(returnData.message); |
|
| 569 |
+ return false; |
|
| 570 |
+ |
|
| 571 |
+ }else if("statusFail"==returnData.result){
|
|
| 572 |
+ |
|
| 573 |
+ alert(returnData.message); |
|
| 574 |
+ location.reload(true); |
|
| 575 |
+ |
|
| 576 |
+ }else if(returnData.resultListCnt == '0'){
|
|
| 577 |
+ |
|
| 578 |
+ alert("전용계좌 요청이 실패하었습니다.");
|
|
| 579 |
+ return false; |
|
| 580 |
+ |
|
| 581 |
+ }else{ //전용계좌 신청 성공시 처리
|
|
| 582 |
+ |
|
| 583 |
+ alert("전용계좌 요청이 완료 되었습니다.");
|
|
| 584 |
+ location.reload(); |
|
| 585 |
+ |
|
| 586 |
+ } |
|
| 587 |
+ |
|
| 588 |
+ } else if(status== 'fail'){
|
|
| 589 |
+ alert(returnData.message); |
|
| 590 |
+ } |
|
| 591 |
+ }, |
|
| 592 |
+ error: function (e) { alert("전용계좌 등록에 실패하였습니다."); console.log("ERROR : ", e); }
|
|
| 593 |
+ }); |
|
| 594 |
+ |
|
| 595 |
+} |
|
| 596 |
+ |
|
| 597 |
+// 계좌번호 문자로 받기 |
|
| 598 |
+function fnSmsSend(sendCnt){
|
|
| 599 |
+ // 후불제여부 체크 |
|
| 600 |
+ if (getMjUserAfterPayCheck() == true) {
|
|
| 601 |
+ alert("후불제 고객은 해당 서비스를 이용할수 없습니다.");
|
|
| 602 |
+ return false; |
|
| 603 |
+ } |
|
| 604 |
+ |
|
| 605 |
+ var form = document.pgForm; |
|
| 606 |
+ |
|
| 607 |
+ |
|
| 608 |
+ /* if(sendCnt >= 3){
|
|
| 609 |
+ |
|
| 610 |
+ alert("일일 문자발송은 3회까지만 가능합니다.");
|
|
| 611 |
+ return false; |
|
| 612 |
+ |
|
| 613 |
+ } */ |
|
| 614 |
+ |
|
| 615 |
+ if(form.callTo.value == '' || form.callTo.length == 0){
|
|
| 616 |
+ |
|
| 617 |
+ alert("받으실 휴대폰 번호를 입력해 주세요.");
|
|
| 618 |
+ return false; |
|
| 619 |
+ |
|
| 620 |
+ } |
|
| 621 |
+ |
|
| 622 |
+ if(!checkHpNum(form.callTo.value)){
|
|
| 623 |
+ |
|
| 624 |
+ alert("정확한 휴대폰 번호를 입력해 주세요.");
|
|
| 625 |
+ return false; |
|
| 626 |
+ |
|
| 627 |
+ } |
|
| 628 |
+ |
|
| 629 |
+ if($('input[name="chkAccount"]').is(':checked')){
|
|
| 630 |
+ var accStr = ''; //전송 계좌 번호 정보 |
|
| 631 |
+ $('input[name="chkAccount"]:checked').each(function(i,val){
|
|
| 632 |
+ |
|
| 633 |
+ var nowStr = $(this).val(); |
|
| 634 |
+ if(i == 0){
|
|
| 635 |
+ accStr = nowStr; |
|
| 636 |
+ }else{
|
|
| 637 |
+ accStr = accStr + "/" + nowStr; |
|
| 638 |
+ } |
|
| 639 |
+ |
|
| 640 |
+ }); |
|
| 641 |
+ |
|
| 642 |
+ |
|
| 643 |
+ |
|
| 644 |
+ form.accMsg.value = accStr; |
|
| 645 |
+ |
|
| 646 |
+ var data = new FormData(document.pgForm); |
|
| 647 |
+ url = "/web/member/pay/insertVacsAccountSendMsgLogAjax.do"; |
|
| 648 |
+ |
|
| 649 |
+ if(confirm("문자를 발송하시겠습니까?")){
|
|
| 650 |
+ |
|
| 651 |
+ $.ajax({
|
|
| 652 |
+ type: "POST", |
|
| 653 |
+ url: url, |
|
| 654 |
+ data: data, |
|
| 655 |
+ dataType:'json', |
|
| 656 |
+ async: false, |
|
| 657 |
+ processData: false, |
|
| 658 |
+ contentType: false, |
|
| 659 |
+ cache: false, |
|
| 660 |
+ success: function (returnData, status) {
|
|
| 661 |
+ if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
|
|
| 662 |
+ if("fail"==returnData.result){
|
|
| 663 |
+ |
|
| 664 |
+ alert(returnData.message); |
|
| 665 |
+ return false; |
|
| 666 |
+ |
|
| 667 |
+ }else if("loginFail"==returnData.result){
|
|
| 668 |
+ |
|
| 669 |
+ alert(returnData.message); |
|
| 670 |
+ return false; |
|
| 671 |
+ |
|
| 672 |
+ }else if(returnData.resultListCnt == '0'){
|
|
| 673 |
+ |
|
| 674 |
+ alert("문자 전송에 실패하었습니다.");
|
|
| 675 |
+ return false; |
|
| 676 |
+ |
|
| 677 |
+ }else{ //전용계좌 신청 성공시 처리
|
|
| 678 |
+ |
|
| 679 |
+ alert("문자 전송이 완료 되었습니다.");
|
|
| 680 |
+ location.reload(); |
|
| 681 |
+ |
|
| 682 |
+ } |
|
| 683 |
+ |
|
| 684 |
+ } else if(status== 'fail'){
|
|
| 685 |
+ alert(returnData.message); |
|
| 686 |
+ } |
|
| 687 |
+ }, |
|
| 688 |
+ error: function (e) { alert("문자 전송에 실패하였습니다."); console.log("ERROR : ", e); }
|
|
| 689 |
+ }); |
|
| 690 |
+ |
|
| 691 |
+ } |
|
| 692 |
+ |
|
| 693 |
+ }else{
|
|
| 694 |
+ alert("문자받을 계좌를 선택해 주세요.");
|
|
| 695 |
+ return false; |
|
| 696 |
+ } |
|
| 697 |
+} |
|
| 698 |
+ |
|
| 699 |
+ |
|
| 700 |
+//충전금액 Change Event |
|
| 701 |
+$(document).on('change', '.list_seType1', function() {
|
|
| 702 |
+ // 충전금액 세팅 |
|
| 703 |
+ setPriceMake(); |
|
| 704 |
+}); |
|
| 705 |
+ |
|
| 706 |
+// 충전금액 세팅 |
|
| 707 |
+function setPriceMake() {
|
|
| 708 |
+ var $currentTab = $('.area_tab').children('.active').index();
|
|
| 709 |
+ var $tempPrice = $('.area_tabcont:eq('+$currentTab+')').find('.list_seType1');
|
|
| 710 |
+ var tempPrice = parseInt($tempPrice.val(), 10); |
|
| 711 |
+ var vatPrice = Math.round(parseInt(tempPrice, 10) * 0.1); // 부가세 |
|
| 712 |
+ var lastPrice = parseInt(tempPrice, 10) + parseInt(vatPrice, 10); // 최종가격 |
|
| 713 |
+ |
|
| 714 |
+ $("#price").val(lastPrice);
|
|
| 715 |
+ $('.area_tabcont:eq('+$currentTab+')').find('#supplyPriceStr').html(numberWithCommas(tempPrice));
|
|
| 716 |
+ $('.area_tabcont:eq('+$currentTab+')').find('#vatPriceStr').html(numberWithCommas(vatPrice));
|
|
| 717 |
+ $('.area_tabcont:eq('+$currentTab+')').find('#lastPriceStr').html(numberWithCommas(lastPrice));
|
|
| 718 |
+} |
|
| 719 |
+ |
|
| 720 |
+// 결제하기 tab |
|
| 721 |
+function TabTypePay(obj, tabId) {
|
|
| 722 |
+ var $tab = $(obj).closest("li");
|
|
| 723 |
+ var $tabPrev = $(obj).closest("li").next("li");
|
|
| 724 |
+ $tab.addClass("active");
|
|
| 725 |
+ $tab.find("button").attr("title", "선택됨");
|
|
| 726 |
+ $tab.siblings("li.tab").removeClass("active");
|
|
| 727 |
+ $tab.siblings("li.btn_tab").removeClass("active");
|
|
| 728 |
+ $tab.siblings("li.tab").find("button").removeAttr("title");
|
|
| 729 |
+ |
|
| 730 |
+ $tab.siblings("li:not(li:first-child)").find("button").css("border-left","1px solid #e5e5e5");
|
|
| 731 |
+ $tabPrev.find("button").css("border-left","0");
|
|
| 732 |
+ |
|
| 733 |
+ var $tabCn = $("#tab2_" + tabId);
|
|
| 734 |
+ $tabCn.fadeIn(0); |
|
| 735 |
+ $tabCn.addClass("current");
|
|
| 736 |
+ |
|
| 737 |
+ $(".bottom_content").not($tabCn).removeClass("current");
|
|
| 738 |
+ $(".bottom_content").not($tabCn).fadeOut(0);
|
|
| 739 |
+ |
|
| 740 |
+ $(".area_tabcont").not($tabCn).removeClass("on");
|
|
| 741 |
+ $(".area_tabcont").not($tabCn).fadeOut(0);
|
|
| 742 |
+ |
|
| 743 |
+ currTabId = tabId; |
|
| 744 |
+ |
|
| 745 |
+ // 충전금액 세팅 |
|
| 746 |
+ setPriceMake(); |
|
| 747 |
+} |
|
| 748 |
+ |
|
| 749 |
+// 등급제 대상 여부 |
|
| 750 |
+function getMberGrdChk() {
|
|
| 751 |
+ $.ajax({
|
|
| 752 |
+ type: "POST", |
|
| 753 |
+ url: "/web/grd/mberGrdChkAjax.do", |
|
| 754 |
+ data: {},
|
|
| 755 |
+ dataType:'json', |
|
| 756 |
+ async: false, |
|
| 757 |
+ success: function (data) {
|
|
| 758 |
+ if (data.isSuccess) {
|
|
| 759 |
+ // 등급제 누적결제액 세부내역 |
|
| 760 |
+ var sHtml = ""; |
|
| 761 |
+ sHtml += "<p>등급 : <span><img src='/publish/images/level/level_icon/level_small/" + data.rtnMberGrdVO.grdSetIcon + "_small_icon.png' alt='등급 스몰 아이콘'>" + data.rtnMberGrdVO.grdSetNm; |
|
| 762 |
+ sHtml += "(누적결제액 : <span>" + numberWithCommas(data.rtnMberGrdVO.totAmt) + "</span>원)</span></p>"; |
|
| 763 |
+ $("#grdShowArea").html(sHtml);
|
|
| 764 |
+ $("#grdShowArea").show();
|
|
| 765 |
+ $("#levelSubTitle").html("(" + data.rtnMberGrdVO.grdDate + " ~ 현재)");
|
|
| 766 |
+ |
|
| 767 |
+ // 문자(등급별 요금 안내) |
|
| 768 |
+ $("#mberGrdSettingArea").show();
|
|
| 769 |
+ } |
|
| 770 |
+ else {
|
|
| 771 |
+ //alert("Msg : " + data.msg);
|
|
| 772 |
+ } |
|
| 773 |
+ }, |
|
| 774 |
+ error: function (e) {
|
|
| 775 |
+ //alert("ERROR : " + JSON.stringify(e));
|
|
| 776 |
+ } |
|
| 777 |
+ }); |
|
| 778 |
+} |
|
| 203 | 779 |
|
| 204 | 780 |
|
| 205 | 781 |
/* 사용내역서 클릭 시 내역서 새창 팝업 오픈 */ |
... | ... | @@ -227,13 +803,11 @@ |
| 227 | 803 |
<form id="payTypeForm" name="payTypeForm" method="post"> |
| 228 | 804 |
<input type="hidden" name="payTypeCode" /> |
| 229 | 805 |
</form> |
| 230 |
- <form id="pgForm" name="pgForm" action="/web/member/pay/PayActionAjax.do" method="post"> |
|
| 806 |
+ <form id="pgForm" name="pgForm" action="/web/member/pay/PayActionAjax.do" method="post"> |
|
| 807 |
+ <input type="hidden" id="price" name="price" /> |
|
| 231 | 808 |
<input type="hidden" id="payMethod" name="payMethod" /> |
| 232 | 809 |
<input type="hidden" id="accMsg" name="accMsg" /> |
| 233 | 810 |
<input type="hidden" id="sendCnt" name="sendCnt" value="<c:out value='${resultMsgInfo.sendCnt}'/>" />
|
| 234 |
- <input type="hidden" id="mberEmailAdres" value="<c:out value='${mberManageVO.mberEmailAdres}'/>" />
|
|
| 235 |
- <input type="hidden" id="moblphonNo" value="<c:out value='${mberManageVO.moblphonNo}'/>" />
|
|
| 236 |
- <input type="hidden" id="mberNm" value="<c:out value='${mberManageVO.mberNm}'/>" />
|
|
| 237 | 811 |
<!-- content 영역 --> |
| 238 | 812 |
<div class="inner"> |
| 239 | 813 |
<!-- send top --> |
... | ... | @@ -260,15 +834,338 @@ |
| 260 | 834 |
<p>- 모든 요금은 VAT별도 금액입니다.</p> |
| 261 | 835 |
</div>--%> |
| 262 | 836 |
<div> |
| 263 |
- <!-- 토스페이먼츠 결제수단 위젯 영역 --> |
|
| 264 |
- <div id="payment-method" class="toss_wrap"></div> |
|
| 265 |
- |
|
| 266 |
- <!-- 토스페이먼츠 이용약관 영역 --> |
|
| 267 |
- <div id="agreement" class="toss_wrap"></div> |
|
| 837 |
+ <p class="tab_tit">충전수단 선택</p> |
|
| 838 |
+ <ul class="area_tab"> |
|
| 839 |
+ <li class="btn_charge1 btn_tab active"><button type="button" onclick="TabTypePay(this,'1');"><i></i>신용카드</button></li> |
|
| 840 |
+ <li class="btn_charge2 btn_tab"><button type="button" onclick="TabTypePay(this,'2');" id="btnDdedicatedAccount"><i></i>전용계좌</button></li> |
|
| 841 |
+ <li class="btn_charge3 btn_tab"><button type="button" onclick="TabTypePay(this,'3');"><i></i>휴대폰결제</button></li> |
|
| 842 |
+ <li class="btn_charge4 btn_tab"><button type="button" onclick="TabTypePay(this,'4');"><i></i>즉시이체</button></li> |
|
| 843 |
+ |
|
| 844 |
+ <li class="btn_charge5 btn_tab simple_pay"><button type="button" onclick="TabTypePay(this,'5');"><i></i></button></li> |
|
| 845 |
+ <li class="btn_charge6 btn_tab simple_pay"><button type="button" onclick="TabTypePay(this,'6');"><i></i></button></li> |
|
| 846 |
+ <li class="btn_charge7 btn_tab simple_pay"><button type="button" onclick="TabTypePay(this,'7');"><i></i></button></li> |
|
| 847 |
+ <li class="btn_charge8 btn_tab simple_pay"><button type="button" onclick="TabTypePay(this,'8');"><i></i></button></li> |
|
| 848 |
+ </ul> |
|
| 849 |
+ <div class="checkbox_wrap"><input type="checkbox" id="agree"><label for="agree">선택한 수단을 다음 충전 시에도 이용합니다.</label></div> |
|
| 268 | 850 |
|
| 269 | 851 |
<!-- 신용카드 --> |
| 270 | 852 |
<div class="area_tabcont on" id="tab2_1"> |
| 271 |
- <p class="tType1_title"><img src="/publish/images/credit_small.png" alt="신용카드"> <span id="payMethodTitle">신용·체크카드</span></p> |
|
| 853 |
+ <p class="tType1_title"><img src="/publish/images/content/icon_charging1_small.png" alt=""> 신용카드</p> |
|
| 854 |
+ <table class="tType1"> |
|
| 855 |
+ <caption></caption> |
|
| 856 |
+ <colgroup> |
|
| 857 |
+ <col style="width: 100px;"> |
|
| 858 |
+ <col style="width: auto;"> |
|
| 859 |
+ </colgroup> |
|
| 860 |
+ <tbody> |
|
| 861 |
+ <tr class="charge_content"> |
|
| 862 |
+ <th scope="row">충전금액</th> |
|
| 863 |
+ <td class="flex"> |
|
| 864 |
+ <select name="tempPrice" id="tempPrice" class="list_seType1"> |
|
| 865 |
+ <option value="5000">5,000</option> |
|
| 866 |
+ <option value="10000">10,000</option> |
|
| 867 |
+ <option value="20000">20,000</option> |
|
| 868 |
+ <option value="30000">30,000</option> |
|
| 869 |
+ <option value="50000" selected>50,000</option> |
|
| 870 |
+ <option value="100000">100,000</option> |
|
| 871 |
+ <option value="200000">200,000</option> |
|
| 872 |
+ <option value="300000">300,000</option> |
|
| 873 |
+ <option value="500000">500,000</option> |
|
| 874 |
+ <option value="700000">700,000</option> |
|
| 875 |
+ <option value="900000">900,000</option> |
|
| 876 |
+ <option value="1000000">1,000,000</option> |
|
| 877 |
+ <option value="1200000">1,200,000</option> |
|
| 878 |
+ <option value="1500000">1,500,000</option> |
|
| 879 |
+ <option value="2000000">2,000,000</option> |
|
| 880 |
+ <option value="2500000">2,500,000</option> |
|
| 881 |
+ <option value="3000000">3,000,000</option> |
|
| 882 |
+ </select> |
|
| 883 |
+ <%--<input type="text" numberOnly placeholder="금액을 입력해주세요" name="tempPrice" class="tempPrice" onfocus="this.placeholder=''" onblur="this.placeholder='금액을 입력해주세요'"> |
|
| 884 |
+ <p class="input_in">원</p> |
|
| 885 |
+ <button type="button" class="btnType1" onclick="setPrice(this , '3000'); return false;">+ 3천원</button> |
|
| 886 |
+ <button type="button" onclick="setPrice(this , '5000'); return false;">+ 5천원</button> |
|
| 887 |
+ <button type="button" onclick="setPrice(this , '10000'); return false;">+ 1만원</button> |
|
| 888 |
+ <button type="button" onclick="setPrice(this , '100000'); return false;">+ 10만원</button> |
|
| 889 |
+ <button type="button" onclick="setPrice(this , '1000000'); return false;">+ 100만원</button>--%> |
|
| 890 |
+ <p class="input_in">원</p> |
|
| 891 |
+ <!-- <span class="reqTxt6">※ 최소 3천원 이상부터 결제 가능합니다.</span> --> |
|
| 892 |
+ </td> |
|
| 893 |
+ </tr> |
|
| 894 |
+ <tr> |
|
| 895 |
+ <td colspan="2"> |
|
| 896 |
+ <div class="amount_wrap"> |
|
| 897 |
+ <dl> |
|
| 898 |
+ <dt>최종 결제금액 :</dt> |
|
| 899 |
+ <dd> |
|
| 900 |
+ <ul> |
|
| 901 |
+ <li><strong id="supplyPriceStr"></strong>원(공급가액)</li> |
|
| 902 |
+ <li><span class="plus"></span><strong id="vatPriceStr"></strong>원(부가세)</li> |
|
| 903 |
+ <li class="total"><span class="equal"></span><strong id="lastPriceStr"></strong>원(최종금액)</li> |
|
| 904 |
+ </ul> |
|
| 905 |
+ </dd> |
|
| 906 |
+ </dl> |
|
| 907 |
+ <button type="button" class="btnType" onclick="pgOpenerPopup(); return false;">충전하기</button> |
|
| 908 |
+ </div> |
|
| 909 |
+ </td> |
|
| 910 |
+ </tr> |
|
| 911 |
+ <tr> |
|
| 912 |
+ <td colspan="2"> |
|
| 913 |
+ <div class="area_text"> |
|
| 914 |
+ <%--<p><span class="c_222222">- 신용카드 결제가 어려우신 고객께서는 문자온 고객센터(1551-8011)를 통해서도 ARS 신용카드 결제를 하실 수 있습니다.</span></p>--%> |
|
| 915 |
+ <p>- 인터넷 익스플로러 이용 고객께서는 도구-팝업 차단 해제 후 충전이 가능합니다.</p> |
|
| 916 |
+ <p>- 카드사별 정책상 충전금액 제한이 있을 수 있습니다. 단, ARS 신용카드 결제는 충전금액 제한 없이 이용하실 수 있습니다.</p> |
|
| 917 |
+ </div> |
|
| 918 |
+ </td> |
|
| 919 |
+ </tr> |
|
| 920 |
+ </tbody> |
|
| 921 |
+ </table> |
|
| 922 |
+ </div> |
|
| 923 |
+ <!-- //신용카드 --> |
|
| 924 |
+ |
|
| 925 |
+ <!-- 전용계좌 --> |
|
| 926 |
+ <div class="area_tabcont" id="tab2_2"> |
|
| 927 |
+ <!-- 신규계좌발급 시 --> |
|
| 928 |
+ <p class="tType1_title"><img src="/publish/images/content/icon_charging1_small.png" alt="계좌 이미"> 전용계좌</p> |
|
| 929 |
+ <table class="tType1"> |
|
| 930 |
+ <caption></caption> |
|
| 931 |
+ <colgroup> |
|
| 932 |
+ <col style="width: 65%"> |
|
| 933 |
+ <col style="width: 35%"> |
|
| 934 |
+ </colgroup> |
|
| 935 |
+ <tbody> |
|
| 936 |
+ <tr> |
|
| 937 |
+ <td> |
|
| 938 |
+ <div class="area_text"> |
|
| 939 |
+ <c:choose> |
|
| 940 |
+ <c:when test="${not empty resultMyList}">
|
|
| 941 |
+ <p>입금 즉시 자동 충전되는 나만의 전용계좌 개설(평생 사용가능, 5천원 이상 입금 가능)</p> |
|
| 942 |
+ </c:when> |
|
| 943 |
+ <c:otherwise> |
|
| 944 |
+ <p>1. 현재 발급받은 전용계좌가 없습니다.</p> |
|
| 945 |
+ <p>2. 입금 즉시 자동 충전되는 나만의 전용계좌 개설(평생 사용가능, 5천원 이상 입금 가능)</p> |
|
| 946 |
+ </c:otherwise> |
|
| 947 |
+ </c:choose> |
|
| 948 |
+ |
|
| 949 |
+ <!-- <p>3. 발급받은 전용계좌는 3개월 미사용시 자동 해지됩니다.</p> --> |
|
| 950 |
+ </div> |
|
| 951 |
+ </td> |
|
| 952 |
+ <td class="right"> |
|
| 953 |
+ <label for="bankCd" class="label">은행선택</label> |
|
| 954 |
+ <select name="bankCd" id="bankCd"> |
|
| 955 |
+ <option value="">은행선택</option> |
|
| 956 |
+ <c:forEach var="result" items="${resultList}" varStatus="status">
|
|
| 957 |
+ <option value="${result.bankCd}">${result.codeNm}</option>
|
|
| 958 |
+ </c:forEach> |
|
| 959 |
+ </select> |
|
| 960 |
+ <p class="input_in" style="margin-right:5px;">원</p> |
|
| 961 |
+ <button type="button" onclick="fnNewBankAccount(); return false;">신규계좌받기</button> |
|
| 962 |
+ </td> |
|
| 963 |
+ </tr> |
|
| 964 |
+ </tbody> |
|
| 965 |
+ </table> |
|
| 966 |
+ |
|
| 967 |
+ <!-- 기존 계좌있을 시 --> |
|
| 968 |
+ <p class="tType1_title"><img src="/publish/images/content/icon_charging1_small.png" alt="계좌 이미"> 전용계좌</p> |
|
| 969 |
+ <table class="tType1 account_con"> |
|
| 970 |
+ <caption></caption> |
|
| 971 |
+ <colgroup> |
|
| 972 |
+ <col style="width: 100%"> |
|
| 973 |
+ <col style="width: auto;"> |
|
| 974 |
+ </colgroup> |
|
| 975 |
+ <tbody> |
|
| 976 |
+ <c:choose> |
|
| 977 |
+ <c:when test="${not empty resultMyList}">
|
|
| 978 |
+ <c:forEach var="result" items="${resultMyList}" varStatus="status">
|
|
| 979 |
+ <tr> |
|
| 980 |
+ <td> |
|
| 981 |
+ <div class="checkbox_wrap"> |
|
| 982 |
+ <input type="radio" id="chkAccount${status.count}" name="chkAccount" value="<c:out value='${result.bankCd}'/>_<c:out value='${result.codeNm}'/>_<c:out value='${result.acctNo}'/>">
|
|
| 983 |
+ <label for="chkAccount${status.count}"></label>
|
|
| 984 |
+ <c:out value='${result.codeNm}'/> <c:out value='${result.acctNo}'/>
|
|
| 985 |
+ </div> |
|
| 986 |
+ <div class="account_holder"> |
|
| 987 |
+ (예금주 : <c:out value="${result.cmfNm}"/>)
|
|
| 988 |
+ </div> |
|
| 989 |
+ |
|
| 990 |
+ </td> |
|
| 991 |
+ <td class="right account_te"> |
|
| 992 |
+ <button type="button" onClick="javascript:fnShowVaViewPrintPopup(); return false;">전용계좌 확인서</button> |
|
| 993 |
+ </td> |
|
| 994 |
+ </tr> |
|
| 995 |
+ </c:forEach> |
|
| 996 |
+ </c:when> |
|
| 997 |
+ <c:otherwise> |
|
| 998 |
+ <tr> |
|
| 999 |
+ <td colspan="2"> |
|
| 1000 |
+ <div> |
|
| 1001 |
+ 보유한 전용 계좌가 없습니다. |
|
| 1002 |
+ </div> |
|
| 1003 |
+ <!-- <button type="button">가상계좌 확인서</button> --> |
|
| 1004 |
+ </td> |
|
| 1005 |
+ </tr> |
|
| 1006 |
+ </c:otherwise> |
|
| 1007 |
+ </c:choose> |
|
| 1008 |
+ <tr> |
|
| 1009 |
+ <td colspan="2"> |
|
| 1010 |
+ <div class="area_text"> |
|
| 1011 |
+ <p>- 전용계좌는 개설일로부터 <span>3개월 미사용 시 자동 해지</span>됩니다.</p> |
|
| 1012 |
+ <p>- 전용계좌에 <span>5,000원 이상 입금</span> 시, 연중무휴 <span>실시간 자동 충전이</span> 가능합니다.</p> |
|
| 1013 |
+ <p>- 이체 후 충전 확인까지 <span>최대 10분이 소요</span>됩니다.</p> |
|
| 1014 |
+ <p>- 이체금액에서 <span>부가세 10%가 제외되고 충전</span>됩니다.</p> |
|
| 1015 |
+ <!-- <p>- 예금주 : 문자온</p> --> |
|
| 1016 |
+ <p>- 계좌번호 문자로 받기(유료) |
|
| 1017 |
+ <label for="" class="label">전화번호 입력</label> |
|
| 1018 |
+ <input type="text" id="callTo" name="callTo" maxLength="11" placeholder="‘-’ 없이 받으실 휴대폰 번호를 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='‘-’ 없이 전화번호를 입력해주세요'"> |
|
| 1019 |
+ <button type="button" onclick="fnSmsSend(<c:out value='${resultMsgInfo.sendCnt}'/>); return false;">문자받기</button>
|
|
| 1020 |
+ </p> |
|
| 1021 |
+ </div> |
|
| 1022 |
+ </td> |
|
| 1023 |
+ </tr> |
|
| 1024 |
+ </tbody> |
|
| 1025 |
+ </table> |
|
| 1026 |
+ </div> |
|
| 1027 |
+ <!-- //전용계좌 --> |
|
| 1028 |
+ |
|
| 1029 |
+ <!-- 휴대폰 --> |
|
| 1030 |
+ <div class="area_tabcont" id="tab2_3"> |
|
| 1031 |
+ <p class="tType1_title"><img src="/publish/images/content/icon_charging4_small.png" alt=""> 휴대폰결제</p> |
|
| 1032 |
+ <table class="tType1"> |
|
| 1033 |
+ <caption></caption> |
|
| 1034 |
+ <colgroup> |
|
| 1035 |
+ <col style="width: 100px;"> |
|
| 1036 |
+ <col style="width: auto;"> |
|
| 1037 |
+ </colgroup> |
|
| 1038 |
+ <tbody> |
|
| 1039 |
+ <tr class="charge_content"> |
|
| 1040 |
+ <th scope="row">충전금액</th> |
|
| 1041 |
+ <td class="flex"> |
|
| 1042 |
+ <select name="tempPrice" id="tempPrice" class="list_seType1"> |
|
| 1043 |
+ <option value="5000">5,000</option> |
|
| 1044 |
+ <option value="10000">10,000</option> |
|
| 1045 |
+ <option value="20000">20,000</option> |
|
| 1046 |
+ <option value="30000">30,000</option> |
|
| 1047 |
+ <option value="50000" selected>50,000</option> |
|
| 1048 |
+ <option value="100000">100,000</option> |
|
| 1049 |
+ <option value="150000">150,000</option> |
|
| 1050 |
+ </select> |
|
| 1051 |
+ <%--<input type="text" numberOnly placeholder="금액을 입력해주세요" name="tempPrice" class="tempPrice" onfocus="this.placeholder=''" onblur="this.placeholder='금액을 입력해주세요'"> |
|
| 1052 |
+ <p class="input_in">원</p> |
|
| 1053 |
+ <button type="button" class="btnType1" onclick="setPrice(this , '3000'); return false;">+ 3천원</button> |
|
| 1054 |
+ <button type="button" onclick="setPrice(this , '5000'); return false;">+ 5천원</button> |
|
| 1055 |
+ <button type="button" onclick="setPrice(this , '10000'); return false;">+ 1만원</button> |
|
| 1056 |
+ <button type="button" onclick="setPrice(this , '100000'); return false;">+ 10만원</button> |
|
| 1057 |
+ <button type="button" onclick="setPrice(this , '1000000'); return false;">+ 100만원</button>--%> |
|
| 1058 |
+ <p class="input_in">원</p> |
|
| 1059 |
+ <!-- <span class="reqTxt6">※ 최소 3천원 이상부터 결제 가능합니다.</span> --> |
|
| 1060 |
+ </td> |
|
| 1061 |
+ </tr> |
|
| 1062 |
+ <tr> |
|
| 1063 |
+ <td colspan="2"> |
|
| 1064 |
+ <div class="amount_wrap"> |
|
| 1065 |
+ <dl> |
|
| 1066 |
+ <dt>최종 결제금액 :</dt> |
|
| 1067 |
+ <dd> |
|
| 1068 |
+ <ul> |
|
| 1069 |
+ <li><strong id="supplyPriceStr"></strong>원(공급가액)</li> |
|
| 1070 |
+ <li><span class="plus"></span><strong id="vatPriceStr"></strong>원(부가세)</li> |
|
| 1071 |
+ <li class="total"><span class="equal"></span><strong id="lastPriceStr"></strong>원(최종금액)</li> |
|
| 1072 |
+ </ul> |
|
| 1073 |
+ </dd> |
|
| 1074 |
+ </dl> |
|
| 1075 |
+ <button type="button" class="btnType" onclick="pgOpenerPopup(); return false;">충전하기</button> |
|
| 1076 |
+ </div> |
|
| 1077 |
+ </td> |
|
| 1078 |
+ </tr> |
|
| 1079 |
+ <tr> |
|
| 1080 |
+ <td colspan="2"> |
|
| 1081 |
+ <div class="area_text"> |
|
| 1082 |
+ <p>- 월 30만원 한도 내에서 충전하실 수 있습니다.</p> |
|
| 1083 |
+ <p>- 휴대폰 소액결제 제한에 관한 사항은 가입하신 통신사를 통해 확인하실 수 있습니다.</p> |
|
| 1084 |
+ <p>- 인터넷 익스플로러 이용 고객께서는 도구-팝업 차단 해제 후 충전이 가능합니다.</p> |
|
| 1085 |
+ </div> |
|
| 1086 |
+ </td> |
|
| 1087 |
+ </tr> |
|
| 1088 |
+ </tbody> |
|
| 1089 |
+ </table> |
|
| 1090 |
+ </div> |
|
| 1091 |
+ <!-- //휴대폰 --> |
|
| 1092 |
+ |
|
| 1093 |
+ <!-- 즉시이체 --> |
|
| 1094 |
+ <div class="area_tabcont" id="tab2_4"> |
|
| 1095 |
+ <p class="tType1_title"><img src="/publish/images/content/icon_charging5_small.png" alt=""> 즉시이체</p> |
|
| 1096 |
+ <table class="tType1"> |
|
| 1097 |
+ <caption></caption> |
|
| 1098 |
+ <colgroup> |
|
| 1099 |
+ <col style="width: 100px;"> |
|
| 1100 |
+ <col style="width: auto;"> |
|
| 1101 |
+ </colgroup> |
|
| 1102 |
+ <tbody> |
|
| 1103 |
+ <tr class="charge_content"> |
|
| 1104 |
+ <th scope="row">충전금액</th> |
|
| 1105 |
+ <td class="flex"> |
|
| 1106 |
+ <select name="tempPrice" id="tempPrice" class="list_seType1"> |
|
| 1107 |
+ <option value="5000">5,000</option> |
|
| 1108 |
+ <option value="10000">10,000</option> |
|
| 1109 |
+ <option value="20000">20,000</option> |
|
| 1110 |
+ <option value="30000">30,000</option> |
|
| 1111 |
+ <option value="50000" selected>50,000</option> |
|
| 1112 |
+ <option value="100000">100,000</option> |
|
| 1113 |
+ <option value="200000">200,000</option> |
|
| 1114 |
+ <option value="300000">300,000</option> |
|
| 1115 |
+ <option value="500000">500,000</option> |
|
| 1116 |
+ <option value="700000">700,000</option> |
|
| 1117 |
+ <option value="900000">900,000</option> |
|
| 1118 |
+ <option value="1000000">1,000,000</option> |
|
| 1119 |
+ <option value="1200000">1,200,000</option> |
|
| 1120 |
+ <option value="1500000">1,500,000</option> |
|
| 1121 |
+ <option value="2000000">2,000,000</option> |
|
| 1122 |
+ <option value="2500000">2,500,000</option> |
|
| 1123 |
+ <option value="3000000">3,000,000</option> |
|
| 1124 |
+ </select> |
|
| 1125 |
+ <%--<input type="text" numberOnly placeholder="금액을 입력해주세요" name="tempPrice" class="tempPrice" onfocus="this.placeholder=''" onblur="this.placeholder='금액을 입력해주세요'"> |
|
| 1126 |
+ <p class="input_in">원</p> |
|
| 1127 |
+ <button type="button" class="btnType1" onclick="setPrice(this , '3000'); return false;">+ 3천원</button> |
|
| 1128 |
+ <button type="button" onclick="setPrice(this , '5000'); return false;">+ 5천원</button> |
|
| 1129 |
+ <button type="button" onclick="setPrice(this , '10000'); return false;">+ 1만원</button> |
|
| 1130 |
+ <button type="button" onclick="setPrice(this , '100000'); return false;">+ 10만원</button> |
|
| 1131 |
+ <button type="button" onclick="setPrice(this , '1000000'); return false;">+ 100만원</button>--%> |
|
| 1132 |
+ <p class="input_in">원</p> |
|
| 1133 |
+ <!-- <span class="reqTxt6">※ 최소 3천원 이상부터 결제 가능합니다.</span> --> |
|
| 1134 |
+ </td> |
|
| 1135 |
+ </tr> |
|
| 1136 |
+ <tr> |
|
| 1137 |
+ <td colspan="2"> |
|
| 1138 |
+ <div class="amount_wrap"> |
|
| 1139 |
+ <dl> |
|
| 1140 |
+ <dt>최종 결제금액 :</dt> |
|
| 1141 |
+ <dd> |
|
| 1142 |
+ <ul> |
|
| 1143 |
+ <li><strong id="supplyPriceStr"></strong>원(공급가액)</li> |
|
| 1144 |
+ <li><span class="plus"></span><strong id="vatPriceStr"></strong>원(부가세)</li> |
|
| 1145 |
+ <li class="total"><span class="equal"></span><strong id="lastPriceStr"></strong>원(최종금액)</li> |
|
| 1146 |
+ </ul> |
|
| 1147 |
+ </dd> |
|
| 1148 |
+ </dl> |
|
| 1149 |
+ <button type="button" class="btnType" onclick="pgOpenerPopup(); return false;">충전하기</button> |
|
| 1150 |
+ </div> |
|
| 1151 |
+ </td> |
|
| 1152 |
+ </tr> |
|
| 1153 |
+ <tr> |
|
| 1154 |
+ <td colspan="2"> |
|
| 1155 |
+ <div class="area_text"> |
|
| 1156 |
+ <p>- KG모빌리언스 결제를 이용하여 인터넷뱅킹처럼 로그인 없이 간단한 정보 입력만으로 실시간 계좌 이체</p> |
|
| 1157 |
+ <p> (일반결제, 간편결제, 앱결제)를 할 수 있는 간편한 결제 수단입니다.(소득공제 및 지출증빙 가능)</p> |
|
| 1158 |
+ </div> |
|
| 1159 |
+ </td> |
|
| 1160 |
+ </tr> |
|
| 1161 |
+ </tbody> |
|
| 1162 |
+ </table> |
|
| 1163 |
+ </div> |
|
| 1164 |
+ <!-- //즉시이체 --> |
|
| 1165 |
+ |
|
| 1166 |
+ <!-- 네이버페이 --> |
|
| 1167 |
+ <div class="area_tabcont" id="tab2_5"> |
|
| 1168 |
+ <p class="tType1_title"><img src="/publish/images/simple_small.png" alt="간편결제"> 네이버페이</p> |
|
| 272 | 1169 |
<table class="tType1"> |
| 273 | 1170 |
<colgroup> |
| 274 | 1171 |
<col style="width: 100px;"> |
... | ... | @@ -278,23 +1175,30 @@ |
| 278 | 1175 |
<tr class="charge_content"> |
| 279 | 1176 |
<th scope="row">충전금액</th> |
| 280 | 1177 |
<td class="flex"> |
| 281 |
- <div class="money_form_wrap form_wrap"> |
|
| 282 |
- <input type="text" name="price" id="price" class="input money_input" placeholder="5,000원 이상 입력해주세요." value="50,000" /> |
|
| 283 |
- <p class="input_in">원</p> |
|
| 284 |
- <p class="input_message error"> |
|
| 285 |
- <i class="icon error">!</i> <span class="msg">휴대폰 결제는 최대 150,000원까지 입력 가능합니다.</span> |
|
| 286 |
- </p> |
|
| 287 |
- </div> |
|
| 1178 |
+ <select name="tempPrice" id="tempPrice" class="list_seType1"> |
|
| 1179 |
+ <option value="5000">5,000</option> |
|
| 1180 |
+ <option value="10000">10,000</option> |
|
| 1181 |
+ <option value="20000">20,000</option> |
|
| 1182 |
+ <option value="30000">30,000</option> |
|
| 1183 |
+ <option value="50000" selected="">50,000</option> |
|
| 1184 |
+ <option value="100000">100,000</option> |
|
| 1185 |
+ <option value="200000">200,000</option> |
|
| 1186 |
+ <option value="300000">300,000</option> |
|
| 1187 |
+ <option value="500000">500,000</option> |
|
| 1188 |
+ <option value="700000">700,000</option> |
|
| 1189 |
+ <option value="900000">900,000</option> |
|
| 1190 |
+ <option value="1000000">1,000,000</option> |
|
| 1191 |
+ <option value="1200000">1,200,000</option> |
|
| 1192 |
+ <option value="1500000">1,500,000</option> |
|
| 1193 |
+ <option value="2000000">2,000,000</option> |
|
| 1194 |
+ <option value="2500000">2,500,000</option> |
|
| 1195 |
+ <option value="3000000">3,000,000</option> |
|
| 1196 |
+ </select> |
|
| 288 | 1197 |
|
| 289 |
- <div class="btn_wrap add_money w100per"> |
|
| 290 |
- <button type="button" class="btn" data-price="10000">+ 1만원</button> |
|
| 291 |
- <button type="button" class="btn" data-price="50000">+ 5만원</button> |
|
| 292 |
- <button type="button" class="btn" data-price="100000">+ 10만원</button> |
|
| 293 |
- <button type="button" class="btn" data-price="1000000">+ 100만원</button> |
|
| 294 |
- </div> |
|
| 1198 |
+ <p class="input_in">원</p> |
|
| 1199 |
+ <!-- <span class="reqTxt6">※ 최소 3천원 이상부터 결제 가능합니다.</span> --> |
|
| 295 | 1200 |
</td> |
| 296 | 1201 |
</tr> |
| 297 |
- |
|
| 298 | 1202 |
<tr> |
| 299 | 1203 |
<td colspan="2"> |
| 300 | 1204 |
<div class="amount_wrap"> |
... | ... | @@ -302,19 +1206,228 @@ |
| 302 | 1206 |
<dt>최종 결제금액 :</dt> |
| 303 | 1207 |
<dd> |
| 304 | 1208 |
<ul> |
| 305 |
- <li><strong id="supplyPriceStr">50,000</strong>원(공급가액)</li> |
|
| 306 |
- <li><span class="plus"></span><strong id="vatPriceStr">5,000</strong>원(부가세)</li> |
|
| 307 |
- <li class="total"><span class="equal"></span><strong class="c_e40000" id="lastPriceStr">55,000</strong>원(최종금액)</li> |
|
| 1209 |
+ <li><strong id="supplyPriceStr"></strong>원(공급가액)</li> |
|
| 1210 |
+ <li><span class="plus"></span><strong id="vatPriceStr"></strong>원(부가세)</li> |
|
| 1211 |
+ <li class="total"><span class="equal"></span><strong id="lastPriceStr"></strong>원(최종금액)</li> |
|
| 308 | 1212 |
</ul> |
| 309 | 1213 |
</dd> |
| 310 | 1214 |
</dl> |
| 311 |
- <button type="button" class="btn btnType fill primary btn_pay" onclick="pgOpenerPopup(); return false;">충전하기</button> |
|
| 1215 |
+ <button type="button" class="btnType" onclick="pgOpenerPopup(); return false;">충전하기</button> |
|
| 1216 |
+ </div> |
|
| 1217 |
+ </td> |
|
| 1218 |
+ </tr> |
|
| 1219 |
+ <tr> |
|
| 1220 |
+ <td colspan="2"> |
|
| 1221 |
+ <div class="area_text"> |
|
| 1222 |
+ <p>- 인터넷 익스플로러 이용 고객께서는 도구-팝업 차단 해제 후 충전이 가능합니다.</p> |
|
| 1223 |
+ <p>- 결제사별 정책상 충전금액 제한이 있을 수 있습니다.</p> |
|
| 1224 |
+ <p>- 간편결제 시 세금계산서 및 간이영수증은 제공되지 않습니다.</p> |
|
| 1225 |
+ <p>- 네이버페이 카드 결제 영수증은 네이버페이를 통해서 발급받으실 수 있습니다.</p> |
|
| 1226 |
+ <p>- 네이버페이 포인트 사용에 따른 현금영수증 발행은 문자고 캐시 결제과정에서 결제자가 직접 선택하여야만 요청할 수 있습니다.(결제 완료 이후 문자고에서 현금영수증 처리 불가)</p> |
|
| 312 | 1227 |
</div> |
| 313 | 1228 |
</td> |
| 314 | 1229 |
</tr> |
| 315 | 1230 |
</tbody> |
| 316 | 1231 |
</table> |
| 317 | 1232 |
</div> |
| 1233 |
+ <!-- //네이버페이 --> |
|
| 1234 |
+ |
|
| 1235 |
+ <!-- 카카오페이 --> |
|
| 1236 |
+ <div class="area_tabcont current" id="tab2_6"> |
|
| 1237 |
+ <!-- 신규계좌발급 시 --> |
|
| 1238 |
+ <p class="tType1_title"><img src="/publish/images/simple_small.png" alt="간편결제"> 카카오페이</p> |
|
| 1239 |
+ <table class="tType1"> |
|
| 1240 |
+ <colgroup> |
|
| 1241 |
+ <col style="width: 100px;"> |
|
| 1242 |
+ <col style="width: auto;"> |
|
| 1243 |
+ </colgroup> |
|
| 1244 |
+ <tbody> |
|
| 1245 |
+ <tr class="charge_content"> |
|
| 1246 |
+ <th scope="row">충전금액</th> |
|
| 1247 |
+ <td class="flex"> |
|
| 1248 |
+ <select name="tempPrice" id="tempPrice" class="list_seType1"> |
|
| 1249 |
+ <option value="5000">5,000</option> |
|
| 1250 |
+ <option value="10000">10,000</option> |
|
| 1251 |
+ <option value="20000">20,000</option> |
|
| 1252 |
+ <option value="30000">30,000</option> |
|
| 1253 |
+ <option value="50000" selected="">50,000</option> |
|
| 1254 |
+ <option value="100000">100,000</option> |
|
| 1255 |
+ <option value="200000">200,000</option> |
|
| 1256 |
+ <option value="300000">300,000</option> |
|
| 1257 |
+ <option value="500000">500,000</option> |
|
| 1258 |
+ <option value="700000">700,000</option> |
|
| 1259 |
+ <option value="900000">900,000</option> |
|
| 1260 |
+ <option value="1000000">1,000,000</option> |
|
| 1261 |
+ <option value="1200000">1,200,000</option> |
|
| 1262 |
+ <option value="1500000">1,500,000</option> |
|
| 1263 |
+ <option value="2000000">2,000,000</option> |
|
| 1264 |
+ <option value="2500000">2,500,000</option> |
|
| 1265 |
+ <option value="3000000">3,000,000</option> |
|
| 1266 |
+ </select> |
|
| 1267 |
+ |
|
| 1268 |
+ <p class="input_in">원</p> |
|
| 1269 |
+ <!-- <span class="reqTxt6">※ 최소 3천원 이상부터 결제 가능합니다.</span> --> |
|
| 1270 |
+ </td> |
|
| 1271 |
+ </tr> |
|
| 1272 |
+ <tr> |
|
| 1273 |
+ <td colspan="2"> |
|
| 1274 |
+ <div class="amount_wrap"> |
|
| 1275 |
+ <dl> |
|
| 1276 |
+ <dt>최종 결제금액 :</dt> |
|
| 1277 |
+ <dd> |
|
| 1278 |
+ <ul> |
|
| 1279 |
+ <li><strong id="supplyPriceStr"></strong>원(공급가액)</li> |
|
| 1280 |
+ <li><span class="plus"></span><strong id="vatPriceStr"></strong>원(부가세)</li> |
|
| 1281 |
+ <li class="total"><span class="equal"></span><strong id="lastPriceStr"></strong>원(최종금액)</li> |
|
| 1282 |
+ </ul> |
|
| 1283 |
+ </dd> |
|
| 1284 |
+ </dl> |
|
| 1285 |
+ <button type="button" class="btnType" onclick="pgOpenerPopup(); return false;">충전하기</button> |
|
| 1286 |
+ </div> |
|
| 1287 |
+ </td> |
|
| 1288 |
+ </tr> |
|
| 1289 |
+ <tr> |
|
| 1290 |
+ <td colspan="2"> |
|
| 1291 |
+ <div class="area_text"> |
|
| 1292 |
+ <p>- 인터넷 익스플로러 이용 고객께서는 도구-팝업 차단 해제 후 충전이 가능합니다.</p> |
|
| 1293 |
+ <p>- 결제사별 정책상 충전금액 제한이 있을 수 있습니다.</p> |
|
| 1294 |
+ <p>- 간편결제 시 세금계산서 및 간이영수증은 제공되지 않습니다.</p> |
|
| 1295 |
+ <p>- 카카오페이 결제에 따른 카드영수증 및 현금영수증은 카카오페이 앱을 통해서만 확인 가능합니다.</p> |
|
| 1296 |
+ </div> |
|
| 1297 |
+ </td> |
|
| 1298 |
+ </tr> |
|
| 1299 |
+ </tbody> |
|
| 1300 |
+ </table> |
|
| 1301 |
+ </div> |
|
| 1302 |
+ <!-- //카카오페이 --> |
|
| 1303 |
+ |
|
| 1304 |
+ <!-- 토스페이 --> |
|
| 1305 |
+ <div class="area_tabcont current" id="tab2_7"> |
|
| 1306 |
+ <p class="tType1_title"><img src="/publish/images/simple_small.png" alt="간편결제"> 토스페이</p> |
|
| 1307 |
+ <table class="tType1"> |
|
| 1308 |
+ <caption></caption> |
|
| 1309 |
+ <colgroup> |
|
| 1310 |
+ <col style="width: 100px;"> |
|
| 1311 |
+ <col style="width: auto;"> |
|
| 1312 |
+ </colgroup> |
|
| 1313 |
+ <tbody> |
|
| 1314 |
+ <tr class="charge_content"> |
|
| 1315 |
+ <th scope="row">충전금액</th> |
|
| 1316 |
+ <td class="flex"> |
|
| 1317 |
+ <select name="tempPrice" id="tempPrice" class="list_seType1"> |
|
| 1318 |
+ <option value="5000">5,000</option> |
|
| 1319 |
+ <option value="10000">10,000</option> |
|
| 1320 |
+ <option value="20000">20,000</option> |
|
| 1321 |
+ <option value="30000">30,000</option> |
|
| 1322 |
+ <option value="50000" selected="">50,000</option> |
|
| 1323 |
+ <option value="100000">100,000</option> |
|
| 1324 |
+ <option value="150000">150,000</option> |
|
| 1325 |
+ </select> |
|
| 1326 |
+ |
|
| 1327 |
+ <p class="input_in">원</p> |
|
| 1328 |
+ <!-- <span class="reqTxt6">※ 최소 3천원 이상부터 결제 가능합니다.</span> --> |
|
| 1329 |
+ </td> |
|
| 1330 |
+ </tr> |
|
| 1331 |
+ <tr> |
|
| 1332 |
+ <td colspan="2"> |
|
| 1333 |
+ <div class="amount_wrap"> |
|
| 1334 |
+ <dl> |
|
| 1335 |
+ <dt>최종 결제금액 :</dt> |
|
| 1336 |
+ <dd> |
|
| 1337 |
+ <ul> |
|
| 1338 |
+ <li><strong id="supplyPriceStr"></strong>원(공급가액)</li> |
|
| 1339 |
+ <li><span class="plus"></span><strong id="vatPriceStr"></strong>원(부가세)</li> |
|
| 1340 |
+ <li class="total"><span class="equal"></span><strong id="lastPriceStr"></strong>원(최종금액)</li> |
|
| 1341 |
+ </ul> |
|
| 1342 |
+ </dd> |
|
| 1343 |
+ </dl> |
|
| 1344 |
+ <button type="button" class="btnType" onclick="pgOpenerPopup(); return false;">충전하기</button> |
|
| 1345 |
+ </div> |
|
| 1346 |
+ </td> |
|
| 1347 |
+ </tr> |
|
| 1348 |
+ <tr> |
|
| 1349 |
+ <td colspan="2"> |
|
| 1350 |
+ <div class="area_text"> |
|
| 1351 |
+ <p>- 인터넷 익스플로러 이용 고객께서는 도구-팝업 차단 해제 후 충전이 가능합니다.</p> |
|
| 1352 |
+ <p>- 결제사별 정책상 충전금액 제한이 있을 수 있습니다.</p> |
|
| 1353 |
+ <p>- 간편결제 시 세금계산서 및 간이영수증은 제공되지 않습니다.</p> |
|
| 1354 |
+ <p>- 토스페이 결제에 따른 카드영수증 및 현금영수증은 토스페이 앱을 통해서만 확인 가능합니다.</p> |
|
| 1355 |
+ </div> |
|
| 1356 |
+ </td> |
|
| 1357 |
+ </tr> |
|
| 1358 |
+ </tbody> |
|
| 1359 |
+ </table> |
|
| 1360 |
+ </div> |
|
| 1361 |
+ <!-- //토스페이 --> |
|
| 1362 |
+ |
|
| 1363 |
+ <!-- 페이코 --> |
|
| 1364 |
+ <div class="area_tabcont current" id="tab2_8"> |
|
| 1365 |
+ <p class="tType1_title"><img src="/publish/images/simple_small.png" alt="간편결제"> PAYCO</p> |
|
| 1366 |
+ <table class="tType1"> |
|
| 1367 |
+ <caption></caption> |
|
| 1368 |
+ <colgroup> |
|
| 1369 |
+ <col style="width: 100px;"> |
|
| 1370 |
+ <col style="width: auto;"> |
|
| 1371 |
+ </colgroup> |
|
| 1372 |
+ <tbody> |
|
| 1373 |
+ <tr class="charge_content"> |
|
| 1374 |
+ <th scope="row">충전금액</th> |
|
| 1375 |
+ <td class="flex"> |
|
| 1376 |
+ <select name="tempPrice" id="tempPrice" class="list_seType1"> |
|
| 1377 |
+ <option value="5000">5,000</option> |
|
| 1378 |
+ <option value="10000">10,000</option> |
|
| 1379 |
+ <option value="20000">20,000</option> |
|
| 1380 |
+ <option value="30000">30,000</option> |
|
| 1381 |
+ <option value="50000" selected="">50,000</option> |
|
| 1382 |
+ <option value="100000">100,000</option> |
|
| 1383 |
+ <option value="200000">200,000</option> |
|
| 1384 |
+ <option value="300000">300,000</option> |
|
| 1385 |
+ <option value="500000">500,000</option> |
|
| 1386 |
+ <option value="700000">700,000</option> |
|
| 1387 |
+ <option value="900000">900,000</option> |
|
| 1388 |
+ <option value="1000000">1,000,000</option> |
|
| 1389 |
+ <option value="1200000">1,200,000</option> |
|
| 1390 |
+ <option value="1500000">1,500,000</option> |
|
| 1391 |
+ <option value="2000000">2,000,000</option> |
|
| 1392 |
+ <option value="2500000">2,500,000</option> |
|
| 1393 |
+ <option value="3000000">3,000,000</option> |
|
| 1394 |
+ </select> |
|
| 1395 |
+ |
|
| 1396 |
+ <p class="input_in">원</p> |
|
| 1397 |
+ <!-- <span class="reqTxt6">※ 최소 3천원 이상부터 결제 가능합니다.</span> --> |
|
| 1398 |
+ </td> |
|
| 1399 |
+ </tr> |
|
| 1400 |
+ <tr> |
|
| 1401 |
+ <td colspan="2"> |
|
| 1402 |
+ <div class="amount_wrap"> |
|
| 1403 |
+ <dl> |
|
| 1404 |
+ <dt>최종 결제금액 :</dt> |
|
| 1405 |
+ <dd> |
|
| 1406 |
+ <ul> |
|
| 1407 |
+ <li><strong id="supplyPriceStr"></strong>원(공급가액)</li> |
|
| 1408 |
+ <li><span class="plus"></span><strong id="vatPriceStr"></strong>원(부가세)</li> |
|
| 1409 |
+ <li class="total"><span class="equal"></span><strong id="lastPriceStr"></strong>원(최종금액)</li> |
|
| 1410 |
+ </ul> |
|
| 1411 |
+ </dd> |
|
| 1412 |
+ </dl> |
|
| 1413 |
+ <button type="button" class="btnType" onclick="pgOpenerPopup(); return false;">충전하기</button> |
|
| 1414 |
+ </div> |
|
| 1415 |
+ </td> |
|
| 1416 |
+ </tr> |
|
| 1417 |
+ <tr> |
|
| 1418 |
+ <td colspan="2"> |
|
| 1419 |
+ <div class="area_text"> |
|
| 1420 |
+ <p>- 인터넷 익스플로러 이용 고객께서는 도구-팝업 차단 해제 후 충전이 가능합니다.</p> |
|
| 1421 |
+ <p>- 결제사별 정책상 충전금액 제한이 있을 수 있습니다.</p> |
|
| 1422 |
+ <p>- 페이코(PAYCO) 결제 영수증은 페이코를 통해 발급받으실 수 있습니다.</p> |
|
| 1423 |
+ </div> |
|
| 1424 |
+ </td> |
|
| 1425 |
+ </tr> |
|
| 1426 |
+ </tbody> |
|
| 1427 |
+ </table> |
|
| 1428 |
+ </div> |
|
| 1429 |
+ <!-- //페이코 --> |
|
| 1430 |
+ |
|
| 318 | 1431 |
</div> |
| 319 | 1432 |
|
| 320 | 1433 |
<!--누적결제액별 등급 및 단가 추가 시작--> |
--- src/main/webapp/publish/css/content.css
+++ src/main/webapp/publish/css/content.css
... | ... | @@ -893,7 +893,6 @@ |
| 893 | 893 |
.photoBox .txtBox span {font-size: 18px; font-weight: 300; color: #666; padding-top: 10px;display: inline-block;display:none;}
|
| 894 | 894 |
|
| 895 | 895 |
/* 결제내역 */ |
| 896 |
- |
|
| 897 | 896 |
/* 요금결제내역 */ |
| 898 | 897 |
.pay_cont .list_info div:last-child button{font-size:14px;}
|
| 899 | 898 |
.pay_cont .tType1 .calendar_wrap {margin-right: 3px;}
|
... | ... | @@ -1084,10 +1083,6 @@ |
| 1084 | 1083 |
.charg_cont {background-color: #fff;padding: 40px;border-radius: 10px; min-height: 589px; display: none;}
|
| 1085 | 1084 |
.charg_cont.current {display: block;}
|
| 1086 | 1085 |
.charg_cont .tab_tit{font-size: 24px; font-weight: bold; color: #222; margin-bottom: 20px; margin-top: 40px;}
|
| 1087 |
- |
|
| 1088 |
-/* 토스 */ |
|
| 1089 |
-.toss_wrap{width:calc(100% + 60px);margin:0 0 0 -30px;}
|
|
| 1090 |
- |
|
| 1091 | 1086 |
/* 간편결제 오픈 시 */ |
| 1092 | 1087 |
.charg_cont .area_tab{display:flex;gap:25px 30px;flex-wrap:wrap;}
|
| 1093 | 1088 |
.charg_cont .area_tab li{position:relative;position:relative;width:calc((100% /4) - 23px);border:1px solid #d5d5d5;border-radius:5px;box-sizing:border-box;}
|
... | ... | @@ -1140,9 +1135,9 @@ |
| 1140 | 1135 |
.charg_cont .area_tabcont.on{display: block;}
|
| 1141 | 1136 |
.charg_cont .area_tabcont .area_tit{font-size: 20px; font-weight: bold; color: #222; margin-left: 5px;}
|
| 1142 | 1137 |
.charg_cont .tType1{margin-bottom: 50px;}
|
| 1143 |
-.charg_cont .tType1 select, .charg_cont .tType1 button:not(.btn_pay), .charg_cont .tType1 input{height: 40px; border-radius: 5px; display: inline-block;line-height:40px;}
|
|
| 1138 |
+.charg_cont .tType1 select, .charg_cont .tType1 button, .charg_cont .tType1 input{height: 40px; border-radius: 5px; display: inline-block;line-height:40px;}
|
|
| 1144 | 1139 |
.charg_cont .tType1 select{width: 220px; padding: 0 20px 0 15px; border: 1px solid #ccc; margin-left: 8px; font-size: 16px; color: #222; font-weight: 300; background-image: url(/publish/images/select_search.png); background-repeat: no-repeat; background-position: 92% center;}
|
| 1145 |
-.area_tabcont .tType1 button:not(.btn_pay) {background-color: var(--primary-color); padding: 0 20px; color: #fff; font-weight: normal; letter-spacing: -0.5px; font-size: 17px;}
|
|
| 1140 |
+.area_tabcont .tType1 button {background-color: var(--primary-color); padding: 0 20px; color: #fff; font-weight: normal; letter-spacing: -0.5px; font-size: 17px;}
|
|
| 1146 | 1141 |
.charg_cont .tType1 input{border: 1px solid #ccc; margin-right: 5px; vertical-align: middle; margin-left: 8px;}
|
| 1147 | 1142 |
/* .charg_cont .tType1 input:nth-child(2) {margin-left: 0;} */
|
| 1148 | 1143 |
.charg_cont .tType1 .area_text{ font-size: 16px; font-weight: 300; color: #555;}
|
... | ... | @@ -1156,35 +1151,27 @@ |
| 1156 | 1151 |
.charg_cont .tType1 .checkbox_wrap input[type="radio"]+label{width: 24px;height: 24px; border-radius: 50%;display: inline-block; vertical-align: middle; margin-bottom: 3px; position: relative; cursor: pointer; vertical-align: middle; margin-right: 5px; margin-top: -2px;padding:0;}
|
| 1157 | 1152 |
.charg_cont .tType1 .account_holder {display:inline-block;margin:0 0 0 -15px;font-size:16px;}
|
| 1158 | 1153 |
.charg_cont .tType1 .flex{display: flex; align-items: center;}
|
| 1159 |
-.charg_cont .tType1 .flex input{height: 40px; border: none; margin:0;}
|
|
| 1154 |
+.charg_cont .tType1 .flex input{height: 40px; border: none;}
|
|
| 1160 | 1155 |
.charg_cont .tType1 p.input_in{margin:0 0 0 5px;line-height: 1; font-size: 18px; display: inline-block; vertical-align: middle;}
|
| 1161 |
-.charg_cont .tType1 .flex button{border: 1px solid #d5d5d5; color: #333; font-size: 16px; background-color: #fff; padding: 0 20px;}
|
|
| 1156 |
+.charg_cont .tType1 .flex button{border: 1px solid #b1b1b1; color: #222; font-size: 17px; background-color: #fff; padding: 0 13px; margin-right: 5px;}
|
|
| 1157 |
+.charg_cont .tType1 tbody tr.charge_content {border-bottom:0 none;}
|
|
| 1162 | 1158 |
.charg_cont .tType1 tbody tr.charge_content .list_seType1 {width:180px;font-size:18px;border-color:#f2f2f2;background-color:#f2f2f2;cursor:pointer;}
|
| 1163 |
- |
|
| 1164 |
-.charg_cont .charge_content{border-bottom:1px solid #e5e5e5;}
|
|
| 1165 |
-.charg_cont .charge_content .flex{flex-wrap:wrap;gap:8px;}
|
|
| 1166 |
-.charg_cont .money_form_wrap{display:flex;width:100%;justify-content:flex-start;align-items:center;gap:8px;}
|
|
| 1167 |
-.charg_cont .money_form_wrap .money_input.error{border:1px solid var(--red-color);}
|
|
| 1168 |
- |
|
| 1169 |
-.amount_wrap {display:flex;margin:-5px 0 20px;padding:12px 30px 12px 35px;line-height:56px;justify-content:space-between;border:3px solid #ddd;border-radius:5px;}
|
|
| 1170 |
-.amount_wrap dl {display:flex;letter-spacing:-0.025em;}
|
|
| 1171 |
-.amount_wrap dl dt {font-size:20px;font-weight:500;white-space:nowrap;}
|
|
| 1172 |
-.amount_wrap dl dd ul {display:flex;}
|
|
| 1173 |
-.amount_wrap dl dd ul li {position:relative;padding:0 30px;font-size:17px;font-weight:300;white-space:nowrap;color:#555;}
|
|
| 1174 |
-.amount_wrap dl dd ul li:first-child {padding-left:25px;}
|
|
| 1175 |
-.amount_wrap dl dd ul li strong {font-size:22px;font-weight:700;color:#000;margin:0 2px 0 0;}
|
|
| 1176 |
-.amount_wrap dl dd ul li .plus {position:absolute;left:-14px;top:50%;width:27px;height:27px;background:#f5f5f5;border-radius:28px;transform:translateY(-50%);}
|
|
| 1177 |
-.amount_wrap dl dd ul li .plus:before {content:'';position:absolute;left:12px;top:6px;width:3px;height:15px;background:#8f8f8f;}
|
|
| 1178 |
-.amount_wrap dl dd ul li .plus:after {content:'';position:absolute;left:6px;top:12px;width:15px;height:3px;background:#8f8f8f;}
|
|
| 1179 |
-.amount_wrap dl dd ul li .equal {position:absolute;left:-14px;top:50%;width:27px;height:27px;background:#f5f5f5;border-radius:28px;transform:translateY(-50%);}
|
|
| 1180 |
-.amount_wrap dl dd ul li .equal:before {content:'';position:absolute;left:6px;top:9px;width:15px;height:3px;background:#8f8f8f;}
|
|
| 1181 |
-.amount_wrap dl dd ul li .equal:after {content:'';position:absolute;left:6px;top:15px;width:15px;height:3px;background:#8f8f8f;}
|
|
| 1182 |
-.amount_wrap dl dd ul li.total {padding-right:0;font-size:20px;color:#222;}
|
|
| 1183 |
-.amount_wrap dl dd ul li.total strong {color:#f43131;}
|
|
| 1184 |
-.amount_wrap .btnType {width:210px;height:56px;font-size:20px;font-weight:600;}
|
|
| 1185 |
- |
|
| 1186 |
-.charg_cont .amount_wrap{border:0;margin:0;padding:0 15px;}
|
|
| 1187 |
- |
|
| 1159 |
+.charg_cont .tType1 tbody tr td .amount_wrap {display:flex;margin:-5px 0 20px;padding:12px 30px 12px 35px;line-height:56px;justify-content:space-between;border:3px solid #ddd;border-radius:5px;}
|
|
| 1160 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl {display:flex;letter-spacing:-0.025em;}
|
|
| 1161 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dt {font-size:20px;font-weight:500;white-space:nowrap;}
|
|
| 1162 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul {display:flex;}
|
|
| 1163 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li {position:relative;padding:0 30px;font-size:16px;font-weight:300;white-space:nowrap;color:#555;}
|
|
| 1164 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li:first-child {padding-left:25px;}
|
|
| 1165 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li strong {font-size:22px;font-weight:700;color:#222;}
|
|
| 1166 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li .plus {position:absolute;left:-14px;top:50%;width:27px;height:27px;background:#f5f5f5;border-radius:28px;transform:translateY(-50%);}
|
|
| 1167 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li .plus:before {content:'';position:absolute;left:12px;top:6px;width:3px;height:15px;background:#8f8f8f;}
|
|
| 1168 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li .plus:after {content:'';position:absolute;left:6px;top:12px;width:15px;height:3px;background:#8f8f8f;}
|
|
| 1169 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li .equal {position:absolute;left:-14px;top:50%;width:27px;height:27px;background:#f5f5f5;border-radius:28px;transform:translateY(-50%);}
|
|
| 1170 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li .equal:before {content:'';position:absolute;left:6px;top:9px;width:15px;height:3px;background:#8f8f8f;}
|
|
| 1171 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li .equal:after {content:'';position:absolute;left:6px;top:15px;width:15px;height:3px;background:#8f8f8f;}
|
|
| 1172 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li.total {padding-right:0;font-size:20px;color:#222;}
|
|
| 1173 |
+.charg_cont .tType1 tbody tr td .amount_wrap dl dd ul li.total strong {color:#f43131;}
|
|
| 1174 |
+.charg_cont .tType1 tbody tr td .amount_wrap .btnType {width:210px;height:56px;font-size:20px;}
|
|
| 1188 | 1175 |
|
| 1189 | 1176 |
.info_bank{display: flex; width: 100%; flex-wrap: wrap; justify-content: space-between;}
|
| 1190 | 1177 |
.info_bank li{width: calc((100% - 33px) / 3); display: flex; margin-bottom: 11px; height: 62px; align-items: center; justify-content: center; box-shadow: 0 0 8px rgba(0, 0, 0, 0.2); border-radius: 5px;}
|
--- src/main/webapp/publish/css/style.css
+++ src/main/webapp/publish/css/style.css
... | ... | @@ -19,9 +19,6 @@ |
| 19 | 19 |
--green-color:#15983A; |
| 20 | 20 |
--green-color-hover:#0E9A1F; |
| 21 | 21 |
|
| 22 |
- --blue-color:#176EE5; |
|
| 23 |
- --blue-color-hover:#1956B4; |
|
| 24 |
- |
|
| 25 | 22 |
--gray-color:#888888; |
| 26 | 23 |
--gray-color-hover:#666666; |
| 27 | 24 |
--lightgray-color:#999999; |
... | ... | @@ -44,10 +41,6 @@ |
| 44 | 41 |
.fwMd{font-weight:500!important;}
|
| 45 | 42 |
.fwBold{font-weight:700!important;}
|
| 46 | 43 |
|
| 47 |
-.fs_18{font-size:18px;font-weight:bold;}
|
|
| 48 |
-.fs_16{font-size:16px;font-weight:bold;}
|
|
| 49 |
-.fs_14{font-size:14px;}
|
|
| 50 |
- |
|
| 51 | 44 |
.c_white{color:#fff!important;}
|
| 52 | 45 |
.c_002c9a{color:var(--primary-color)!important;}
|
| 53 | 46 |
.c_e40000{color:#e40000!important;}
|
... | ... | @@ -58,10 +51,7 @@ |
| 58 | 51 |
.c_222{color:#222!important;}
|
| 59 | 52 |
.c_666{color:#666!important;}
|
| 60 | 53 |
|
| 61 |
-.color_red{color:var(--red-color);}
|
|
| 62 |
-.color_blue{color:var(--blue-color);}
|
|
| 63 |
-.color_green{color:var(--green-color);}
|
|
| 64 |
-.color_yellow{color:#eea301;}
|
|
| 54 |
+.color_red{color:#F43131;}
|
|
| 65 | 55 |
|
| 66 | 56 |
/* ============================================= |
| 67 | 57 |
폰트 강조(GmarketSans Bold) |
... | ... | @@ -94,8 +84,6 @@ |
| 94 | 84 |
.text_deco3::after{position:absolute;top:50%;left:0;content:"";width:5px;height:17px;border-radius:2.5px;background-color:var(--secondary-light-color);transform:translateY(-50%);}
|
| 95 | 85 |
.font_ellipsis>p{display:-webkit-inline-box;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:1;-webkit-box-orient:vertical;font-weight:300;line-break:anywhere;text-align:left;}
|
| 96 | 86 |
.font_ellipsis>a>p{display:-webkit-inline-box;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:1;-webkit-box-orient:vertical;font-weight:400;line-break:anywhere;text-align:left;}
|
| 97 |
-.desc_text{font-size:14px;color:#666;}
|
|
| 98 |
- |
|
| 99 | 87 |
|
| 100 | 88 |
/* ===================== SORT BUTTON / CASE COUNT ===================== */ |
| 101 | 89 |
.sort_wrap{display:inline-block;}
|
... | ... | @@ -122,9 +110,6 @@ |
| 122 | 110 |
|
| 123 | 111 |
.form_area.column{flex-direction:column;}
|
| 124 | 112 |
|
| 125 |
-.form_row{display:flex;gap:8px;}
|
|
| 126 |
-.form_row *{margin:0;}
|
|
| 127 |
- |
|
| 128 | 113 |
select{border:1px solid #e5e5e5;vertical-align:middle;font-family:'Pretendard';font-weight:300;font-size:16px;}
|
| 129 | 114 |
select.selType1{padding:0 25px 0 10px;height:34px;border:1px solid #d5d5d5;border-radius:3px;background-image:url(/publish/images/select_search2.png);background-repeat:no-repeat;background-position:right 5px top 50%;color:#777;}
|
| 130 | 115 |
select.selType2{margin-left:2px;align-self:center;padding-left:12px;width:125px;height:36px;border:1px solid #ccc;border-radius:3px;box-sizing:border-box;background-image:url(/publish/images/select_search.png);background-repeat:no-repeat;background-position:92% center;font-size:16px;color:#666;}
|
... | ... | @@ -137,7 +122,6 @@ |
| 137 | 122 |
input::placeholder{font-family:'Pretendard';font-weight:300;color:#a6a6a6!important;}
|
| 138 | 123 |
input:-ms-input-placeholder{font-family:'Pretendard';font-weight:300;color:#a6a6a6!important;}
|
| 139 | 124 |
input[type="text"]{padding:0 10px;border-radius:3px;font-size:16px;}
|
| 140 |
-input[type="text"]:active{border:1px solid var(--blue-color);}
|
|
| 141 | 125 |
input[type="text"].readonly::placeholder{color:#222!important;}
|
| 142 | 126 |
input[type="text"].readonly:-ms-input-placeholder{color:#222!important;}
|
| 143 | 127 |
input[type="text"].inputLight::placeholder{color:#a6a6a6!important;}
|
... | ... | @@ -178,33 +162,7 @@ |
| 178 | 162 |
.w100{width:100%;}
|
| 179 | 163 |
.h100{height:100%;}
|
| 180 | 164 |
|
| 181 |
-/* ========================================================================== |
|
| 182 |
- 배지 및 상태 표시 박스 (Badges & Boxes) |
|
| 183 |
- ========================================================================== */ |
|
| 184 |
-.badge_wrap{padding:10px;border-radius:5px;}
|
|
| 185 |
-.badge_wrap.red{background:#ffeaea;}
|
|
| 186 |
-.badge_wrap .badge{padding:0;}
|
|
| 187 | 165 |
|
| 188 |
-.badge{display:inline-flex;align-items:center;justify-content:center;padding:8px 14px;font-size:14px;font-weight:400;border-radius:5px;box-sizing:border-box;gap:8px;}
|
|
| 189 |
-.badge.blue{color:#002c9a;background:#e6eaf5;}
|
|
| 190 |
-.badge.yellow{color:#FF8800;background:#FFF4E6;}
|
|
| 191 |
-.badge.red{color:#E40000;background:#FFEAEA;}
|
|
| 192 |
-.badge.green{color:#18BB59;background:#e8f9ef;}
|
|
| 193 |
- |
|
| 194 |
-.badge i{display:inline-block;width:6px;height:6px;border-radius:100%;}
|
|
| 195 |
-.badge.blue i{background:#002c9a;}
|
|
| 196 |
-.badge.yellow i{background:#FF8800;}
|
|
| 197 |
-.badge.red i{background:#E40000;}
|
|
| 198 |
-.badge .icon{width:16px;height:16px;border-radius:0;}
|
|
| 199 |
-.badge.red .error{background:transparent url(/publish/images/content/icon_error.png) no-repeat center;}
|
|
| 200 |
-.badge.yellow .warning{background:transparent url(/publish/images/content/icon_warning.png) no-repeat center;}
|
|
| 201 |
-.badge.green .success{background:transparent url(/publish/images/content/icon_success.png) no-repeat center;}
|
|
| 202 |
- |
|
| 203 |
-/* 박스 유형별 스타일 */ |
|
| 204 |
-.gray_box{padding:20px 25px;font-size:14px;font-weight:400;line-height:1.4;color:#666;}
|
|
| 205 |
-.gray_box.fill{background:#f5f5f5;border-radius:5px;}
|
|
| 206 |
-.white_box{padding:12px 16px;margin:8px 0 0 0;font-size:14px;line-height:1.4;color:#333;background:#fff;border-radius:5px;}
|
|
| 207 |
-.lightred_box.fill{padding:20px 12px;font-size:16px;font-weight:400;line-height:1.4;color:#222;text-align:center;background:#FFEAEA;border-radius:5px;}
|
|
| 208 | 166 |
|
| 209 | 167 |
/* ============================================= |
| 210 | 168 |
테이블 타입 |
... | ... | @@ -240,8 +198,6 @@ |
| 240 | 198 |
.tType1 tbody tr td.putText .put_left.long textarea {height: 380px;}
|
| 241 | 199 |
.tType1 tbody tr td.putText .put_left.long.on {border: 1px solid #12bec9;border-radius: 5px;background-color: #eef5f9 !important;}
|
| 242 | 200 |
.tType1 tbody tr td.putText .put_left.photo.on {border: 1px solid #e26ba9;border-radius: 5px;background-color: #f8f1f5 !important;}
|
| 243 |
-.tType1 tbody tr td.put_num .badge{margin:0 0 0 8px;}
|
|
| 244 |
-.tType1 tbody tr td.put_num .badge.yellow{cursor:pointer;}
|
|
| 245 | 201 |
.tType1 tbody tr.msg_title {display:none;}
|
| 246 | 202 |
.tType1 tbody tr.msg_title.active {display:table-row;}
|
| 247 | 203 |
.tType1 tbody tr.msg_title td .title_wrap .textbox {display:none;margin:10px 0 0;}
|
--- src/main/webapp/publish/payment_toss.html
... | ... | @@ -1,276 +0,0 @@ |
| 1 | -<!DOCTYPE html> | |
| 2 | -<html lang="ko"> | |
| 3 | - | |
| 4 | -<head> | |
| 5 | - <meta charset="UTF-8"> | |
| 6 | - <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
| 7 | - <title>문자온</title> | |
| 8 | - | |
| 9 | - <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap" rel="stylesheet"> | |
| 10 | - <link rel="stylesheet" href="/publish/css/reset.css"> | |
| 11 | - <link rel="stylesheet" href="/publish/css/jquery.mCustomScrollbar.css"> | |
| 12 | - <link rel="stylesheet" href="/publish/css/common.css"> | |
| 13 | - <link rel="stylesheet" href="/publish/css/style.css"> | |
| 14 | - <link rel="stylesheet" href="/publish/css/button.css"> | |
| 15 | - <link rel="stylesheet" href="/publish/css/content.css"> | |
| 16 | - <link rel="stylesheet" href="/publish/css/mem.css"> | |
| 17 | - <link rel="stylesheet" href="/publish/css/font.css"> | |
| 18 | - <link rel="stylesheet" href="/publish/css/popupLayer.css"> | |
| 19 | - | |
| 20 | - <script src="/publish/js/jquery-3.5.0.js"></script> | |
| 21 | - <script src="/publish/js/jquery.mCustomScrollbar.concat.min.js"></script> | |
| 22 | - <script src="/publish/js/common.js"></script> | |
| 23 | - <script src="/publish/js/content.js"></script> | |
| 24 | - <script src="/publish/js/calendar.js"></script> | |
| 25 | - <script src="/publish/js/popup.js"></script> | |
| 26 | - <script src="/publish/js/popupLayer.js"></script> | |
| 27 | - | |
| 28 | - <script src="https://mup.mobilians.co.kr/js/ext/ext_inc_comm.js"></script> | |
| 29 | - <script type="text/javascript" src="/js/MJUtill.js"></script> | |
| 30 | - <script src="https://js.tosspayments.com/v1/payment-widget"></script> | |
| 31 | - <script> | |
| 32 | - let paymentWidget; | |
| 33 | - let paymentMethodWidget; | |
| 34 | - | |
| 35 | - $(document).ready(function () { | |
| 36 | - | |
| 37 | - const $input = $('.money_input'); | |
| 38 | - const $message = $('.input_message'); | |
| 39 | - | |
| 40 | - // 금액 추가 버튼 클릭 | |
| 41 | - $('.add_money .btn').on('click', function () { | |
| 42 | - | |
| 43 | - const addAmount = Number($(this).data('price')); | |
| 44 | - | |
| 45 | - // 현재 입력값 숫자만 추출 | |
| 46 | - let currentValue = $input.val().replace(/[^0-9]/g, ''); | |
| 47 | - currentValue = currentValue ? Number(currentValue) : 0; | |
| 48 | - | |
| 49 | - // 금액 합산 | |
| 50 | - const total = currentValue + addAmount; | |
| 51 | - | |
| 52 | - // input 표시 | |
| 53 | - $input.val(numberWithCommas(total)); | |
| 54 | - | |
| 55 | - // 금액 갱신 | |
| 56 | - updatePrice(total); | |
| 57 | - | |
| 58 | - }); | |
| 59 | - | |
| 60 | - // 직접 입력 | |
| 61 | - $input.on('input', function () { | |
| 62 | - let value = $(this).val().replace(/[^0-9]/g, ''); | |
| 63 | - value = value ? Number(value) : 0; | |
| 64 | - $(this).val(numberWithCommas(value)); | |
| 65 | - updatePrice(value); | |
| 66 | - }); | |
| 67 | - | |
| 68 | - // 토스페이먼츠 위젯 초기화 | |
| 69 | - const clientKey = 'test_gck_KNbdOvk5rk15kdKpqQGo3n07xlzm'; | |
| 70 | - const customerKey = 'test_customer_1234'; | |
| 71 | - | |
| 72 | - paymentWidget = PaymentWidget(clientKey, customerKey); | |
| 73 | - | |
| 74 | - // 최초 금액 | |
| 75 | - const initialAmount = 0; | |
| 76 | - | |
| 77 | - // 결제수단 렌더링 | |
| 78 | - paymentMethodWidget = paymentWidget.renderPaymentMethods( | |
| 79 | - '#payment-method', | |
| 80 | - { value: initialAmount } | |
| 81 | - ); | |
| 82 | - | |
| 83 | - // 약관 렌더링 | |
| 84 | - paymentWidget.renderAgreement('#agreement'); | |
| 85 | - | |
| 86 | - }); | |
| 87 | - | |
| 88 | - // 금액 업데이트 | |
| 89 | - function updatePrice(price) { | |
| 90 | - | |
| 91 | - const $message = $('.input_message'); | |
| 92 | - | |
| 93 | - const supplyPrice = price; | |
| 94 | - const vatPrice = Math.round(supplyPrice * 0.1); | |
| 95 | - const lastPrice = supplyPrice + vatPrice; | |
| 96 | - | |
| 97 | - // 화면 표시 | |
| 98 | - $('#supplyPriceStr').text(numberWithCommas(supplyPrice)); | |
| 99 | - $('#vatPriceStr').text(numberWithCommas(vatPrice)); | |
| 100 | - $('#lastPriceStr').text(numberWithCommas(lastPrice)); | |
| 101 | - | |
| 102 | - // 토스 결제 금액 변경 | |
| 103 | - if (typeof paymentMethodWidget !== 'undefined') { | |
| 104 | - paymentMethodWidget.updateAmount(lastPrice); | |
| 105 | - } | |
| 106 | - | |
| 107 | - // 휴대폰 결제 제한 체크 | |
| 108 | - if (price > 150000 || price < 5000) { | |
| 109 | - $(".money_input").addClass('error'); | |
| 110 | - $message.addClass('active'); | |
| 111 | - if(price<5001){ | |
| 112 | - $message.find(".msg").text("최소 충전금액 5천원 이상 입력해주세요."); | |
| 113 | - }else{$message.find(".msg").text("휴대폰 결제는 최대 150,000원까지 입력 가능합니다.");} | |
| 114 | - | |
| 115 | - } else { | |
| 116 | - $(".money_input").removeClass('error'); | |
| 117 | - $message.removeClass('active'); | |
| 118 | - } | |
| 119 | - } | |
| 120 | - | |
| 121 | - // 결제 호출 | |
| 122 | - function pgOpenerPopup() { | |
| 123 | - | |
| 124 | - const chargePrice = parseInt($('#price').val().replace(/[^0-9]/g, ''),10); | |
| 125 | - | |
| 126 | - const lastPrice = chargePrice + Math.round(chargePrice * 0.1); | |
| 127 | - | |
| 128 | - if (chargePrice < 5000) { | |
| 129 | - alert("최소 충전금액 5천원 이상 입력해주세요."); | |
| 130 | - return false; | |
| 131 | - } | |
| 132 | - | |
| 133 | - paymentWidget.requestPayment({ | |
| 134 | - orderId: 'ORDER_' + new Date().getTime(), | |
| 135 | - orderName: '문자온 충전 ' + lastPrice + '원', | |
| 136 | - successUrl: window.location.origin + '/web/member/pay/tossSuccess.do', | |
| 137 | - failUrl: window.location.origin + '/web/member/pay/tossFail.do', | |
| 138 | - customerEmail: $('#mberEmailAdres').val(), | |
| 139 | - customerName: $('#mberNm').val(), | |
| 140 | - customerMobilePhone: $('#moblphonNo').val() | |
| 141 | - }).catch(function (error) { | |
| 142 | - | |
| 143 | - if (error.code === 'USER_CANCEL') { | |
| 144 | - alert('결제를 취소하셨습니다.'); | |
| 145 | - } else { | |
| 146 | - alert(error.message); | |
| 147 | - } | |
| 148 | - | |
| 149 | - }); | |
| 150 | - } | |
| 151 | - | |
| 152 | - // 콤마 함수 | |
| 153 | - function numberWithCommas(x) { | |
| 154 | - return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); | |
| 155 | - } | |
| 156 | - </script> | |
| 157 | - | |
| 158 | -</head> | |
| 159 | - | |
| 160 | -<body> | |
| 161 | - <div data-include-path="/publish/layout/_header.html"></div> | |
| 162 | - <!-- content 영역 --> | |
| 163 | - <div id="container" class="cont sub"> | |
| 164 | - <div class="inner"> | |
| 165 | - <!-- send top --> | |
| 166 | - <div class="send_top"> | |
| 167 | - <!-- tab button --> | |
| 168 | - <ul class="tabType4"> | |
| 169 | - <li class="tab"><button type="button" onclick="location.href='/publish/payment1.html'">요금안내/견적내기</button></li> | |
| 170 | - <li class="tab active"><button type="button" onclick="TabType5(this,'2');">결제하기</button></li> | |
| 171 | - <li class="tab"><button type="button" onclick="location.href='/publish/payment3.html'">요금 결제내역</button></li> | |
| 172 | - <li class="tab"><button type="button" onclick="location.href='/publish/payment4.html'">요금 사용내역</button></li> | |
| 173 | - <li class="tab"><button type="button" onclick="location.href='/publish/payment5.html'">세금계산서 발행 등록</button></li> | |
| 174 | - </ul> | |
| 175 | - <!--// tab button --> | |
| 176 | - <!-- 결제관리 - 결제하기 --> | |
| 177 | - <div class="serv_content charg_cont current" id="tab5_2"> | |
| 178 | - <div class="heading"> | |
| 179 | - <h2>결제하기</h2> | |
| 180 | - <button type="button" class="button info" onclick="infoListPop('payment2','792','250');">사용안내</button> | |
| 181 | - </div> | |
| 182 | - | |
| 183 | - <div> | |
| 184 | - <!-- 토스페이먼츠 결제수단 위젯 영역 --> | |
| 185 | - <div id="payment-method" class="toss_wrap"></div> | |
| 186 | - | |
| 187 | - <!-- 토스페이먼츠 이용약관 영역 --> | |
| 188 | - <div id="agreement" class="toss_wrap"></div> | |
| 189 | - | |
| 190 | - <!-- <b class="fs_18 fwMd">충전할 금액을 선택한 후 <spa n class="c_002c9a">[충전하기]</span> 버튼을 눌러주세요</b> --> | |
| 191 | - <div class="area_tabcont on " id="tab2_1"> | |
| 192 | - <p class="tType1_title"><img src="/publish/images/credit_small.png" alt="신용카드"> 신용카드</p> | |
| 193 | - <table class="tType1"> | |
| 194 | - <colgroup> | |
| 195 | - <col style="width: 100px;"> | |
| 196 | - <col style="width: auto;"> | |
| 197 | - </colgroup> | |
| 198 | - <tbody> | |
| 199 | - <tr class="charge_content"> | |
| 200 | - <th scope="row">충전금액</th> | |
| 201 | - <td class="flex"> | |
| 202 | - <!-- <select name="tempPrice" id="tempPrice" class="list_seType1"> | |
| 203 | - <option value="5000">5,000</option> | |
| 204 | - <option value="10000">10,000</option> | |
| 205 | - <option value="20000">20,000</option> | |
| 206 | - <option value="30000">30,000</option> | |
| 207 | - <option value="50000" selected="">50,000</option> | |
| 208 | - <option value="100000">100,000</option> | |
| 209 | - <option value="200000">200,000</option> | |
| 210 | - <option value="300000">300,000</option> | |
| 211 | - <option value="500000">500,000</option> | |
| 212 | - <option value="700000">700,000</option> | |
| 213 | - <option value="900000">900,000</option> | |
| 214 | - <option value="1000000">1,000,000</option> | |
| 215 | - <option value="1200000">1,200,000</option> | |
| 216 | - <option value="1500000">1,500,000</option> | |
| 217 | - <option value="2000000">2,000,000</option> | |
| 218 | - <option value="2500000">2,500,000</option> | |
| 219 | - <option value="3000000">3,000,000</option> | |
| 220 | - </select> --> | |
| 221 | - | |
| 222 | - <div class="money_form_wrap form_wrap"> | |
| 223 | - <input type="text" name="price" id="price" class="input money_input" placeholder="1,000원 이상 입력해주세요." value="50,000" min="5,000" max="150,000"/> | |
| 224 | - <p class="input_in">원</p> | |
| 225 | - <p class="input_message error"> | |
| 226 | - <i class="icon error">!</i> <span class="msg">휴대폰 결제는 최대 150,000원까지 입력 가능합니다.</span> | |
| 227 | - </p> | |
| 228 | - </div> | |
| 229 | - | |
| 230 | - <div class="btn_wrap add_money w100per"> | |
| 231 | - <button type="button" class="btn" data-price="10000">+ 1만원</button> | |
| 232 | - <button type="button" class="btn" data-price="50000">+ 5만원</button> | |
| 233 | - <button type="button" class="btn" data-price="100000">+ 10만원</button> | |
| 234 | - <button type="button" class="btn" data-price="1000000">+ 100만원</button> | |
| 235 | - </div> | |
| 236 | - <!-- <span class="reqTxt6">※ 최소 3천원 이상부터 결제 가능합니다.</span> --> | |
| 237 | - </td> | |
| 238 | - </tr> | |
| 239 | - | |
| 240 | - <tr> | |
| 241 | - <td colspan="2"> | |
| 242 | - <div class="amount_wrap"> | |
| 243 | - <dl> | |
| 244 | - <dt>최종 결제금액 :</dt> | |
| 245 | - <dd> | |
| 246 | - <ul> | |
| 247 | - <li><strong id="supplyPriceStr">50,000</strong>원(공급가액)</li> | |
| 248 | - <li><span class="plus"></span><strong id="vatPriceStr">5,000</strong>원(부가세)</li> | |
| 249 | - <li class="total"><span class="equal"></span><strong class="c_e40000" id="lastPriceStr">55,000</strong>원(최종금액)</li> | |
| 250 | - </ul> | |
| 251 | - </dd> | |
| 252 | - </dl> | |
| 253 | - <button type="button" class="btn btnType fill primary btn_pay" onclick="pgOpenerPopup(); return false;" >충전하기</button> | |
| 254 | - </div> | |
| 255 | - </td> | |
| 256 | - | |
| 257 | - </tr> | |
| 258 | - | |
| 259 | - </tbody> | |
| 260 | - </table> | |
| 261 | - </div> | |
| 262 | - | |
| 263 | - </div> | |
| 264 | - | |
| 265 | - </div><!-- 결제관리 - 결제하기 --> | |
| 266 | - </div> | |
| 267 | - <!--// send top --> | |
| 268 | - </div> | |
| 269 | - </div> | |
| 270 | - <!--// content 영역 --> | |
| 271 | - <!-- footer 영역 --> | |
| 272 | - <div data-include-path="/publish/layout/_footer.html"></div> | |
| 273 | - <!--// footer 영역 --> | |
| 274 | -</body> | |
| 275 | - | |
| 276 | -</html>(No newline at end of file) |
--- src/main/webapp/publish/payment_toss_evaluation.html
... | ... | @@ -1,381 +0,0 @@ |
| 1 | -<!DOCTYPE html> | |
| 2 | -<html lang="ko"> | |
| 3 | - | |
| 4 | -<head> | |
| 5 | - <meta charset="UTF-8"> | |
| 6 | - <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
| 7 | - <title>문자온</title> | |
| 8 | - | |
| 9 | - <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap" rel="stylesheet"> | |
| 10 | - <link rel="stylesheet" href="/publish/css/reset.css"> | |
| 11 | - <link rel="stylesheet" href="/publish/css/jquery.mCustomScrollbar.css"> | |
| 12 | - <link rel="stylesheet" href="/publish/css/common.css"> | |
| 13 | - <link rel="stylesheet" href="/publish/css/style.css"> | |
| 14 | - <link rel="stylesheet" href="/publish/css/button.css"> | |
| 15 | - <link rel="stylesheet" href="/publish/css/content.css"> | |
| 16 | - <link rel="stylesheet" href="/publish/css/mem.css"> | |
| 17 | - <link rel="stylesheet" href="/publish/css/font.css"> | |
| 18 | - <link rel="stylesheet" href="/publish/css/popupLayer.css"> | |
| 19 | - | |
| 20 | - <script src="/publish/js/jquery-3.5.0.js"></script> | |
| 21 | - <script src="/publish/js/jquery.mCustomScrollbar.concat.min.js"></script> | |
| 22 | - <script src="/publish/js/common.js"></script> | |
| 23 | - <script src="/publish/js/content.js"></script> | |
| 24 | - <script src="/publish/js/calendar.js"></script> | |
| 25 | - <script src="/publish/js/popup.js"></script> | |
| 26 | - <script src="/publish/js/popupLayer.js"></script> | |
| 27 | - | |
| 28 | - <script src="https://mup.mobilians.co.kr/js/ext/ext_inc_comm.js"></script> | |
| 29 | - <script type="text/javascript" src="/js/MJUtill.js"></script> | |
| 30 | - <script src="https://js.tosspayments.com/v1/payment-widget"></script> | |
| 31 | - <script> | |
| 32 | - let paymentWidget; | |
| 33 | - let paymentMethodWidget; | |
| 34 | - | |
| 35 | - $(document).ready(function () { | |
| 36 | - | |
| 37 | - // 토스페이먼츠 위젯 초기화 세팅 | |
| 38 | - const clientKey = 'test_gck_KNbdOvk5rk15kdKpqQGo3n07xlzm'; | |
| 39 | - const customerKey = 'test_customer_1234'; | |
| 40 | - | |
| 41 | - paymentWidget = PaymentWidget(clientKey, customerKey); | |
| 42 | - | |
| 43 | - // 최초 선택된 체크박스 기준 금액 세팅 | |
| 44 | - setPriceMake(); | |
| 45 | - | |
| 46 | - const initialAmount = parseInt($("#price").val(), 10); | |
| 47 | - | |
| 48 | - // 결제수단 및 약관 위젯 렌더링 | |
| 49 | - paymentMethodWidget = paymentWidget.renderPaymentMethods( | |
| 50 | - '#payment-method', | |
| 51 | - { value: initialAmount } | |
| 52 | - ); | |
| 53 | - | |
| 54 | - paymentWidget.renderAgreement('#agreement'); | |
| 55 | - | |
| 56 | - $(".tType4 tbody tr td").click(function () { | |
| 57 | - $("input[name='price']").prop("checked", false); | |
| 58 | - $(this).closest("tr").find("input[name='price']").prop("checked", true); | |
| 59 | - | |
| 60 | - // 금액 갱신 | |
| 61 | - setPriceMake(); | |
| 62 | - }); | |
| 63 | - | |
| 64 | - }); | |
| 65 | - | |
| 66 | - | |
| 67 | - function setPriceMake() { | |
| 68 | - | |
| 69 | - const checkedRow = $('input[name="price"]:checked').closest('tr'); | |
| 70 | - const priceText = checkedRow.find('td').eq(1).text().replace(/,/g, '').trim(); | |
| 71 | - const supplyPrice = parseInt(priceText, 10); | |
| 72 | - const vatPrice = Math.round(supplyPrice * 0.1); | |
| 73 | - const lastPrice = supplyPrice + vatPrice; | |
| 74 | - | |
| 75 | - // hidden input 값 | |
| 76 | - $("#price").val(lastPrice); | |
| 77 | - | |
| 78 | - // 화면 표시 | |
| 79 | - $('#supplyPriceStr').html(numberWithCommas(supplyPrice)); | |
| 80 | - $('#vatPriceStr').html(numberWithCommas(vatPrice)); | |
| 81 | - $('#lastPriceStr').html(numberWithCommas(lastPrice)); | |
| 82 | - | |
| 83 | - // 토스 위젯 금액 변경 | |
| 84 | - if (typeof paymentMethodWidget !== 'undefined') { | |
| 85 | - paymentMethodWidget.updateAmount(lastPrice); | |
| 86 | - } | |
| 87 | - } | |
| 88 | - | |
| 89 | - | |
| 90 | - // 체크박스 단일 선택 처리 | |
| 91 | - $(document).on('change', 'input[name="price"]', function () { | |
| 92 | - $('input[name="price"]').not(this).prop('checked', false); | |
| 93 | - $(this).prop('checked', true); | |
| 94 | - | |
| 95 | - // 금액 갱신 | |
| 96 | - setPriceMake(); | |
| 97 | - }); | |
| 98 | - | |
| 99 | - // 후불제여부 체크 | |
| 100 | - function getMjUserAfterPayCheck() { | |
| 101 | - var isAfterPay = false; | |
| 102 | - | |
| 103 | - $.ajax({ | |
| 104 | - type: "POST", | |
| 105 | - url: "/web/main/selectUserAfterPayAjax.do", | |
| 106 | - data: {}, | |
| 107 | - dataType:'json', | |
| 108 | - async: false, | |
| 109 | - success: function (data) { | |
| 110 | - if (data.isSuccess) { | |
| 111 | - if (data.isAfterPay == true) { | |
| 112 | - isAfterPay = true; | |
| 113 | - } | |
| 114 | - } | |
| 115 | - }, | |
| 116 | - error: function (e) { | |
| 117 | - | |
| 118 | - } | |
| 119 | - }); | |
| 120 | - | |
| 121 | - return isAfterPay; | |
| 122 | - } | |
| 123 | - | |
| 124 | - function pgOpenerPopup(){ | |
| 125 | - | |
| 126 | - var lastPrice = parseInt($("#price").val(), 10); | |
| 127 | - if(lastPrice < 5500){ | |
| 128 | - alert("최소 충전금액 5천원 이상 선택해주세요."); | |
| 129 | - return false; | |
| 130 | - } | |
| 131 | - | |
| 132 | - // 토스페이먼츠 결제창 바로 호출 | |
| 133 | - paymentWidget.requestPayment({ | |
| 134 | - orderId: 'ORDER_' + new Date().getTime(), // 고유한 상점 주문번호 생성 | |
| 135 | - orderName: '문자고 충전 ' + lastPrice + '원', | |
| 136 | - successUrl: window.location.origin + '/web/member/pay/tossSuccess.do', // 결제 성공 시 이동할 URL (백엔드 컨트롤러 생성 필요) | |
| 137 | - // paymentType=NORMAL | |
| 138 | - // &orderId=ORDER_1778047452906 | |
| 139 | - // &paymentKey=tmunj2026050615041659Zv9 | |
| 140 | - // &amount=55000 | |
| 141 | - failUrl: window.location.origin + '/web/member/pay/tossFail.do', // 결제 실패 시 이동할 URL (백엔드 컨트롤러 생성 필요) | |
| 142 | - customerEmail: $('#mberEmailAdres').val(), // 필요시 로그인한 사용자의 이메일 매핑 | |
| 143 | - customerName: $('#mberNm').val(), // 필요시 로그인한 사용자의 이름 매핑 | |
| 144 | - customerMobilePhone: $('#moblphonNo').val() | |
| 145 | - }).catch(function (error) { | |
| 146 | - if (error.code === 'USER_CANCEL') { | |
| 147 | - alert('결제를 취소하셨습니다.'); | |
| 148 | - } else { | |
| 149 | - alert(error.message); | |
| 150 | - } | |
| 151 | - }); | |
| 152 | - } | |
| 153 | - | |
| 154 | - | |
| 155 | - // 숫자 콤마 함수 | |
| 156 | - function numberWithCommas(x) { | |
| 157 | - return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); | |
| 158 | - } | |
| 159 | - | |
| 160 | - </script> | |
| 161 | - | |
| 162 | -</head> | |
| 163 | - | |
| 164 | -<body> | |
| 165 | - <div data-include-path="/publish/layout/_header.html"></div> | |
| 166 | - <!-- content 영역 --> | |
| 167 | - <div id="container" class="cont sub"> | |
| 168 | - <div class="inner"> | |
| 169 | - <!-- send top --> | |
| 170 | - <div class="send_top"> | |
| 171 | - <!-- tab button --> | |
| 172 | - <ul class="tabType4"> | |
| 173 | - <li class="tab"><button type="button" onclick="location.href='/publish/payment1.html'">요금안내/견적내기</button></li> | |
| 174 | - <li class="tab active"><button type="button" onclick="TabType5(this,'2');">결제하기</button></li> | |
| 175 | - <li class="tab"><button type="button" onclick="location.href='/publish/payment3.html'">요금 결제내역</button></li> | |
| 176 | - <li class="tab"><button type="button" onclick="location.href='/publish/payment4.html'">요금 사용내역</button></li> | |
| 177 | - <li class="tab"><button type="button" onclick="location.href='/publish/payment5.html'">세금계산서 발행 등록</button></li> | |
| 178 | - </ul> | |
| 179 | - <!--// tab button --> | |
| 180 | - <!-- 결제관리 - 결제하기 --> | |
| 181 | - <div class="serv_content charg_cont current" id="tab5_2"> | |
| 182 | - <div class="heading"> | |
| 183 | - <h2>결제하기</h2> | |
| 184 | - <button type="button" class="button info" onclick="infoListPop('payment2','792','250');">사용안내</button> | |
| 185 | - </div> | |
| 186 | - | |
| 187 | - <div> | |
| 188 | - <!-- 토스페이먼츠 결제수단 위젯 영역 --> | |
| 189 | - <div id="payment-method" class="toss_wrap"></div> | |
| 190 | - | |
| 191 | - <!-- 토스페이먼츠 이용약관 영역 --> | |
| 192 | - <div id="agreement" class="toss_wrap"></div> | |
| 193 | - | |
| 194 | - <b class="fs_18 fwMd">결제할 금액을 선택한 후 <span class="c_002c9a">[결제하기]</span> 버튼을 눌러주세요</b> | |
| 195 | - <div class="tb_wrap" style="margin:12px 0 0 0;"> | |
| 196 | - <table class="tType4"> | |
| 197 | - <colgroup> | |
| 198 | - <col style="width:60px;"/> | |
| 199 | - <col style="width:calc((100% - 60px)/4);"/> | |
| 200 | - <col style="width:calc((100% - 60px)/4);"/> | |
| 201 | - <col style="width:calc((100% - 60px)/4);"/> | |
| 202 | - <col style="width:calc((100% - 60px)/4);"/> | |
| 203 | - </colgroup> | |
| 204 | - <thead> | |
| 205 | - <tr> | |
| 206 | - <th>선택</th> | |
| 207 | - <th>결제금액</th> | |
| 208 | - <th>단문(15원)</th> | |
| 209 | - <th>장문(39원)</th> | |
| 210 | - <th>그림(70원)</th> | |
| 211 | - </tr> | |
| 212 | - </thead> | |
| 213 | - <tbody> | |
| 214 | - <tr> | |
| 215 | - <td> | |
| 216 | - <input type="checkbox" name="price"/> | |
| 217 | - </td> | |
| 218 | - <td>10,000</td> | |
| 219 | - <td><b class="c_002c9a fwBold">666</b>건</td> | |
| 220 | - <td><b class="c_002c9a fwBold">256</b>건</td> | |
| 221 | - <td><b class="c_002c9a fwBold">142</b>건</td> | |
| 222 | - </tr> | |
| 223 | - <tr> | |
| 224 | - <td> | |
| 225 | - <input type="checkbox" name="price"/> | |
| 226 | - </td> | |
| 227 | - <td>20,000</td> | |
| 228 | - <td><b class="c_002c9a fwBold">1,333</b>건</td> | |
| 229 | - <td><b class="c_002c9a fwBold">512</b>건</td> | |
| 230 | - <td><b class="c_002c9a fwBold">285</b>건</td> | |
| 231 | - </tr> | |
| 232 | - <tr> | |
| 233 | - <td> | |
| 234 | - <input type="checkbox" name="price"/> | |
| 235 | - </td> | |
| 236 | - <td>30,000</td> | |
| 237 | - <td><b class="c_002c9a fwBold">2,000</b>건</td> | |
| 238 | - <td><b class="c_002c9a fwBold">769</b>건</td> | |
| 239 | - <td><b class="c_002c9a fwBold">428</b>건</td> | |
| 240 | - </tr> | |
| 241 | - <tr> | |
| 242 | - <td> | |
| 243 | - <input type="checkbox" name="price"/> | |
| 244 | - </td> | |
| 245 | - <td>40,000</td> | |
| 246 | - <td><b class="c_002c9a fwBold">2,666</b>건</td> | |
| 247 | - <td><b class="c_002c9a fwBold">1,025</b>건</td> | |
| 248 | - <td><b class="c_002c9a fwBold">571</b>건</td> | |
| 249 | - </tr> | |
| 250 | - <tr> | |
| 251 | - <td> | |
| 252 | - <input type="checkbox" name="price" checked/> | |
| 253 | - </td> | |
| 254 | - <td>50,000</td> | |
| 255 | - <td><b class="c_002c9a fwBold">3,333</b>건</td> | |
| 256 | - <td><b class="c_002c9a fwBold">1,282</b>건</td> | |
| 257 | - <td><b class="c_002c9a fwBold">714</b>건</td> | |
| 258 | - </tr> | |
| 259 | - <tr> | |
| 260 | - <td> | |
| 261 | - <input type="checkbox" name="price"/> | |
| 262 | - </td> | |
| 263 | - <td>100,000</td> | |
| 264 | - <td><b class="c_002c9a fwBold">6,666</b>건</td> | |
| 265 | - <td><b class="c_002c9a fwBold">2,564</b>건</td> | |
| 266 | - <td><b class="c_002c9a fwBold">1,428</b>건</td> | |
| 267 | - </tr> | |
| 268 | - <tr> | |
| 269 | - <td> | |
| 270 | - <input type="checkbox" name="price"/> | |
| 271 | - </td> | |
| 272 | - <td>150,000</td> | |
| 273 | - <td><b class="c_002c9a fwBold">10,000</b>건</td> | |
| 274 | - <td><b class="c_002c9a fwBold">3,846</b>건</td> | |
| 275 | - <td><b class="c_002c9a fwBold">2,142</b>건</td> | |
| 276 | - </tr> | |
| 277 | - <tr> | |
| 278 | - <td> | |
| 279 | - <input type="checkbox" name="price"/> | |
| 280 | - </td> | |
| 281 | - <td>200,000</td> | |
| 282 | - <td><b class="c_002c9a fwBold">13,333</b>건</td> | |
| 283 | - <td><b class="c_002c9a fwBold">5,128</b>건</td> | |
| 284 | - <td><b class="c_002c9a fwBold">2,857</b>건</td> | |
| 285 | - </tr> | |
| 286 | - <tr> | |
| 287 | - <td> | |
| 288 | - <input type="checkbox" name="price"/> | |
| 289 | - </td> | |
| 290 | - <td>300,000</td> | |
| 291 | - <td><b class="c_002c9a fwBold">20,000</b>건</td> | |
| 292 | - <td><b class="c_002c9a fwBold">7,692</b>건</td> | |
| 293 | - <td><b class="c_002c9a fwBold">4,285</b>건</td> | |
| 294 | - </tr> | |
| 295 | - <tr> | |
| 296 | - <td> | |
| 297 | - <input type="checkbox" name="price"/> | |
| 298 | - </td> | |
| 299 | - <td>400,000</td> | |
| 300 | - <td><b class="c_002c9a fwBold">26,666</b>건</td> | |
| 301 | - <td><b class="c_002c9a fwBold">10,256</b>건</td> | |
| 302 | - <td><b class="c_002c9a fwBold">5,714</b>건</td> | |
| 303 | - </tr> | |
| 304 | - <tr> | |
| 305 | - <td> | |
| 306 | - <input type="checkbox" name="price"/> | |
| 307 | - </td> | |
| 308 | - <td>500,000</td> | |
| 309 | - <td><b class="c_002c9a fwBold">33,333</b>건</td> | |
| 310 | - <td><b class="c_002c9a fwBold">12,820</b>건</td> | |
| 311 | - <td><b class="c_002c9a fwBold">7,142</b>건</td> | |
| 312 | - </tr> | |
| 313 | - <tr> | |
| 314 | - <td> | |
| 315 | - <input type="checkbox" name="price"/> | |
| 316 | - </td> | |
| 317 | - <td>1,000,000</td> | |
| 318 | - <td><b class="c_002c9a fwBold">66,666</b>건</td> | |
| 319 | - <td><b class="c_002c9a fwBold">25,641</b>건</td> | |
| 320 | - <td><b class="c_002c9a fwBold">14,285</b>건</td> | |
| 321 | - </tr> | |
| 322 | - <tr> | |
| 323 | - <td> | |
| 324 | - <input type="checkbox" name="price"/> | |
| 325 | - </td> | |
| 326 | - <td>1,500,000</td> | |
| 327 | - <td><b class="c_002c9a fwBold">100,000</b>건</td> | |
| 328 | - <td><b class="c_002c9a fwBold">38,461</b>건</td> | |
| 329 | - <td><b class="c_002c9a fwBold">21,428</b>건</td> | |
| 330 | - </tr> | |
| 331 | - <tr> | |
| 332 | - <td> | |
| 333 | - <input type="checkbox" name="price"/> | |
| 334 | - </td> | |
| 335 | - <td>2,000,000</td> | |
| 336 | - <td><b class="c_002c9a fwBold">133,333</b>건</td> | |
| 337 | - <td><b class="c_002c9a fwBold">51,282</b>건</td> | |
| 338 | - <td><b class="c_002c9a fwBold">28,571</b>건</td> | |
| 339 | - </tr> | |
| 340 | - <tr> | |
| 341 | - <td> | |
| 342 | - <input type="checkbox" name="price"/> | |
| 343 | - </td> | |
| 344 | - <td>5,000,000</td> | |
| 345 | - <td><b class="c_002c9a fwBold">333,333</b>건</td> | |
| 346 | - <td><b class="c_002c9a fwBold">128,205</b>건</td> | |
| 347 | - <td><b class="c_002c9a fwBold">71,428</b>건</td> | |
| 348 | - </tr> | |
| 349 | - </tbody> | |
| 350 | - </table> | |
| 351 | - </div> | |
| 352 | - | |
| 353 | - <div class="amount_wrap" style="margin:20px 0 0 0;padding:12px 30px 12px 35px;border:3px solid #ddd;border-radius:5px;"> | |
| 354 | - <dl> | |
| 355 | - <dt>최종 결제금액 :</dt> | |
| 356 | - <dd> | |
| 357 | - <ul> | |
| 358 | - <li><strong id="supplyPriceStr">50,000</strong>원(결제금액)</li> | |
| 359 | - <li><span class="plus"></span><strong id="vatPriceStr">5,000</strong>원(부가세)</li> | |
| 360 | - <li class="total"><span class="equal"></span><strong class="c_e40000" id="lastPriceStr">55,000</strong>원(최종금액)</li> | |
| 361 | - </ul> | |
| 362 | - </dd> | |
| 363 | - </dl> | |
| 364 | - <button type="button" class="btn btnType fill primary" onclick="pgOpenerPopup(); return false;" style="width:210px;">결제하기</button> | |
| 365 | - </div> | |
| 366 | - | |
| 367 | - | |
| 368 | - </div> | |
| 369 | - | |
| 370 | - </div><!-- 결제관리 - 결제하기 --> | |
| 371 | - </div> | |
| 372 | - <!--// send top --> | |
| 373 | - </div> | |
| 374 | - </div> | |
| 375 | - <!--// content 영역 --> | |
| 376 | - <!-- footer 영역 --> | |
| 377 | - <div data-include-path="/publish/layout/_footer.html"></div> | |
| 378 | - <!--// footer 영역 --> | |
| 379 | -</body> | |
| 380 | - | |
| 381 | -</html>(No newline at end of file) |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?