이 문서는 아직 실행되지 않은 예약결제를 reserve_id로 취소하는 방법을 설명해요.
예약 취소는 “미래 결제 예약을 제거하는 작업”이에요. 이미 결제가 실행된 뒤에는 예약 취소가 아니라 receipt_id 기준 결제 취소를 호출해야 해요.
핵심 요약
- 예약 취소는 아직 실행되지 않은 예약만 제거해요.
- 결제가 이미 실행됐다면
reserve_id가 아니라receipt_id로 결제 취소를 호출해야 해요. - 결제수단 해지나 탈퇴 처리에서는 예약 취소를 먼저 하고, 그 다음 필요하면 빌링키를 삭제해요.
- 취소 성공 후 내부 DB의 예약 상태를
cancelled로 바꿔 중복 취소를 막아요.
취소 판단 흐름
예약 취소와 결제 취소의 차이
| 상황 | 사용 API | 설명 |
|---|---|---|
| 예약 시간이 아직 오지 않음 | 예약 취소 API | 대기 중인 예약을 제거해요 |
| 예약 실행 여부가 불확실함 | 예약 조회 | 상태를 확인한 뒤 취소 방식을 정해요 |
| 이미 결제가 실행됨 | 결제 취소 | receipt_id 기준으로 결제를 취소/환불해요 |
빌링키 삭제보다 예약 취소가 먼저예요
고객이 결제수단을 해지하거나 탈퇴하더라도 빌링키 삭제만으로 예약결제가 취소된다고 가정하면 안 돼요. 대기 중인 예약을 먼저 취소하고, 그 다음 필요하면 빌링키 삭제를 처리해야 해요.
API 엔드포인트
DELETE
https://api.bootpay.co.kr/v2/subscribe/payment/reserve/:reserve_idBasic Auth이미 실행된 예약 결제는 예약 취소 API로 취소할 수 없어요. 실행 후에는 receipt_id로 결제 취소를 호출해야 해요.
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
reserve_id |
String | 필수 | 예약 결제 ID (URL 파라미터) |
코드 예제
import { Bootpay } from '@bootpay/backend-js'
Bootpay.setConfiguration({
client_key: '[ Client Key ]',
secret_key: '[ Secret Key ]'
})
try {
const response = await Bootpay.cancelSubscribeReserve(
'6261104e1fc19202e6f9420e'
)
console.log(response)
} catch (e) {
console.log(e)
}javascriptfrom bootpay_backend import BootpayBackend
bootpay = BootpayBackend('APPLICATION_ID', 'PRIVATE_KEY')
response = bootpay.cancel_subscribe_reserve('6261104e1fc19202e6f9420e')
print(response)pythonuse Bootpay\ServerPhp\BootpayApi;
BootpayApi::setConfiguration('APPLICATION_ID', 'PRIVATE_KEY');
$response = BootpayApi::cancelSubscribeReserve('6261104e1fc19202e6f9420e');
print_r($response);phpimport kr.co.bootpay.pg.Bootpay;
Bootpay bootpay = new Bootpay("APPLICATION_ID", "PRIVATE_KEY");
var response = bootpay.reserveCancelSubscribe("6261104e1fc19202e6f9420e");
System.out.println(response);javabootpay = Bootpay::Api.new(application_id: 'APPLICATION_ID', private_key: 'PRIVATE_KEY')
response = bootpay.request(
method: :delete,
uri: 'subscribe/payment/reserve/6261104e1fc19202e6f9420e'
)
puts response.datarubyimport "github.com/bootpay/backend-go/v2"
api := bootpay.NewAPI("APPLICATION_ID", "PRIVATE_KEY", nil, "")
response, err := api.ReserveCancelSubscribe("6261104e1fc19202e6f9420e")
if err != nil {
log.Fatal(err)
}
fmt.Println(response)gousing Bootpay;
var bootpay = new BootpayApi("APPLICATION_ID", "PRIVATE_KEY");
var response = await bootpay.ReserveCancelSubscribe("6261104e1fc19202e6f9420e");
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);csharp응답
성공 응답
{
"reserve_id": "6261104e1fc19202e6f9420e",
"success": true
}json응답 파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
| reserve_id | String | 취소된 예약 번호 |
| success | Boolean | 취소 성공 여부 |
에러 코드
공통 에러
인증·권한 관련 에러는 에러 코드표를 참고해요.
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
BS_NOT_FOUND (2504) |
예약결제 정보를 찾지 못했다 | reserve_id가 올바른지 확인해요 |
BS_UNAUTHORIZED (2509) |
예약결제 접근 권한 없음 | 해당 예약의 소유자 계정으로 요청해요 |
BS_NOT_READY (2505) |
예약결제 대기 상태가 아니다 | 이미 실행되었거나 취소된 예약이에요. 예약 상태를 조회해요 |
