아임포트 결제 api 연동.....결제 정보 DB보낼때 NULL나오는 에러 처리
실제로 사용하니 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";
}
}