마켓플레이스

커머스 웹훅 설정

하위 판매자의 주문·구독 이벤트를 리셀러 서버가 직접 받는다.

하위 프로젝트에 연결된 부트페이 커머스 프로젝트가 주문·구독 웹훅을 보낼 주소와 받을 이벤트를 리셀러가 정한다. 판매자가 커머스 관리자 화면(개발 연동 설정)에서 정하는 웹훅과 같은 설정​​이다. PG 신청 단계를 알려 주는 리셀러 웹훅 과는 다른 통로다.

핵심 요약

  • PUT 은 주소(url)와 이벤트(events)를 한 번에 바꾼다. url 은 꼭 보낸다 — 빈 문자열("")이면 웹훅을 끈다. 키를 빼면 400 이다(실수로 꺼지지 않게).
  • events 를 비우면 모든 주문·구독 이벤트를 받는다(지금 판매자 설정과 같은 기본값). 고르면 고른 이벤트만 보낸다.
  • 주소는 500자 이하의 https:// 주소만 받는다. 이름을 풀어 나온 IP 가 내부·사설·부트페이 서버 주소면 거부한다.
  • 주소는 새로 만들어지는 주문·구독부터 쓰인다(주문·구독이 만들어질 때 주소를 복사해 둔다). 받을 이벤트는 보낼 때마다 지금 설정을 본다.
  • 재시도 횟수와 본문 형식(Content-Type)은 그 커머스 프로젝트의 지금 값을 그대로 쓴다(기본 10번 · application/x-www-form-urlencoded). 바꾸려면 커머스 관리자 화면에서 바꾼다.
  • 커머스 프로젝트가 아직 없으면 404 다. 커머스 연동 재시도 로 먼저 만든다.

API 정보

PUThttps://api.bootpay.co.kr/v2/reseller/seller/app/commerce/:app_id/webhookBasic Auth (리셀러 계정 키)

설정 조회는 GET https://api.bootpay.co.kr/v2/reseller/seller/app/commerce/:app_id/webhook — 요청 본문 없이 같은 모양으로 응답한다.

요청 파라미터

파라미터 타입 필수 설명
app_id String 필수 웹훅을 설정할 하위 프로젝트의 app_id (URL 경로)
url String 필수 웹훅을 받을 주소. 500자 이하 https://, 외부에서 접속할 수 있는 주소만. 빈 문자열이면 웹훅을 끈다
events Array 선택 받을 이벤트 이름(아래 이벤트 표). 비우거나 빼면 전부 받는다

코드 예제

import fetch from 'node-fetch'

const RESELLER_AUTH = 'Basic ' + Buffer
  .from(`${process.env.BOOTPAY_RESELLER_CLIENT_KEY}:${process.env.BOOTPAY_RESELLER_SECRET_KEY}`)
  .toString('base64')

const appId = '65a1c0ab8f1b5b00367a0002'
const res = await fetch(`https://api.bootpay.co.kr/v2/reseller/seller/app/commerce/${appId}/webhook`, {
    method: 'PUT',
    headers: {
        'Authorization': RESELLER_AUTH,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        url: 'https://reseller.example.com/bootpay/commerce-webhook',
        events: ['order.done', 'order.cancelled', 'subscription.approved']
    })
})
console.log(await res.json())javascript

응답

{
  "app_id":       "65a1c0ab8f1b5b00367a0002",
  "project_id":   "65a1c0ab8f1b5b00367a0006",
  "url":          "https://reseller.example.com/bootpay/commerce-webhook",
  "events":       ["order.done", "order.cancelled", "subscription.approved"],
  "retry_count":  10,
  "content_type": "application/x-www-form-urlencoded"
}json

응답 파라미터

파라미터 타입 설명
app_id String 하위 프로젝트 식별자
project_id String 커머스 프로젝트 식별자
url String 웹훅 주소. 꺼져 있으면 null
events Array 받을 이벤트 이름. 빈 배열 = 전부
retry_count Number 실패했을 때 다시 보내는 최대 횟수(커머스 프로젝트 설정)
content_type String 웹훅 본문 형식 application/x-www-form-urlencoded 또는 application/json(커머스 프로젝트 설정)

이벤트

본문의 webhook_type 으로 어떤 이벤트인지 안다. 결제완료·취소·부분취소 중 일부 경로는 본문에 옛 표기(ORDER_COMPLETED · ORDER_CANCELLED · ORDER_PARTIAL_CANCELLED)로 오는데, 고를 때는 아래 이름(order.done · order.cancelled · order.partial_cancelled)을 쓴다.

분류 이벤트
주문 order.done order.confirm_error order.cancelled order.cancel_error order.transaction_pending order.partial_cancelled
구독 신청·승인 subscription.requested_done subscription.approved subscription.requested_error subscription.rejected subscription.trial_started subscription.trial_ending subscription.trial_ended
구독 변경 subscription.modified subscription.upgraded subscription.downgraded subscription.transfer_requested subscription.transfer_approved subscription.extended
구독 정지·재개 subscription.paused subscription.resumed subscription.hold_on
구독 종료 subscription.terminated subscription.admin_terminated subscription.expired subscription.expiring_soon subscription.restored
구독 갱신 subscription.renewed subscription.renewal_upcoming
구독 쿠폰 subscription_coupon.applied subscription_coupon.removed subscription_coupon.expired

알림톡 발송 결과(alimtalk.*)와 입금 확인(deposit.*)은 각자 설정이 따로 있어 여기서 고를 수 없다.

받는 요청

  • 커머스 프로젝트 설정의 형식(content_type)으로 POST 한다. 서명 헤더는 없다 — 받은 주문·구독은 커머스 API 로 다시 조회해 확인한다.
  • 처리했으면 응답 본문에 {"success": true} 를 담는다. 없거나 false 이면 retry_count 만큼 다시 보낸다.
  • 같은 이벤트가 두 번 올 수 있다. 본문의 idempotency_key 나 주문·구독 id 로 중복을 거른다.

에러 코드

코드 메시지 대처 방법
COMMERCE_WEBHOOK_INVALID (8190) 커머스 웹훅 주소나 이벤트를 확인해 주세요 (HTTP 400) url 키를 보냈는지, 500자 이하 https:// 외부 주소인지, 이벤트 이름이 위 표에 있는지 본다. 원인은 payload.commerce_error_code(WEBHOOK_URL_INVALID 형식·호스트 · PROJECT_WEBHOOK_URL_FORBIDDEN 내부·사설 주소 · PROJECT_WEBHOOK_EVENT_INVALID 이벤트)
COMMERCE_PROJECT_NOT_FOUND (8191) 이 프로젝트에 연결된 커머스 프로젝트가 없어요 (HTTP 404) 커머스 연동 재시도 로 커머스 프로젝트를 먼저 만든다
COMMERCE_REQUEST_FAILED (8182) 커머스 연동 서버에 요청하지 못했어요 잠시 후 다시 부른다. 같은 값으로 다시 불러도 안전하다. 원인은 payload.commerce_error_code
APP_NOT_FOUND 프로젝트를 찾지 못했다 app_id 가 올바른지 확인한다
APP_NOT_PERMIT 본인 하위 프로젝트가 아니다 app_id 가 본인 리셀러 하위 셀러의 프로젝트인지 확인한다
API_ONLY_RESELLER 리셀러만 이용이 가능한 API 다 리셀러 권한 계정 키로 호출한다

함께 보기