๐Ÿ“Œ ์นด์นด์˜คํŽ˜์ด ๊ฒฐ์ œ ์—ฐ๋™ ์ •๋ฆฌ (React + Spring Boot ๋ฐฑ์—”๋“œ)

1. ์ „์ฒด ๊ฒฐ์ œ ํ๋ฆ„

  1. ๊ฒฐ์ œ ์ค€๋น„ ์š”์ฒญ (/api/payments/ready)
  2. ๊ฒฐ์ œ ์ง„ํ–‰ (์นด์นด์˜ค ํ™”๋ฉด)
  3. ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ (/api/payments/approve)

2. ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์„ฑ

โœ… ๊ฒฐ์ œ ๋ฒ„ํŠผ

export function KakaoPayButton({ courseId }) {
  const requestPayment = async () => {
    const res = await axios.post(`/api/payments/ready?courseId=${courseId}`, {}, {
      headers: { Authorization: `Bearer ${localStorage.getItem("accessToken")}` },
    });
    window.location.href = res.data.next_redirect_pc_url;
  };
  return <button onClick={requestPayment}>๐Ÿ’ณ ์นด์นด์˜คํŽ˜์ด๋กœ ๊ฒฐ์ œํ•˜๊ธฐ</button>;
}


โœ… ๊ฒฐ์ œ ์Šน์ธ ํŽ˜์ด์ง€

export function KakaoPayApprovePage() {
  const [searchParams] = useSearchParams();
  const pgToken = searchParams.get("pg_token");

  useEffect(() => {
    if (!pgToken) return;
    axios.get(`/api/payments/approve?pg_token=${pgToken}`, {
      headers: { Authorization: `Bearer ${localStorage.getItem("accessToken")}` },
    })
      .then(() => window.location.href = "/my-courses")
      .catch(() => alert("๊ฒฐ์ œ ์Šน์ธ ์‹คํŒจ"));
  }, [pgToken]);

  return <div>๊ฒฐ์ œ ์Šน์ธ ์ค‘์ž…๋‹ˆ๋‹ค...</div>;
}


โœ… ์„ฑ๊ณต ํŽ˜์ด์ง€ (์„ ํƒ)