결제 승인 후 가맹점 정의 코드 실행 중 오류 발생 시 자동 결제 취소 방법에 대해 문의드립니다.
안녕하세요. PHP 7.* 환경에서 토스페이먼츠 결제 모듈을 연동하여 사용중에 있습니다.
(결제위젯, 브랜드페이 사용 중 / 자동결제(빌링) 추후 연동 예정)
이전 XPay 모듈에서는 결제 승인 후 가맹점 정의 코드 실행 중 오류 발생 시
Tx 기능
이 제공된 것으로 알고 있지만
토스페이먼츠 모듈에서는 직접 결제 취소 API를 호출
해야되는 것 같더라구요.
가맹점에서는 고객이 마이페이지를 통해 주문건 취소 신청
을 하는 경우 환불 계좌 정보를 추가로 받고 있습니다.
이후 업무 담당자는 관리자 페이지에서 해당 주문건에 대해 결제 취소 시
고객이 입력한 환불 계좌 정보를 결제 취소 API 호출 요청 데이터에 포함시켜 취소 처리를 진행하고 있습니다.
다만, 결제 승인 후 기타 작업 처리 중 오류가 발생한 상황에서 개발자가 정의한 자동 결제 취소 로직이 호출되는 상황에는
환불 계좌정보
가 없을 경우가 있을 것 같은데요. 이런 경우 취소가 불가능한 것인지 문의드립니다.

9 Replies
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) :
- 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요.
* 주말/공휴일에는 답변이 늦을 수 있어요.
환불계좌 명시는 가상계좌 거래에만 국한됩니다. 취소API를 호출하시는 시점이 입금이후라면 고객에게 환불계좌를 받는 UI를 노출시킨 후 취소API를 호출하시면 되구요
카드결제의 경우에는 환불계좌정보가 없이 카드취소로 호출하시면 되는데, 카드결제 취소는 실시간으로 응답을 받고 가맹점 작업중에 발생한 케이스인데요 가상계좌는 실시간으로 내려가는 응답이 고객이 입금할 계좌발급을 응답받으실때라서 결제에 대한 핸들링을 하는 시점이 다릅니다.
제가 가상계좌 결제 시 플로우를 잘못 이해 하고 있는 것일까요..?
예를 들어, 결제위젯을 사용한 가상계좌 결제 시에도 successUrl은 호출(가상계좌 발급 후 고객 입금에 의한 Webhook 호출과는 별개)되는 것으로 알고 있고,
successUrl이 정상적으로 호출되었다면 고객이 입급할 가상계좌가 발급될 것으로 예상이 되는데요.
(* 가맹점 successUrl에서는
결제 승인 API
까지 호출합니다.)
만에 하나 successUrl에서 결제 승인 API까지 정상적으로 처리되었지만 이후 가맹점 정의 로직 수행 중 오류가 발생했다면
고객에게 발급되어버린 입급할 가상계좌
를 무효화(?) 시키고자 합니다.
그 계좌를 통해 고객은 입금해버릴 수가 있기 때문입니다.이해하고 계신 내용이 맞습니다. 환불계좌가 필요한 내용을 안내드렸구요.
가상계좌 입금전 취소는 결제 취소 API를 호출해주시면 됩니다. 이때에는 환불계좌가 필요하지 않습니다
이 내용때문에 문의주신것 같네요. 입금전이라면 당연히 환불계좌가 필요하지 않은것이 맞는데요. 제가 테스트 한번 해보고 다시 말씀드릴게요

네, 맞습니다! 가상계좌 결제건에 대한 결제 취소 시에는
환불계좌 정보(refundReceiveAccount:object)
가 필수로 가이드 문서에서 확인을 했었거든요.
(입금 전/후 구분에 대한 내용이 있었는지는... 😿 )
테스트 후 추가 답변 부탁드리겠습니다. 감사합니다!잘 됩니다
취소요청
curl --request POST \
--url https://api.tosspayments.com/v1/payments/PoxJmeD4pZORzdMaqN3wKk7Np49aLy35AkYXQGwyEb21W9v7/cancel \
--header 'Authorization: Basic ${apiKey}' \
--header 'Content-Type: application/json' \
--data '{"cancelReason":"고객 변심"}'
응답
{"mId":"상점아이디","lastTransactionKey":"5D476073C81DCDCBCFF8501061F69DCE","paymentKey":"PoxJmeD4pZORzdMaqN3wKk7Np49aLy35AkYXQGwyEb21W9v7","orderId":"sample-1684820528955","orderName":"커피1잔","taxExemptionAmount":0,"status":"CANCELED","requestedAt":"2023-05-23T14:42:15+09:00","approvedAt":null,"useEscrow":false,"cultureExpense":false,"card":null,"virtualAccount":{"accountNumber":"79004639886666","accountType":"일반","bankCode":"11","customerName":"김토스","dueDate":"2023-05-23T14:44:15+09:00","expired":false,"settlementStatus":"INCOMPLETED","refundStatus":"NONE","refundReceiveAccount":null},"transfer":null,"mobilePhone":null,"giftCertificate":null,"cashReceipt":null,"cashReceipts":null,"discount":null,"cancels":[{"transactionKey":"5D476073C81DCDCBCFF8501061F69DCE","cancelReason":"고객 변심","taxExemptionAmount":0,"canceledAt":"2023-05-23T14:44:16+09:00","easyPayDiscountAmount":0,"partialCancelId":null,"receiptKey":null,"cancelAmount":200,"taxFreeAmount":0,"refundableAmount":0}],"secret":null,"type":"NORMAL","easyPay":null,"country":"KR","failure":null,"isPartialCancelable":true,"receipt":{"url":"https://pgweb.tosspayments.com:9091/MpFlowCtrl?eventDiv1=search&eventDiv2=getCasReceiptList&trxid=sb_in20230523144229D4W91&SYSTEM=NEW"},"checkout":{"url":"https://api.tosspayments.com/v1/payments/PoxJmeD4pZORzdMaqN3wKk7Np49aLy35AkYXQGwyEb21W9v7/checkout"},"pgTransactionId":"sb_in20230523144229D4W91","currency":"KRW","totalAmount":200,"balanceAmount":0,"suppliedAmount":0,"vat":0,"taxFreeAmount":0,"method":"가상계좌","version":"2022-11-16"}
감사합니다.
입금 전 상태
의 가상계좌 결제건 취소의 경우 카드(또는 계좌이체) 결제 취소와 동일하게 결제 취소 API 호출해보겠습니다.❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.