Skip to content

서브스크립션 생성 및 청구 금액 정산 메뉴얼

SeungpilPark edited this page Mar 20, 2017 · 1 revision
  1. 빌링 서비스에서 결제 조직을 하나 생성한 후, test 어카운트와 test 프로덕트(BASE)를 생성한다.

  2. test 프로덕트에 test-1 플랜을 하나 생성하도록한다. 플랜 모델은 BASE, 월결제 100달러, 트라이얼 기간은 없도록 한다.

  3. test-addon(ADD_ON) 프로덕트를 생성한다. 플랜 모델은 ADD_ON, 월결제 10달러, 트라이얼 기간은 없도록 한다.

  4. 어카운트로 하여금 아래 api 를 통해 test-1 플랜을 구독하도록 한다.

subscription

POST /1.0/kb/subscriptions

구독을 추가한다.

"post": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Create an entitlement",
        "description": "",
        "operationId": "createEntitlement",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "$ref": "#/definitions/SubscriptionJson"
            }
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "entitlementDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "billingDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "migrated",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "bcd",
            "in": "query",
            "required": false,
            "type": "integer",
            "format": "int32"
          },
          {
            "name": "callCompletion",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "callTimeoutSec",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 3,
            "format": "int64"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid entitlement supplied"
          }
        }
      }
  1. 리턴되는 response 의 Location 헤더의 bundleId 를 가져와서, 위의 api 를 재호출하되, test-addon 프로덕트를 신청하며 bundleId 파라미터를 포함하도록 한다. bundle 조회시 test-1 프로덕트와 test-addon 프로덕트가 번들로 묶여져 있는데, 이는 하나의 인보이스로 매월 결제됨을 뜻한다.

  2. BASE 와 ADD_ON 구독을 함께 생성하는 테스트를 진행해본다.

POST /1.0/kb/subscriptions/createEntitlementWithAddOns

구독을 애드온과 함께 추가한다.

"post": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Create an entitlement with addOn products",
        "description": "",
        "operationId": "createEntitlementWithAddOns",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/SubscriptionJson"
              }
            }
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "entitlementDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "billingDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "migrated",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "callCompletion",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "callTimeoutSec",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 3,
            "format": "int64"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid entitlement supplied"
          }
        }
      }
  1. 다수의 BASE 와 ADD_ON 구독을 함께 생성하는 테스트를 진행해본다.

POST /1.0/kb/subscriptions/createEntitlementsWithAddOns

다수의 구독을 애드온과 함께 추가한다.

"post": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Create multiple entitlements with addOn products",
        "description": "",
        "operationId": "createEntitlementsWithAddOns",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/BulkBaseSubscriptionAndAddOnsJson"
              }
            }
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "entitlementDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "billingDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "migrated",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "callCompletion",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "callTimeoutSec",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 3,
            "format": "int64"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid entitlements supplied"
          }
        }
      }
  1. 4)번을 실행하였을 경우 bundle 을 조회하면서 subscriptionId 도 함께 얻을 수 있는데, subscriptionId 를 통하여 구독 한건을 조회해보도록 한다.

GET /1.0/kb/subscriptions/{subscriptionId}

구독 한건을 가져온다.

"get": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Retrieve a subscription by id",
        "description": "",
        "operationId": "getEntitlement",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "$ref": "#/definitions/SubscriptionJson"
            }
          },
          "400": {
            "description": "Invalid subscription id supplied"
          },
          "404": {
            "description": "Subscription not found"
          }
        }
      },
  1. test 프로덕트에 test-2 플랜을 하나 더 추가로 생성한다. 그 후 4) 를 실행시 생성된 구독을 test-2 플랜으로 변경해보도록 한다. 이 때 변경된 플랜에 대한 인보이스가 생성된다.

PUT /1.0/kb/subscriptions/{subscriptionId}

구독 한건을 다른 플랜으로 변경한다.

"put": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Change entitlement plan",
        "description": "",
        "operationId": "changeEntitlementPlan",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "$ref": "#/definitions/SubscriptionJson"
            }
          },
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "callCompletion",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "callTimeoutSec",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 3,
            "format": "int64"
          },
          {
            "name": "billingPolicy",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid subscription id supplied"
          },
          "404": {
            "description": "Entitlement not found"
          }
        }
      },
  1. 구독을 정지시켜본다. billingPolicy 파라미터를 END_OF_TERM 또는 IMMEDIATE 를 선택하여, 월말 정지와 즉시 정지를 모두 테스트해보도록 한다. 즉시정지일경우 정지즉시 정산인보이스가 발행되어야 한다.

DELETE /1.0/kb/subscriptions/{subscriptionId}

구독 한건을 정지시킨다.

"delete": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Cancel an entitlement plan",
        "description": "",
        "operationId": "cancelEntitlementPlan",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "callCompletion",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "callTimeoutSec",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 5,
            "format": "int64"
          },
          {
            "name": "entitlementPolicy",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "billingPolicy",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "useRequestedDateForBilling",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid subscription id supplied"
          },
          "404": {
            "description": "Entitlement not found"
          }
        }
      }
  1. 매월 결제되는 구독일 경우, 아래 api 를 통해 결제일을 변경시킨 후 날짜를 경과시켜 인보이스 발행일 및 결제일이 변경되는지 확인토록 한다.

PUT /1.0/kb/subscriptions/{subscriptionId}/bcd

구독의 결제일을 변경시킨다.

"put": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Update the BCD associated to a subscription",
        "description": "",
        "operationId": "updateSubscriptionBCD",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "$ref": "#/definitions/SubscriptionJson"
            }
          },
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "effectiveFromDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid entitlement supplied"
          }
        }
      }
    },
  1. 구독이 과금되지 않을 경우 일시정지 하였다가, 과금이 되었을 경우 일시정지가 풀리되, 정지된 기간만큼 과금정산이 되지 않아야 할 경우가 있다. 아래 api 를 통해 구독의 일시정지/정지해제를 수행할 수 있다.

PUT /1.0/kb/subscriptions/{subscriptionId}/block

구독을 블락처리한다.

"put": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Block a subscription",
        "description": "",
        "operationId": "addSubscriptionBlockingState",
        "consumes": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "$ref": "#/definitions/BlockingStateJson"
            }
          },
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid subscription id supplied"
          },
          "404": {
            "description": "Subscription not found"
          }
        }
      }
  1. 구독에 커스텀 필드를 조회해본다. 커스텀 필드는 외부조회용으로 쓰일 수 있다.

GET /1.0/kb/subscriptions/{subscriptionId}/customFields

구독의 커스텀 필드를 가져온다.

"get": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Retrieve subscription custom fields",
        "description": "",
        "operationId": "getCustomFields",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/CustomFieldJson"
              }
            }
          },
          "400": {
            "description": "Invalid subscription id supplied"
          }
        }
      },
  1. 구독에 커스텀 필드를 추가해본다.

POST /1.0/kb/subscriptions/{subscriptionId}/customFields

구독의 커스텀 필드를 추가한다.

"post": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Add custom fields to subscription",
        "description": "",
        "operationId": "createCustomFields",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/CustomFieldJson"
              }
            }
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid subscription id supplied"
          }
        }
      },
  1. 생성된 커스텀 필드를 삭제하도록 한다.

DELETE /1.0/kb/subscriptions/{subscriptionId}/customFields

구독의 커스텀 필드를 삭제한다.

"delete": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Remove custom fields from subscription",
        "description": "",
        "operationId": "deleteCustomFields",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "customFieldList",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid subscription id supplied"
          }
        }
      }
  1. 구독의 태그리스트를 가져온다. 태그는 외부조회용으로 쓰일 수 있다.

GET /1.0/kb/subscriptions/{subscriptionId}/tags

구독의 태그를 가져온다.

"get": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Retrieve subscription tags",
        "description": "",
        "operationId": "getTags",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          },
          {
            "name": "includedDeleted",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TagJson"
              }
            }
          },
          "400": {
            "description": "Invalid subscription id supplied"
          },
          "404": {
            "description": "Subscription not found"
          }
        }
      },
  1. 구독의 태그리스트를 추가하여 본다.

POST /1.0/kb/subscriptions/{subscriptionId}/tags

구독의 태그를 추가한다.

"post": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Add tags to subscription",
        "description": "",
        "operationId": "createTags",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "tagList",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid subscription id supplied"
          }
        }
      },
  1. 생성한 태그를 삭제해본다.

DELETE /1.0/kb/subscriptions/{subscriptionId}/tags

구독의 태그를 삭제한다.

"delete": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Remove tags from subscription",
        "description": "",
        "operationId": "deleteTags",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "tagList",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid subscription id supplied"
          }
        }
      }
  1. delete 메소드를 통해 정지된 구독을 정지취소를 할 수 있는데, 정지 요청일이 현재시간보다 이전이라서 이미 인보이스가 발송된 경우 정지취소를 할 수 없다. 그러나 정지 요청일을 다가올 어느날로 설정할 경우 아직 정지된 상태가 아니므로 아래 api 를 통하여 정지 예약을 취소할 수 있다.

PUT /1.0/kb/subscriptions/{subscriptionId}/uncancel

구독의 정지를 해제한다.

"put": {
        "tags": [
          "1.0kbsubscriptions"
        ],
        "summary": "Un-cancel an entitlement",
        "description": "",
        "operationId": "uncancelEntitlementPlan",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid subscription id supplied"
          },
          "404": {
            "description": "Entitlement not found"
          }
        }
      }

bundle

  1. BASE 프로덕트를 subscription(구독) 신청할 경우 리턴되는 bundleId 를 통해 번들을 조회할 수 있다. 번들의 BASE + ADD_ON 의 조합으로써 동일 결제일을 가지는 구독의 묶음이다. 번들에 소속된 구독들은 하나의 인보이스로 청구된다.

GET /1.0/kb/bundles

external key 로 번들을 가져온다.

"get": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Retrieve a bundle by external key",
        "description": "",
        "operationId": "getBundleByKey",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "externalKey",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "includedDeleted",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "$ref": "#/definitions/BundleJson"
            }
          },
          "404": {
            "description": "Bundle not found"
          }
        }
      }
    }
  1. 번들을 페이지네이션하여 가져온다. limit, offset 의 파라미터로 정할 수 있으며, 없을경우 기본 100건이 조회된다.

GET /1.0/kb/bundles/pagination

번들을 페이지네이션으로 가져온다

"get": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "List bundles",
        "description": "",
        "operationId": "getBundles",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 0,
            "format": "int64"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 100,
            "format": "int64"
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/BundleJson"
              }
            }
          }
        }
      }
  1. 번들을 검색어로 쿼리하여 페이지네이션하여 가져온다. limit, offset 의 파라미터로 정할 수 있으며, 없을경우 기본 100건이 조회된다.

GET /1.0/kb/bundles/search/{searchKey}

주어진 검색어에 해당하는 번들을 페이지네이션으로 가져온다.

"get": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Search bundles",
        "description": "",
        "operationId": "searchBundles",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "searchKey",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": ".*"
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 0,
            "format": "int64"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "type": "integer",
            "default": 100,
            "format": "int64"
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/BundleJson"
              }
            }
          }
        }
      }
  1. 번들 한건을 조회하여 BASE, ADD_ON 두가지 구독이 모두 명시되어 있는지 확인토록 한다.

GET /1.0/kb/bundles/{bundleId}

번들 한건을 가져온다.

"get": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Retrieve a bundle by id",
        "description": "",
        "operationId": "getBundle",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "$ref": "#/definitions/BundleJson"
            }
          },
          "400": {
            "description": "Invalid bundle id supplied"
          },
          "404": {
            "description": "Bundle not found"
          }
        }
      },
  1. Account 를 하나 추가로 생성한 후, test 어카운트의 번들을 새로 생성한 어카운트로 이전토록 해본다. 이때, 구독의 결제주기 및 결제 상태과 이전과 동일하게 표현되는지 확인토록 한다.

PUT /1.0/kb/bundles/{bundleId}

번들을 다른 계정으로 이동시킨다.

"put": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Transfer a bundle to another account",
        "description": "",
        "operationId": "transferBundle",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "$ref": "#/definitions/BundleJson"
            }
          },
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "billingPolicy",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "END_OF_TERM"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid bundle id, requested date or policy supplied"
          },
          "404": {
            "description": "Bundle not found"
          }
        }
      }
    },
  1. 번들의 커스텀 필드를 조회한다.(외부 조회용)

GET /1.0/kb/bundles/{bundleId}/customFields

번들의 커스텀 필드를 가져온다.

"get": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Retrieve bundle custom fields",
        "description": "",
        "operationId": "getCustomFields",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/CustomFieldJson"
              }
            }
          },
          "400": {
            "description": "Invalid bundle id supplied"
          }
        }
      },

POST /1.0/kb/bundles/{bundleId}/customFields

번들의 커스텀 필드를 추가한다.

"post": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Add custom fields to bundle",
        "description": "",
        "operationId": "createCustomFields",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "in": "body",
            "name": "body",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/CustomFieldJson"
              }
            }
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid bundle id supplied"
          }
        }
      },

DELETE /1.0/kb/bundles/{bundleId}/customFields

번들의 커스텀 필드를 삭제한다.

"delete": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Remove custom fields from bundle",
        "description": "",
        "operationId": "deleteCustomFields",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "customFieldList",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid bundle id supplied"
          }
        }
      }
    },
  1. 번들을 pause(일시정지) 처리한다. 일시정지된 번들은 과금이 집행될 경우 일시정지가 해제된다.

PUT /1.0/kb/bundles/{bundleId}/pause

번들을 일시정지한다.

"put": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Pause a bundle",
        "description": "",
        "operationId": "pauseBundle",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid bundle id supplied"
          },
          "404": {
            "description": "Bundle not found"
          }
        }
      }
    },
  1. pause(일시정지)된 번들을 일시정지 해제한다.

PUT /1.0/kb/bundles/{bundleId}/resume

번들의 일시정지를 해제한다.

"put": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Resume a bundle",
        "description": "",
        "operationId": "resumeBundle",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "requestedDate",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "pluginProperty",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid bundle id supplied"
          },
          "404": {
            "description": "Bundle not found"
          }
        }
      }
    },
  1. 번들의 태크를 조회, 생성, 삭제해보도록 한다.

GET /1.0/kb/bundles/{bundleId}/tags

번들의 태그를 가져온다.

"get": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Retrieve bundle tags",
        "description": "",
        "operationId": "getTags",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "audit",
            "in": "query",
            "required": false,
            "type": "string",
            "default": "NONE"
          },
          {
            "name": "includedDeleted",
            "in": "query",
            "required": false,
            "type": "boolean",
            "default": false
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TagJson"
              }
            }
          },
          "400": {
            "description": "Invalid bundle id supplied"
          },
          "404": {
            "description": "Bundle not found"
          }
        }
      },

POST /1.0/kb/bundles/{bundleId}/tags

번들의 태그를 생성한다.

"post": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Add tags to bundle",
        "description": "",
        "operationId": "createTags",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "tagList",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid bundle id supplied"
          }
        }
      },

DELETE /1.0/kb/bundles/{bundleId}/tags

번들의 태그를 삭제한다.

"delete": {
        "tags": [
          "1.0kbbundles"
        ],
        "summary": "Remove tags from bundle",
        "description": "",
        "operationId": "deleteTags",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "bundleId",
            "in": "path",
            "required": true,
            "type": "string",
            "pattern": "\\w+-\\w+-\\w+-\\w+-\\w+"
          },
          {
            "name": "tagList",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-CreatedBy",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Reason",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "X-Killbill-Comment",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid bundle id supplied"
          }
        }
      }
    },

Swagger Spec Test - Response Definition

BundleJson

{
    "accountId": "576ac83b-f56a-4da8-a214-66d63f6e523f",
    "bundleId": "8c4020c5-f105-4940-8214-2aa77425d5d0",
    "externalKey": "8c4020c5-f105-4940-8214-2aa77425d5d0",
    "subscriptions": [
      {
        "accountId": "576ac83b-f56a-4da8-a214-66d63f6e523f",
        "bundleId": "8c4020c5-f105-4940-8214-2aa77425d5d0",
        "subscriptionId": "be14e10a-41a6-4768-bcd5-a31962e63611",
        "externalKey": "8c4020c5-f105-4940-8214-2aa77425d5d0",
        "startDate": "2017-02-13",
        "productName": "Blowdart",
        "productCategory": "BASE",
        "billingPeriod": "MONTHLY",
        "phaseType": "TRIAL",
        "priceList": "DEFAULT",
        "planName": "blowdart-monthly",
        "state": "CANCELLED",
        "sourceType": "NATIVE",
        "cancelledDate": "2017-02-13",
        "chargedThroughDate": "2017-02-13",
        "billingStartDate": "2017-02-13",
        "billingEndDate": "2017-02-13",
        "billCycleDayLocal": 9,
        "events": [
          {
            "eventId": "ffa4c7f0-2b14-4b3a-9baf-b922685095ed",
            "billingPeriod": null,
            "product": null,
            "priceList": null,
            "eventType": "START_ENTITLEMENT",
            "isBlockedBilling": false,
            "isBlockedEntitlement": false,
            "serviceName": "entitlement-service",
            "serviceStateName": "ENT_STARTED",
            "phase": null,
            "auditLogs": [],
            "effectiveDate": "2017-02-13"
          },
          {
            "eventId": "6a410b6a-ddde-4be8-bbe1-ae9892cbacfb",
            "billingPeriod": "MONTHLY",
            "product": "Blowdart",
            "priceList": "DEFAULT",
            "eventType": "START_BILLING",
            "isBlockedBilling": false,
            "isBlockedEntitlement": false,
            "serviceName": "billing-service",
            "serviceStateName": "START_BILLING",
            "phase": "blowdart-monthly-trial",
            "auditLogs": [],
            "effectiveDate": "2017-02-13"
          },
          {
            "eventId": "cdea353d-32ba-4f94-a86d-3ca1e9989dcc",
            "billingPeriod": null,
            "product": null,
            "priceList": null,
            "eventType": "STOP_ENTITLEMENT",
            "isBlockedBilling": false,
            "isBlockedEntitlement": true,
            "serviceName": "entitlement-service",
            "serviceStateName": "ENT_CANCELLED",
            "phase": null,
            "auditLogs": [],
            "effectiveDate": "2017-02-13"
          },
          {
            "eventId": "2228562e-29da-443d-bd15-79cc25c9bb85",
            "billingPeriod": "MONTHLY",
            "product": "Blowdart",
            "priceList": "DEFAULT",
            "eventType": "STOP_BILLING",
            "isBlockedBilling": false,
            "isBlockedEntitlement": false,
            "serviceName": "billing-service",
            "serviceStateName": "STOP_BILLING",
            "phase": "blowdart-monthly-trial",
            "auditLogs": [],
            "effectiveDate": "2017-02-13"
          }
        ],
        "priceOverrides": [],
        "auditLogs": []
      }
    ],
    "timeline": {
      "accountId": "576ac83b-f56a-4da8-a214-66d63f6e523f",
      "bundleId": "8c4020c5-f105-4940-8214-2aa77425d5d0",
      "externalKey": "8c4020c5-f105-4940-8214-2aa77425d5d0",
      "events": [
        {
          "eventId": "ffa4c7f0-2b14-4b3a-9baf-b922685095ed",
          "billingPeriod": null,
          "product": null,
          "priceList": null,
          "eventType": "START_ENTITLEMENT",
          "isBlockedBilling": false,
          "isBlockedEntitlement": false,
          "serviceName": "entitlement-service",
          "serviceStateName": "ENT_STARTED",
          "phase": null,
          "auditLogs": [],
          "effectiveDate": "2017-02-13"
        },
        {
          "eventId": "6a410b6a-ddde-4be8-bbe1-ae9892cbacfb",
          "billingPeriod": "MONTHLY",
          "product": "Blowdart",
          "priceList": "DEFAULT",
          "eventType": "START_BILLING",
          "isBlockedBilling": false,
          "isBlockedEntitlement": false,
          "serviceName": "billing-service",
          "serviceStateName": "START_BILLING",
          "phase": "blowdart-monthly-trial",
          "auditLogs": [],
          "effectiveDate": "2017-02-13"
        },
        {
          "eventId": "cdea353d-32ba-4f94-a86d-3ca1e9989dcc",
          "billingPeriod": null,
          "product": null,
          "priceList": null,
          "eventType": "STOP_ENTITLEMENT",
          "isBlockedBilling": false,
          "isBlockedEntitlement": true,
          "serviceName": "entitlement-service",
          "serviceStateName": "ENT_CANCELLED",
          "phase": null,
          "auditLogs": [],
          "effectiveDate": "2017-02-13"
        },
        {
          "eventId": "2228562e-29da-443d-bd15-79cc25c9bb85",
          "billingPeriod": "MONTHLY",
          "product": "Blowdart",
          "priceList": "DEFAULT",
          "eventType": "STOP_BILLING",
          "isBlockedBilling": false,
          "isBlockedEntitlement": false,
          "serviceName": "billing-service",
          "serviceStateName": "STOP_BILLING",
          "phase": "blowdart-monthly-trial",
          "auditLogs": [],
          "effectiveDate": "2017-02-13"
        }
      ],
      "auditLogs": []
    },
    "auditLogs": []
  }

SubscriptionJson

{
  "accountId": "576ac83b-f56a-4da8-a214-66d63f6e523f",
  "bundleId": "8c4020c5-f105-4940-8214-2aa77425d5d0",
  "subscriptionId": "be14e10a-41a6-4768-bcd5-a31962e63611",
  "externalKey": "8c4020c5-f105-4940-8214-2aa77425d5d0",
  "startDate": "2017-02-13",
  "productName": "Blowdart",
  "productCategory": "BASE",
  "billingPeriod": "MONTHLY",
  "phaseType": "TRIAL",
  "priceList": "DEFAULT",
  "planName": "blowdart-monthly",
  "state": "CANCELLED",
  "sourceType": "NATIVE",
  "cancelledDate": "2017-02-13",
  "chargedThroughDate": "2017-02-13",
  "billingStartDate": "2017-02-13",
  "billingEndDate": "2017-02-13",
  "billCycleDayLocal": 9,
  "events": [
    {
      "eventId": "ffa4c7f0-2b14-4b3a-9baf-b922685095ed",
      "billingPeriod": null,
      "product": null,
      "priceList": null,
      "eventType": "START_ENTITLEMENT",
      "isBlockedBilling": false,
      "isBlockedEntitlement": false,
      "serviceName": "entitlement-service",
      "serviceStateName": "ENT_STARTED",
      "phase": null,
      "auditLogs": [],
      "effectiveDate": "2017-02-13"
    },
    {
      "eventId": "6a410b6a-ddde-4be8-bbe1-ae9892cbacfb",
      "billingPeriod": "MONTHLY",
      "product": "Blowdart",
      "priceList": "DEFAULT",
      "eventType": "START_BILLING",
      "isBlockedBilling": false,
      "isBlockedEntitlement": false,
      "serviceName": "billing-service",
      "serviceStateName": "START_BILLING",
      "phase": "blowdart-monthly-trial",
      "auditLogs": [],
      "effectiveDate": "2017-02-13"
    },
    {
      "eventId": "cdea353d-32ba-4f94-a86d-3ca1e9989dcc",
      "billingPeriod": null,
      "product": null,
      "priceList": null,
      "eventType": "STOP_ENTITLEMENT",
      "isBlockedBilling": false,
      "isBlockedEntitlement": true,
      "serviceName": "entitlement-service",
      "serviceStateName": "ENT_CANCELLED",
      "phase": null,
      "auditLogs": [],
      "effectiveDate": "2017-02-13"
    },
    {
      "eventId": "2228562e-29da-443d-bd15-79cc25c9bb85",
      "billingPeriod": "MONTHLY",
      "product": "Blowdart",
      "priceList": "DEFAULT",
      "eventType": "STOP_BILLING",
      "isBlockedBilling": false,
      "isBlockedEntitlement": false,
      "serviceName": "billing-service",
      "serviceStateName": "STOP_BILLING",
      "phase": "blowdart-monthly-trial",
      "auditLogs": [],
      "effectiveDate": "2017-02-13"
    }
  ],
  "priceOverrides": [
    {
      "phaseName": "blowdart-monthly-trial",
      "phaseType": "TRIAL",
      "fixedPrice": 0,
      "recurringPrice": null
    },
    {
      "phaseName": "blowdart-monthly-discount",
      "phaseType": "DISCOUNT",
      "fixedPrice": null,
      "recurringPrice": 9.95
    },
    {
      "phaseName": "blowdart-monthly-evergreen",
      "phaseType": "EVERGREEN",
      "fixedPrice": null,
      "recurringPrice": 29.95
    }
  ],
  "auditLogs": []
}
Clone this wiki locally