소방안전원
소방안전원10mo ago

카드 결제 시 1초만에 자동취소 오류

결제를 한 고객들 중 간헐적으로 1초만에 자동으로 카드가 취소되는 경우가 발생합니다. 저희 내부 시스템에는 결제되어 있다고 확인이 되는데 실제로 카드취소가 되어있는 상황입니다. 답변 부탁드립니다.
12 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
유부장
유부장10mo ago
유플러스 결제 모듈 XPay 쓰고 있으신가요?
소방안전원
소방안전원OP10mo ago
네 맞습니다
유부장
유부장10mo ago
결제 완료 후, 가맹점 측에서 해당 결제건에 대한 처리 여부에 따라서 결제 취소를 바로 요청하는 Rollback 이라는 기능이 있는데요 서버 언어는 어떤 언어를 쓰고 있으신가요?
소방안전원
소방안전원OP10mo ago
자바입니다
유부장
유부장10mo ago
네, 그럼 아래와 같습니다. 1) payres.jsp 를 보시면, (5) DB에 인증요청 결과처리 라고 명시되어 있는 부분이 있을 겁니다. 여기에 Rollback 함수가 실행되는 조건에 대해 명시 해주셨을 겁니다. Rollback 취소가 일어난 이유는, 여기에 명시된 조건에 부합된것 때문이다, 라고 우선 이해해주시면 될것 같습니다. DB 처리가 늦어졌거나 등 사유가 있을텐데, 이 부분은 직접 확인해 주셔야 합니다. 2) lgdacom/conf/mall.conf 를 보시면 auto_rollback 이라는 기능이 있습니다. rollback 함수 실행을 원하지 않으시면, 이 값을 0 으로 변경 해주시면 됩니다.
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.
소방안전원
소방안전원OP10mo ago
확인해본 결과 1번의 경우에 저희가 Rollback 함수가 실행되어도 받을 수 있는 트랜잭션이 따로 없어서 ROLLBACK 값을 0으로 해놔도 기능이 의미가 없는 것 같더라구요. 그래서 저희는 결재완료 후 바로 취소 되었을 경우 특정 주문번호에 대해서 API를 통해 최종 결재가 완료 또는 취소 여부를 확인할 수 있는 API가 있는지 여쭤보고 싶고 있다면 관련 샘플 소스 등을 제공받아서 저희쪽에 적용할려고 합니다.
김차장
김차장10mo ago
// (5) DB에 인증요청 결과 처리
if( "0000".equals( xpay.m_szResCode ) ) {
// 통신상의 문제가 없을시
// 최종결제요청 결과 성공 DB처리(LGD_RESPCODE 값에 따라 결제가 성공인지, 실패인지 DB처리)
out.println("최종결제요청 성공, DB처리하시기 바랍니다.<br>");
out.println("<a href='http://43.201.59.164:8081/legacy-payments/sample_crossplatform.html'>처음으로 돌아가기</a><br>");

//최종결제요청 결과를 DB처리합니다. (결제성공 또는 실패 모두 DB처리 가능)
//상점내 DB에 어떠한 이유로 처리를 하지 못한경우 false로 변경해 주세요.
boolean isDBOK = true;
if( !isDBOK ) {
xpay.Rollback("상점 DB처리 실패로 인하여 Rollback 처리 [TID:" +xpay.Response("LGD_TID",0)+",MID:" + xpay.Response("LGD_MID",0)+",OID:"+xpay.Response("LGD_OID",0)+"]");
out.println( "TX Rollback Response_code = " + xpay.Response("LGD_RESPCODE",0) + "<br>");
out.println( "TX Rollback Response_msg = " + xpay.Response("LGD_RESPMSG",0) + "<p>");
if( "0000".equals( xpay.m_szResCode ) ) {
out.println("자동취소가 정상적으로 완료 되었습니다.<br>");
}else{
out.println("자동취소가 정상적으로 처리되지 않았습니다.<br>");
}
}
}else{
//통신상의 문제 발생(최종결제요청 결과 실패 DB처리)
out.println("최종결제요청 결과 실패, DB처리하시기 바랍니다.<br>");
}
// (5) DB에 인증요청 결과 처리
if( "0000".equals( xpay.m_szResCode ) ) {
// 통신상의 문제가 없을시
// 최종결제요청 결과 성공 DB처리(LGD_RESPCODE 값에 따라 결제가 성공인지, 실패인지 DB처리)
out.println("최종결제요청 성공, DB처리하시기 바랍니다.<br>");
out.println("<a href='http://43.201.59.164:8081/legacy-payments/sample_crossplatform.html'>처음으로 돌아가기</a><br>");

//최종결제요청 결과를 DB처리합니다. (결제성공 또는 실패 모두 DB처리 가능)
//상점내 DB에 어떠한 이유로 처리를 하지 못한경우 false로 변경해 주세요.
boolean isDBOK = true;
if( !isDBOK ) {
xpay.Rollback("상점 DB처리 실패로 인하여 Rollback 처리 [TID:" +xpay.Response("LGD_TID",0)+",MID:" + xpay.Response("LGD_MID",0)+",OID:"+xpay.Response("LGD_OID",0)+"]");
out.println( "TX Rollback Response_code = " + xpay.Response("LGD_RESPCODE",0) + "<br>");
out.println( "TX Rollback Response_msg = " + xpay.Response("LGD_RESPMSG",0) + "<p>");
if( "0000".equals( xpay.m_szResCode ) ) {
out.println("자동취소가 정상적으로 완료 되었습니다.<br>");
}else{
out.println("자동취소가 정상적으로 처리되지 않았습니다.<br>");
}
}
}else{
//통신상의 문제 발생(최종결제요청 결과 실패 DB처리)
out.println("최종결제요청 결과 실패, DB처리하시기 바랍니다.<br>");
}
샘플코드에서 롤백 수행되는 부분의 코드인데요
if( !isDBOK )
if( !isDBOK )
이 부분 if 절에서 수행하는 로직이 없다는 말씀일까요?> 문의주신 결제의 완료인지 취소인지는 아래 가이드로 확인하시면 됩니다 https://drive.google.com/drive/folders/1PaDbgryQBwMX5Xczv59P6Oh5woBDKXE-?usp=drive_link
김차장
김차장10mo ago
응답 필드의 내용들을 조합해서 최종상태를 확인하는 방식입니다
No description
소방안전원
소방안전원OP10mo ago
말씀하신 코드가 저희쪽에 주석처리되어 사용하지 않고 있더라구요. 예외처리 추가해서 사용하다가 나중에 또 문의사항 있으면 연락드리겠습니다. 감사합니다.
김차장
김차장10mo ago
넵, 공유 감사합니다. 🙏

Did you find this page helpful?