이미지 출처 : sjy5386.log_아임포트 일반결제 연동하기
사용자가 결제를 진행 한 뒤에,
관리자가 결제를 환불 처리 할 수 있는 기능도 필요 할 것 같아서 추가!!!
물론 아임포트 관리자 페이지내에서도 결제 취소를 직접 하는것도 가능하지만
버튼 하나만 누르면 해당 결제건이 환불되게 처리 하는것도 가능하다.
일단 각 결제 정보를 확인 할 수 있는 페이지 내에 버튼을 생성 해 주고,
해당 버튼을 누르면 이벤트가 진행 되도록 처리 해 뒀다.
$('#paymentCancelBtn').on('click', function(){
var params = {};
params.MEMBER_ID = MEMBER_ID;
if(confirm('환불 처리를 진행하시겠습니까?')){
$.ajax({
url: '/admin/paymentCancel',
method: 'POST',
data: params,
success: function(data){
if(data.code == 'S00'){
alert('취소가 완료되었습니다.');
location.reload(true);
}else if(data.code == 'E99'){
alert(data.message);
}else{
alert('오류가 발생하였습니다.');
}
}
})
}
})
paymentCancelBtn
이라는 id의 버튼을 만들어주고,
해당 버튼 클릭 시 /admin/paymentCancel
라는 url로 이동하게 해줬다.
const paymentCancel = async (req, res, next) => {
const result = {};
try {
let params = {};
params.member_id = req.body.MEMBER_ID;
//MERCHANT_UID값을 조회하기 위한 쿼리
const paymentData = await oracle.selectPaymentInfo(params);
var PAYMENT_KEY = paymentData[0].MERCHANT_UID;
let cancelData = {};
cancelData.merchant_uid = PAYMENT_KEY;
// 인증 토큰 발급
const getToken = await axios({
url: 'https://api.iamport.kr/users/getToken',
method: 'post',
headers: {"Content-Type": "application/json"},
data: {
imp_key: imp_key 값,
imp_secret: imp_secret 값
}
});
const { access_token } = getToken.data.response;
// 결제 취소 진행
let cancelResult = await axios({
url: 'https://api.iamport.kr/payments/cancel',
method: 'post',
headers: { "Authorization": access_token },
data: cancelData
});
if(cancelResult.data.code == 0){ // 취소 성공
result.code = 'S00';
result.message = '정상';
}else{ // 취소 실패
result.code = 'E99';
result.message = cancelResult.data.message; // 실패 사유
}
return res.send(result);
} catch (e) {
console.error(e);
sendError(e);
return next(e);
}
};
결제 취소 구현 코드는 다음과 같다.
로직은 고유 결제 키 가져오기 -> 인증 토큰 발급 -> 결제 취소 진행
로 보면 된다!!!
일단 사용자의 고유 결제키를 가져와야 해당 키로 환불을 진행 할 수 있기 때문에,
DB에서 merchant_uid
값을 가져와줬다.
그리고 getToken
을 통해 인증 토큰을 가져와 준 후,
인증 토큰값과 고유 결제키를 이용해서 결제 취소 로직인 cancelResult
을 타도록 해 주면 된다.
여기서 cancelResult.data.code
가 0으로 떨어질 경우 결제 취소가 성공한거다 🧐
위 코드를 응용하면 꼭 관리자가 취소를 해 주는 것이 아닌,
사용자가 직접 환불 신청을 진행하는 기능도 구현이 가능 할 것 같다.
난 필요 없으니 패스 ~~~