부트페이 공식 Go 라이브러리입니다.
- 설치하기
- PG API 사용하기
- API 목록
- Commerce API 사용하기
- Example 프로젝트
- Documentation
- 기술문의
- License
go get -u github.com/bootpay/backend-go/v2예제와 테스트는 각 SDK 루트의 .env 파일을 우선 읽습니다. 먼저 .env.example을 복사한 뒤 필요한 키만 변경하세요. .env는 gitignore 처리되어 커밋되지 않습니다.
cp .env.example .env
# BOOTPAY_ENV=production 또는 development주요 변수:
BOOTPAY_ENV=productionBOOTPAY_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_PROD=...BOOTPAY_COMMERCE_SECRET_KEY_PROD=...변수가 없으면 SDK 테스트용 기본값(NodeJS 기준 ck/sk)으로 fallback 합니다.
import (
bootpay "github.com/bootpay/backend-go/v2"
)
funcmain() {
// 권장: client_key/secret_key 방식api:=bootpay.NewAPIWithClientKey(
os.Getenv("BOOTPAY_PG_CLIENT_KEY_PROD"),
os.Getenv("BOOTPAY_PG_SECRET_KEY_PROD"),
nil, // http.Client (nil이면 기본값 사용)"", // mode: "", "development", "test", "stage"
)
// legacy application_id/private_key 방식도 NewAPI로 계속 지원됩니다.// 토큰 발급token, err:=api.GetToken()
iferr!=nil {
panic(err)
}
fmt.Println(token)
}| Mode | Base URL |
|---|---|
"" (기본값) | https://api.bootpay.co.kr/v2 |
"development" | https://dev-api.bootpay.co.kr/v2 |
"test" | https://test-api.bootpay.co.kr/v2 |
"stage" | https://stage-api.bootpay.co.kr/v2 |
부트페이와 서버간 통신을 하기 위해서는 부트페이 서버로부터 토큰을 발급받아야 합니다. 발급된 토큰은 30분간 유효하며, 30분이 지날 경우 토큰 발급 함수를 재호출 해주셔야 합니다.
funcGetToken(api*bootpay.Api) {
token, err:=api.GetToken()
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(token)
}결제창 및 정기결제에서 승인/취소된 결제건에 대하여 올바른 결제건인지 서버간 통신으로 결제검증을 합니다.
funcGetReceipt(api*bootpay.Api) {
receiptId:="62afc194e38c300021b345d4"receipt, err:=api.GetReceipt(receiptId)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(receipt)
}CancelPrice를 지정하지 않으면 전액취소 됩니다.
주의사항:
- 휴대폰 결제의 경우 이월될 경우 이통사 정책상 취소되지 않습니다
- 정산받으실 금액보다 취소금액이 클 경우 PG사 정책상 취소되지 않을 수 있습니다
- 가상계좌의 경우 CMS 특약이 되어있지 않으면 취소되지 않습니다
부분취소 지원 PG사: 이니시스, KCP, 다날, 페이레터, 나이스페이, 카카오페이, 페이코
funcReceiptCancel(api*bootpay.Api) {
payload:= bootpay.CancelData{
ReceiptId: "62afc3c5cf9f6d001b7d101a",
CancelId: fmt.Sprintf("%d", time.Now().UnixMilli()), // 중복 취소 방지용CancelUsername: "관리자",
CancelMessage: "테스트 결제 취소",
// CancelPrice: 500, // 부분 취소시 금액 지정// CancelTaxFree: 0, // 부분 취소시 면세 금액
}
result, err:=api.ReceiptCancel(payload)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}REST API 방식으로 고객으로부터 카드 정보를 전달하여 PG사에게 빌링키를 발급받습니다.
funcGetBillingKey(api*bootpay.Api) {
payload:= bootpay.BillingKeyPayload{
SubscriptionId: fmt.Sprintf("%d", time.Now().UnixMilli()),
Pg: "nicepay",
OrderName: "정기결제 테스트 아이템",
CardNo: "5570********1074",
CardPw: "**",
CardExpireYear: "**",
CardExpireMonth: "**",
CardIdentityNo: "",
}
billingKey, err:=api.GetBillingKey(payload)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(billingKey)
}고객의 계좌 정보로 빌링키 발급을 요청합니다. 출금동의 확인 절차까지 진행해야 빌링키가 발급됩니다.
Step 1: 빌링키 발급 요청
funcRequestSubscribeAutomaticTransferBillingKey(api*bootpay.Api) {
payload:= bootpay.BillingKeyPayload{
SubscriptionId: fmt.Sprintf("%d", time.Now().UnixMilli()),
Pg: "nicepay",
OrderName: "정기결제 테스트 아이템",
Username: "홍길동",
AuthType: "ARS", // "ARS" 또는 "간편인증"BankName: "국민",
BankAccount: "6756123412342472",
IdentityNo: "901014",
CashReceiptType: "소득공제", // "소득공제" 또는 "지출증빙"CashReceiptIdentityNo: "01012341234",
Phone: "01012341234",
}
result, err:=api.RequestSubscribeAutomaticTransferBillingKey(payload)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}Step 2: 출금 동의 확인
funcPublishAutomaticTransferBillingKey(api*bootpay.Api) {
receiptId:="6655069ca691573f1bb9c28a"result, err:=api.PublishAutomaticTransferBillingKey(receiptId)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result) // 빌링키 발급됨
}발급된 빌링키로 원하는 시점에 원하는 금액으로 결제 승인 요청을 합니다.
funcRequestSubscribe(api*bootpay.Api) {
payload:= bootpay.SubscribePayload{
BillingKey: "62afc52dcf9f6d001d7d1035",
OrderName: "정기결제 테스트",
OrderId: fmt.Sprintf("%d", time.Now().UnixMilli()),
Price: 1000,
Items: []bootpay.Item{
{
Name: "테스트 상품",
Qty: 1,
Id: "item_1",
Price: 1000,
},
},
}
result, err:=api.RequestSubscribe(payload)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}빌링키 발급 이후 원하는 시점에 결제를 예약할 수 있습니다. (빌링키당 최대 10건)
funcReserveSubscribe(api*bootpay.Api) {
reserveTime:=time.Now().Add(time.Minute*10).Format("2006-01-02T15:04:05-07:00")
payload:= bootpay.SubscribePayload{
BillingKey: "62aff193cf9f6d001a7d10be",
OrderName: "정기결제 테스트",
OrderId: fmt.Sprintf("%d", time.Now().UnixMilli()),
ReserveExecuteAt: reserveTime,
Price: 1000,
}
result, err:=api.ReserveSubscribe(payload)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}funcReserveSubscribeLookup(api*bootpay.Api) {
reserveId:="6490149ca575b40024f0b70d"result, err:=api.ReserveSubscribeLookup(reserveId)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}funcReserveCancel(api*bootpay.Api) {
reserveId:="62aff2a0cf9f6d001a7d10c4"result, err:=api.ReserveCancelSubscribe(reserveId)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}발급된 빌링키를 삭제합니다. 삭제하더라도 예약된 결제건은 취소되지 않습니다.
funcDestroyBillingKey(api*bootpay.Api) {
billingKey:="62afc52dcf9f6d001d7d1035"result, err:=api.DestroyBillingKey(billingKey)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}클라이언트에서 빌링키 발급시, 보안상 클라이언트 이벤트에 빌링키를 전달해주지 않습니다.
receiptId로 조회:
funcLookupBillingKey(api*bootpay.Api) {
receiptId:="62afccb3cf9f6d001b7d101d"result, err:=api.LookupBillingKey(receiptId)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}billingKey로 조회:
funcLookupBillingKeyByKey(api*bootpay.Api) {
billingKey:="66542dfb4d18d5fc7b43e1b6"result, err:=api.LookupBillingKeyByKey(billingKey)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}ㅇㅇ페이 사용을 위해 가맹점 회원의 토큰을 발급합니다.
funcGetUserToken(api*bootpay.Api) {
payload:= bootpay.EasyUserTokenPayload{
UserId: "user_1234",
Email: "test1234@gmail.com",
Name: "홍길동",
Gender: 0,
Birth: "19861014",
Phone: "01012345678",
}
result, err:=api.GetUserToken(payload)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}또는 간단하게:
funcRequestUserToken(api*bootpay.Api) {
payload:= bootpay.UserTokenRequest{
UserId: "gosomi1",
Phone: "01012345678",
}
result, err:=api.RequestUserToken(payload)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}결제승인 방식은 클라이언트 승인 방식과 서버 승인 방식 2가지가 있습니다.
서버 승인이 필요한 경우:
- 100% 안정적인 결제 후 고객 안내가 필요한 경우
- 단일 트랜잭션 개념이 필요한 경우 (재고 파악이 중요한 커머스)
funcServerConfirm(api*bootpay.Api) {
receiptId:="62afda41cf9f6d001f7d105f"result, err:=api.ServerConfirm(receiptId)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}다날 본인인증 후 결과값을 조회합니다.
funcCertificate(api*bootpay.Api) {
receiptId:="6285ffa6cf9f6d0022c4346b"result, err:=api.Certificate(receiptId)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}funcRequestAuthentication(api*bootpay.Api) {
authData:= bootpay.Authentication{
Pg: "다날",
Method: "본인인증",
Username: "홍길동",
IdentityNo: "9001011", // 생년월일 + 주민번호 뒷 1자리Carrier: "SKT", // SKT, KT, LGU+, SKT_MVNO, KT_MVNO, LGU+_MVNOPhone: "01012345678",
SiteUrl: "https://www.example.com",
OrderName: "회원 본인인증",
AuthenticationId: fmt.Sprintf("%d", time.Now().UnixMilli()),
ClientIp: "127.0.0.1",
AuthenticateType: "sms", // "sms" 또는 "pass"
}
result, err:=api.RequestAuthentication(authData)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}funcConfirmAuthentication(api*bootpay.Api) {
authParams:= bootpay.AuthenticationParams{
ReceiptId: "636a020d1fc1920373e6d8ff",
Otp: "613026",
}
result, err:=api.ConfirmAuthentication(authParams)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}funcRealarmAuthentication(api*bootpay.Api) {
authParams:= bootpay.AuthenticationParams{
ReceiptId: "636a020d1fc1920373e6d8ff",
}
result, err:=api.RealarmAuthentication(authParams)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}현금 거래에 한해 구매자의 안전거래를 보장하는 매매보호서비스입니다.
지원 PG사: 이니시스, KCP
funcShippingStart(api*bootpay.Api) {
shipping:= bootpay.Shipping{
ReceiptId: "628ae7ffd01c7e001e9b6066",
ReceiptUrl: "https://example.com/receipt",
TrackingNumber: "123456789",
DeliveryCorp: "CJ대한통운",
ShippingPrepayment: true, // 선불 여부ShippingDay: 3, // 배송일User: bootpay.ShippingUser{
Username: "홍길동",
Phone: "01012345678",
Address: "서울특별시 종로구",
Zipcode: "03000",
},
Company: bootpay.ShippingCompany{
Name: "부트페이",
Phone: "02-1234-5678",
Zipcode: "06000",
Addr1: "서울특별시 강남구",
Addr2: "테헤란로 123",
},
}
result, err:=api.PutShippingStart(shipping)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}부트페이 API를 통해 결제된 건에 대하여 현금영수증을 발행합니다.
funcRequestCashReceiptByBootpay(api*bootpay.Api) {
cashReceipt:= bootpay.CashReceiptData{
ReceiptId: "62e0f11f1fc192036b1b3c92",
Username: "홍길동",
Email: "test@bootpay.co.kr",
Phone: "01012345678",
IdentityNo: "01012345678",
CashReceiptType: "소득공제", // "소득공제" 또는 "지출증빙"
}
result, err:=api.RequestCashReceiptByBootpay(cashReceipt)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}funcRequestCashReceiptCancelByBootpay(api*bootpay.Api) {
cancelData:= bootpay.CancelData{
ReceiptId: "62e0f11f1fc192036b1b3c92",
CancelUsername: "관리자",
CancelMessage: "고객 요청으로 취소",
}
result, err:=api.RequestCashReceiptCancelByBootpay(cancelData)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}부트페이 결제와 상관없이 현금영수증을 발행합니다.
funcRequestCashReceipt(api*bootpay.Api) {
purchasedAt:=time.Now().Format("2006-01-02T15:04:05-07:00")
cashReceipt:= bootpay.CashReceiptData{
Pg: "토스",
Price: 1000,
OrderName: "테스트 상품",
CashReceiptType: "소득공제",
IdentityNo: "01012345678",
OrderId: fmt.Sprintf("%d", time.Now().UnixMilli()),
PurchasedAt: purchasedAt,
Currency: "KRW",
}
result, err:=api.RequestCashReceipt(cashReceipt)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}funcRequestCashReceiptCancel(api*bootpay.Api) {
cancelData:= bootpay.CancelData{
ReceiptId: "62f4be7f1fc192036f9f4bc6",
CancelUsername: "관리자",
CancelMessage: "고객 요청으로 취소",
}
result, err:=api.RequestCashReceiptCancel(cancelData)
iferr!=nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}Go SDK는 상세 응답 타입을 제공합니다. types.go 파일에서 확인할 수 있습니다:
AccessTokenResponse- 토큰 발급 응답ReceiptResponse- 결제 정보 응답CertificateResponse- 본인인증 응답SubscriptionBillingResponse- 빌링키 응답UserTokenResponse- 사용자 토큰 응답- 등...
부트페이 Commerce API를 사용하여 사용자, 상품, 주문, 정기구독 등을 관리할 수 있습니다.
import (
commerce "github.com/bootpay/backend-go/v2/commerce"
)
funcmain() {
api:= commerce.ApiCommerce{}.New(
os.Getenv("BOOTPAY_COMMERCE_CLIENT_KEY_PROD"),
os.Getenv("BOOTPAY_COMMERCE_SECRET_KEY_PROD"),
nil, // http.Client (nil이면 기본값 사용)"production", // mode: "production", "development", "stage"
)
// 토큰 발급token, err:=api.GetToken()
iferr!=nil {
panic(err)
}
}// 사용자 목록 조회users, err:=api.UserList(map[string]interface{}{
"page": 1,
"limit": 10,
})
// 사용자 상세 조회user, err:=api.UserDetail("USER_ID")
// 회원가입newUser, err:=api.UserJoin(map[string]interface{}{
"login_id": "test@example.com",
"login_pw": "password123",
"name": "홍길동",
"email": "test@example.com",
"phone": "010-1234-5678",
})
// 사용자 정보 수정updatedUser, err:=api.UserUpdate(map[string]interface{}{
"user_id": "USER_ID",
"name": "수정된 이름",
})// 상품 목록 조회products, err:=api.ProductList(map[string]interface{}{
"page": 1,
"limit": 10,
})
// 상품 생성product, err:=api.ProductCreate(map[string]interface{}{
"name": "테스트 상품",
"price": 10000,
"description": "상품 설명",
})
// 상품 상세 조회productDetail, err:=api.ProductDetail("PRODUCT_ID")
// 상품 수정updatedProduct, err:=api.ProductUpdate(map[string]interface{}{
"product_id": "PRODUCT_ID",
"name": "수정된 상품명",
"price": 15000,
})// 주문 목록 조회orders, err:=api.OrderList(map[string]interface{}{
"page": 1,
"limit": 10,
})
// 주문 상세 조회order, err:=api.OrderDetail("ORDER_ID")
// 월별 주문 조회monthOrders, err:=api.OrderMonth("USER_GROUP_ID", "2024-12")// 정기구독 목록 조회subscriptions, err:=api.OrderSubscriptionList(nil)
// 정기구독 상세 조회subscription, err:=api.OrderSubscriptionDetail("ORDER_SUBSCRIPTION_ID")
// 정기구독 일시정지err=api.OrderSubscriptionPause(map[string]interface{}{
"order_subscription_id": "ORDER_SUBSCRIPTION_ID",
"pause_days": 30,
"reason": "일시정지 사유",
})
// 정기구독 재개err=api.OrderSubscriptionResume(map[string]interface{}{
"order_subscription_id": "ORDER_SUBSCRIPTION_ID",
})
// 정기구독 해지err=api.OrderSubscriptionTermination(map[string]interface{}{
"order_subscription_id": "ORDER_SUBSCRIPTION_ID",
"reason": "해지 사유",
})// 청구서 목록 조회invoices, err:=api.InvoiceList(nil)
// 청구서 생성invoice, err:=api.InvoiceCreate(map[string]interface{}{
"user_id": "USER_ID",
"amount": 50000,
"title": "청구서 제목",
})
// 청구서 알림 전송err=api.InvoiceNotify("INVOICE_ID", []int{1, 2}) // 1: SMS, 2: Email더 자세한 Commerce API 사용 예제는 commerce_test 디렉토리를 참고해주세요.
적용 샘플 프로젝트를 참조해주세요.
부트페이 개발매뉴얼을 참조해주세요.
부트페이 홈페이지 우측 하단 채팅을 통해 기술문의 주세요!