id 'org.springframework.boot' version '3.1.4'

 

나의 스프링 부트 버전이다. 3.1.4 버전으로 하면서 겪은 일은 풀어보자면

1. css폴더 안의 이미지와 관련된 주소를 모두 나의 프로젝트 폴더 구조에 맞춰서 변경해야한다.

처음에 툴바가 아니 나와서 보니깐 이 주소들 설정이 안맞아서 그런것이였다.

이건 다행이 그렇게 어렵지 않게 찾고 수정할 수 있었다...물론 일일이 확인하면서 해서 노가다 작업이였으나....이정도야...감사하다..ㅋㅋ

url주소를 모두 변경해줘야 한다.

2. 사진을 올려야 하는데.....이게 문제이다.

<% 
String return1="";
String return2="";
String return3="";
//변경 title 태그에는 원본 파일명을 넣어주어야 하므로
String name = "";
if (ServletFileUpload.isMultipartContent(request)){
	ServletFileUpload uploadHandler = new ServletFileUpload(new DiskFileItemFactory());
	uploadHandler.setHeaderEncoding("UTF-8");
	List<FileItem> items = uploadHandler.parseRequest(request);

원 코드 인데...request부분부터 문제였다....빨간줄이 뜨는데...처음엔 뭐가 문제지????????

The method parseRequest(javax.servlet.http.HttpServletRequest) in the type ServletFileUpload is not applicable for the arguments (jakarta.servlet.http.HttpServletRequest)
에러가 남..

하루정도 형변환도 했다가 import도 다시 했다가 설정 넣었다가 지웠다가 해보다가 안되서 포기하고 집에 누웠는데......갑자기 생각났다..스프링부트는 javax.servlet.http.HttpServletRequest 가 안된다.....그래서 jakarta.servlet.http.HttpServletRequest 다 변경해줬느데 그부분은 까맣게 잊고 있었다...다음날은 그럼 어떻게 이걸로 변경해야하나를 고민했다...영어 잘 못하고 눈치만 늘은 내가 겨우 찾은 것은 apache.fileupload2로  import해야 한다는것....

https://mvnrepository.com/artifact/org.apache.commons/commons-fileupload2-core/2.0.0-M1

    implementation group: 'org.apache.commons', name: 'commons-fileupload2-jakarta', version: '2.0.0-M1'
    implementation group: 'commons-io', name: 'commons-io', version: '2.13.0'
    implementation group: 'org.apache.commons', name: 'commons-fileupload2-core', version: '2.0.0-M1'

gradle설정도 변경해줘야 한다.

 

그러고 나니깐......

new DiskFileItemFactory

가 안되는것이다......뭐지??????또 apache.fileupload 버전을 설치 했다가 안했다가 쇼를 하다가 또 겨우 찾은공식문서....사실 잘 안봤는데....선배님들이 공식 문서계속 들어가시는게 조금씪 이해되고 있다...블로거를 다 믿으면 안된다는거..ㅋㅋㅋ

https://javadoc.io/doc/org.apache.commons/commons-fileupload2-core/latest/org/apache/commons/fileupload2/core/DiskFileItemFactory.Builder.html

생성할때 전처럼 간단히가 아니라 이렇게 써야한다고 예시되어 있었다.......나를 칭찬하고 싶은 순간...ㅋㅋㅋ

DiskFileItemFactory factory = new DiskFileItemFactory.Builder().setPath("\\resources\\upLoad").setBufferSize(10240).get();

 

요놈은 파일은 읽어들이고 잠시 보관해야 할 곳을 지정하는 녀석이라서 이렇게 만들어주었는데...사실은 AI질문한거랑 확인한 거랑 짬봉해서 넣은것이다......

.setSizeThreshold(10240) // Set the size threshold to 10 KB

하길래...그냥 맞춰서 넣었다.

 

3. 그다음 에러....본문에 이미지 파일을 붙여 넣어야 하는데...계속 에러인 것이다...

 

a.lang.IllegalArgumentException: Invalid character found in the request target [/resources/smartEditor/photo_uploader/popup/callback.html?callback_func=tmpFrame_4468_func&bNewLine=true&sFileName=taling3-search.png&sFileURL=`/resources/upLoad/202311131040129bae9bf3-21f9-44b7-82a9-2e3c7d97efdd.png ]. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:482) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:264) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.13.jar:10.1.13]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]  

그냥 검색부터 했더니 톰캣에서 특수문자를 못읽는다고 URLEncoder.encode  

관련 작업을 하라고 해서 한참을 이것저것  했으나 별다른 반응이 없는것이다...........브라우저 콘솔까지 뒤져서 한참을 보고 알았다... search.png&sFileURL=`/resources/upLoad/202311131040129bae9bf3-21f9-44b7-82a9- 이부분.....

` 요것이 들어가 있었다.....타이밍 실수였던것이다.....욕나옴....

 

결론은 스마트에디터의 코드는 왠만하면 건들이지 마세요~~~~^^

처음에 request가 안될때 정신줄 놓고 여기저기 만졌더니만 결국은 고생했다...

이제 DB저장과  화면 호출관련된 작업은 프로젝트에 맞게끔 진행하면 된다....

 

제목에서 스프링부트라고 하고 fileupload 관련 2가 안붙으면 안된다는 거..........결론입니다.~~~^^

1. html부분 : 구매할 구독권과 포인트를 나눠서 진행

<main>        
        <section>
        <input type="hidden" value="${sessionScope.loginMember}">
			<div id="ssTicket">
				<table>
					<tr>
						<td colspan="3" class="payName">구독권</td>
					</tr>
					<tr>
						<td class="payOne"><label for="seasonticket"><input
								type="radio" id="seasonticket" name="payName" value="10000"></label></td>
						<td class="payTwo" name="seasonticket"><label
							for="seasonticket">한달이용권</label></td>
						<td class="payTwo" value="10000"><label
							for="seasonticket">10,000원</label></td>
					</tr>
				</table>
			</div>

			<div id="peanetCharge">
				<table>			
					<tr>
						<td colspan="3" class="payName">땅콩충전</td>
					</tr>
					<tr>

						<td class="payOne"><label for="peanutpoint100"><input
								type="radio" id="peanutpoint100" name="payName" value="10000"></label></td>
						<td class="payTwo" name="peanetpoint"><label
							for="peanutpoint100">100 땅콩</label></td>
						<td class="payTwo"><label for="peanutpoint100">10,000원</label></td>

					</tr>
					<tr>

						<td class="payOne"><label for="peanutpoint200"><input
								type="radio" id="peanutpoint200" name="payName" value="20000"></label></td>
						<td class="payTwo" name="peanetpoint"><label
							for="peanutpoint200">200 땅콩</label></td>
						<td class="payTwo"><label for="peanutpoint200">20,000원</label></td>

					</tr>
					<tr>
						<td class="payOne"><label for="peanutpoint300"><input
								type="radio" id="peanutpoint300" name="payName" value="30000"></label></td>
						<td class="payTwo" name="peanetpoint"><label
							for="peanutpoint300">300 땅콩</label></td>
						<td class="payTwo"><label for="peanutpoint300">30,000원</label></td>
					</tr>

				</table>

			</div>

			<div id="Confirmation"><button id="ordercheck">주문확정</button></div>
            <div id="history">
                <table>                  
                    <tr>
                        <td colspan="2" class="payName">주문내역</td>
                    </tr>                    
                    <tr>
                        <td class="history1"> 주문번호 :</td>
                        <td class="history2" id="oderno"></td>
                    </tr>
                    <tr>
                        <td class="history1">구매내역 : </td>
                        <td class="history2" id="contents"></td>
                    </tr>
                    <tr>
                        <td class="history1">구매금액 : </td>
                        <td class="history2" id="paymoney" value=""></td>
                    </tr>
              
                </table>     
            
            
                <div id="listCheck">
                    <p>주문내용을 확인하셨습니까? </p>
                    <p>구독권은 구매후 취소불가합니다.</p>
                    <p>땅콩은 구매후 15일 안에 사용하지 않을 경우만 </p>
                    <p>취소가능하며 잔여땅콩은 환불되지 않습니다.</p>
                    <p>위의 내용에 동의하십니까?<input type="checkbox" value="" id="payCheck"></p> 
                </div>
            </div>
	        <div id="pay"><button onclick="requestPay()">결제진행</button></div>
        </section>
    </main>

실수 1: label은 id와 for가 연결되는 것인데 각각 다 걸어야 한다....div 통으로 걸었더니 안먹힌다.

실수2 : radio는 name명이 같이것끼리만 가능하다....name이 다르니깐 둘다 선택된다.

 

여기서 부터 스트립트 단!!!!!

 var orderName='';  //결제 분류명
	    var payMoney='';  // 결제할 값
	    var d=new Date();
	    var dm='';         // 년월일 합칠 변수
	    var orderNo='';   //주문번호 분류명과 날짜 합친것
	    var orderContents='' // 주문내용
	    var merchant_uid=''; //결제 주문번호 넣을 곳
	    var memberId= '${sessionScope.loginMember.memberId}';
	    var mEmail= '${sessionScope.loginMember.mEmail}';  
	    
	    $('#seasonticket').on('click', function(){
	    	if(!${empty sessionScope.lastDate}){
				alert("구독권 만료후 구매 부탁드립니다. 이용해 주셔서 감사합니다.");
				$('#seasonticket').prop("checked",false);
			};
	    })

로그인한 정보 가져 오기....session은 정말 편리한것이네.~~~~~~~ controller에서 안보내져도 읽혀진다....그러라고 만든거니깐...ㅋㅋㅋ

구독권만료기간이 남았는데 또 클릭할것을 대비해서 분류!!!!! 

prop으로 체크 값을 해제하기..........사용자입장에서 생각하면 이것저것 자꾸 떠오르게 된다.

$('#ordercheck').on('click', function(){
	
		    if ($('#history').css('display')=='none'){
			    $('#ordercheck').css('background-color','red');
			    $('#ordercheck').css('color','#fff');
			    $('#ordercheck').html('주문취소');    
			    $('#history').css('display','block');
			    $('#pay').css('display','block');
			    orderList(); 
			    
			  } else{           
			    location.href='/pay/start.kh';
			  }	
				
	})

주문확정을 하게 되면 주문정보를 불러와야하니깐 숨겨놨던 div를 활성화시키는것...

toggle로도 해봤는데 부자연스럽고 의도처럼 먹히지 않고 되다 말다 하는 느낌이다....

확실히....block으로 각각 모두 부여하니깐 의도되로 됨....더 정확한 방법이 있겠지만....오늘은 이만큼만...

선택한 정보를 결제테이블에 db에 저장하여 그값을 가져오기....

function orderList(){
	    
	    orderName=$('input[type="radio"]:checked').parent().parent().next().attr('name');  //결제 분류명
	    payMoney=$('input[type="radio"]:checked').val();  // 결제할 값   	    
	    dm=String(d.getFullYear());
	    dm+=String(d.getMonth()+1);
	    dm+=String(d.getDate());
	    orderNo=orderName+"-"+dm;                        //주문번호 분류명과 날짜 합친것
	    orderContents=$('input[type="radio"]:checked').parent().parent().next().text()+"구매"; // 주문내용
	    
	    $.ajax({
	    	url:'/pay/orderIN.kh',
	    	type:'post',
	    	dataType:'json',
	    	data:{
	    		'orderNo':orderNo,
	    		'memberId':memberId,
	    		'orderContents':orderContents,	    		
	    		'payMoney':payMoney
	    	},
	    	success:function(pay){          //주문번호 받아오기
	    		$('#oderno').html(pay.orderNo);
	    		$('#contents').html(pay.orderContents);
	    		$('#paymoney').html(pay.pay+'원');
	    		$('#paymoney').val(pay.pay);
	    	
	    	},
	    	error : function(data){
	    		console.log(data);
	    		alert('주문실패: 잠시후 다시 부탁드립니다!'+data.statusText);
	    	}
	    })
	    
	}
// 주문 번호 만들어서 보내기
	@ResponseBody
	@RequestMapping(value = "/pay/orderIN.kh", produces = "application/json;charset=utf-8", method=RequestMethod.POST)
	public String orderIn(String orderNo,String payMoney,String memberId, String orderContents) {			 
		Pay pay=new Pay();
		pay.setOrderNo(orderNo);
		pay.setPay(Integer.valueOf(payMoney));
		pay.setMemberId(memberId);		
		pay.setOrderContents(orderContents);
		int result=pService.orderin(pay);
		
	
		if(result>0) {
			pay=pService.orderNoOne(pay);			
			return new Gson().toJson(pay);
			
		}else {
			JSONObject json=new JSONObject();
			json.put("error","error");
			return json.toJSONString();
		}	
		
	}

controller 까지 다녀왔다..... 드뎌 결제 준비 된것이다...

다시보니 새록하다...앞서 올린 headers: { "Content-Type": "application/json" }, 오류.......나의 2시간.!!!!!!

 

	var IMP = window.IMP; 
	IMP.init('------------');
	
	function requestPay() {
		
	if ($('#payCheck').is(':checked')) {
			IMP.request_pay({
				pg : 'html5_inicis',
				pay_method : 'card',
				merchant_uid : merchant_uid, //주문번호 
				name : orderContents, //주문내용
				amount : 1000, //주문금액
				buyer_email : mEmail, // 고객이메일
				buyer_name : memberId, // 고객id
				buyer_tel : '01011112222', //고객연락처
				buyer_addr : '서울특별시 강남구 삼성동', //고객주소
				buyer_postcode : '123-456'
			}, function(rsp) { // callback
				if (rsp.success) { // 결제 성공 시: 결제 승인 또는 가상계좌 발급에 성공한 경우
					// jQuery로 HTTP 요청
					$.ajax({
						url : '/pay/success.kh', // 예: https://www.myservice.com/payments/complete
						type : 'POST',
						// headers: { 'Content-Type': 'application/json' },
						data : {
							'imp_uid' : rsp.imp_uid,//결제번호
							'orderNo' : $('#oderno').html(),
							'memberId' : memberId,
							'pay' : $('#paymoney').val()
						},
						success : function(result) {
							alert('결제 성공');
							location.href = '/';
						},
						error : function(e) {
							console.log(e)
							alert('에러: 관리자에게 문의하세요');
						}
					}).done(function(data) {
						//가맹점 서버 결제 aip성공시 로직
						switch (data.status) {
						case 'vbankIssued':
							// 가상계좌 발급 시 로직
							break;
						case 'success':
							// 결제 성공 시 로직
							break;
						}
					});
				} else {
					alert('결제에 실패하였습니다. 에러 내용: ' + rsp.error_msg);
					location.href = '/pay/start.kh';
				}
			});
			
		} else {
			alert("동의 체크 후 결제 가능합니다.");
		}

ajax으로 db보내는건 내가 하는거고 done까지는 아직 필요 없을것 같아 멈췄다.

마지막 controller에서 결제내용을 db로 보내기 해본다.

	// API결제 성공시 데이터 DB전달
	@ResponseBody
	@RequestMapping(value="/pay/success.kh", method=RequestMethod.POST)
	public String paySussess(String orderNo, String memberId, Integer pay, String imp_uid, Pay payApi) {
		String[] arr = orderNo.split("-");
		String table = arr[0];
		payApi.setImp_uid(imp_uid);
		payApi.setMemberId(memberId);
		payApi.setOrderNo(orderNo);
		int result = pService.orderSuccess(payApi);
		int p_t_input;
		int m_st_YN=1;
		if (result > 0) {
			if (table.equals("seasonticket")) {
				SeasonTicket st = new SeasonTicket();
				st.setOrderNo(orderNo);
				st.setMemberId(memberId);
				p_t_input = pService.seasonticketInput(st);
				m_st_YN = pService.memberStChange(memberId);
				
			} else {
				PeanutPoint pp = new PeanutPoint();
				pp.setMemberId(memberId);
				pp.setOrderNo(orderNo);
				pp.setPeanutPoint(pay / 100);
				p_t_input = pService.peanutTableInput(pp);
			}

		} else {
			return "failure";
		}

		if ((p_t_input > 0) && (m_st_YN > 0) ) {
			return "success";
		} else {
			return "failure";
		}
	}

땅콩포인트는 땅콩으로 

구독권은 구독권으로 나눠서 보내는거.............

매핑 잘 쳐야 한다......오타와의 전쟁.........!!

 

이걸 또 잘 걸러서 member클래스랑 연결하기......

결제api가 쉬운거지.....결제 자체가 쉬운것은 아니다.....

역시나 돈이 연결되었는데 간단할리가 없다......이건 인생진리!!!!

실제로 사용하니  api의 연동은 간단한것은 사실이다.

하지만 이몸은 일단 결제창이 뜨는데 하루~~~~~~

결제창이 뜨고 나서  어떻게 처리 해야하는지 하루......

그걸 다시 DB연동과 화면에 출력하는데 까지 하루.............어쩌구 저쩌구 주말쉬고....

그러다 보니 일주일 후딱이다...

 

그동안 아임포트 결제 진행한것을 정리한다...........ㅠㅠ

 

개발 가이드가 있어서 편하다...... 그대로 따라하면된다.

1. 아임포트 회원가입하기....부터.....그건 알아서들......^^

인터넷 검색했을때 관리자 체험하기가 이 따로 있다고 해서 그런줄 알았떠니....아무리 검색하고 찾아봐도 없다.

이거 하루 걸리고 알아낸 결론이다...미련퉁이!!!!

그런거 없다... 회원가입하고 2차 인증한다.

여기는 2차 인증으로 구글 OTP방식을 쓴다.....처음해본거라....엄청 낯설었다.

 

결제 연동을 하면 그렇게나 검색되던 관리자 체험하기가 나오나 했더니 아니다.

어드민 콘솔이 이거다..........2차로 otp도 관리자 계정이 있으니깐 참고!!

인터넷에서 검색되더 이런 내역이 뜨는데....여기서 할껀 없다....시스템 설정에서 관리자계정 안넘어간다....

주소가 docs.iamport.kr 이다....

가만히 있으면 그냥 클릭해도 나오는데 필요하거나 잘모르면 아무리 해도 안보이는게 이런거다....

설명해주는 페이지 내용이 쬐매 다르다....

난 이페이지가 나으서....ㅁ^^

화면 들어가면 step1, 2, 3, 4까지 하면 왠만 한거 됩니다.

1.2번까지만 해도 결제창...새빨간 창이 뜨1뜨1뜹니다.......감격!!!!!!!!!!정말감격.......하루를 싸이트에다 바치면 이렇게 됩니다.

내가 만든 프로그램은......포인트( 우린 땅콩이라 불렀다) 구매를 위해 결제화면에서 상품 클릭하고

주문번호 만들어서 그걸 결제데이터에 보내 결제 한 다음

결제 데이터를 db로 보내는 것이다.

<main>        
        <section>
        <input type="hidden" value="${sessionScope.loginMember}">
            <div id="ssTicket">
                <table>
                    <tr>
                        <td colspan="3" class="payName">구독권</td>
                    </tr> 
                    <tr>
                        <td class="payOne"><input type="radio" name="seasonticket" value="10000"></td>
                        <td class="payTwo" >한달이용권</td>
                        <td class="payTwo" name="pay" value="10000">10,000원</td>
                    </tr>
              
                </table>
            </div>
            
            <div id="peanetCharge">
                <table>
                    <tr>
                        <td colspan="3" class="payName">땅콩충전</td>
                    </tr>
                    <tr>
                        <td class="payOne"><input type="radio" name="peanetpoint" value="10000"></td>
                        <td class="payTwo" >100 땅콩</td>
                        <td class="payTwo" >10,000원</td>
                    </tr>
                    <tr>
                        <td class="payOne"><input type="radio" name="peanetpoint" value="20000"></td>
                        <td class="payTwo" >200 땅콩</td>
                        <td class="payTwo"> 20,000원</td>
                    </tr>
                    <tr>
                        <td class="payOne"><input type="radio" name="peanetpoint" value="30000"></td>
                        <td class="payTwo" >300 땅콩</td>
                        <td class="payTwo" >30,000원</td>
                    </tr>
              
                </table>             
                
            </div>

            <div id="Confirmation"><button id="ordercheck">주문확정</button></div>
            <div id="history">
                <table>                  
                    <tr>
                        <td colspan="2" class="payName">주문내역</td>
                    </tr>                    
                    <tr>
                        <td class="history1"> 주문번호 :</td>
                        <td class="history2" id="oderno"></td>
                    </tr>
                    <tr>
                        <td class="history1">구매내역 : </td>
                        <td class="history2" id="contents"></td>
                    </tr>
                    <tr>
                        <td class="history1">구매금액 : </td>
                        <td class="history2" id="paymoney" value=""></td>
                    </tr>
              
                </table>     
            
            
                <div id="orderCheck">
                    <p>주문내용을 확인하셨습니까? </p>
                    <p>구독권은 구매후 취소불가합니다.</p>
                    <p>땅콩은 구매후 15일 안에 사용하지 않을 경우만 </p>
                    <p>취소가능하며 잔여땅콩은 환불되지 않습니다.</p>
                    <p>위의 내용에 동의하십니까?<input type="checkbox" value="" id="payCheck"></p> 
                </div>
            </div>
	        <div id="pay"><button onclick="requestPay()">결제진행</button></div>
        </section>
    </main>

요건 jsp화면

<script type="text/javascript">

	    var orderName="";  //결제 분류명
	    var payMoney="";  // 결제할 값
	    var d=new Date();
	    var dm="";         // 년월일 합칠 변수
	    var orderNo="";   //주문번호 분류명과 날짜 합친것
	    var orderContents="" // 주문내용
	    var merchant_uid=""; //결제 주문번호 넣을 곳
	    var memberId= "${sessionScope.loginMember.memberId}";
	    var mEmail= "${sessionScope.loginMember.mEmail}";  
	    
	$("#ordercheck").on("click", function(){
	    if ($("#history").css("display","none")){
		    $("#ordercheck").css("background-color","red");
		    $("#ordercheck").css("color","#fff");
		    $("#ordercheck").html("주문취소");    
		    $("#history").show();
		    $("#pay").show();
		    
		  } else{           
		    $("#ordercheck").css("background-color","#fff9b0");
		    $("#ordercheck").css("color","black");
		    $("#ordercheck").html("주문확정"); 
		    $("#history").hide();   
		    $("#pay").hide();  
		   }
	    
	    orderName=$('input[type="radio"]:checked').attr('name');  //결제 분류명
	    payMoney=$('input[type="radio"]:checked').val();  // 결제할 값   	    
	    dm=String(d.getFullYear());
	    dm+=String(d.getMonth()+1);
	    dm+=String(d.getDate());
	    orderNo=orderName+"-"+dm;                        //주문번호 분류명과 날짜 합친것
	    orderContents=$('input[type="radio"]:checked').parent().next().text()+"구매"; // 주문내용
	    
	    $.ajax({
	    	url:"/pay/orderIN.kh",
	    	type:"post",
	    	dataType:"json",
	    	data:{
	    		"orderNo":orderNo,
	    		"memberId":memberId,
	    		"orderContents":orderContents,	    		
	    		"payMoney":payMoney
	    	},
	    	success:function(pay){          //주문번호 받아오기
	    		$("#oderno").html(pay.orderNo);
	    		$("#contents").html(pay.orderContents);
	    		$("#paymoney").html(pay.pay+"원");
	    		$("#paymoney").val(pay.pay);
	    	
	    	},
	    	error : function(data){
	    		console.log(data);
	    		alert("주문실패: 잠시후 다시 부탁드립니다!"+data.statusText);
	    	}
	    })
	    
	})
	// -------------------------------------*********주문 확정 후 번호 받아 오기
	var IMP = window.IMP; 
	IMP.init("가맹점 식별코드 그대로 넣으면 됩니다.");
	
	function requestPay() {
	    IMP.request_pay({
	        pg : 'html5_inicis',
	        pay_method : 'card',
	        merchant_uid: merchant_uid,   //주문번호 
	        name : orderContents,             //주문내용
	        amount : 1000,                 //주문금액
	        buyer_email :mEmail,       // 고객이메일
	        buyer_name : memberId,         // 고객id
	        buyer_tel : "01011112222",        //고객연락처
	        buyer_addr : '서울특별시 강남구 삼성동', //고객주소
	        buyer_postcode : '123-456'
	    }, function (rsp) { // callback
	        if (rsp.success) {                // 결제 성공 시: 결제 승인 또는 가상계좌 발급에 성공한 경우
	        	// jQuery로 HTTP 요청
	            $.ajax({
	                url: "/pay/success.kh", // 예: 서버로 보내는 url이다....내경우는 controller연결할 url
	                method: "POST",
	                headers: { "Content-Type": "application/json" },
	                data: {
	                    "imp_uid": rsp.imp_uid,//결제번호
	                    "orderNo": $("#oderno").html(),	                    
              		    "memberId":memberId,
              		    "pay": $("#paymoney").val()	                  		  
              		  },              		 
              		 success:function(result){
               		  alert("result");
               		  location.href="/ej.kh";
               		 },
	               	 error:function(e){
	               		 console.log(e)
	           		  alert("에러: 관리자에게 문의하세요");
	           	  	 }
	            }).done(function (data) {  
	            	//가맹점 서버 결제 aip성공시 로직
	            	switch(data.status) {
		            case  "vbankIssued":
		              // 가상계좌 발급 시 로직
		              break;
		            case "success":
		              // 결제 성공 시 로직
		              break;
		          }
	            });
	        } else {
	        	alert("결제에 실패하였습니다. 에러 내용: " +  rsp.error_msg); 
	        	location.href="/pay/start.kh";
	        }
	    });
                          
	}

앞서말한 step1,2,3,4를 합친다음 차이점을 보면 내꺼와 공통것을 알게되니깐....

사이트를 열시미 째려보심 됩니다...^^

여기서 문제점.......

controller에서 json 데이터 값을 못읽는 겁니다...

배우데로 기재했고.....오류날것도 없는데....왜 null이냐고!!!!!!!!!!!!!!!!!!!!!!!!

한시간 이상을 소비해서 JSON.stringity()도 넣보고.

ResponseBody 있나 없나 확인도 해보고....,mapper 어디 잘못됐나....보고 또 보고 해도 안되는것이다.

혹시나 해서 안배웠던 headers: { "Content-Type": "application/json" }, 주석처리 해봣다.......

된다.....이런 쓰...........벌......왜되는지는 모르겠다....

참고로 jsp에서 서버로 데이터를 보낼때 json으로 보내겠다는 것이다......json맞는데...

아무래도 아임포트는 어떤 환경에도 되어야 하니깐 공통적으로 기재해서 그런게 아닌가 싶다.

 headers: { "Content-Type": "application/json" }, :주석처리하고

method : "post"는 type : "post"   ==이건 안해도 post방식으로 받는다..

headers 삭제하니깐 null에서 정상적으로 데이터를 받아왔다....

참고 하시라고 올린다^^

 

 

	// API결제 성공시 데이터 DB전달
	@ResponseBody
	@RequestMapping(value="/pay/success.kh", method=RequestMethod.POST)
	public String paySussess(String orderNo, String memberId, Integer pay,String imp_uid
			,Pay payApi){
		String[] arr=orderNo.split("-");
		String table=arr[0];
		payApi.setImp_uid(imp_uid);
		payApi.setMemberId(memberId);
		payApi.setOrderNo(orderNo);
		int result=pService.orderSuccess(payApi);
		int p_t_input ;
		if(result>0) {
			if(table.equals("seasonticket")) {
					SeasonTicket st=new SeasonTicket();
					st.setOrderNo(orderNo);
					st.setMemberId(memberId);
					
				p_t_input = pService.seasonticketInput(st);
			}else {
				PeanutPoint pp=new PeanutPoint();
				pp.setMemberId(memberId);
				pp.setOrderNo(orderNo);
				pp.setPeanutPoint(pay/100);				
				p_t_input = pService.peanutTableInput(pp);
			}			
			
		}else {
			return "failure";
		}
		
		if(p_t_input>0) {
			return "success";
		}else {
			return "failure";
		}
	}

 

root-context,xml에 적었던걸 삭제 한다.

어노테이션 @Component와 @Aspect를 붙이고......

Id로 썼던 allPointCut 메소드를 만들어서 @Pointcut태그를 붙인다.

실행해야할 메소드의 어노테이션은 Advice를 정의했던 그 태그로 붙이고 id 메소드 명을 붙여주면 간단히 실행된다.

advice가 around였으니깐 어노테이션만 변경하니 간단히 실행된다.

 

+ Recent posts