페이팔

페이팔 결제 연동 방법을 안내합니다.

채널 설정하기

결제대행사 채널 설정하기 페이지의 내용을 참고하여 채널을 설정해야 합니다. 포트원 V2 결제 모듈을 사용하시려면 페이팔(SPB/RT)로 연동해야 합니다.

포트원 V2에서는 페이팔 일반결제의 경우 SPB(Smart Payment Button), 정기결제의 경우 RT(Reference Transaction) 방식만 지원합니다.
페이팔은 카드나 계좌 등의 결제수단을 지정하여 결제를 호출할 수 없습니다. (단, 페이팔 계정내에서 사용자가 등록한 결제수단에 따라 카드 혹은 계좌 등을 선택할 수 있습니다.)

페이팔의 경우 다른 결제대행사(PG)의 결제창 호출 방식과 달리 버튼을 렌더링한 후 결제를 진행해야 합니다.

주요 파라미터

  • 일반결제 시 uiType파라미터를 PAYPAL_SPB, 빌링키 발급 시 PAYPAL_RT로 설정해야 합니다. 페이팔의 경우 uiType 파라미터를 필수로 입력해야 합니다.

  • 페이팔의 경우 payMethod, windowType 파라미터를 생략한 채 호출해도 됩니다.

    • 단, windowType 파라미터 지정 시 PC 및 모바일 환경 모두 UI로 지정하셔야 하며, 이 외의 값을 입력하는 경우 에러가 리턴됩니다.

일반 결제/빌링키 발급 공통 준비 사항

페이팔의 경우 고객사의 화면에 페이팔 결제/빌링키 발급 버튼을 렌더링 한 후, 페이팔의 버튼을 클릭하여 페이팔의 결제/빌링키 발급 창을 호출하는 방식입니다.

페이팔의 버튼을 렌더링 하기 위해, 버튼을 렌더링 할 곳에 클래스명이 portone-ui-container인 DOM element를 선언하셔야 합니다.

<!--
  페이팔 버튼을 렌더링 하고 싶은 위치에 "portone-ui-container"라는 class 이름을 갖는 DOM element를 넣습니다.
  포트원 SDK는 해당 id를 가지는 element를 찾아 버튼을 렌더링합니다.
-->
<div class="portone-ui-container">
  <!-- 여기에 페이팔 버튼이 생성됩니다. -->
</div>

일반 결제(loadPaymentUI) 호출하기

일반 결제의 경우, 고객사의 결제 화면에 페이팔 결제 버튼을 렌더링 하기위해 loadPaymentUI 함수를 사용해야 합니다.

결제 성공 시의 동작을 onPaymentSuccess 콜백 함수에, 결제 실패 시의 동작을 onPaymentFail에 작성해야 합니다.

const requestData = {
  uiType: "PAYPAL_SPB",
  storeId: "store-4ff4af41-85e3-4559-8eb8-0d08a2c6ceecl",
  channelKey: "channel-key-893597d6-e62d-410f-83f9-119f530b4b11",
  paymentId: `payment-${crypto.randomUUID()}`,
  orderName: "나이키 와플 트레이너 2 SD",
  totalAmount: 1000,
  currency: "CURRENCY_KRW",
};
const response = await PortOne.loadPaymentUI(requestData, {
  onPaymentSuccess: (response) => {
    setResult(response);
  },
  onPaymentFail: (error) => {
    alert(error);
  },
});

따라서 다른 PG사와 결제 플로우가 상이하기 때문에 고객사는 결제(체크아웃) 페이지가 렌더링 되는 시점에 PortOne.requestPayment 함수 대신 PortOne.loadPaymentUI함수를 별도로 호출해 페이팔 결제 버튼을 렌더링한 후 사용해야 합니다.

페이팔 일반결제 연동 플로우
페이팔 일반결제 연동 플로우

결제 요청 데이터 업데이트

페이팔의 결제 플로우에 의하면 고객사의 결제 페이지가 렌더링될 때 결제 요청 데이터가 결정되어야 하고, 결제 페이지 내에서 구매자의 정보(ex. 구매자 이름, 구매자 주소 등)가 새로 입력되거나 혹은 변경되거나, 쿠폰 및 포인트 사용으로 인한 결제 금액에 대해 변경이 발생한 경우 최종적으로 결정된 구매 정보를 기준으로 페이팔 결제버튼을 새로 렌더링 시킨 후 사용하도록 권장하고 있습니다.

하지만 이런 방식으로 사용하는 것은 번거롭기에 포트원에서는 고객사의 편의를 위해 최초 페이팔 결제 버튼을 렌더링 시킨 후 주문 정보가 변경되었을 때, 추가로 결제 버튼 렌더링하지 않고 결제 요청 데이터를 업데이트할 수 있는 PortOne.updateLoadPaymentUIRequest 함수를 제공하고 있습니다.

구매 정보 변경이 있을 경우 PortOne.updateLoadPaymentUIRequest함수를 호출하여 결제 데이터를 업데이트하시면 구매자가 페이팔 결제 버튼을 누를 때 최종적으로 변경된 결제 요청 데이터로 페이팔 결제창이 호출됩니다.

SDK 일반 결제 요청
import * as PortOne from "@portone/browser-sdk/v2"; const requestData = { uiType: "PAYPAL_SPB", orderName: "포트원 페이팔 테스트 결제", // ...중략 }; function loadPaymentUI() { // loadPaymentUI의 파라미터로 결제 요청 데이터, 결제 프로세스 성공, 실패 시 호출될 "콜백 함수"를 전달해야 합니다. PortOne.loadPaymentUI({ requestData, onPaymentSuccess: (response) => { // 성공 시 호출되는 콜백 함수 내용 }, onPaymentFail: (error) => { // 실패 시 호출되는 콜백함수 내용 }, }); } function updateLoadPaymentUIRequest() { // 결제 요청 데이터가 변경되면 고객사에서 선언한 updateLoadPaymentUIRequest 함수가 호출됩니다. // PortOne.updateLoadPaymentUIRequest가 최종적으로 변경 된 결제 요청 데이터를 전달합니다. PortOne.updateLoadPaymentUIRequest(requestData); }

빌링키 발급(loadIssueBillingKeyUI) 호출하기

빌링키 발급의 경우, 고객사의 빌링키 발급 화면에 페이팔 빌링키 발급 버튼을 렌더링 하기위해 loadIssueBillingKeyUI 함수를 사용해야 합니다.

발급 성공 시의 동작을 onIssueBillingKeySuccess 콜백 함수에, 발급 실패 시의 동작을 onIssueBillingKeyFail에 작성하셔야 합니다.

const requestData = {
  uiType: "PAYPAL_RT",
  storeId: "store-4ff4af41-85e3-4559-8eb8-0d08a2c6ceec",
  channelKey: "channel-key-893597d6-e62d-410f-83f9-119f530b4b11",
  issueId: `issue-id-${crypto.randomUUID()}`,
};
const response = await PortOne.loadIssueBillingKeyUI(requestData, {
  onIssueBillingKeySuccess: (response) => {
    setResult(response);
  },
  onIssueBillingKeyFail: (error) => {
    alert(error);
  },
});

따라서 다른 PG사와 결제 플로우가 상이하기 때문에 고객사는 결제(체크아웃) 페이지가 렌더링 되는 시점에 PortOne.requestIssueBillingKey 함수 대신 PortOne.loadIssueBillingKeyUI함수를 별도로 호출해 페이팔 빌링키 발급 버튼을 렌더링한 후 사용해야 합니다.

빌링키 발급 요청 데이터 업데이트

페이팔의 결제 플로우에 의하면 고객사의 빌링키 발급 페이지가 렌더링될 때 빌링키 발급 요청 데이터가 결정되어야 하고, 해당 페이지 내에서 구매자의 정보(ex. 구매자 이름, 구매자 주소 등)가 새로 입력되거나 혹은 변경이 발생한 경우 최종적으로 결정된 빌링키 발급 정보를 기준으로 페이팔 빌링키 발급 버튼을 새로 렌더링 시킨 후 사용하도록 권장하고 있습니다.

하지만 이런 방식으로 사용하는 것은 번거롭기에 포트원에서는 고객사의 편의를 위해 최초 페이팔 빌링키 발급 버튼을 렌더링 시킨 후 주문 정보가 변경되었을 때, 추가로 빌링키 발급 버튼을 렌더링하지 않고 빌링키 발급 요청 데이터를 업데이트할 수 있는 PortOne.updateLoadIssueBillingKeyUIRequest 함수를 제공하고 있습니다.

빌링키 발급 정보 변경이 있을 경우 PortOne.updateLoadIssueBillingKeyUIRequest함수를 호출하여 데이터를 업데이트하시면 구매자가 페이팔 빌링키 발급 버튼을 누를 때 최종적으로 변경된 데이터로 페이팔 빌링키 발급창이 호출됩니다.

페이팔 정기결제 빌링키 발급 연동 플로우
페이팔 정기결제 빌링키 발급 연동 플로우
SDK 빌링키 발급 요청
import * as PortOne from "@portone/browser-sdk/v2"; const requestData = { uiType: "PAYPAL_RT", // ...중략 }; function loadIssueBillingKeyUI() { // loadIssueBillingKeyUI 파라미터로 결제 요청 데이터, 결제 프로세스 성공, 실패 시 호출될 "콜백 함수"를 전달해야 합니다. PortOne.loadIssueBillingKeyUI({ requestData, onIssueBillingKeySuccess: (response) => { // 성공 시 호출되는 콜백 함수 내용 }, onIssueBillingKeyFail: (error) => { // 실패 시 호출되는 콜백함수 내용 }, }); } function updateLoadIssueBillingKeyUIRequest() { // 결제 요청 데이터가 변경되면 고객사에서 선언한 updateLoadIssueBillingKeyUIRequest 함수가 호출됩니다. // PortOne.updateLoadIssueBillingKeyUIRequest가 최종적으로 변경 된 결제 요청 데이터를 전달합니다. PortOne.updateLoadIssueBillingKeyUIRequest(requestData); }

비동기 프로세스 처리하기

결제 승인 및 취소 시 비동기 프로세스가 존재하는 경우 결제 상태를 최종적으로 반영하기 위해서 반드시 웹훅 연동을 해야합니다. [→ 웹훅 연동하기 바로가기]

비동기 상태

  1. 결제 요청 후 대기 상태 페이팔 결제 건은 결제 승인 요청 시 바로 승인 되지 않고 일정 시간이후 처리되는 "승인 대기(pending)" 상태가 존재합니다. 때문에 트랜잭션 종료 시 콜백 함수로 전달되는 결제 아이디(paymentId)로 결제 내역을 조회하여 status 응답에 따라 후처리 로직을 구현해야 합니다. [→ 결제내역 단건조회 API 바로가기]

  2. 결제 취소 후 대기 상태 결제 취소 시 취소 승인이 바로 되지 않고 일정 시간이후 취소 승인이 처리되는 경우가 존재합니다.

결제 취소 API를 통해 결제를 취소한 경우 API 응답의 status 값을 기준으로 취소 승인 여부를 판단해야 합니다. 취소 승인 대기인 경우 status 값이 REQUESTED로 응답되며 이후 취소 승인이 완료되면 웹훅이 발송됩니다.

콘솔을 통해 결제를 취소한 경우 취소 승인이 바로 되지 않으면 결제 상태는 변경되지 않고, 콘솔 내 [결제내역 상세 > 취소요청내역] 탭에서 취소 요청 내역을 확인할 수 있습니다. 이후 취소 승인이 되면, 결제 취소로 상태가 변경됩니다.

고위험 산업(STC) 안내

페이팔은 판매자 보호 정책을 통해 고객사 거래에서 이상거래나 사기 등 위험 발생 시, 판매자 보호 정책을 통해 고객사의 손해를 보존하는 판매자 보호 프로그램을 가지고 있습니다. 이 판매자 보호 정책을 적용하기 위해서는 페이팔 측에서 제공하는 STC 기능을 사용해야 합니다.

고위험 산업군(게임과 같은 디지털 상품 또는 중고거래 등)의 경우 페이팔에서 STC API를 통해 판매자 보호 정책을 적용하도록 강력하게 요구하고 있습니다. 또한, 고위험 산업군이 아닌 경우에도 STC API를 연동하는 것을 권장하고 있습니다.

판매자 보호 정책에 관한 자세한 내용 및 협의가 필요한 경우 페이팔에 직접 문의해 주세요.




고위험 산업에 해당하는 산업군들은 다음과 같습니다.

  1. 이벤트/티켓 판매 산업

  2. 연료 산업

  3. 게임/디지털 상품 산업

  4. 마켓플레이스 사업

  5. 온라인 여행 산업(렌터카, 숙박, 여행 패키지, 교통)

  6. P2P 산업

  7. 소매, 식품 산업

    • 소매, 식품 산업의 경우 다음과 같은 경우에만 STC 연동이 필요합니다.

      • 모바일 기기를 통해 매장 내 구매가 가능한 산업
    • 다음 산업의 경우에는 STC 연동이 필요하지 않습니다.

      • 타사 배송업체를 통해 주소로 실물 상품을 배송하는 산업
      • 자체 배송 트럭을 통해 주소로 실물 상품을 배송하는 산업
      • 소비자가 수령할 수 있도록 자체 매장으로 실물 상품을 배송하는 산업
  8. 택시, 공유 이동수단 사업

  9. 통신사

  10. 결제 시스템 보안 서비스 산업

결제 처리

STC 기능을 사용하기 위해 다음 정보를 확인해 주세요.

  1. 페이팔 Business 계정 가입 시 선택한 산업 종류(Industry)를 확인해야 합니다.
  2. 계정의 산업 종류를 확인한 후, 해당 산업에 맞는 파라미터를 아래와 같은 형식으로 loadUI 호출 시 bypass.paypal_v2 객체에 추가하여 호출해야 합니다.

산업군 별 파라미터

페이팔에서 지원하는 판매자 보호 정책(Seller Protection Policy) 적용을 위해서, 결제 시에 산업군 별 파라미터를 추가하여 전달해야 합니다. 해당 문서의 파라미터들은 모두 optional이지만, 고위험 거래 처리를 위해 하나 이상의 필드를 추가하여 전달해야 합니다. 페이팔에서는 위험도 분석을 위해, 고객사가 제공할 수 있는 최대한의 데이터를 전달하는 것을 권장하고 있습니다.

모든 파라미터는 String 타입으로 전달해야 합니다. 또한 Format이 작성되어 있지 않은 필드들은 자유 형식으로 작성하여 전달해야 합니다.

사용 가능한 결제수단

결제 수단에 따라 가능한 국가 및 통화가 제한적이오니 자세한 사항은 페이팔에 문의해 주세요.

일반결제 유의사항

일반결제 FAQ

정기결제 유의사항

정기결제 FAQ