마켓플레이스

결제 연동

이미 받은 PG 가맹점 키(MID 등)를 하위 프로젝트에 넣고 결제수단을 켜고 끕니다. 아직 MID 가 없는 판매자는 PG 가맹 신청 을 사용합니다.

API 하는 일
1. PG·필수 연동 값 목록 고를 수 있는 PG 와 필수 연동 값
2. PG 리소스 갱신 결제수단 붙이기·끄기, 연동 값 갱신
3. 결제수단 목록 프로젝트의 결제수단 목록
4. 결제 설정 잠금 가맹점이 결제수단·연동 값을 못 바꾸게 잠금

인증·권한 오류는 각 표에 없어도 공통 오류 가 날 수 있습니다.

1PG·필수 연동 값 목록

가맹점 생성·프로젝트 생성·PG 리소스 갱신 의 resources[] 에 넣을 수 있는 PG·결제수단과, 결제수단마다 resource 에 넣어야 하는 키를 돌려줍니다.

동작 규칙

  • resources[].pg 에는 PG 의 symbols 중 하나, resources[].method 에는 결제수단의 symbols 중 하나를 넣습니다.
  • resource_keys 중 required 가 true 인 키만 필수입니다. 하나라도 비면 RESOURCE_KEY_BLANK 로 거부됩니다. required 가 false 인 키는 PG 사가 준 경우에만 넣습니다(빼거나 빈 값이어도 됩니다). 부트페이 관리자 화면의 연동 정보 저장과 같은 기준입니다.
  • 결제 모드가 있는 결제수단(일부 PG)은 새로 붙일 때의 기본 결제 모드 기준으로 required 를 줍니다. 관리자 화면에서 다른 모드를 고른 결제수단을 갱신하면 그 모드의 필수 키로 검사합니다.
  • 값은 가맹 계약 뒤 PG 사가 알려 줍니다. description 은 부트페이 관리자 화면의 안내 문구라 HTML 이 섞여 있을 수 있습니다.
  • input_type 이 textarea 인 키는 여러 줄 값(예: 인증서 PEM)입니다.
  • 사용 중인 PG·결제수단만 나옵니다. pg 를 주면 그 PG 하나만 옵니다.
  • 모든 리셀러가 같은 목록을 봅니다.

API 정보

GEThttps://api.bootpay.co.kr/v2/reseller/pgsBasic Auth (리셀러 계정 키)

1-1. 요청 파라미터

파라미터 타입 필수 설명
pg String 선택 PG 심볼(예: nicepay). 주면 그 PG 만 돌려줍니다 (쿼리)

1-2. 코드 예제

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 res = await fetch('https://api.bootpay.co.kr/v2/reseller/pgs?pg=nicepay', {
    headers: { 'Authorization': RESELLER_AUTH }
})
const { list } = await res.json()
const card = list[0].methods.find(m => m.method === 'card')
console.log(card.resource_keys.filter(k => k.required).map(k => k.key)) // resource 에 꼭 넣을 키javascript

1-3. 응답

{
  "list": [
    {
      "pg":      "nicepay",
      "pg_name": "나이스페이먼츠",
      "symbols": ["nicepay"],
      "methods": [
        {
          "method":            "card",
          "method_name":       "카드",
          "display_name":      "신용카드",
          "symbols":           ["card", "카드"],
          "group":             2,
          "sandbox_supported": true,
          "resource_keys": [
            { "key": "mid",        "description": "상점 아이디를 입력해주세요.",        "input_type": "input", "required": true },
            { "key": "mkey",       "description": "상점키를 입력해주세요.",             "input_type": "input", "required": true },
            { "key": "cancel_pwd", "description": "결제 취소 비밀번호를 입력해주세요.", "input_type": "input", "required": false }
          ]
        }
      ]
    }
  ]
}json
필드 타입 필수 설명
list Array 필수 PG 목록(부트페이 노출 순서)
pg String 필수 PG 심볼(별칭)
pg_name String 필수 PG 이름
symbols Array 필수 resources[].pg 에 넣을 수 있는 값
methods Array 필수 결제수단 목록
method String 필수 결제수단 심볼(별칭)
method_name String 필수 결제수단 이름
display_name String 선택 화면 표시 이름
symbols Array 필수 resources[].method 에 넣을 수 있는 값
group Number 선택 결제 그룹
sandbox_supported Boolean 필수 테스트 모드(sandbox: true) 지원 여부. true 면 연동 값(resource) 없이 sandbox: true 만으로 붙일 수 있습니다(부트페이 테스트 키로 결제)
resource_keys Array 필수 resource 에 넣을 수 있는 키. 필수는 required 가 true 인 키만
key String 필수 키 이름
description String 선택 안내 문구(HTML 이 섞일 수 있습니다)
input_type String 선택 input 한 줄 · textarea 여러 줄
required Boolean 필수 필수 여부. true 면 비었을 때 RESOURCE_KEY_BLANK (기본 결제 모드 기준)

1-4. 에러 코드

코드 메시지 대처 방법
API_ONLY_RESELLER (601) 리셀러만 이용이 가능한 API입니다 리셀러 권한 계정 키로 호출합니다
API_SCOPE_INVALID 허용되지 않은 API 권한의 키입니다 (HTTP 401) 키에 이 API 의 리셀러 스코프 를 주거나 전체 권한(supervisor) 키로 호출합니다
PG_RESOURCE_NOT_FOUND (1004) pg 로 보낸 PG 를 찾지 못했습니다 (HTTP 404) pg 없이 불러 고를 수 있는 PG 를 확인합니다

2PG 리소스 갱신

프로젝트(app) 에 등록되어 있는 PG·결제수단·발급키를 갱신합니다. 신규 결제수단을 추가하거나 PG 사가 발급한 가맹점 키가 바뀌었을 때 호출합니다.

동작 규칙

  • resources 배열에 포함된 결제수단은 추가 또는 갱신됩니다. 배열에 빠진 결제수단은 그대로 유지됩니다 — 전체 덮어쓰기가 아닙니다.
  • 기존에 등록된 PG·결제수단 묶음에 같은 pg + method 조합이 들어오면 발급키만 갱신됩니다.
  • sandbox: true 면 테스트 모드로 등록합니다. 테스트 결제는 부트페이가 결제수단마다 가진 테스트 키로 하므로, 연동 값이 아직 없으면 resource 없이 sandbox: true 만 보내도 됩니다. 운영으로 바꿀 때는 resource 와 sandbox: false(또는 생략)를 보냅니다.
  • 원소에 status: "off" 를 보내면 그 결제수단을 끕니다(결제창에서 빠집니다). 지우지 않으므로 연동 값·기록이 남고, status: "on" 으로 다시 켤 수 있습니다. 켜기·끄기만 할 때는 resource 를 보내지 않아도 됩니다.
  • 응답으로 프로젝트의 최신 정보(application_keys, payment_apps) 가 다시 내려옵니다. 프로젝트 비밀키(private_key)는 나오지 않고, 결제수단 resource 는 가린 값(앞 5자 + *****)입니다.
  • 지금 붙어 있는 결제수단은 결제수단 목록, PG 마다 resource 에 넣을 키는 PG·필수 연동 값 목록 에서 확인합니다. 필수는 그 목록의 required: true 인 키만입니다(부트페이 관리자 화면과 같은 기준). 같은 PG 라도 결제수단마다 다릅니다 — 예: 나이스페이먼츠 카드는 mid·mkey, 카드자동은 mid·mkey·cancel_pwd.
  • 같은 결제수단 심볼(예: card)을 여러 PG 로 한 요청에 보내도 각 원소는 그 원소의 pg 결제수단에 저장됩니다.
  • 가맹점이나 리셀러가 결제 설정 잠금 을 켜 두었어도 이 API 는 그대로 동작합니다. 잠금은 가맹점 관리자 화면에서의 수정만 막습니다.

API 정보

PATCHhttps://api.bootpay.co.kr/v2/reseller/seller/app/resource/:app_idBasic Auth (리셀러 계정 키)
메서드 표기

Rails 표준 resources 라우트라서 PATCH / PUT 둘 다 받습니다. 본 문서는 PATCH 기준으로 표기합니다.

2-1. 요청 파라미터

파라미터 타입 필수 설명
app_id String 필수 갱신할 프로젝트 식별자 (URL 경로)
resources Array 필수 등록·갱신할 PG·결제수단 배열. 각 원소 구조는 아래 참고

resources 배열 형식

필드 타입 필수 설명
pg String 필수 PG 심볼 (예: nicepay, kcp, inicis, tosspayments)
method String 필수 결제수단 심볼 (예: 카드, 계좌이체, 가상계좌, 카드자동)
sandbox Boolean 선택 true 면 테스트 모드(부트페이 테스트 키로 결제). 생략·false 면 운영
resource Object 선택 PG 가 발급한 가맹점 키 묶음. status 로 켜기·끄기만 하거나, sandbox: true 로 테스트 모드로만 쓸 때는 생략합니다
status String 선택 on 켜기 · off 끄기. 생략하면 켜짐·꺼짐을 바꾸지 않습니다

결제수단 끄기·다시 켜기

status 만 보내면 연동 값은 그대로 두고 켜짐·꺼짐만 바꿉니다. 같은 요청에 연동 값을 바꿀 원소와 섞어 보내도 됩니다.

{
  "resources": [
    { "pg": "nicepay", "method": "카드자동", "status": "off" },
    { "pg": "nicepay", "method": "카드", "status": "on" }
  ]
}json

연동 값 없이 테스트 모드로 붙이기

PG 계약 전이라 연동 값이 없어도 sandbox: true 만 보내면 그 결제수단을 테스트 모드로 붙입니다(없으면 추가, 있으면 테스트 모드로 바꿉니다). 테스트 결제는 부트페이 테스트 키로 하고, 이미 저장된 연동 값·MID 기록은 그대로 둡니다. 테스트 모드를 지원하는지는 PG·필수 연동 값 목록 의 sandbox_supported 로 확인합니다.

{
  "resources": [
    { "pg": "nicepay", "method": "카드", "sandbox": true },
    { "pg": "nicepay", "method": "카드자동", "sandbox": true, "status": "on" }
  ]
}json

운영으로 바꿀 때는 PG 에서 받은 연동 값을 resource 에 넣고 sandbox: false 로 다시 보냅니다.

2-2. 코드 예제

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 = '65a1c0ab8f1b5b00367a0010'

const res = await fetch(`https://api.bootpay.co.kr/v2/reseller/seller/app/resource/${appId}`, {
    method: 'PATCH',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': RESELLER_AUTH
    },
    body: JSON.stringify({
        resources: [
            {
                pg:     'nicepay',
                method: '카드',
                sandbox: false,
                resource: {
                    mid:          process.env.NICEPAY_MID,
                    mkey:         process.env.NICEPAY_MKEY
                }
            },
            {
                pg:     'nicepay',
                method: '카드자동',
                sandbox: false,
                resource: {
                    mid:          process.env.NICEPAY_MID,
                    mkey:         process.env.NICEPAY_MKEY,
                    cancel_pwd:   process.env.NICEPAY_CANCEL_PWD // 카드자동은 결제 취소 비밀번호도 필수
                }
            }
        ]
    })
})
const data = await res.json()
console.log(data)javascript

2-3. 응답

프로젝트의 최신 상태가 내려옵니다. 프로젝트 비밀키(private_key)는 프로젝트 생성·키 재발급 응답에서만 나오므로 여기에는 없고, resource 는 가린 값입니다.

{
  "app_id":   "65a1c0ab8f1b5b00367a0010",
  "app_name": "한입가게 — 정기구독",
  "real":     { "name": "비실물", "value": 0, "desc": "" },
  "unit":     "KRW",
  "application_keys": [
    { "type": 1, "name": "WEB",     "key": "65a1c0ab8f1b5b00367a0011" },
    { "type": 2, "name": "Android", "key": "65a1c0ab8f1b5b00367a0012" },
    { "type": 3, "name": "iOS",     "key": "65a1c0ab8f1b5b00367a0013" },
    { "type": 4, "name": "REST",    "key": "65a1c0ab8f1b5b00367a0014" }
  ],
  "payment_apps": [
    {
      "payment_resource_id": "65a1c0ab8f1b5b00367a0015",
      "pg_id":               "6098a1b2c3d4e5f600000101",
      "pg_name":             "나이스페이먼츠",
      "pg_alias":            "nicepay",
      "method_id":           "6098a1b2c3d4e5f600000201",
      "method_name":         "카드",
      "method_alias":        "card",
      "resource_mode":       null,
      "sandbox_mode":        false,
      "easypay":             false,
      "updated_at":          "2024-01-12T18:04:11+09:00",
      "status":              1,
      "resource": {
        "mid":          "nicep*****",
        "mkey":         "EYzu8*****"
      }
    },
    {
      "payment_resource_id": "65a1c0ab8f1b5b00367a0016",
      "pg_id":               "6098a1b2c3d4e5f600000101",
      "pg_name":             "나이스페이먼츠",
      "pg_alias":            "nicepay",
      "method_id":           "6098a1b2c3d4e5f600000202",
      "method_name":         "카드자동",
      "method_alias":        "card_rebill",
      "resource_mode":       null,
      "sandbox_mode":        false,
      "easypay":             false,
      "updated_at":          "2024-01-12T18:04:11+09:00",
      "status":              0,
      "resource": {
        "mid":          "nicep*****",
        "mkey":         "EYzu8*****",
        "cancel_pwd":   "pw123*****"
      }
    }
  ],
  "status": 20
}json

응답 파라미터

파라미터 타입 설명
app_id String 프로젝트 식별자
app_name String 프로젝트명
real Object 거래 상품 유형. { name, value, desc } 구조입니다
unit String 결제 통화
application_keys Array 플랫폼별 SDK 연동키 묶음. WEB / Android / iOS / REST 4 건이 내려옵니다
application_keys[].type Number 플랫폼 코드. 1 = WEB, 2 = Android, 3 = iOS, 4 = REST
application_keys[].name String 플랫폼 이름 (WEB / Android / iOS / REST)
application_keys[].key String SDK 초기화에 넣는 application_id. Basic Auth 에 쓰는 client_key 와는 다른 값입니다
payment_apps Array 프로젝트에 등록된 PG·결제수단 목록(꺼 둔 것 포함)
payment_apps[].payment_resource_id String 등록된 결제수단 리소스 식별자
payment_apps[].pg_id / pg_name / pg_alias String 매칭된 PG 식별자·이름·심볼
payment_apps[].method_id / method_name / method_alias String 매칭된 결제수단 식별자·이름·심볼
payment_apps[].resource_mode String / null PG 연동 방식(일부 PG 만)
payment_apps[].sandbox_mode Boolean 테스트 모드 여부
payment_apps[].easypay Boolean 간편결제 여부
payment_apps[].updated_at String 리소스 갱신 시각 (ISO 8601)
payment_apps[].status Number 1 켜짐, 0 꺼짐
payment_apps[].resource Object 등록된 PG 발급키 묶음. 키 이름은 그대로, 값은 가린 값(앞 5자 + *****, 10자보다 짧은 값은 앞 절반 + *****)입니다. 빈 값은 빈 값 그대로
status Number 프로젝트 상태. 기본값 20 (심사통과)
요청 로깅 주의

응답에는 가맹점 키 원문이 없지만 요청 본문​​의 resource 는 원문입니다. 이 요청을 그대로 로그·APM·에러 리포팅에 남기지 않습니다. 원문이 다시 필요하면 PG 사 통보서에서 다시 확인합니다 — 부트페이 API 는 원문을 다시 보여 주지 않습니다.

2-4. 동작 규칙

상황 결과
신규 pg + method 가 들어옴 결제수단이 추가됩니다
기존 pg + method 에 새 resource 가 들어옴 발급키가 덮어쓰기 됩니다
기존에 있던 pg + method 가 배열에서 빠짐 그대로 유지됩니다 (자동 제거되지 않습니다)
resource 안에 필수 키(required: true)가 빠짐 400 RESOURCE_KEY_BLANK 로 거부되고 아무것도 저장되지 않습니다
resource 안에 선택 키(required: false)가 빠짐 저장됩니다(그 키는 빈 값)
resources 가 없거나 빈 배열 400 PARAMS_INVALID
status: "off" 그 결제수단을 끕니다. resource·sandbox 는 보지 않고 연동 값·MID 기록은 그대로 남습니다
status: "on" + resource 없음 저장돼 있던 연동 값으로 다시 켭니다. 저장된 값에 필수 키가 빠져 있으면 400 RESOURCE_KEY_BLANK
status: "on" + resource 연동 값을 바꾸고 켭니다
status 없음 켜짐·꺼짐을 바꾸지 않습니다(꺼 둔 결제수단에 연동 값만 바꾸면 꺼진 채로 남습니다)
sandbox: true + resource 없음 연동 값 없이 테스트 모드로 붙이거나 바꾼다(없으면 결제수단 추가). 저장된 연동 값·MID 기록은 그대로입니다
sandbox: true + resource 없음 + status: "on" 테스트 모드로 바꾸고 켭니다(저장된 연동 값의 필수 키는 보지 않습니다)
테스트 모드를 지원하지 않는 결제수단에 sandbox: true + resource 없음 400 PM_NOT_SUPPORT_SANDBOX_MODE — 아무것도 저장되지 않습니다
프로젝트에 없는 결제수단을 status 만으로 켜고 끔 404 RESELLER_PAYMENT_METHOD_NOT_SET — 처음 붙일 때는 resource(테스트 모드면 sandbox: true)를 함께 보냅니다
원소에 resource·status·sandbox: true 가 모두 없음 400 PARAMS_INVALID
필수 키 검증

갱신도 가맹점 생성 (POST /v2/reseller/seller) 과 같은 RESOURCE_KEY_BLANK 검증을 거칩니다. 검사하는 키는 PG·필수 연동 값 목록 의 required: true 인 키입니다. 관리자 화면에서 결제 모드를 고른 결제수단은 그 모드의 필수 키로 검사합니다. 저장은 결제수단의 resource 를 통째로 바꾸므로​, 키 하나만 바꿀 때도 필수 키는 모두 다시 보내고(예: MID 만 바꾸려고 mid 만 보내면 다른 필수 키가 비어 400), 지금 값을 남기고 싶은 선택 키도 함께 보냅니다 — 보내지 않은 키는 빈 값이 됩니다.

끄면 바뀌는 것

끈 결제수단은 결제창에 나오지 않아 새 결제를 받지 않습니다. 이미 발급된 정기결제 빌링키로 하는 결제는 이 설정을 보지 않으므로, 정기결제를 멈추려면 빌링키·구독 쪽에서 따로 멈춥니다. 카카오·네이버 인증서 수단은 PG 하나에서만 켤 수 있습니다 — 다른 PG 에서 켜져 있으면 PM_AUTH_CERT_ALREADY_ENABLE 이므로 같은 요청에서 그쪽을 off 로 함께 보냅니다.

2-5. 에러 코드

코드 메시지 대처 방법
API_ONLY_RESELLER 리셀러만 이용이 가능한 API입니다 리셀러 권한 계정 키로 호출합니다
API_NOT_PERMIT_LV (10000) 허가된 API 권한이 아닙니다 (HTTP 401) 계정에 이 API 호출 권한이 열려 있는지 부트페이 관리자에게 문의합니다
API_NOT_PERMIT (10001) 허가된 API 권한이 아닙니다 (HTTP 401) 계정에 이 API 호출 권한이 열려 있는지 부트페이 관리자에게 문의합니다
APP_NOT_FOUND (200) 해당 app_id 의 프로젝트가 존재하지 않습니다 (HTTP 404) app_id 오타·삭제 여부를 확인합니다
APP_NOT_PERMIT (201) 프로젝트는 있으나 본인 리셀러 하위가 아닙니다 (HTTP 401) 해당 프로젝트가 본인 하위 셀러 소속인지 확인합니다
PG_RESOURCE_NOT_FOUND resources[].pg 심볼을 찾지 못했습니다 PG 코드 에서 PG 심볼을 확인합니다
METHOD_RESOURCE_NOT_FOUND resources[].method 심볼을 찾지 못했습니다 PG 가 지원하는 결제수단 심볼인지 확인합니다
RESOURCE_KEY_BLANK (1006) resources[].resource 에 필수 키(required: true)가 빠져 있습니다 (빠진 키 이름이 메시지에 나옵니다). status: "on" 만 보냈어요면 저장된 연동 값에 필수 키가 빠져 있습니다 PG·필수 연동 값 목록 에서 required: true 인 키를 채워서 보냅니다
PARAMS_INVALID resources 가 없거나 비어 있습니다. 또는 status 가 on·off 가 아니거나, 원소에 resource·status·sandbox: true 가 모두 없습니다 갱신할 결제수단을 하나 이상, 원소마다 resource·status·sandbox: true 중 하나를 넣어 보냅니다
PM_NOT_SUPPORT_SANDBOX_MODE (1101) sandbox: true 로 연동 값 없이 붙이려는 결제수단이 테스트 모드를 지원하지 않습니다 (어느 원소인지 메시지에 나옵니다) PG·필수 연동 값 목록 에서 sandbox_supported 를 확인하고, 지원하지 않으면 resource 와 함께 보냅니다
RESELLER_PAYMENT_METHOD_NOT_SET (8181) 이 프로젝트에 설정되지 않은 결제수단을 켜거나 끄려 했습니다 (HTTP 404) 처음 붙일 때는 resource(테스트 모드면 sandbox: true)를 함께 보냅니다. 붙어 있는 결제수단은 결제수단 목록 에서 확인합니다
PM_AUTH_CERT_ALREADY_ENABLE (1111) 카카오·네이버 인증서 수단이 다른 PG 에서 이미 켜져 있습니다 같은 요청에서 다른 PG 의 그 수단을 status: "off" 로 함께 보냅니다

3결제수단 목록

하위 프로젝트에 설정된 결제수단을 모두 돌려줍니다. 켜진 것과 꺼 둔 것이 함께 나옵니다. 결제수단을 붙이거나 끄고 켜는 것은 PG 리소스 갱신 으로 합니다.

동작 규칙

  • status 가 1 이면 켜짐(결제창에 나옵니다), 0 이면 꺼짐입니다. 꺼 둔 결제수단도 연동 값과 기록이 그대로 남아 있어 다시 켤 수 있습니다.
  • resource 는 키 이름은 그대로, 값은 가린 값​​입니다(앞 5자 + *****, 10자보다 짧은 값은 앞 절반 + *****). PG 가맹점 키 원문이 응답에 실리는 곳은 가맹점 생성 뿐이고, 그 밖의 리셀러 API 는 가린 값만 줍니다.
  • sandbox_mode 가 true 면 테스트 모드입니다.
  • cert_expire_at 은 인증서가 필요한 결제수단(예: KCP 휴대폰 자동결제)의 가장 이른 인증서 만료 시각입니다. 인증서가 없으면 null 입니다.
  • 프로젝트를 만들 때 함께 붙는 부트페이 기본 결제수단(테스트 모드)도 목록에 나옵니다.
  • payment_setting_lock 은 이 프로젝트의 결제 설정 잠금 상태입니다(가맹점 잠금 seller_locked · 리셀러 잠금 reseller_locked). 잠금과 상관없이 리셀러 API 로는 결제수단을 바꿀 수 있습니다 — 결제 설정 잠금

API 정보

GEThttps://api.bootpay.co.kr/v2/reseller/seller/app/:app_id/payment-methodsBasic Auth (리셀러 계정 키)

3-1. 요청 파라미터

파라미터 타입 필수 설명
app_id String 필수 하위 프로젝트의 app_id (URL 경로)

3-2. 코드 예제

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 = '65a1c0ab8f1b5b00367a0010'
const res = await fetch(`https://api.bootpay.co.kr/v2/reseller/seller/app/${appId}/payment-methods`, {
    headers: { 'Authorization': RESELLER_AUTH }
})
const { list } = await res.json()
console.log(list.filter(pm => pm.status === 1).map(pm => `${pm.pg_alias}/${pm.method_alias}`))javascript

3-3. 응답

{
  "app_id": "65a1c0ab8f1b5b00367a0010",
  "list": [
    {
      "payment_resource_id": "65a1c0ab8f1b5b00367a0015",
      "pg_id":               "6098a1b2c3d4e5f600000101",
      "pg_name":             "나이스페이먼츠",
      "pg_alias":            "nicepay",
      "method_id":           "6098a1b2c3d4e5f600000201",
      "method_name":         "카드",
      "method_alias":        "card",
      "resource_mode":       null,
      "sandbox_mode":        false,
      "easypay":             false,
      "updated_at":          "2026-10-27T10:00:00+09:00",
      "status":              1,
      "resource": {
        "mid":          "nicep*****",
        "mkey":         "EYzu8*****"
      },
      "cert_expire_at": null
    }
  ],
  "payment_setting_lock": {
    "seller_locked":       false,
    "seller_changed_at":   null,
    "reseller_locked":     true,
    "reseller_changed_at": "2026-10-29T15:00:00+09:00"
  }
}json
필드 타입 필수 설명
app_id String 필수 프로젝트 식별자
list Array 필수 결제수단 목록
payment_resource_id String 필수 프로젝트에 붙은 결제수단 식별자
pg_id / pg_name / pg_alias String 필수 PG 식별자·이름·심볼
method_id / method_name / method_alias String 필수 결제수단 식별자·이름·심볼
resource_mode String 선택 PG 연동 방식(일부 PG 만)
sandbox_mode Boolean 필수 테스트 모드 여부
easypay Boolean 필수 간편결제 여부
updated_at String 선택 마지막 변경 시각
status Number 필수 1 켜짐, 0 꺼짐
resource Object 필수 연동 값. 키는 그대로, 값은 가린 값. 빈 값은 빈 값 그대로
cert_expire_at String 선택 인증서 만료 시각. 인증서가 없으면 null
payment_setting_lock Object 필수 결제 설정 잠금 상태
seller_locked Boolean 필수 가맹점이 자기 화면에서 켠 잠금
seller_changed_at String 선택 가맹점 잠금을 마지막으로 바꾼 시각
reseller_locked Boolean 필수 리셀러 잠금. 켜져 있으면 가맹점이 결제수단·테스트 모드·연동 값을 못 바꿉니다
reseller_changed_at String 선택 리셀러 잠금을 마지막으로 바꾼 시각

3-4. 에러 코드

코드 메시지 대처 방법
API_ONLY_RESELLER (601) 리셀러만 이용이 가능한 API입니다 리셀러 권한 계정 키로 호출합니다
API_SCOPE_INVALID 허용되지 않은 API 권한의 키입니다 (HTTP 401) 키에 이 API 의 리셀러 스코프 를 주거나 전체 권한(supervisor) 키로 호출합니다
APP_NOT_FOUND (200) 프로젝트를 찾지 못했습니다 (HTTP 404) app_id 가 올바른지 확인합니다
APP_NOT_PERMIT (201) 본인 하위 프로젝트가 아닙니다 (HTTP 401) app_id 가 본인 리셀러 하위 셀러의 프로젝트인지 확인합니다

4결제 설정 잠금

하위 프로젝트의 결제 설정을 리셀러가 잠그거나 풉니다. 잠기면 가맹점은 부트페이 관리자 화면에서 결제수단을 켜고 끄거나, 테스트 모드(샌드박스)를 바꾸거나, 연동 값(MID 등)을 저장할 수 없습니다.

동작 규칙

  • 잠금은 프로젝트(app_id) 하나에 걸립니다. 그 프로젝트의 모든 결제수단에 적용됩니다.
  • 가맹점은 이 잠금을 풀 수 없습니다. 가맹점 화면에는 "리셀러가 잠가 둔 결제 설정"이라고 보이고, 바꾸려면 리셀러에게 문의하라고 안내됩니다.
  • 가맹점도 자기 화면에서 따로 잠글 수 있습니다(가맹점 잠금). 두 잠금은 서로 다른 값입니다 — 이 API 는 리셀러 잠금만 바꾸고, 가맹점 잠금이 켜져 있어도 리셀러 잠금을 바꿀 수 있습니다.
  • 리셀러 API 는 두 잠금과 상관없이 동작합니다. PG 리소스 갱신(결제수단 추가·연동 값 갱신·켜기·끄기)은 리셀러 잠금이나 가맹점 잠금이 켜져 있어도 그대로 됩니다.
  • 지금 잠금 상태는 결제수단 목록·프로젝트 조회 응답의 payment_setting_lock 으로도 볼 수 있습니다.
  • 리셀러 관리자 콘솔의 하위 가맹점 상세 화면에서도 프로젝트마다 잠그고 풀 수 있습니다.

API 정보

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

4-1. 요청 파라미터

파라미터 타입 필수 설명
app_id String 필수 하위 프로젝트의 app_id (URL 경로)
locked Boolean 필수 true 잠금, false 풀기. 다른 값은 PARAMS_INVALID

4-2. 코드 예제

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 = '65a1c0ab8f1b5b00367a0010'
const res = await fetch(`https://api.bootpay.co.kr/v2/reseller/seller/app/${appId}/payment-lock`, {
    method:  'PUT',
    headers: { 'Authorization': RESELLER_AUTH, 'Content-Type': 'application/json' },
    body:    JSON.stringify({ locked: true })
})
const { payment_setting_lock } = await res.json()
console.log(payment_setting_lock.reseller_locked) // truejavascript

4-3. 응답

{
  "app_id": "65a1c0ab8f1b5b00367a0010",
  "payment_setting_lock": {
    "seller_locked":       false,
    "seller_changed_at":   null,
    "reseller_locked":     true,
    "reseller_changed_at": "2026-10-29T15:00:00+09:00"
  }
}json
필드 타입 필수 설명
app_id String 필수 프로젝트 식별자
payment_setting_lock Object 필수 결제 설정 잠금 상태
seller_locked Boolean 필수 가맹점이 자기 화면에서 켠 잠금. 이 API 로는 바뀌지 않습니다
seller_changed_at String 선택 가맹점 잠금을 마지막으로 켜거나 끈 시각
reseller_locked Boolean 필수 리셀러 잠금. 이 API 로 바꿉니다
reseller_changed_at String 선택 리셀러 잠금을 마지막으로 켜거나 끈 시각

4-4. 잠기면 가맹점 화면에서 막히는 것

가맹점 관리자 화면 동작 리셀러 잠금 가맹점 잠금
결제수단 켜기·끄기(모두 켜기·끄기 포함) 막힘 막힘
테스트 모드(샌드박스) 켜기·끄기 막힘 막힘
연동 값(MID·가맹점 키 등) 저장 막힘 막힘
잠금 풀기 리셀러만 가맹점 프로젝트 관리자(비밀번호 확인)

막힌 동작을 가맹점이 시도하면 PM_RESELLER_SETTING_LOCKED(8220, "리셀러가 잠가 둔 결제 설정입니다. 바꾸려면 리셀러에게 문의해 주세요.")로 거절됩니다. 리셀러 API 와 부트페이 운영팀의 처리는 막지 않습니다.

4-5. 에러 코드

코드 메시지 대처 방법
API_ONLY_RESELLER (601) 리셀러만 이용이 가능한 API입니다 리셀러 권한 계정 키로 호출합니다
API_SCOPE_INVALID 허용되지 않은 API 권한의 키입니다 (HTTP 401) 키에 reseller:app:write 리셀러 스코프 를 주거나 전체 권한(supervisor) 키로 호출합니다
PARAMS_INVALID (-33) locked 는 true 또는 false 로 보내야 합니다 (HTTP 400) locked 를 불리언으로 보냅니다
APP_NOT_FOUND (200) 프로젝트를 찾지 못했습니다 (HTTP 404) app_id 가 올바른지 확인합니다
APP_NOT_PERMIT (201) 본인 하위 프로젝트가 아닙니다 (HTTP 401) app_id 가 본인 리셀러 하위 셀러의 프로젝트인지 확인합니다

함께 보기