부트페이 공식 Go 라이브러리입니다.
- 설치하기
- PG API 사용하기
- API 목록
- Commerce API 사용하기
- Example 프로젝트
- Documentation
- 기술문의
- License
go get -u github.com/bootpay/backend-go/v2import (
bootpay "github.com/bootpay/backend-go/v2"
)
func main() {
// API 인스턴스 생성
api := bootpay.Api{}.New(
"5b8f6a4d396fa665fdc2b5ea", // application_id
"rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=", // private_key
nil, // http.Client (nil이면 기본값 사용)
"", // mode: "", "development", "test", "stage"
)
// 토큰 발급 (필수)
token, err := api.GetToken()
if err != 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분이 지날 경우 토큰 발급 함수를 재호출 해주셔야 합니다.
func GetToken(api *bootpay.Api) {
token, err := api.GetToken()
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(token)
}결제창 및 정기결제에서 승인/취소된 결제건에 대하여 올바른 결제건인지 서버간 통신으로 결제검증을 합니다.
func GetReceipt(api *bootpay.Api) {
receiptId := "62afc194e38c300021b345d4"
receipt, err := api.GetReceipt(receiptId)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(receipt)
}CancelPrice를 지정하지 않으면 전액취소 됩니다.
주의사항:
- 휴대폰 결제의 경우 이월될 경우 이통사 정책상 취소되지 않습니다
- 정산받으실 금액보다 취소금액이 클 경우 PG사 정책상 취소되지 않을 수 있습니다
- 가상계좌의 경우 CMS 특약이 되어있지 않으면 취소되지 않습니다
부분취소 지원 PG사: 이니시스, KCP, 다날, 페이레터, 나이스페이, 카카오페이, 페이코
func ReceiptCancel(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)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}REST API 방식으로 고객으로부터 카드 정보를 전달하여 PG사에게 빌링키를 발급받습니다.
func GetBillingKey(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)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(billingKey)
}고객의 계좌 정보로 빌링키 발급을 요청합니다. 출금동의 확인 절차까지 진행해야 빌링키가 발급됩니다.
Step 1: 빌링키 발급 요청
func RequestSubscribeAutomaticTransferBillingKey(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)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}Step 2: 출금 동의 확인
func PublishAutomaticTransferBillingKey(api *bootpay.Api) {
receiptId := "6655069ca691573f1bb9c28a"
result, err := api.PublishAutomaticTransferBillingKey(receiptId)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result) // 빌링키 발급됨
}발급된 빌링키로 원하는 시점에 원하는 금액으로 결제 승인 요청을 합니다.
func RequestSubscribe(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)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}빌링키 발급 이후 원하는 시점에 결제를 예약할 수 있습니다. (빌링키당 최대 10건)
func ReserveSubscribe(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)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}func ReserveSubscribeLookup(api *bootpay.Api) {
reserveId := "6490149ca575b40024f0b70d"
result, err := api.ReserveSubscribeLookup(reserveId)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}func ReserveCancel(api *bootpay.Api) {
reserveId := "62aff2a0cf9f6d001a7d10c4"
result, err := api.ReserveCancelSubscribe(reserveId)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}발급된 빌링키를 삭제합니다. 삭제하더라도 예약된 결제건은 취소되지 않습니다.
func DestroyBillingKey(api *bootpay.Api) {
billingKey := "62afc52dcf9f6d001d7d1035"
result, err := api.DestroyBillingKey(billingKey)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}클라이언트에서 빌링키 발급시, 보안상 클라이언트 이벤트에 빌링키를 전달해주지 않습니다.
receiptId로 조회:
func LookupBillingKey(api *bootpay.Api) {
receiptId := "62afccb3cf9f6d001b7d101d"
result, err := api.LookupBillingKey(receiptId)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}billingKey로 조회:
func LookupBillingKeyByKey(api *bootpay.Api) {
billingKey := "66542dfb4d18d5fc7b43e1b6"
result, err := api.LookupBillingKeyByKey(billingKey)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}ㅇㅇ페이 사용을 위해 가맹점 회원의 토큰을 발급합니다.
func GetUserToken(api *bootpay.Api) {
payload := bootpay.EasyUserTokenPayload{
UserId: "user_1234",
Email: "[email protected]",
Name: "홍길동",
Gender: 0,
Birth: "19861014",
Phone: "01012345678",
}
result, err := api.GetUserToken(payload)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}또는 간단하게:
func RequestUserToken(api *bootpay.Api) {
payload := bootpay.UserTokenRequest{
UserId: "gosomi1",
Phone: "01012345678",
}
result, err := api.RequestUserToken(payload)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}결제승인 방식은 클라이언트 승인 방식과 서버 승인 방식 2가지가 있습니다.
서버 승인이 필요한 경우:
- 100% 안정적인 결제 후 고객 안내가 필요한 경우
- 단일 트랜잭션 개념이 필요한 경우 (재고 파악이 중요한 커머스)
func ServerConfirm(api *bootpay.Api) {
receiptId := "62afda41cf9f6d001f7d105f"
result, err := api.ServerConfirm(receiptId)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}다날 본인인증 후 결과값을 조회합니다.
func Certificate(api *bootpay.Api) {
receiptId := "6285ffa6cf9f6d0022c4346b"
result, err := api.Certificate(receiptId)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}func RequestAuthentication(api *bootpay.Api) {
authData := bootpay.Authentication{
Pg: "다날",
Method: "본인인증",
Username: "홍길동",
IdentityNo: "9001011", // 생년월일 + 주민번호 뒷 1자리
Carrier: "SKT", // SKT, KT, LGU+, SKT_MVNO, KT_MVNO, LGU+_MVNO
Phone: "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)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}func ConfirmAuthentication(api *bootpay.Api) {
authParams := bootpay.AuthenticationParams{
ReceiptId: "636a020d1fc1920373e6d8ff",
Otp: "613026",
}
result, err := api.ConfirmAuthentication(authParams)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}func RealarmAuthentication(api *bootpay.Api) {
authParams := bootpay.AuthenticationParams{
ReceiptId: "636a020d1fc1920373e6d8ff",
}
result, err := api.RealarmAuthentication(authParams)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}현금 거래에 한해 구매자의 안전거래를 보장하는 매매보호서비스입니다.
지원 PG사: 이니시스, KCP
func ShippingStart(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)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}부트페이 API를 통해 결제된 건에 대하여 현금영수증을 발행합니다.
func RequestCashReceiptByBootpay(api *bootpay.Api) {
cashReceipt := bootpay.CashReceiptData{
ReceiptId: "62e0f11f1fc192036b1b3c92",
Username: "홍길동",
Email: "[email protected]",
Phone: "01012345678",
IdentityNo: "01012345678",
CashReceiptType: "소득공제", // "소득공제" 또는 "지출증빙"
}
result, err := api.RequestCashReceiptByBootpay(cashReceipt)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}func RequestCashReceiptCancelByBootpay(api *bootpay.Api) {
cancelData := bootpay.CancelData{
ReceiptId: "62e0f11f1fc192036b1b3c92",
CancelUsername: "관리자",
CancelMessage: "고객 요청으로 취소",
}
result, err := api.RequestCashReceiptCancelByBootpay(cancelData)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}부트페이 결제와 상관없이 현금영수증을 발행합니다.
func RequestCashReceipt(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)
if err != nil {
fmt.Println("error:", err.Error())
return
}
fmt.Println(result)
}func RequestCashReceiptCancel(api *bootpay.Api) {
cancelData := bootpay.CancelData{
ReceiptId: "62f4be7f1fc192036f9f4bc6",
CancelUsername: "관리자",
CancelMessage: "고객 요청으로 취소",
}
result, err := api.RequestCashReceiptCancel(cancelData)
if err != 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"
)
func main() {
api := commerce.ApiCommerce{}.New(
"hxS-Up--5RvT6oU6QJE0JA", // client_key
"r5zxvDcQJiAP2PBQ0aJjSHQtblNmYFt6uFoEMhti_mg=", // secret_key
nil, // http.Client (nil이면 기본값 사용)
"development", // mode: "", "development", "stage"
)
// 토큰 발급
token, err := api.GetToken()
if err != 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": "[email protected]",
"login_pw": "password123",
"name": "홍길동",
"email": "[email protected]",
"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 디렉토리를 참고해주세요.
적용 샘플 프로젝트를 참조해주세요.
부트페이 개발매뉴얼을 참조해주세요.
부트페이 홈페이지 우측 하단 채팅을 통해 기술문의 주세요!