page.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. 'use client';
  2. import '../style.scss';
  3. import { useSearchParams } from 'next/navigation';
  4. // 토스 SDK 에러 코드 → 사용자 친화 안내 (미매핑 코드는 토스가 전달한 message 사용)
  5. const CODE_MESSAGES: Record<string, string> = {
  6. PAY_PROCESS_CANCELED: '결제를 취소했습니다.',
  7. PAY_PROCESS_ABORTED: '결제가 중단되었습니다. 다시 시도해주세요.',
  8. REJECT_CARD_COMPANY: '카드사에서 결제를 거절했습니다. 다른 결제수단을 이용해주세요.',
  9. USER_CANCEL: '결제를 취소했습니다.'
  10. };
  11. export default function ChargeFailPage()
  12. {
  13. const searchParams = useSearchParams();
  14. const code = searchParams.get('code') || '';
  15. const rawMessage = searchParams.get('message') || '';
  16. const message = CODE_MESSAGES[code] || rawMessage || '결제가 취소되었거나 실패했습니다.';
  17. const handleRetry = () => {
  18. window.location.href = '/charge';
  19. };
  20. const handleClose = () => {
  21. if (window.opener) {
  22. window.close();
  23. } else {
  24. window.location.href = '/';
  25. }
  26. };
  27. return (
  28. <div className="charge-page">
  29. <div className="charge-page__card">
  30. <div className="charge-page__result">
  31. <div className="charge-page__result-icon charge-page__result-icon--error">✕</div>
  32. <p className="charge-page__result-message">{message}</p>
  33. {code && <p className="charge-page__result-code">오류 코드: {code}</p>}
  34. <button type="button" className="charge-page__submit" onClick={handleRetry}>
  35. 다시 충전하기
  36. </button>
  37. <button type="button" className="charge-page__reset" onClick={handleClose}>
  38. 닫기
  39. </button>
  40. </div>
  41. </div>
  42. </div>
  43. );
  44. }