code개발자 도구

결제·인증·인프라·배포 — 복붙 한 번으로 완성

💳 PayPal 결제

1. 패키지 설치

npm install @paypal/react-paypal-js

2. 환경변수 (.env.local)

NEXT_PUBLIC_PAYPAL_CLIENT_ID=AfVfIr... (본인 키)
PAYPAL_SECRET=EIERq... (서버 전용)

3. 결제 컴포넌트

import { PayPalScriptProvider, PayPalButtons } from "@paypal/react-paypal-js";

export function PayPalCheckout({ amount }: { amount: string }) {
  return (
    <PayPalScriptProvider
      options={{ clientId: process.env.NEXT_PUBLIC_PAYPAL_CLIENT_ID! }}
    >
      <PayPalButtons
        createOrder={(_data, actions) =>
          actions.order.create({
            intent: "CAPTURE",
            purchase_units: [{ amount: { currency_code: "USD", value: amount } }],
          })
        }
        onApprove={async (_data, actions) => {
          const order = await actions.order?.capture();
          console.log("결제 완료:", order?.id);
        }}
      />
    </PayPalScriptProvider>
  );
}

4. Webhook (app/api/webhook/paypal/route.ts)

export async function POST(req: Request) {
  const body = await req.json();
  const eventType = body.event_type;
  if (eventType === "PAYMENT.CAPTURE.COMPLETED") {
    // 결제 완료 처리
    const orderId = body.resource.id;
    console.log("PayPal 결제 완료:", orderId);
  }
  return new Response("OK");
}

🟦 토스페이먼츠

1. 패키지 설치

npm install @tosspayments/tosspayments-sdk

2. 환경변수 (.env.local)

NEXT_PUBLIC_TOSS_CLIENT_KEY=test_ck_0RnYX2w... (테스트)
TOSS_SECRET_KEY=test_sk_24xLea... (서버 전용)

3. 결제 요청 함수

import { loadTossPayments } from "@tosspayments/tosspayments-sdk";

async function requestPayment(orderId: string, amount: number) {
  const toss = await loadTossPayments(process.env.NEXT_PUBLIC_TOSS_CLIENT_KEY!);
  const payment = toss.payment({ customerKey: "ANONYMOUS" });
  await payment.requestPayment({
    method: "CARD",
    amount: { currency: "KRW", value: amount },
    orderId,
    orderName: "NatasAI Pro 플랜",
    successUrl: `${window.location.origin}/payment/success`,
    failUrl: `${window.location.origin}/payment/fail`,
  });
}

4. 결제 승인 (app/api/toss/confirm/route.ts)

export async function POST(req: Request) {
  const { paymentKey, orderId, amount } = await req.json();
  const res = await fetch("https://api.tosspayments.com/v1/payments/confirm", {
    method: "POST",
    headers: {
      Authorization: `Basic ${btoa(process.env.TOSS_SECRET_KEY + ":")}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ paymentKey, orderId, amount }),
  });
  const data = await res.json();
  return Response.json(data, { status: res.status });
}