부트페이 공식 PHP 라이브러리 입니다 (서버사이드 용)
PHP 언어로 작성된 어플리케이션, 프레임워크 등에서 사용가능합니다.
- PG 결제창 연동은 클라이언트 라이브러리에서 수행됩니다. (Javascript, Android, iOS, React Native, Flutter 등)
- 결제 검증 및 취소, 빌링키 발급, 본인인증 등의 수행은 서버사이드에서 진행됩니다. (Java, PHP, Python, Ruby, Node.js, Go, ASP.NET 등)
- 사용하기
composer require bootpay/server-php- PHP >= 5.3.0
- ext-json
예제와 테스트는 각 SDK 루트의 .env 파일을 우선 읽습니다. 먼저 .env.example을 복사한 뒤 필요한 키만 변경하세요. .env는 gitignore 처리되어 커밋되지 않습니다.
cp .env.example .env
# BOOTPAY_ENV=production 또는 development주요 변수:
BOOTPAY_ENV=production
BOOTPAY_PG_CLIENT_KEY_PROD=...
BOOTPAY_PG_SECRET_KEY_PROD=...
BOOTPAY_PG_CLIENT_KEY_DEV=...
BOOTPAY_PG_SECRET_KEY_DEV=...
BOOTPAY_COMMERCE_CLIENT_KEY_PROD=...
BOOTPAY_COMMERCE_SECRET_KEY_PROD=...
BOOTPAY_COMMERCE_CLIENT_KEY_DEV=...
BOOTPAY_COMMERCE_SECRET_KEY_DEV=...변수가 없으면 SDK 테스트용 기본값(NodeJS 기준 ck/sk)으로 fallback 합니다.
<?php
require_once 'vendor/autoload.php';
use Bootpay\ServerPhp\BootpayApi;
BootpayApi::setClientKeyConfiguration(
getenv('BOOTPAY_PG_CLIENT_KEY_PROD'),
getenv('BOOTPAY_PG_SECRET_KEY_PROD')
);
// Legacy application_id/private_key 방식은 setConfiguration()으로 계속 지원됩니다.
$response = BootpayApi::getAccessToken();
var_dump($response);함수 단위의 샘플 코드는 tests/pg 폴더를 참조하세요.
부트페이와 서버간 통신을 하기 위해서는 부트페이 서버로부터 토큰을 발급받아야 합니다. 발급된 토큰은 30분간 유효하며, 최초 발급일로부터 30분이 지날 경우 토큰 발급 함수를 재호출 해주셔야 합니다.
<?php
require_once 'vendor/autoload.php';
use Bootpay\ServerPhp\BootpayApi;
BootpayApi::setClientKeyConfiguration(
getenv('BOOTPAY_PG_CLIENT_KEY_PROD'),
getenv('BOOTPAY_PG_SECRET_KEY_PROD')
);
$response = BootpayApi::getAccessToken();
var_dump($response);결제창 및 정기결제에서 승인/취소된 결제건에 대하여 올바른 결제건인지 서버간 통신으로 결제검증을 합니다.
$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::receiptPayment('receipt_id_here');
var_dump($response);
}price를 지정하지 않으면 전액취소 됩니다.
$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::cancelPayment(array(
'receipt_id' => 'receipt_id_here',
'cancel_price' => 1000, // 부분취소 금액 (없으면 전액취소)
'cancel_tax_free' => 0,
'cancel_username' => '관리자',
'cancel_message' => '테스트 결제 취소'
));
var_dump($response);
}REST API 방식으로 고객으로부터 카드 정보를 전달하여, PG사에게 빌링키를 발급받을 수 있습니다.
$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::getSubscribeBillingKey(
'nicepay', // PG사
'subscription_' . time(), // subscription_id
'30일 정기권 결제', // order_name
'5570********1074', // card_no
'12', // card_pw (앞 2자리)
'25', // card_expire_year
'12', // card_expire_month
'901012' // card_identity_no (생년월일 또는 사업자번호)
);
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::requestSubscribeAutomaticTransferBillingKey(array(
'pg' => 'nicepay',
'subscription_id' => 'subscription_' . time(),
'order_name' => '자동이체 등록',
'auth_type' => 'ARS',
'username' => '홍길동',
'bank_name' => '국민은행',
'bank_account' => '12345678901234',
'identity_no' => '901012'
));
var_dump($response);
}발급된 빌링키로 원하는 시점에 결제 승인 요청을 합니다.
$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::requestSubscribeCardPayment(array(
'billing_key' => 'billing_key_here',
'order_name' => '정기결제 테스트',
'price' => 1000,
'order_id' => 'order_' . time()
));
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::subscribePaymentReserve(array(
'billing_key' => 'billing_key_here',
'order_name' => '예약결제 테스트',
'price' => 1000,
'order_id' => 'order_' . time(),
'reserve_execute_at' => date('Y-m-d H:i:s', strtotime('+1 day'))
));
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::subscribePaymentReserveLookup('reserve_id_here');
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::cancelSubscribeReserve('reserve_id_here');
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::destroyBillingKey('billing_key_here');
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::lookupSubscribeBillingKey('receipt_id_here');
var_dump($response);
}부트페이에서 제공하는 간편결제창, 생체인증 기반의 결제 사용을 위해 사용자 토큰을 발급합니다.
$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::requestUserToken(array(
'user_id' => 'user_123',
'phone' => '01012345678'
));
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::confirmPayment('receipt_id_here');
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::certificate('receipt_id_here');
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::shippingStart(array(
'receipt_id' => 'receipt_id_here',
'tracking_number' => '1234567890',
'delivery_corp' => 'CJ대한통운',
'user' => array(
'username' => '홍길동',
'phone' => '01012345678'
)
));
var_dump($response);
}기존 결제건에 대해 현금영수증을 발행합니다.
$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::cashReceiptPublishOnReceipt(array(
'receipt_id' => 'receipt_id_here',
'identity_no' => '01012345678',
'cash_receipt_type' => '소득공제'
));
var_dump($response);
}$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::cashReceiptCancelOnReceipt('receipt_id_here');
var_dump($response);
}결제 건과 별개로 현금영수증을 발행합니다.
$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::requestCashReceipt(array(
'pg' => 'nicepay',
'price' => 1000,
'order_name' => '테스트 상품',
'order_id' => 'order_' . time(),
'cash_receipt_type' => '소득공제',
'identity_no' => '01012345678'
));
var_dump($response);
}pg 는 선택 파라미터입니다. 생략하면 가맹점에 설정된 기본 PG 로 발행됩니다.
$response = BootpayApi::requestCashReceipt(array(
'price' => 1000,
'order_name' => '테스트 상품',
'order_id' => 'order_' . time(),
'cash_receipt_type' => '소득공제',
'identity_no' => '01012345678'
));$token = BootpayApi::getAccessToken();
if (!$token->error_code) {
$response = BootpayApi::cancelCashReceipt('receipt_id_here');
var_dump($response);
}<?php
require_once 'vendor/autoload.php';
use Bootpay\ServerPhp\BootpayCommerceApi;
$bootpay = new BootpayCommerceApi(
'your_client_key',
'your_secret_key',
'production' // 또는 'development'
);
try {
// 토큰 발급
$bootpay->getAccessToken();
// API 호출 예시
$response = $bootpay->user->getList(array('page' => 1, 'limit' => 10));
print_r($response);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}함수 단위의 샘플 코드는 tests/commerce 폴더를 참조하세요.
Commerce API 사용을 위한 토큰을 발급받습니다.
$bootpay = new BootpayCommerceApi(
'your_client_key',
'your_secret_key',
'production'
);
$bootpay->getAccessToken();$response = $bootpay->user->token('user_id_here');$response = $bootpay->user->join(array(
'login_id' => 'test_user',
'login_pw' => 'password123',
'username' => '홍길동',
'email' => 'test@example.com',
'phone' => '01012345678'
));회원등급 필터의 서버 키는 membership_type 입니다. 기존 호환을 위해 member_type 으로 넘겨도 membership_type 으로 전송됩니다.
$response = $bootpay->user->getList(array(
'page' => 1,
'limit' => 10,
'membership_type' => 1
));$response = $bootpay->user->detail('user_id_here');$response = $bootpay->user->update(array(
'user_id' => 'user_id_here',
'username' => '변경된 이름'
));$response = $bootpay->user->delete('user_id_here');$response = $bootpay->userGroup->create(array(
'company_name' => '테스트 회사',
'business_number' => '1234567890',
'ceo_name' => '홍길동',
'corporate_type' => 2
));$response = $bootpay->userGroup->getList(array(
'page' => 1,
'limit' => 10
));$response = $bootpay->userGroup->detail('user_group_id_here');$response = $bootpay->userGroup->update(array(
'user_group_id' => 'user_group_id_here',
'company_name' => '변경된 회사명'
));$response = $bootpay->product->getList(array(
'page' => 1,
'limit' => 10
));
// Mall API — category_id / ex_uid / sort 필터 지원 (ex_uid 는 외부 UID 로 상품 조회)
$response = $bootpay->product->products(array(
'page' => 1,
'limit' => 10,
'ex_uid' => 'EX-1'
));$response = $bootpay->product->create(array(
'name' => '테스트 상품',
'price' => 10000,
'type' => 1
));user_jwt 를 함께 넘기면 회원 컨텍스트로 조회합니다 (선택).
$response = $bootpay->product->detail('product_id_here');
$response = $bootpay->product->detail('product_id_here', 'user_jwt_here');$response = $bootpay->product->update(array(
'product_id' => 'product_id_here',
'name' => '변경된 상품명'
));$response = $bootpay->product->delete('product_id_here');status / payment_status / order_subscription_ids 는 배열·단일 값·콤마 문자열을 모두 받습니다 (빈 값은 전송하지 않습니다).
날짜 필터 키는 search_date_from / search_date_to 입니다.
$response = $bootpay->order->getList(array(
'page' => 1,
'limit' => 10,
'status' => array(1, 2),
'order_subscription_ids' => array('order_subscription_id_here'),
'subscription_billing_type' => 1
));$response = $bootpay->order->detail('order_id_here');$response = $bootpay->orderCancel->request(array(
'order_id' => 'order_id_here',
'cancel_reason' => '고객 요청'
));$response = $bootpay->invoice->getList(array(
'page' => 1,
'limit' => 10
));$response = $bootpay->invoice->create(array(
'user_id' => 'user_id_here',
'price' => 10000,
'order_name' => '청구서 테스트'
));$response = $bootpay->invoice->notify('invoice_id_here', array(
'send_types' => array(1) // 1: SMS
));order_number 로 주문번호 역조회가 가능합니다. 날짜 필터 키는 search_date_from / search_date_to (또는 s_at / e_at) 입니다.
$response = $bootpay->orderSubscription->getList(array(
'page' => 1,
'limit' => 10,
'order_number' => 'order_number_here'
));$response = $bootpay->orderSubscription->detail('order_subscription_id_here');$response = $bootpay->orderSubscription->requestIng->pause(array(
'order_subscription_id' => 'order_subscription_id_here'
));$response = $bootpay->orderSubscription->requestIng->resume(array(
'order_subscription_id' => 'order_subscription_id_here'
));$response = $bootpay->orderSubscription->requestIng->calculateTerminationFee(array(
'order_subscription_id' => 'order_subscription_id_here'
));$response = $bootpay->orderSubscription->requestIng->termination(array(
'order_subscription_id' => 'order_subscription_id_here'
));price 는 회차별 결제 금액의 기준금액입니다. 변경하면 결제예정(READY) 회차의 청구액이 즉시 다시 계산되고, 이후 회차도 이 금액으로 생성됩니다. 이미 결제된 회차는 그대로입니다. 0 이하는 받지 않습니다.
$response = $bootpay->orderSubscription->update(array(
'order_subscription_id' => 'order_subscription_id_here',
'price' => 19900,
'memo' => '고객 요청 금액 변경' // 변경이력에 남길 사유 (선택)
));특정 회차만 금액을 가감하려면 조정항목을 사용합니다. 회차 지정 방법은 3가지입니다.
// 5회차 한 건만
$response = $bootpay->orderSubscriptionAdjustment->create('order_subscription_id_here', array(
'duration' => 5,
'price' => -1000,
'name' => '5회차 할인'
));
// 3~7회차 각각 한 건씩 (총 5건)
$response = $bootpay->orderSubscriptionAdjustment->create('order_subscription_id_here', array(
'duration_from' => 3,
'duration_to' => 7,
'price' => -1000,
'name' => '3~7회차 할인'
));
// 3회차부터 계약 끝까지 (레코드 1건, duration_to 는 무시)
$response = $bootpay->orderSubscriptionAdjustment->create('order_subscription_id_here', array(
'duration_from' => 3,
'is_unlimited' => true,
'price' => -1000,
'name' => '3회차 이후 상시 할인'
));상한은 계약 총회차이며, 총회차가 무제한인 계약은 60회차까지입니다. 이미 결제가 끝난 회차는 거절되며, 범위 중 한 회차라도 최종 금액이 음수면 전부 거절됩니다 (부분 반영 없음).
카카오 알림톡 발송·템플릿·수신거부·웹훅을 다루는 /v1/alimtalk 계열 API입니다.
⚠️ 발송 계열은 샌드박스가 없습니다.alimtalkSend->send()·sendBulk()는 실제로 카카오톡이 나가고 과금되며,alimtalkSender->otp()는 채널 관리자폰으로 실제 문자를,alimtalkSender->create()·alimtalkTemplate->register()·alimtalkTemplate->inspect()는 카카오에 실제 등록·검수 요청을 보냅니다.
알림톡 계열은 서버 스코프가 전부
user:alimtalk_*라BOOTPAY-ROLE: user로 고정 전송됩니다. 또한Idempotency-Key헤더를 붙이지 않습니다 — 알림톡 API 는 이 헤더를 읽지 않으며, 멱등은 발송 payload 의ref_id로만 성립합니다.
카테고리 조회 → OTP 발송 → 발신프로필 등록 → 목록/상세 → 연동 해지 순으로 사용합니다. 등록이 끝나면 서버가 그룹키 등록까지 수행하므로 공식 템플릿은 별도 채택 없이 바로 발송됩니다.
// 등록에 필요한 category_code 후보 조회
$response = $bootpay->alimtalkSender->categories();
// ⚠️ 채널 관리자폰으로 실제 문자가 발송됩니다
$response = $bootpay->alimtalkSender->otp(array(
'yellow_id' => '@bootpay',
'phone' => '01012345678'
));
// ⚠️ 카카오에 발신프로필이 실제 등록됩니다 (같은 yellow_id 재등록 시 기존 프로필 재사용)
$response = $bootpay->alimtalkSender->create(array(
'otp' => '123456',
'yellow_id' => '@bootpay',
'phone' => '01012345678',
'category_code' => '001001'
));
$response = $bootpay->alimtalkSender->getList();
$response = $bootpay->alimtalkSender->detail('ksp_id_here'); // 자체 DB 만 조회
$response = $bootpay->alimtalkSender->detail('ksp_id_here', true); // 벤더에서 상태 재조회 (느립니다)
// 템플릿 미리보기용 변수 예문 (표시용이며 발송값이 아닙니다. 보낸 키만 덮어씁니다)
$response = $bootpay->alimtalkSender->variableExamples('ksp_id_here', array(
'user_name' => '홍길동',
'company_name' => '부트페이몰'
));
// 이 프로젝트와의 연동만 끊습니다 (채널 모델·템플릿은 보존)
$response = $bootpay->alimtalkSender->release('ksp_id_here');부트페이가 미리 카카오 승인을 받아 둔 템플릿이라, 그룹키가 등록된 채널이면 검수 없이 즉시 발송됩니다. 전부 조회 계열이라 부작용이 없습니다.
// keyword 는 본문·이름·분류 부분일치. msg_type 은 BA(기본형)·EX(부가정보형)만 존재합니다.
$response = $bootpay->alimtalkOfficial->getList(array(
'keyword' => '주문',
'category' => '주문',
'msg_type' => 'BA',
'page' => 1,
'per' => 20, // 서버 기본 20, 최대 100
'ksp_id' => 'ksp_id_here'
));
// 보내려는 문구로 유사 템플릿 추천 (score 내림차순)
$response = $bootpay->alimtalkOfficial->recommend(array(
'text' => '주문이 완료되었습니다',
'limit' => 5
));
$response = $bootpay->alimtalkOfficial->detail('official_code_here');(초안 생성 → 확인 → 대행사 등록) → 검수 요청 → 승인(APR) → 발송 가능 순서입니다.
⚠️ register를 명시적으로false로 주지 않으면 생성 즉시 대행사·카카오에 실제 등록됩니다. 본문 변수는#{변수명}형식이며 템플릿 전체에서 최대 40개입니다.
// ins: 1 REG(등록) / 2 REQ(검수요청) / 3 APR(승인) / 4 KRR(등록거절) / 5 REJ(승인반려) — 'APR' 같은 문자열도 받습니다
// ⚠️ 페이지네이션이 없습니다 (필터에 걸린 템플릿을 한 번에 모두 반환)
$response = $bootpay->alimtalkTemplate->getList(array(
'ins' => 'APR',
'sort' => 'latest', // latest(기본) / oldest / code
'keyword' => '주문'
));
// 초안만 생성 (권장)
$response = $bootpay->alimtalkTemplate->create(array(
'ksp_id' => 'ksp_id_here',
'name' => '주문완료 안내',
'content' => "#{user_name}님, 주문이 완료되었습니다.",
'register' => false,
'msg_type' => 'BA', // BA / EX(template_extra 필수) / AD / MI (AD·MI 는 채널추가 버튼 필수)
'emphasize_type' => 'NONE', // NONE / TEXT / IMAGE / ITEM_LIST
'examples' => array('user_name' => '홍길동') // 주면 모든 변수에 예문이 있어야 합니다
));
// ⚠️ sync 는 서버 기본값이 true 라 조회만 해도 벤더 동기화가 일어납니다. 초안은 false 권장.
$response = $bootpay->alimtalkTemplate->detail('template_id_here', false);
// ⚠️ 부분 수정이 아닙니다 — 보내지 않은 필드는 null 로 덮어써집니다. 항상 전체 필드를 보내세요.
$response = $bootpay->alimtalkTemplate->update('template_id_here', array(
'name' => '주문완료 안내',
'content' => "#{user_name}님, 주문이 완료되었습니다."
));
$response = $bootpay->alimtalkTemplate->register('template_id_here'); // ⚠️ 대행사·카카오 실제 등록
$response = $bootpay->alimtalkTemplate->inspect('template_id_here'); // ⚠️ 카카오 검수 요청 (취소 불가)
$response = $bootpay->alimtalkTemplate->delete('template_id_here');
// 이미지 업로드 — 돌려받은 image_url 을 create/update 의 storage_image_url 로 넘깁니다
$response = $bootpay->alimtalkTemplate->image('/path/to/body.png'); // jpg/png · 500KB 이하 · 가로 500px 이상 · 2:1
$response = $bootpay->alimtalkTemplate->highlightImage('/path/to/thumb.png'); // jpg/png · 500KB 이하 · 가로 108px 이상 · 1:1내보내기는 format 기본값이 json 입니다. csv 로 주면 응답을 파싱하지 않고 원문 그대로 돌려줍니다.
$response = $bootpay->alimtalkTemplate->export(array(
'scope' => 'private', // private(기본) / official / all
'ksp_id' => 'ksp_id_here',
'status' => 'APR',
'include_content' => true
));
// csv 는 { body: '<원문 문자열>', content_type: '...', status: 200 } 로 돌아옵니다
$csv = $bootpay->alimtalkTemplate->export(array('format' => 'csv', 'scope' => 'private'));
echo $csv->body;1회 5,000건을 넘으면 거부(3031)되므로 채널·상태 필터로 좁혀 주세요.
⚠️ 실제로 카카오톡이 발송되고 과금됩니다.
$response = $bootpay->alimtalkSend->send(array(
'template_code' => 'template_code_here',
'to' => '01012345678',
'variables' => array('user_name' => '홍길동', 'company_name' => '부트페이몰'),
'ref_id' => 'order-0001', // 멱등 키 — 같은 값으로 재요청하면 기존 receipt 를 반환
'fallback' => false, // 알림톡 실패 시 문자(LMS) 대체발송
'reserved_at' => '2026-09-01T10:00:00+09:00', // 생략하면 즉시 발송
'sender_key' => 'sender_key_here' // 연동 채널이 둘 이상일 때만 필수
));
fallback은 미지정(생략)과false의 의미가 다릅니다. 생략하면 프로젝트 기본값을 따르고,false는 명시적으로 끕니다. 켜면 발신번호가 등록돼 있어야 하며 없으면 거부(3030)됩니다.
// 벌크 발송 (1요청 = N수신자) — ⚠️ 수신자 수만큼 실제 발송·과금됩니다
$response = $bootpay->alimtalkSend->sendBulk(array(
'template_code' => 'template_code_here',
'recipients' => array(
array('to' => '01012345678', 'ref_id' => 'bulk-0001', 'variables' => array('user_name' => '홍길동')),
array('to' => '01087654321', 'ref_id' => 'bulk-0002', 'variables' => array('user_name' => '김철수'))
)
));
// 예약 발송 취소 — 접수(READY) 상태의 예약 건만 가능합니다
$response = $bootpay->alimtalkSend->cancel('receipt_id_here');벌크는 쿼터를 넘으면 요청 시점에 전체 거부(3022)됩니다. 수신거부 번호는
skipped로 빠지며 과금되지 않습니다.
유료 알림톡만 조회됩니다(무료 커머스 알림톡은 포함되지 않습니다).
$response = $bootpay->alimtalkMessage->getList(array(
'template_code' => 'template_code_here',
'status' => 'success', // requested / success / failed / canceled
'ref_id' => 'order-0001',
'to' => '01012345678',
's_at' => '2026-08-01',
'e_at' => '2026-08-27',
'page' => 1,
'limit' => 20 // 서버 기본 20, 최대 100
));
$response = $bootpay->alimtalkMessage->stats(array('s_at' => '2026-08-01', 'e_at' => '2026-08-27'));
$response = $bootpay->alimtalkMessage->detail('receipt_id_here');기간 기본값은 최근 30일이고 최대 조회 폭은 92일입니다. 초과분은 거부하지 않고 시작일을 당겨 잘라내므로, 실제 적용 구간은 응답의
period로 확인하세요. 집계의billing.unit_price_source가default면 잠정 단가입니다(확정 청구액이 아닙니다).
발송 판정과 같은 기준(부트페이 전역 + 내 프로젝트)으로 다룹니다.
// phone 은 숫자만 남겨 부분일치로 찾습니다 (50건 단위 페이징)
$response = $bootpay->alimtalkOptout->getList(array('phone' => '1234', 'page' => 1));
$response = $bootpay->alimtalkOptout->create(array('phone' => '01012345678', 'reason' => 'CRM 동기화'));
// 발송 전 사전 확인 — 벌크에서 skipped 로 낭비될 건을 미리 뺄 수 있습니다 (1회 최대 1,000건)
$response = $bootpay->alimtalkOptout->check(array('phones' => array('01012345678', '01087654321')));
$response = $bootpay->alimtalkOptout->check(array('phone' => '01012345678'));
$response = $bootpay->alimtalkOptout->release('01012345678');
⚠️ 전역(global) 수신거부는 조회는 되지만 해제할 수 없습니다(releasable: false). 해제를 호출해도 전역 차단은 남고 응답의global_blocked: true로 알려 줍니다.
⚠️ 주문·구독 통합 웹훅(webhook->sendTest())과 완전히 별개입니다. 알림톡 이벤트를 기존 주문 웹훅 URL 로 태우면 수신 서버가 모르는 payload 를 받아 기존 연동이 깨집니다.
$response = $bootpay->alimtalkWebhook->detail(); // 미설정이면 { configured: false }
// url 은 https 만 허용합니다. 최초 저장 시 서명 시크릿이 자동 발급됩니다.
$response = $bootpay->alimtalkWebhook->update(array(
'url' => 'https://example.com/hooks/alimtalk',
'events' => array(301, 302, 303, 304, 310, 311),
'enabled' => true
));
$response = $bootpay->alimtalkWebhook->test(); // ⚠️ 설정된 URL 로 실제 요청이 나갑니다
$response = $bootpay->alimtalkWebhook->rotateSecret(); // ⚠️ 이 응답에서만 secret 원문을 돌려줍니다
$response = $bootpay->alimtalkWebhook->deliveries(array('page' => 1, 'limit' => 20));이벤트 코드: 300 발송 접수(기본 미구독) / 301 전달 성공 / 302 전달 실패 / 303 예약 취소 / 304 문자(LMS) 대체발송 전환 / 310 검수 승인 / 311 검수 반려 / 320 수신거부 등록(기본 미구독). events 를 비우면 기본 구독셋(301·302·303·304·310·311)이 적용됩니다.
서명 검증은 다음 헤더로 합니다. 타임스탬프가 5분 이상 지난 요청은 거부하세요(replay 방지).
X-Bootpay-Signature: sha256=HMAC_SHA256(secret, "{X-Bootpay-Timestamp}.{raw_body}")
Commerce API에서는 역할(Role)에 따라 접근 권한이 달라집니다.
// 매니저 역할로 설정
$bootpay->asManager();
// 사용자 역할로 설정
$bootpay->asUser();
// 파트너 역할로 설정
$bootpay->asPartner();
// 역할 초기화
$bootpay->clearRole();적용한 샘플 프로젝트를 참조해주세요
부트페이 홈페이지에서 문의해주세요!