리셀러 본인 하위에 만들어둔 테스트 셀러 한 곳을 삭제한다. 셀러 자신, 셀러의 모든 프로젝트(app), 프로젝트에 발급된 SDK 연동키(AppKey), 셀러 단위 멤버 권한(ProviderRole) 이 정리된다.
테스트 전용
이 엔드포인트는 통합 테스트·CI 에서 만들어둔 데이터를 정리하기 위한 용도다. 운영 데이터에는 절대 호출하지 않는다. 삭제된 셀러·프로젝트는 복구할 수 없다.
삭제되지 않는 것
결제 내역(Receipt)·정산 데이터·회원(Member) 은 이 API 로 삭제되지 않고 그대로 남는다. 삭제 대상은 아래 삭제 범위 표에 정리된 항목뿐이다. 결제 내역이 있는 셀러를 삭제하면 소유자가 사라진 결제 데이터가 남게 되므로, 실제 결제가 발생한 셀러에는 호출하지 않는다.
핵심 요약
- 리셀러 본인의 하위가 아닌 셀러는 삭제되지 않는다.
provider_id가 다른 리셀러 소속이면PROVIDER_NOT_FOUND가 떨어진다. - 본인(리셀러 자기 자신) 의
provider_id를 넣어도 거부된다. 리셀러 자체는 이 API 로 삭제할 수 없다. - 한 번에 한 셀러만 삭제된다. 대량 정리는 반복 호출이 필요하다.
API 정보
DELETE
https://api.bootpay.co.kr/v2/reseller/test/seller/:provider_idBasic Auth (리셀러 계정 키)요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
provider_id |
String | 필수 | 삭제할 테스트 셀러의 provider_id (URL 경로) |
코드 예제
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 providerId = '65a1c0aa8f1b5b00367a0001'
const res = await fetch(`https://api.bootpay.co.kr/v2/reseller/test/seller/${providerId}`, {
method: 'DELETE',
headers: { 'Authorization': RESELLER_AUTH }
})
console.log(res.status) // 200javascriptimport base64, os, requests
auth = 'Basic ' + base64.b64encode(
f"{os.environ['BOOTPAY_RESELLER_CLIENT_KEY']}:{os.environ['BOOTPAY_RESELLER_SECRET_KEY']}".encode()
).decode()
provider_id = '65a1c0aa8f1b5b00367a0001'
res = requests.delete(
f'https://api.bootpay.co.kr/v2/reseller/test/seller/{provider_id}',
headers={'Authorization': auth}
)
print(res.status_code)pythonRESELLER_AUTH=$(printf '%s' "$BOOTPAY_RESELLER_CLIENT_KEY:$BOOTPAY_RESELLER_SECRET_KEY" | base64)
PROVIDER_ID='65a1c0aa8f1b5b00367a0001'
curl -X DELETE "https://api.bootpay.co.kr/v2/reseller/test/seller/$PROVIDER_ID" \
-H "Authorization: Basic $RESELLER_AUTH"bash삭제 범위
한 번의 호출로 아래가 정리된다.
| 대상 | 설명 |
|---|---|
| 셀러(provider) | 셀러 자체 레코드 |
| 프로젝트(app) | 셀러가 소유한 모든 프로젝트 |
| AppKey | 프로젝트에 발급된 SDK 용 application_id 만 삭제된다. Basic Auth 에 쓰는 client_key / secret_key (AppKeyChain) 는 그대로 남는다 |
| ProviderRole | 셀러에 묶인 모든 팀 멤버 권한 |
| AppRole | 현재 구현에서는 정리되지 않는다. 프로젝트 멤버 권한 레코드가 그대로 남는다 |
결제·정산 데이터
이 API 는 셀러와 프로젝트 레코드를 삭제하지만, 결제 내역·정산 데이터·회원 계정은 남긴다. 실제 결제 내역이 있는 운영 셀러에는 호출하면 안 된다. 테스트 환경에서만 사용한다.
응답
성공 시 본문은 비어 있고, HTTP 200 으로 떨어진다.
에러 코드
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
API_ONLY_RESELLER |
리셀러만 이용이 가능한 API 다 | 리셀러 권한 계정 키로 호출한다 |
PROVIDER_NOT_FOUND |
셀러가 본인 하위에 없거나 본인 자신이다 | provider_id 가 본인 하위 셀러인지 확인한다. 리셀러 자기 자신은 삭제 불가 |
CI 에서 쓰는 패턴
테스트 흐름은 보통 셋업·검증·정리 세 단계로 묶인다.
// 1) 셋업 — 테스트용 셀러 생성
const seller = await createTestSeller({
primary_key: `ci-${process.env.GITHUB_RUN_ID}-${Date.now()}`,
company_name: 'CI Sandbox',
email: `ci+${Date.now()}@example.com`
})
try {
// 2) 검증 — 결제 흐름 테스트
await runPaymentFlow(seller.apps[0].application_keys[0].key)
} finally {
// 3) 정리 — 어떤 결과든 셀러 일괄 삭제
await fetch(`https://api.bootpay.co.kr/v2/reseller/test/seller/${seller.provider_id}`, {
method: 'DELETE',
headers: { 'Authorization': RESELLER_AUTH }
})
}javascriptprimary_key 에 CI 빌드 식별자를 박아두면 누구의 어떤 실행에서 만든 셀러인지 추적이 쉽다. 정리에서 누락된 잔여 셀러가 있어도 primary_key 패턴으로 찾아 일괄 처리할 수 있다.