[28-1] 결제 프로세스
[28-2] 외부 API (포트원) 사용하기
📂 인터넷 서비스에서 결제를 통해 포인트를 충전하는 과정
1️⃣ 사용자가 브라우저에서 충전하기 버튼을 클릭
2️⃣ 충전하기 창에서 원하는 금액을 선택하고 결제 진행
3️⃣ 개인 결제수단(신용카드/카카오페이 등)에서 빠져나간 금액 만큼 사용자의 포인트가 증가
📂 결제의 역사
카드사
PG (Payment Gateway)
결제 솔루션
📂 포인트 충전 과정
1️⃣ 사용자가 브라우저에서 충전하기 버튼을 클릭
2️⃣ 충전하기 창에서 원하는 금액을 선택하고 결제 버튼 클릭
3️⃣ 아임포트에서 제공하는 Rest-API를 이용해 결제 요청
4️⃣ 결제 성공 시 해당 결제에 대한 imp_uid와 결제 금액 등의 데이터를 돌려받음
5️⃣ 성공한 결제 정보를 백엔드 서버로 mutation
6️⃣ db의 유저 포인트 정보에 결제 내역을 업데이트
📂 아임포트 적용
💡 아임포트 DOCS 페이지와 Github
import { gql, useQuery } from "@apollo/client"; import { useRouter } from "next/router"; import { useEffect } from "react"; const FETCH_USER_LOGGED_IN = gql` query { fetchUserLoggedIn { email name } } `; declare const window: typeof globalThis & { IMP: any; }; export default function LoginPage(): JSX.Element { const router = useRouter(); const { data } = useQuery<Pick<IQuery, "fetchUserLoggedIn">>(FETCH_USER_LOGGED_IN); useEffect(() => { if (localStorage.getItem("accessToken") === null) { alert("로그인 후 이용 가능합니다."); void router.push("/28/payment/login"); } }, []); const onClick = (amount: number, name: string): void => { const IMP = window.IMP; // 생략 가능 IMP.init("imp00000000a"); // 예: imp00000000a IMP.request_pay( { // param pg: "kakaopay", pay_method: "card", // merchant_uid: "ORD20180131-0000011", name, amount, buyer_email: "gildong@gmail.com", buyer_name: "홍길동", buyer_tel: "010-4242-4242", buyer_addr: "서울특별시 강남구 신사동", buyer_postcode: "01181", m_redirect_url: "http://localhost:3000/section28/28-01-payment", }, (rsp: any) => { // callback if (rsp.success === true) { // 결제 성공 시 로직, console.log(rsp); // 백엔드에 결제관련 데이터 넘겨주기 => 즉 뮤테이션 실행하기 // createPointTransactionOfLoading void router.push("/28/payment/complete"); } else { // 결제 실패 시 로직, } } ); }; return ( <> {data?.fetchUserLoggedIn.name}님 환영합니다! <script src="https://cdn.iamport.kr/v1/iamport.js"></script> <button onClick={() => onClick(500, "500원 충전")}>500원 충전</button> <button onClick={() => onClick(1000, "1000원 충전")}>1000원 충전</button> <button onClick={() => onClick(2000, "2000원 충전")}>2000원 충전</button> <button onClick={() => onClick(5000, "5000원 충전")}>5000원 충전</button> </> ); }
📂 백엔드 API로 데이터 넘겨주기