본인 환불/청약철회 가능 결제건을 골라 신청한다. 산정값(예상 금액·회수 크레딧·근거)은 BE가 계산해 내려주고 화면은 읽기전용으로 표시만 한다. 환불 불가 항목을 고르면 CTA가 "멤버십 관리로 이동"으로 바뀐다.
GET /refund/eligible-payments (진입 onMounted) — 환불/철회 가능한 본인 결제건 + 산정 추천값 조회POST /refund/request (신청 CTA) — { paymentIdx, reason, contactEmail }만 전송 → { request, advisory }FormSelect). 옵션 = eligible-payments의 paidAt 중복 제거. 바꾸면 유형·항목·사유·이메일 초기화.BtnOption×2). productType과 대조.filteredPayments) 표시. 조합에 없으면 목록 비어 보임(빈-상태 UI 없음). 규칙#needs-verificationselectedPaymentIdx). 라벨=planName - 금액. 근거 [[결정-크레딧환불-단일선택]].hasInProgressRefund 항목은 흐리게(opacity .5)·클릭 무시 → "환불 진행 중" 오류 라벨.basis별 문구(WITHDRAWAL_7DAYS·CREDIT_UNUSED·CREDIT_PARTIAL·PREPAID_PRORATA…). 불가 basis면 error 스타일.refundMethod(원결제수단) 읽기전용, 변경 UI 없음. 근거 [[결정-환불화면-결제수단표시]].recommendedAmount(BE 산정) 읽기전용. 통화별 ₩/$ 동적.recoverCredit. >0일 때만 −{n} Credits, 0이면 행 숨김. 근거 [[결정-환불화면-회수크레딧표시]].FormTextarea, 필수 1자+). 항목 바꾸면 초기화.type=email, 필수 1자+).POST /refund/request { paymentIdx, reason, contactEmail }. 금액·근거는 재전송 안 함(BE 재산정). 성공 → 접수 완료 팝업.isNotRefundable(refundable=false 또는 basis MONTHLY_NO_REFUND/NOT_REFUNDABLE)면 근거 error·금액 블록 숨김.membership-change-plan([[화면설계-06-멤버십-크레딧]] 계열, 이 화면군 밖). #needs-verificationPopupBasic).monthlyLimitExceeded=true면 월 한도 경고 문구 덧붙임(접수는 막지 않음).payment-history, 이 화면군 밖).