From 9168c49f61967b6a0dd3f1faa5ac34def69cf329 Mon Sep 17 00:00:00 2001 From: Jeongho Nam Date: Tue, 23 Jan 2024 01:35:02 +0900 Subject: [PATCH 1/4] As `pnpm` does not allow indirect package importing through dependency, changed `package.json` following the rule. Therefore, `@samchon/payments` became both compatible with `npm` and `pnpm`. --- .github/workflows/build.yml | 5 +- .gitignore | 1 + deploy/publish.js | 4 +- package.json | 2 +- packages/fake-iamport-server/package.json | 6 +- .../fake-toss-payments-server/package.json | 5 +- packages/iamport-server-api/package.json | 4 +- packages/iamport-server-api/swagger.json | 2 +- packages/iamport-server-api/tsconfig.json | 2 +- packages/payment-api/package.json | 9 +- packages/payment-api/swagger.json | 2 +- packages/payment-api/tsconfig.json | 2 +- packages/payment-backend/README.md | 105 ------------------ packages/payment-backend/package.json | 19 ++-- .../payment-backend/src/PaymentBackend.ts | 38 +------ packages/payment-backend/src/PaymentGlobal.ts | 18 +-- .../payment-backend/src/PaymentUpdator.ts | 94 ---------------- .../payment-backend/src/executable/master.ts | 9 -- .../payment-backend/src/executable/update.ts | 55 --------- .../src/executable/updator-master.ts | 10 -- .../src/executable/updator-slave.ts | 9 -- packages/payment-backend/src/module.ts | 1 - packages/payment-backend/test/index.ts | 3 - .../toss-payments-server-api/package.json | 4 +- .../toss-payments-server-api/swagger.json | 2 +- .../toss-payments-server-api/tsconfig.json | 2 +- 26 files changed, 44 insertions(+), 369 deletions(-) delete mode 100644 packages/payment-backend/src/PaymentUpdator.ts delete mode 100644 packages/payment-backend/src/executable/master.ts delete mode 100644 packages/payment-backend/src/executable/update.ts delete mode 100644 packages/payment-backend/src/executable/updator-master.ts delete mode 100644 packages/payment-backend/src/executable/updator-slave.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fe9b721..7f14fb3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,5 +16,8 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 + - name: Setup PNPM + run: npm i -g pnpm && pnpm install + - name: Test Packages - run: npm install && npm run test \ No newline at end of file + run: pnpm run test \ No newline at end of file diff --git a/.gitignore b/.gitignore index c70043f..7cb1c50 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ migrations/ node_modules/ package-lock.json +pnpm-lock.yaml *.DS_Store *.log *.tgz \ No newline at end of file diff --git a/deploy/publish.js b/deploy/publish.js index 16d2749..5c54506 100644 --- a/deploy/publish.js +++ b/deploy/publish.js @@ -26,7 +26,7 @@ const deploy = (tag) => (version) => (name) => { for (const key of Object.keys(record)) if (packages.includes(key.replace("@samchon/", ""))) { if (tag === "tgz" && fs.existsSync(`${directory}/node_modules/${key}`)) - execute(directory)(`npm uninstall ${key}`); + execute(directory)(`pnpm uninstall ${key}`); record[key] = tag === "tgz" ? path.resolve( @@ -40,7 +40,7 @@ const deploy = (tag) => (version) => (name) => { // SETUP UPDATED DEPENDENCIES fs.writeFileSync(file, JSON.stringify(info, null, 2), "utf8"); - execute(directory)(`npm install`); + execute(directory)(`pnpm install`); execute(directory)(`npm run build`); // RUN TEST PROGRAM diff --git a/package.json b/package.json index d16f963..7a4364c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@samchon/payments", - "version": "6.0.1", + "version": "6.0.2", "description": "Collection of Payment system of Samchon", "scripts": { "package:latest": "node deploy latest", diff --git a/packages/fake-iamport-server/package.json b/packages/fake-iamport-server/package.json index 237b733..7ddcaed 100644 --- a/packages/fake-iamport-server/package.json +++ b/packages/fake-iamport-server/package.json @@ -1,6 +1,6 @@ { "name": "fake-iamport-server", - "version": "6.0.1", + "version": "6.0.2", "description": "Fake iamport server for testing", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -63,12 +63,14 @@ "@nestjs/common": "^10.2.8", "@nestjs/core": "^10.2.8", "@nestjs/platform-fastify": "^10.2.8", + "atob": "^2.1.2", + "btoa": "^1.2.1", "fastify": "^4.24.3", "serialize-error": "^4.1.0", "source-map-support": "^0.5.19", "tstl": "^2.5.13", "typescript-transform-paths": "^3.4.6", - "typia": "^5.3.11", + "typia": "^5.3.12", "uuid": "^9.0.0" }, "keywords": [ diff --git a/packages/fake-toss-payments-server/package.json b/packages/fake-toss-payments-server/package.json index dfa5f78..73c63c5 100644 --- a/packages/fake-toss-payments-server/package.json +++ b/packages/fake-toss-payments-server/package.json @@ -1,6 +1,6 @@ { "name": "fake-toss-payments-server", - "version": "6.0.1", + "version": "6.0.2", "description": "Fake toss-payments server for testing", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -60,6 +60,7 @@ }, "dependencies": { "@nestia/core": "^2.4.5", + "@nestia/fetcher": "^2.4.5", "@nestjs/common": "^10.2.8", "@nestjs/core": "^10.2.8", "@nestjs/platform-fastify": "^10.2.8", @@ -69,7 +70,7 @@ "serialize-error": "^4.1.0", "source-map-support": "^0.5.19", "tstl": "^2.5.13", - "typia": "^5.3.11", + "typia": "^5.3.12", "uuid": "^9.0.0" }, "keywords": [ diff --git a/packages/iamport-server-api/package.json b/packages/iamport-server-api/package.json index dcade6a..d355aae 100644 --- a/packages/iamport-server-api/package.json +++ b/packages/iamport-server-api/package.json @@ -1,6 +1,6 @@ { "name": "iamport-server-api", - "version": "6.0.1", + "version": "6.0.2", "description": "API for Iamport Server", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -35,6 +35,6 @@ }, "dependencies": { "@nestia/fetcher": "^2.4.5", - "typia": "^5.3.11" + "typia": "^5.3.12" } } \ No newline at end of file diff --git a/packages/iamport-server-api/swagger.json b/packages/iamport-server-api/swagger.json index 17c4059..4548787 100644 --- a/packages/iamport-server-api/swagger.json +++ b/packages/iamport-server-api/swagger.json @@ -1 +1 @@ -{"openapi":"3.0.1","servers":[{"url":"http://localhost:10851","description":"fake"},{"url":"https://api.iamport.kr","description":"real"}],"info":{"title":"Iamport API","description":"Built by [fake-iamport-server](https://github.com/samchon/payments/tree/master/packages/fake-iamport-server) with [nestia](https://github.com/samchon/nestia)","version":"6.0.1","license":{"name":"MIT"}},"paths":{"/subscribe/customers/{customer_uid}":{"get":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"responses":{"200":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 정보 조회하기","description":"간편 결제 카드 정보 조회하기.\n\n`subscribe.customers.at` 은 고객이 {@link create } 나 혹은 아임포트가 제공하는\n간편 결제 카드 등록 창을 이용하여 저장한 간편 결제 카드 정보를 조회하는 API\n함수이다.","security":[{"bearer":[]}]},"post":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"requestBody":{"description":"카드 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.ICreate"}}},"required":true},"responses":{"201":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 등록하기","description":"간편 결제 카드 등록하기.\n\n`subscribe.customers.stoer` 는 고객이 자신의 카드를 서버에 등록해두고, 매번 결제가\n필요할 때마다 카드 정보를 반복 입력하는 일 없이, 간편하게 결제를 진행하고자 할 때\n사용하는 API 함수이다.\n\n참고로 `subscribe.customers.create` 는 클라이언트 어플리케이션이 아임포트가 제공하는\n간편 결제 카드 등록 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는\n일은 없을 것이다. 다만, 고객이 간편 결제 카드를 등록하는 상황을 시뮬레이션하기 위하여,\n테스트 자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"responses":{"200":{"description":"삭제된 간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 삭제하기","description":"간편 결제 카드 삭제하기.\n\n간편 결제를 위하여 등록한 카드를 제거한다.","security":[{"bearer":[]}]}},"/subscribe/payments/onetime":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"카드 결제 신청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.IOnetime"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCardPayment"}}}}},"summary":"카드로 결제하기, 더불어 간편 결제용으로 등록 가능","description":"카드로 결제하기, 더불어 간편 결제용으로 등록 가능.\n\n`subscribe.payments.onetime` 은 카드를 매개로 한 결제를 하고자 할 때 호출하는 API\n함수이다. 더하여 입력 값에 {@link IIamportSubscription.IOnetime.customer_uid } 를\n기입하는 경우, 결제에 사용한 카드를 그대로 간편 결제용 카드\n{@link IIamportSubscription } 로 등록해버린다.\n\n다만, 정히 간편 카드 등록과 결제를 동시에 하고 싶다면,\n`subscribe.payments.onetime` 에 {@link IIamportSubscription.IOnetime.customer_uid }\n를 더하기보다, {@link subscribe.customers.create } 와 {@link subscribe.payments.again }\n을 각각 호출하는 것을 권장한다. 그것이 예외적인 상황에 보다 안전하게 대처할 수 있기\n때문이다.\n\n더하여 `subscribe.payments.onetime` 은 클라이언트 어플리케이션이 아임포트가 제공하는\n결제 창을 그대로 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는 일은\n없을 것이다. 다만, 고객이 카드를 통하여 결제하는 상황을 시뮬레이션하기 위하여, 테스트\n자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"bearer":[]}]}},"/subscribe/payments/again":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"미리 등록한 카드를 이용한 결제 신청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.IAgain"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCardPayment"}}}}},"summary":"간편 결제에 등록된 카드로 결제하기","description":"간편 결제에 등록된 카드로 결제하기.\n\n`subscribe.payments.again` 은 고객이 간편 결제에 등록한 카드로 결제를 진행하고자 할 때\n호출하는 API 함수이다. 이는 간편하고 불편하고를 떠나, 본질적으로 카드 결제의 일환이기에,\n리턴값은 일반적인 카드 결제 때와 동일한 {@link IIamportCardPayment } 이다.\n\n그리고 `subscribe.payments.again` 은 결제 수단 중 유일하게, 클라이언트 어플리케이션이\n아임포트가 제공하는 결체 창을 사용할 수 없어, 오직 귀하의 백엔드 서버가 아임포트의 API\n함수를 직접 호출해야하는 경우에 해당한다. 따라서 간편 결제에 관하여 아임포트 서버와\n연동하는 백엔드 서버 및 프론트 어플리케이션을 개발할 때, 반드시 이 상황에 대한 별도의\n설계 및 개발이 필요하니, 이 점을 염두에 두기 바란다.","security":[{"bearer":[]}]}},"/certifications/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"responses":{"200":{"description":"본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 정보 열람하기","description":"본인인증 정보 열람하기.\n\n`certiciations.at` 은 본인인증 정보를 열람할 때 사용하는 API 함수이다.\n\n다만 이 API 함수를 통하여 열람한 본인인증 정보 {@link IIamportCertification } 이\n곧 OTP 인증까지 마쳐 본인인증을 모두 마친 레코드라는 보장은 없다. 본인인증의 완결\n여부는 오직, {@link IIamportCertification.certified } 값을 직접 검사해봐야만 알\n수 있기 때문이다.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"responses":{"200":{"description":"삭제된 본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 정보 삭제하기","description":"본인인증 정보 삭제하기.","security":[{"bearer":[]}]}},"/certifications/otp/request":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"본인인증 요청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportCertification.ICreate"}}},"required":true},"responses":{"201":{"description":"진행 중인 본인인증의 식별자 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification.IAccessor"}}}}},"summary":"본인인증 요청하기","description":"본인인증 요청하기.\n\n`certifications.otp.request` 는 아임포트 서버에 본인인증을 요청하는 API 함수이다.\n이 API 를 호출하면 본인인증 대상자의 핸드폰으로 OTP 문자가 전송되며, 본인인증\n대상자가 {@link certifications.otp.confirm } 을 통하여 이 OTP 번호를 정확히\n입력함으로써, 본인인증이 완결된다.\n\n또한 본인인증 대상자가 자신의 핸드폰으로 전송된 OTP 문자를 입력하기 전에도,\n여전히해당 본인인증 내역은 {@link certifications.at } 함수를 통하여 조회할 수 있다.\n다만, 이 때 리턴되는 {@link IIamportCertification } 에서 인증의 완결 여부를\n지칭하는 {@link IIamportCertification.certified } 값은 `false` 이다.","security":[{"bearer":[]}]}},"/certifications/otp/confirm/{imp_uid}":{"post":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"requestBody":{"description":"OTP 코드","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportCertification.IConfirm"}}},"required":true},"responses":{"201":{"description":"인증 완료된 본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 시 발급된 OTP 코드 입력하기","description":"본인인증 시 발급된 OTP 코드 입력하기.\n\n`certifications.otp.confirm` 는 {@link certifications.otp.request } 를 통하여\n발급된 본인인증 건에 대하여, 본인인증 대상자의 휴대폰으로 전송된 OTP 번호를\n검증하고, 입력한 OTP 번호가 맞거든 해당 본인인증 건을 승인하여 완료 처리해주는\nAPI 함수이다.\n\n이처럼 본인인증을 완료하거든, 해당 본인인증 건 {@link IIamportCertification } 의\n{@link IIamportCertification.certified } 값이 비로소 `true` 로 변경되어,\n비로소 완결된다.","security":[{"bearer":[]}]}},"/internal/webhook":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"웹훅 이벤트 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPayment.IWebhook"}}},"required":true},"responses":{"201":{"description":""}},"summary":"웹훅 이벤트 더미 리스너","description":"웹훅 이벤트 더미 리스너.\n\n`internal.webhook` 은 실제 아임포트의 서버에는 존재하지 않는 API 로써,\n`fake-impoart-server` 의 {@link Configuration.WEBHOOK_URL } 에 아무런 URL 을 설정하지\n않으면, `fake-iamport-server` 로부터 발생하는 모든 종류의 웹훅 이벤트는 이 곳으로 전달되어\n무의미하게 사라진다.\n\n따라서 `fake-iamport-server` 를 사용하여 아임포트 서버와의 연동을 미리 검증코자 할 때는,\n반드시 {@link Configuration.WEBHOOK_URL } 를 설정하여 웹훅 이벤트가 귀하의 백엔드 서버로\n제대로 전달되도록 하자."}},"/internal/deposit/{imp_uid}":{"put":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 결제의 ","required":true}],"responses":{"201":{"description":""}},"summary":"가상 계좌에 입금하기","description":"가상 계좌에 입금하기.\n\n`internal.deposit` 은 실제 아임포트 결제 서버에는 존재하지 않는 API 로써, 가상 계좌\n결제를 신청한 고객이, 이후 가상 계좌에 목표 금액을 입금하는 상황을 시뮬레이션 할 수 있는\n함수이다.\n\n즉, `internal.deposit` 는 고객이 스스로에게 가상으로 발급된 계좌에 입금을 하고, 그에 따라\n아임포트 서버에서 webhook 이벤트가 발생, 이를 귀하의 백엔드 서버로 전송하는 일련의 상황을\n시뮬레이션하기 위하여 설계된 테스트 함수다.","security":[{"bearer":[]}]}},"/payments/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 결제 기록의 ","required":true},{"name":"query","in":"query","schema":{"$ref":"#/components/schemas/IIamportPayment.IQuery"},"description":"결제 수단이 페이팔인 경우에 사용","required":true}],"responses":{"200":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportPayment"}}}}},"summary":"결제 기록 열람하기","description":"결제 기록 열람하기.\n\n아임포트를 통하여 발생한 결제 기록을 열람한다.","security":[{"bearer":[]}]}},"/payments/cancel":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"결제 취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPaymentCancel.ICreate"}}},"required":true},"responses":{"201":{"description":"취소된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportPayment"}}}}},"summary":"결제 취소하기","description":"결제 취소하기.\n\n만약 가상 계좌를 통한 결제였다면, 반드시 환불 계좌 정보를 입력해줘야 한다.","security":[{"bearer":[]}]}},"/receipts/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"responses":{"200":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 조회하기","description":"현금 영수증 조회하기.","security":[{"bearer":[]}]},"post":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"requestBody":{"description":"현금 영수증 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportReceipt.ICreate"}}},"required":true},"responses":{"201":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 발행하기","description":"현금 영수증 발행하기.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"responses":{"200":{"description":"취소된 현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 취소하기","description":"현금 영수증 취소하기.","security":[{"bearer":[]}]}},"/users/getToken":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"아임포트의 API 및 secret 키 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportUser.IAccessor"}}},"required":true},"responses":{"201":{"description":"유저 인증 토큰 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportUser"}}}}},"summary":"유저 인증 토큰 발행하기","description":"유저 인증 토큰 발행하기.\n\n아임포트에 가입하여 부여받은 API 및 secret 키를 토대로, 유저 인증 토큰을 발행한다.\n\n단, 아임포트가 발급해주는 유저 인증 토큰에는 유효 시간 {@link IIamportUser.expired_at }\n이 있어, 해당 시간이 지나거든 기 발급 토큰이 만료되어 더 이상 쓸 수 없게 된다. 때문에\n아임포트의 이러한 시간 제한에 구애받지 않고 자유로이 아임포트의 API 를 이용하고 싶다면,\n`iamport-server-api` 에서 제공해주는 {@link IamportConnector } 를 활용하도록 하자."}},"/vbanks":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"가상 계좌 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportVBankPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportVBankPayment"}}}}},"summary":"가상 계좌 발급하기","description":"가상 계좌 발급하기.","security":[{"bearer":[]}]},"put":{"tags":[],"parameters":[],"requestBody":{"description":"가상 계좌 편집 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportVBankPayment.IUpdate"}}},"required":true},"responses":{"201":{"description":"편집된 가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportVBankPayment"}}}}},"summary":"가상 계좌 편집하기","description":"가상 계좌 편집하기.","security":[{"bearer":[]}]}}},"components":{"schemas":{"IIamportResponseIIamportSubscription":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportSubscription","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportSubscription":{"type":"object","properties":{"pg_provider":{"type":"string"},"pg_id":{"type":"string"},"card_name":{"type":"string"},"card_code":{"type":"string"},"card_number":{"type":"string"},"card_type":{"type":"string"},"customer_name":{"type":"string","nullable":true},"customer_tel":{"type":"string","nullable":true},"customer_email":{"type":"string","nullable":true},"customer_addr":{"type":"string","nullable":true},"customer_postcode":{"type":"string","nullable":true},"inserted":{"type":"number"},"updated":{"type":"number"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["pg_provider","pg_id","card_name","card_code","card_number","card_type","customer_name","customer_tel","customer_email","customer_addr","customer_postcode","inserted","updated","customer_uid"],"description":"간편 결제 카드 정보."},"IIamportSubscription.ICreate":{"type":"object","properties":{"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호.\n\n형식: XXXX-XXXX-XXXX-XXXX"},"expiry":{"type":"string","pattern":"^([0-9]{4})-(0[1-9]|1[012])$","description":"카드 유효기간.\n\n형식: YYYY-MM"},"birth":{"type":"string","pattern":"^(([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))|(\\d{10})$","description":"생년월일 YYMMDD 또는 사업자등록번호 10자리."},"pwd_2digit":{"type":"string","pattern":"\\d{2}","description":"카드 비밀번호 앞 두 자리."},"cvc":{"type":"string","pattern":"\\d{2}","description":"카드 인증번호 (카드 뒷면 3 자리)."},"customer_name":{"type":"string"},"customer_tel":{"type":"string"},"customer_email":{"type":"string","format":"email"},"customr_addr":{"type":"string"},"customer_postcode":{"type":"string"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["card_number","expiry","birth","customer_uid"],"description":"간편 결제 카드 입력 정보."},"IIamportSubscription.IOnetime":{"type":"object","properties":{"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함.\n\n이를 생략시 단순 결제로만 그치며, 카드 정보가 간편 결제용으로 등록되지 아니함."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호.\n\n형식: XXXX-XXXX-XXXX-XXXX"},"expiry":{"type":"string","pattern":"^([0-9]{4})-(0[1-9]|1[012])$","description":"카드 유효기간.\n\n형식: YYYY-MM"},"birth":{"type":"string","pattern":"^(([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))|(\\d{10})$","description":"생년월일 YYMMDD 또는 사업자등록번호 10자리."},"pwd_2digit":{"type":"string","pattern":"\\d{2}","description":"카드 비밀번호 앞 두 자리."},"cvc":{"type":"string","pattern":"\\d{2}","description":"카드 인증번호 (카드 뒷면 3 자리)."},"customer_name":{"type":"string"},"customer_tel":{"type":"string"},"customer_email":{"type":"string","format":"email"},"customr_addr":{"type":"string"},"customer_postcode":{"type":"string"},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트가 아닌 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"name":{"type":"string","description":"주문 이름."},"currency":{"type":"string","enum":["KRW","USD","EUR","JPY"],"description":"통화 정보."},"tax_free":{"type":"number","description":"면세 공급가액.\n\n기본값은 0 로써, 알아서 amount 의 1/11 로써 부가세 처리됨."},"card_quota":{"type":"number","description":"할부 개월 수.\n\n일시불은 0."},"buyer_name":{"type":"string"},"buyer_email":{"type":"string","format":"email"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"interest_free_by_merchant":{"type":"boolean","description":"카드할부처리할 때, 할부이자가 발생하는 경우 (카드사 무이자 프로모션 제외).\n\n부과되는 할부이자를 고객대신 가맹점이 지불하고자 PG사와 계약된 경우(현재, 나이스페이먼츠만 지원됨)"},"use_card_point":{"type":"boolean","description":"승인요청시 카드사 포인트 차감하며 결제승인처리할지 flag.\n\nPG사 영업담당자와 계약 당시 사전 협의 필요(현재, 나이스페이먼츠만 지원됨)"},"custom_data":{"type":"string","description":"임의 정보를 기재할 수 있다."},"notice_url":{"type":"string","format":"url","description":"결제 성공시 통지될 Notification, 웹훅 URL."}},"nullable":false,"required":["card_number","expiry","birth","merchant_uid","amount","name"],"description":"결제 신청 입력 정보."},"IIamportResponseIIamportCardPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCardPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCardPayment":{"type":"object","properties":{"card_code":{"type":"string","description":"카드 식별자 코드."},"card_name":{"type":"string","description":"카드 이름."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호."},"card_quota":{"type":"integer","description":"할부 개월 수."},"apply_num":{"type":"string","description":"카드사 승인번호."},"pay_method":{"type":"string","enum":["card","samsung"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["card_code","card_name","card_number","card_quota","apply_num","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"카드 결제 정보."},"IIamportPayment.Currency":{"type":"string","enum":["KRW","USD","EUR","JPY"]},"IIamportPayment.Status":{"type":"string","enum":["paid","ready","failed","cancelled"]},"IIamportPaymentCancel":{"type":"object","properties":{"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"amount":{"type":"number"},"cancelled_at":{"type":"number"},"reason":{"type":"string"},"receipt_url":{"type":"string","format":"url"}},"nullable":false,"required":["pg_id","pg_tid","amount","cancelled_at","reason","receipt_url"],"description":"결제 취소 정보."},"IIamportSubscription.IAgain":{"type":"object","properties":{"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트가 아닌 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"name":{"type":"string","description":"주문 이름."},"currency":{"type":"string","enum":["KRW","USD","EUR","JPY"],"description":"통화 정보."},"tax_free":{"type":"number","description":"면세 공급가액.\n\n기본값은 0 로써, 알아서 amount 의 1/11 로써 부가세 처리됨."},"card_quota":{"type":"number","description":"할부 개월 수.\n\n일시불은 0."},"buyer_name":{"type":"string"},"buyer_email":{"type":"string","format":"email"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"interest_free_by_merchant":{"type":"boolean","description":"카드할부처리할 때, 할부이자가 발생하는 경우 (카드사 무이자 프로모션 제외).\n\n부과되는 할부이자를 고객대신 가맹점이 지불하고자 PG사와 계약된 경우(현재, 나이스페이먼츠만 지원됨)"},"use_card_point":{"type":"boolean","description":"승인요청시 카드사 포인트 차감하며 결제승인처리할지 flag.\n\nPG사 영업담당자와 계약 당시 사전 협의 필요(현재, 나이스페이먼츠만 지원됨)"},"custom_data":{"type":"string","description":"임의 정보를 기재할 수 있다."},"notice_url":{"type":"string","format":"url","description":"결제 성공시 통지될 Notification, 웹훅 URL."},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["merchant_uid","amount","name","customer_uid"],"description":"간편 결제 카드로 결제 신청 입력 정보."},"IIamportResponseIIamportCertification":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCertification","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCertification":{"type":"object","properties":{"imp_uid":{"type":"string","description":"아임포트가 발급해 준 식별자 번호."},"merchant_uid":{"type":"string","nullable":true,"description":"서비스로부터의 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","description":"본인인증대상자 성명."},"gender":{"type":"string","description":"성별."},"birth":{"type":"number","description":"생년월일.\n\n리눅스 타임이 쓰인다."},"birthday":{"type":"string","pattern":"^([0-9]{4})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"생년월일, YYYYMMDD 형식."},"foreigner":{"type":"boolean","description":"외국인 여부."},"phone":{"type":"string","description":"본인인증 대상자 핸드폰 번호."},"carrier":{"type":"string","enum":["SKT","KT","LGT"],"description":"본인인증 대상자 통신사 코드."},"certified":{"type":"boolean","description":"OTP 인증 여부."},"certified_at":{"type":"number","description":"OTP 인증 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"unique_key":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"unique_in_site":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"pg_tid":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"pg_provider":{"type":"string","description":"PG 제공자."},"origin":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"__otp":{"type":"string","description":"(테스트 전용) OTP 코드.\n\n오직 `fake-iamport-server` 에서만 쓰이는 속성으로써, 본인인증을 시뮬레이션할 때,\n어떠한 OTP 코드가 발급되었는 지를 확인하기 위하여 사용된다. 이를 이용하여\n{@link functional.certifications.otp.confirm } 함수를 호출하면, 본인인증을 완료할\n수 있다."}},"nullable":false,"required":["imp_uid","merchant_uid","name","gender","birth","birthday","foreigner","phone","carrier","certified","certified_at","unique_key","unique_in_site","pg_tid","pg_provider","origin"],"description":"본인 인증 내역.\n\n`IIamportCertification` 은 아임포트의 본인인증 정보를 형상화한 자료구조 인터페이스이다.\n\n단, `IIamportCertification` 레코드의 존재가 곧 본인인증의 완결을 뜻하는 것은 아니다.\n{@link IIamportCertification.certified } 값이 `true` 여야만이 비로소, 본인인증\n대상자가 자신의 핸드폰 번호로 전송된 OTP 를 아임포트의 본인인증 팝업창에 정확히 적어,\n본인인증을 완료했음을 의미한다."},"IIamportCertification.ICreate":{"type":"object","properties":{"name":{"type":"string","description":"본인인증대상자 성명."},"phone":{"type":"string","description":"본인인증 대상자 핸드폰 번호.\n\n핸드폰 번호에 \"-\" 값이 들어가던 아니던 상관 없음.\n\n다만, 내부적으로는 \"-\" 값을 제거하여 처리한다."},"birth":{"type":"string","pattern":"^([0-9]{4})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"생년월일.\n\nYYYYMMDD 형식."},"gender_digit":{"type":"string","description":"주민등록 뒷부분 첫 자리."},"carrier":{"type":"string","enum":["SKT","KT","LGT"],"description":"본인인증 대상자 통신사 코드."},"is_mvno":{"type":"boolean","description":"알뜰폰 여부."},"commpany":{"type":"string","description":"가맹점 서비스 명칭 또는 domain URL.\n\nKISA 에서 대상자에게 발송하는 SMS에 안내될 서비스 명칭."},"merchant_uid":{"type":"string","description":"귀사 서비스에서의 본인인증 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"pg":{"type":"string","description":"PG 사 구분자.\n\n다날 상점아이디를 2개 이상 동시에 사용하시려는 경우에 설정하면 된다.\n\n**danal.{상점아이디}** 형태로 지정."}},"nullable":false,"required":["name","phone","birth","gender_digit","carrier"],"description":"본인 인증 입력 정보."},"IIamportResponseIIamportCertification.IAccessor":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCertification.IAccessor","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCertification.IAccessor":{"type":"object","properties":{"imp_uid":{"type":"string","description":"본인인증정보의 식별자 키."}},"nullable":false,"required":["imp_uid"],"description":"본인인증 정보의 접근자 구조체."},"IIamportCertification.IConfirm":{"type":"object","properties":{"otp":{"type":"string","description":"SMS 로 전송된 본인인증 번호."}},"nullable":false,"required":["otp"],"description":"본인인증 승인을 위한 입력 정보."},"IIamportPayment.IWebhook":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"status":{"type":"string","enum":["paid","ready","failed","cancelled"],"description":"현재 상태."}},"nullable":false,"required":["imp_uid","merchant_uid","status"],"description":"웹훅 데이터."},"IIamportPayment.IQuery":{"type":"object","properties":{"extension":{"type":"boolean","description":"페이팔의 경우, 이 값을 `true` 로 할 것."}},"nullable":false,"description":"결제 수단이 페이팔인 경우, 페이팔의 구매자 보호정책에 의해 결제 승인 시점에\nPending 상태를 만든 후, 내부 심사등을 통해 최종 결제 완료라고 변경함.\n\n`iamport` 의 기술적 이슈로 해당 상태를 status: failed 로 기록함. 추후\n페이팔에서 최종결제완료로 변경된 경우, `iamport` 에서 `paid` 로 변경 후,\n해당건에 대한 웹훅 발송. `iamport` 를 사용하는 고객사에서는, failed 로 이미\n처리된 결제건에 대한 paid 상태의 웹훅을 받는 문제점이 생김.\n\n이에, `iamport` 에서 제공하는 `/payment/{imp_uid}` 에 query-string 으로\n`extension=true` 옵션을 추가해야 함"},"IIamportResponseIIamportPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportPayment":{"oneOf":[{"$ref":"#/components/schemas/IIamportCardPayment"},{"$ref":"#/components/schemas/IIamportTransferPayment"},{"$ref":"#/components/schemas/IIamportVBankPayment"},{"$ref":"#/components/schemas/IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint"}],"description":"결제 정보.\n\n`IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.pay_method === \"card\")\n payment.card_number; // payment be IIamportCardPayment\n```"},"IIamportTransferPayment":{"type":"object","properties":{"bank_code":{"type":"string","description":"은행 식별자 코드."},"bank_name":{"type":"string","description":"은행 이름."},"pay_method":{"type":"string","enum":["trans"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["bank_code","bank_name","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"계좌 이체 결제 정보."},"IIamportVBankPayment":{"type":"object","properties":{"vbank_code":{"type":"string","description":"가상 계좌 식별자 코드."},"vbank_name":{"type":"string","description":"가상 게좌 이름"},"vbank_num":{"type":"string","description":"가상 계좌 번호"},"vbank_holder":{"type":"string","description":"가상 계좌 예금주."},"vbank_date":{"type":"number","description":"가상 계좌 입금 만료 기한."},"vbank_issued_at":{"type":"number","description":"가상 계좌 개설 일시."},"pay_method":{"type":"string","enum":["vbank"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["vbank_code","vbank_name","vbank_num","vbank_holder","vbank_date","vbank_issued_at","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"가상 계좌 결제 정보."},"IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint":{"type":"object","properties":{"pay_method":{"type":"string","enum":["phone","kpay","kakaopay","payco","lpay","ssgpay","tosspay","cultureland","smartculture","happymoney","booknlife","point"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"결제 기본 (공통) 정보."},"IIamportPaymentCancel.ICreate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"amount":{"type":"number","description":"취소 금액, 부분 취소도 가능하다.\n\n누락시 전액 취소."},"checksum":{"type":"number","minimum":0,"nullable":true,"description":"취소 트랜잭션 수행 전, 현재 시점의 취소 가능한 잔액.\n\nAPI요청자가 기록하고 있는 취소가능 잔액과 아임포트가 기록하고 있는 취소가능 잔액이\n일치하는지 사전에 검증하고, 검증에 실패하면 트랜잭션을 수행하지 않는다.\n\n`null` 인 경우에는 검증 프로세스를 생략."},"reason":{"type":"string","description":"취소 사유."},"tax_free":{"type":"number","default":0,"description":"취소요청금액 중 면세금액."},"refund_holder":{"type":"string","description":"환불계좌 예금주."},"refund_bank":{"type":"string","description":"환불계좌 은행 코드."},"refund_account":{"type":"string","description":"환불계좌 계좌번호."},"refund_tel":{"type":"string","description":"환불계좌 예금주 연락처"}},"nullable":false,"required":["imp_uid","merchant_uid","checksum","reason"],"description":"결제 취소 입력 정보."},"IIamportResponseIIamportReceipt":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportReceipt","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportReceipt":{"type":"object","properties":{"imp_uid":{"type":"string","description":"귀속 결제의 {@link IIamportPayment.imp_uid }."},"receipt_uid":{"type":"string","description":"현금 영수증의 고유 식별자 ID."},"apply_num":{"type":"string","description":"승인 번호."},"type":{"$ref":"#/components/schemas/IIamportReceipt.Type","description":"발행 타입 (대상)."},"amount":{"type":"number","description":"결제 총액."},"vat":{"type":"number","description":"부가세."},"receipt_url":{"type":"string","format":"url","description":"현금영수증 조회 URL."},"applied_at":{"type":"number","description":"현금영수증 발행 시간."},"cancelled_at":{"type":"number","description":"현금영수증 취소 시간.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."}},"nullable":false,"required":["imp_uid","receipt_uid","apply_num","type","amount","vat","receipt_url","applied_at","cancelled_at"],"description":"현금 영수증 정보."},"IIamportReceipt.Type":{"type":"string","enum":["person","company"],"description":"현금영수증 발행 타입 (대상)."},"IIamportReceipt.ICreate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"귀속 결제의 {@link IIamportPayment.imp_uid }."},"identifier":{"type":"string","description":"현금영수증 발생대상 식별정보.\n\n - 국세청현금영수증카드\n - 휴대폰번호\n - 주민등록번호\n - 사업자등록번호"},"identifier_type":{"type":"string","enum":["phone","person","business","taxcard"],"description":"현금영수증 발행대상 유형.\n\n - person: 주민등록번호\n - business: 사업자등록번호\n - phone: 휴대폰번호\n - taxcard: 국세청현금영수증카드\n\n일부 PG 사의 경우 이 항목이 없어 된다는데, 어지간하면 그냥 쓰기 바람."},"type":{"type":"string","enum":["person","company"],"description":"현금영수증 발행 타입 (대상).\n\n누락시 person 이 사용됨."},"buyer_name":{"type":"string","description":"구매자 이름.\n\n형금영수증 발행건 사후 추적을 위해 가급 입력하기 바람."},"buyer_email":{"type":"string","description":"구매자 이메일."},"buyer_tel":{"type":"string","description":"구매자 전화번호.\n\n현금영수증 발행건 사후 추적을 위해 가급 입력하기 바람."},"tax_free":{"type":"number","description":"면세 금액."}},"nullable":false,"required":["imp_uid","identifier"],"description":"현금영수증 입력 정보."},"IIamportUser.IAccessor":{"type":"object","properties":{"imp_key":{"type":"string","description":"API 키."},"imp_secret":{"type":"string","description":"Secret 키."}},"nullable":false,"required":["imp_key","imp_secret"],"description":"아임포트에서 부여해 준 API 및 secret 키."},"IIamportResponseIIamportUser":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportUser","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportUser":{"type":"object","properties":{"now":{"type":"number","description":"토큰 발행 시간."},"expired_at":{"type":"number","description":"토큰 만료 시간.\n\n리눅스 타임이 기준이며, 이를 JS 에서 사용하려거든, 아래와 같이 변환해야 한다.\n\n```typescript\nnew Date(user.expired_at * 1_000);\n```"},"access_token":{"type":"string","description":"유저 인증 토큰."}},"nullable":false,"required":["now","expired_at","access_token"],"description":"아임포트 유저 인증 정보.\n\n아임포트는 고객사에게 API 및 secret 키 정보, {@link IIamportUser.IAccessor } 를 발급해준다.\n\n하지만 이를 곧장 아임포트의 유저 인증에 사용할 수는 없고, 해당 API 및 secret 키를 토대로 유저\n인증 토큰을 발급받아야 하는데, 이 유저 인증 토큰에는 하필이면 만로 시간이라는 게 존재한다.\n`IIamportUser` 는 바로 이러한 유저 인증 토큰 및 그것의 만료 시간을 형상화한 자료구조\n인터페이스이다.\n\n더하여 이처럼 만료 시간이 존재하는 아임포트의 유저 인증 토큰의 특성상, 이것의 만료 시간이\n초과되지 않도록 관리하는 것은 매우 힘든 일이다. 이에 `iamport-server-api` 에서는 아임포트\n유저 인증 토큰이 만료될 때마다 자동 갱신해주는, {@link IamportConnector } 클래스를 제공한다."},"IIamportVBankPayment.ICreate":{"type":"object","properties":{"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"amount":{"type":"number","description":"총액."},"vbank_code":{"type":"string","description":"가상계좌 은행 코드."},"vbank_due":{"type":"number","description":"가상계좌 입금기한, 유닉스 타임."},"vbank_holder":{"type":"string","description":"예금주."},"name":{"type":"string"},"buyer_name":{"type":"string"},"buyer_email":{"type":"string"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"pg":{"type":"string"},"notice_url":{"type":"string","description":"가상 계좌 입금 정보를 수신할 URL.\n\n누락시 기본 웹훅 URL 사용."},"custom_data":{"type":"string","description":"커스텀 데이터, 자유롭게 사용 가능."},"pg_api_key":{"type":"string","description":"[이니시스 전용] 가맹점 콘솔에서 확인한 API 값."}},"nullable":false,"required":["merchant_uid","amount","vbank_code","vbank_due","vbank_holder"],"description":"가상 계좌 결제 입력 정보.\n\n가상 계좌를 임의 생성할 수 있다.\n\n단, 일부 PG 사 혹은 `fake-iamport-server` 만 가능.\n\n - 세틀뱅크\n - 나이스페이먼츠\n - KG이니시스"},"IIamportResponseIIamportVBankPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportVBankPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportVBankPayment.IUpdate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"대상 결제 기록의 {@link IIamportPayment.imp_uid }."},"amount":{"type":"number","description":"수정할 결제 금액."},"vbank_due":{"type":"number","description":"수정할 가상계좌 입금 기한."}},"nullable":false,"required":["imp_uid"],"description":"가상 계좌 결제의 수정 입력 정보.\n\n아직 입금되지 않은 가상계좌의 입금기한 또는 입금금액을 수정할 수 있다.\n\n다만, 세틀뱅크 혹은 `fake-iamport-server` 만 가능."}},"securitySchemes":{"bearer":{"type":"apiKey","name":"Authorization","in":"header"}}}} \ No newline at end of file +{"openapi":"3.0.1","servers":[{"url":"http://localhost:10851","description":"fake"},{"url":"https://api.iamport.kr","description":"real"}],"info":{"title":"Iamport API","description":"Built by [fake-iamport-server](https://github.com/samchon/payments/tree/master/packages/fake-iamport-server) with [nestia](https://github.com/samchon/nestia)","version":"6.0.2","license":{"name":"MIT"}},"paths":{"/subscribe/customers/{customer_uid}":{"get":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"responses":{"200":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 정보 조회하기","description":"간편 결제 카드 정보 조회하기.\n\n`subscribe.customers.at` 은 고객이 {@link create } 나 혹은 아임포트가 제공하는\n간편 결제 카드 등록 창을 이용하여 저장한 간편 결제 카드 정보를 조회하는 API\n함수이다.","security":[{"bearer":[]}]},"post":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"requestBody":{"description":"카드 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.ICreate"}}},"required":true},"responses":{"201":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 등록하기","description":"간편 결제 카드 등록하기.\n\n`subscribe.customers.stoer` 는 고객이 자신의 카드를 서버에 등록해두고, 매번 결제가\n필요할 때마다 카드 정보를 반복 입력하는 일 없이, 간편하게 결제를 진행하고자 할 때\n사용하는 API 함수이다.\n\n참고로 `subscribe.customers.create` 는 클라이언트 어플리케이션이 아임포트가 제공하는\n간편 결제 카드 등록 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는\n일은 없을 것이다. 다만, 고객이 간편 결제 카드를 등록하는 상황을 시뮬레이션하기 위하여,\n테스트 자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"responses":{"200":{"description":"삭제된 간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 삭제하기","description":"간편 결제 카드 삭제하기.\n\n간편 결제를 위하여 등록한 카드를 제거한다.","security":[{"bearer":[]}]}},"/subscribe/payments/onetime":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"카드 결제 신청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.IOnetime"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCardPayment"}}}}},"summary":"카드로 결제하기, 더불어 간편 결제용으로 등록 가능","description":"카드로 결제하기, 더불어 간편 결제용으로 등록 가능.\n\n`subscribe.payments.onetime` 은 카드를 매개로 한 결제를 하고자 할 때 호출하는 API\n함수이다. 더하여 입력 값에 {@link IIamportSubscription.IOnetime.customer_uid } 를\n기입하는 경우, 결제에 사용한 카드를 그대로 간편 결제용 카드\n{@link IIamportSubscription } 로 등록해버린다.\n\n다만, 정히 간편 카드 등록과 결제를 동시에 하고 싶다면,\n`subscribe.payments.onetime` 에 {@link IIamportSubscription.IOnetime.customer_uid }\n를 더하기보다, {@link subscribe.customers.create } 와 {@link subscribe.payments.again }\n을 각각 호출하는 것을 권장한다. 그것이 예외적인 상황에 보다 안전하게 대처할 수 있기\n때문이다.\n\n더하여 `subscribe.payments.onetime` 은 클라이언트 어플리케이션이 아임포트가 제공하는\n결제 창을 그대로 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는 일은\n없을 것이다. 다만, 고객이 카드를 통하여 결제하는 상황을 시뮬레이션하기 위하여, 테스트\n자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"bearer":[]}]}},"/subscribe/payments/again":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"미리 등록한 카드를 이용한 결제 신청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.IAgain"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCardPayment"}}}}},"summary":"간편 결제에 등록된 카드로 결제하기","description":"간편 결제에 등록된 카드로 결제하기.\n\n`subscribe.payments.again` 은 고객이 간편 결제에 등록한 카드로 결제를 진행하고자 할 때\n호출하는 API 함수이다. 이는 간편하고 불편하고를 떠나, 본질적으로 카드 결제의 일환이기에,\n리턴값은 일반적인 카드 결제 때와 동일한 {@link IIamportCardPayment } 이다.\n\n그리고 `subscribe.payments.again` 은 결제 수단 중 유일하게, 클라이언트 어플리케이션이\n아임포트가 제공하는 결체 창을 사용할 수 없어, 오직 귀하의 백엔드 서버가 아임포트의 API\n함수를 직접 호출해야하는 경우에 해당한다. 따라서 간편 결제에 관하여 아임포트 서버와\n연동하는 백엔드 서버 및 프론트 어플리케이션을 개발할 때, 반드시 이 상황에 대한 별도의\n설계 및 개발이 필요하니, 이 점을 염두에 두기 바란다.","security":[{"bearer":[]}]}},"/certifications/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"responses":{"200":{"description":"본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 정보 열람하기","description":"본인인증 정보 열람하기.\n\n`certiciations.at` 은 본인인증 정보를 열람할 때 사용하는 API 함수이다.\n\n다만 이 API 함수를 통하여 열람한 본인인증 정보 {@link IIamportCertification } 이\n곧 OTP 인증까지 마쳐 본인인증을 모두 마친 레코드라는 보장은 없다. 본인인증의 완결\n여부는 오직, {@link IIamportCertification.certified } 값을 직접 검사해봐야만 알\n수 있기 때문이다.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"responses":{"200":{"description":"삭제된 본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 정보 삭제하기","description":"본인인증 정보 삭제하기.","security":[{"bearer":[]}]}},"/certifications/otp/request":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"본인인증 요청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportCertification.ICreate"}}},"required":true},"responses":{"201":{"description":"진행 중인 본인인증의 식별자 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification.IAccessor"}}}}},"summary":"본인인증 요청하기","description":"본인인증 요청하기.\n\n`certifications.otp.request` 는 아임포트 서버에 본인인증을 요청하는 API 함수이다.\n이 API 를 호출하면 본인인증 대상자의 핸드폰으로 OTP 문자가 전송되며, 본인인증\n대상자가 {@link certifications.otp.confirm } 을 통하여 이 OTP 번호를 정확히\n입력함으로써, 본인인증이 완결된다.\n\n또한 본인인증 대상자가 자신의 핸드폰으로 전송된 OTP 문자를 입력하기 전에도,\n여전히해당 본인인증 내역은 {@link certifications.at } 함수를 통하여 조회할 수 있다.\n다만, 이 때 리턴되는 {@link IIamportCertification } 에서 인증의 완결 여부를\n지칭하는 {@link IIamportCertification.certified } 값은 `false` 이다.","security":[{"bearer":[]}]}},"/certifications/otp/confirm/{imp_uid}":{"post":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"requestBody":{"description":"OTP 코드","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportCertification.IConfirm"}}},"required":true},"responses":{"201":{"description":"인증 완료된 본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 시 발급된 OTP 코드 입력하기","description":"본인인증 시 발급된 OTP 코드 입력하기.\n\n`certifications.otp.confirm` 는 {@link certifications.otp.request } 를 통하여\n발급된 본인인증 건에 대하여, 본인인증 대상자의 휴대폰으로 전송된 OTP 번호를\n검증하고, 입력한 OTP 번호가 맞거든 해당 본인인증 건을 승인하여 완료 처리해주는\nAPI 함수이다.\n\n이처럼 본인인증을 완료하거든, 해당 본인인증 건 {@link IIamportCertification } 의\n{@link IIamportCertification.certified } 값이 비로소 `true` 로 변경되어,\n비로소 완결된다.","security":[{"bearer":[]}]}},"/internal/webhook":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"웹훅 이벤트 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPayment.IWebhook"}}},"required":true},"responses":{"201":{"description":""}},"summary":"웹훅 이벤트 더미 리스너","description":"웹훅 이벤트 더미 리스너.\n\n`internal.webhook` 은 실제 아임포트의 서버에는 존재하지 않는 API 로써,\n`fake-impoart-server` 의 {@link Configuration.WEBHOOK_URL } 에 아무런 URL 을 설정하지\n않으면, `fake-iamport-server` 로부터 발생하는 모든 종류의 웹훅 이벤트는 이 곳으로 전달되어\n무의미하게 사라진다.\n\n따라서 `fake-iamport-server` 를 사용하여 아임포트 서버와의 연동을 미리 검증코자 할 때는,\n반드시 {@link Configuration.WEBHOOK_URL } 를 설정하여 웹훅 이벤트가 귀하의 백엔드 서버로\n제대로 전달되도록 하자."}},"/internal/deposit/{imp_uid}":{"put":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 결제의 ","required":true}],"responses":{"201":{"description":""}},"summary":"가상 계좌에 입금하기","description":"가상 계좌에 입금하기.\n\n`internal.deposit` 은 실제 아임포트 결제 서버에는 존재하지 않는 API 로써, 가상 계좌\n결제를 신청한 고객이, 이후 가상 계좌에 목표 금액을 입금하는 상황을 시뮬레이션 할 수 있는\n함수이다.\n\n즉, `internal.deposit` 는 고객이 스스로에게 가상으로 발급된 계좌에 입금을 하고, 그에 따라\n아임포트 서버에서 webhook 이벤트가 발생, 이를 귀하의 백엔드 서버로 전송하는 일련의 상황을\n시뮬레이션하기 위하여 설계된 테스트 함수다.","security":[{"bearer":[]}]}},"/payments/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 결제 기록의 ","required":true},{"name":"query","in":"query","schema":{"$ref":"#/components/schemas/IIamportPayment.IQuery"},"description":"결제 수단이 페이팔인 경우에 사용","required":true}],"responses":{"200":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportPayment"}}}}},"summary":"결제 기록 열람하기","description":"결제 기록 열람하기.\n\n아임포트를 통하여 발생한 결제 기록을 열람한다.","security":[{"bearer":[]}]}},"/payments/cancel":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"결제 취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPaymentCancel.ICreate"}}},"required":true},"responses":{"201":{"description":"취소된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportPayment"}}}}},"summary":"결제 취소하기","description":"결제 취소하기.\n\n만약 가상 계좌를 통한 결제였다면, 반드시 환불 계좌 정보를 입력해줘야 한다.","security":[{"bearer":[]}]}},"/receipts/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"responses":{"200":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 조회하기","description":"현금 영수증 조회하기.","security":[{"bearer":[]}]},"post":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"requestBody":{"description":"현금 영수증 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportReceipt.ICreate"}}},"required":true},"responses":{"201":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 발행하기","description":"현금 영수증 발행하기.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"responses":{"200":{"description":"취소된 현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 취소하기","description":"현금 영수증 취소하기.","security":[{"bearer":[]}]}},"/users/getToken":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"아임포트의 API 및 secret 키 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportUser.IAccessor"}}},"required":true},"responses":{"201":{"description":"유저 인증 토큰 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportUser"}}}}},"summary":"유저 인증 토큰 발행하기","description":"유저 인증 토큰 발행하기.\n\n아임포트에 가입하여 부여받은 API 및 secret 키를 토대로, 유저 인증 토큰을 발행한다.\n\n단, 아임포트가 발급해주는 유저 인증 토큰에는 유효 시간 {@link IIamportUser.expired_at }\n이 있어, 해당 시간이 지나거든 기 발급 토큰이 만료되어 더 이상 쓸 수 없게 된다. 때문에\n아임포트의 이러한 시간 제한에 구애받지 않고 자유로이 아임포트의 API 를 이용하고 싶다면,\n`iamport-server-api` 에서 제공해주는 {@link IamportConnector } 를 활용하도록 하자."}},"/vbanks":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"가상 계좌 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportVBankPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportVBankPayment"}}}}},"summary":"가상 계좌 발급하기","description":"가상 계좌 발급하기.","security":[{"bearer":[]}]},"put":{"tags":[],"parameters":[],"requestBody":{"description":"가상 계좌 편집 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportVBankPayment.IUpdate"}}},"required":true},"responses":{"201":{"description":"편집된 가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportVBankPayment"}}}}},"summary":"가상 계좌 편집하기","description":"가상 계좌 편집하기.","security":[{"bearer":[]}]}}},"components":{"schemas":{"IIamportResponseIIamportSubscription":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportSubscription","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportSubscription":{"type":"object","properties":{"pg_provider":{"type":"string"},"pg_id":{"type":"string"},"card_name":{"type":"string"},"card_code":{"type":"string"},"card_number":{"type":"string"},"card_type":{"type":"string"},"customer_name":{"type":"string","nullable":true},"customer_tel":{"type":"string","nullable":true},"customer_email":{"type":"string","nullable":true},"customer_addr":{"type":"string","nullable":true},"customer_postcode":{"type":"string","nullable":true},"inserted":{"type":"number"},"updated":{"type":"number"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["pg_provider","pg_id","card_name","card_code","card_number","card_type","customer_name","customer_tel","customer_email","customer_addr","customer_postcode","inserted","updated","customer_uid"],"description":"간편 결제 카드 정보."},"IIamportSubscription.ICreate":{"type":"object","properties":{"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호.\n\n형식: XXXX-XXXX-XXXX-XXXX"},"expiry":{"type":"string","pattern":"^([0-9]{4})-(0[1-9]|1[012])$","description":"카드 유효기간.\n\n형식: YYYY-MM"},"birth":{"type":"string","pattern":"^(([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))|(\\d{10})$","description":"생년월일 YYMMDD 또는 사업자등록번호 10자리."},"pwd_2digit":{"type":"string","pattern":"\\d{2}","description":"카드 비밀번호 앞 두 자리."},"cvc":{"type":"string","pattern":"\\d{2}","description":"카드 인증번호 (카드 뒷면 3 자리)."},"customer_name":{"type":"string"},"customer_tel":{"type":"string"},"customer_email":{"type":"string","format":"email"},"customr_addr":{"type":"string"},"customer_postcode":{"type":"string"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["card_number","expiry","birth","customer_uid"],"description":"간편 결제 카드 입력 정보."},"IIamportSubscription.IOnetime":{"type":"object","properties":{"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함.\n\n이를 생략시 단순 결제로만 그치며, 카드 정보가 간편 결제용으로 등록되지 아니함."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호.\n\n형식: XXXX-XXXX-XXXX-XXXX"},"expiry":{"type":"string","pattern":"^([0-9]{4})-(0[1-9]|1[012])$","description":"카드 유효기간.\n\n형식: YYYY-MM"},"birth":{"type":"string","pattern":"^(([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))|(\\d{10})$","description":"생년월일 YYMMDD 또는 사업자등록번호 10자리."},"pwd_2digit":{"type":"string","pattern":"\\d{2}","description":"카드 비밀번호 앞 두 자리."},"cvc":{"type":"string","pattern":"\\d{2}","description":"카드 인증번호 (카드 뒷면 3 자리)."},"customer_name":{"type":"string"},"customer_tel":{"type":"string"},"customer_email":{"type":"string","format":"email"},"customr_addr":{"type":"string"},"customer_postcode":{"type":"string"},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트가 아닌 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"name":{"type":"string","description":"주문 이름."},"currency":{"type":"string","enum":["KRW","USD","EUR","JPY"],"description":"통화 정보."},"tax_free":{"type":"number","description":"면세 공급가액.\n\n기본값은 0 로써, 알아서 amount 의 1/11 로써 부가세 처리됨."},"card_quota":{"type":"number","description":"할부 개월 수.\n\n일시불은 0."},"buyer_name":{"type":"string"},"buyer_email":{"type":"string","format":"email"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"interest_free_by_merchant":{"type":"boolean","description":"카드할부처리할 때, 할부이자가 발생하는 경우 (카드사 무이자 프로모션 제외).\n\n부과되는 할부이자를 고객대신 가맹점이 지불하고자 PG사와 계약된 경우(현재, 나이스페이먼츠만 지원됨)"},"use_card_point":{"type":"boolean","description":"승인요청시 카드사 포인트 차감하며 결제승인처리할지 flag.\n\nPG사 영업담당자와 계약 당시 사전 협의 필요(현재, 나이스페이먼츠만 지원됨)"},"custom_data":{"type":"string","description":"임의 정보를 기재할 수 있다."},"notice_url":{"type":"string","format":"url","description":"결제 성공시 통지될 Notification, 웹훅 URL."}},"nullable":false,"required":["card_number","expiry","birth","merchant_uid","amount","name"],"description":"결제 신청 입력 정보."},"IIamportResponseIIamportCardPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCardPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCardPayment":{"type":"object","properties":{"card_code":{"type":"string","description":"카드 식별자 코드."},"card_name":{"type":"string","description":"카드 이름."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호."},"card_quota":{"type":"integer","description":"할부 개월 수."},"apply_num":{"type":"string","description":"카드사 승인번호."},"pay_method":{"type":"string","enum":["card","samsung"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["card_code","card_name","card_number","card_quota","apply_num","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"카드 결제 정보."},"IIamportPayment.Currency":{"type":"string","enum":["KRW","USD","EUR","JPY"]},"IIamportPayment.Status":{"type":"string","enum":["paid","ready","failed","cancelled"]},"IIamportPaymentCancel":{"type":"object","properties":{"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"amount":{"type":"number"},"cancelled_at":{"type":"number"},"reason":{"type":"string"},"receipt_url":{"type":"string","format":"url"}},"nullable":false,"required":["pg_id","pg_tid","amount","cancelled_at","reason","receipt_url"],"description":"결제 취소 정보."},"IIamportSubscription.IAgain":{"type":"object","properties":{"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트가 아닌 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"name":{"type":"string","description":"주문 이름."},"currency":{"type":"string","enum":["KRW","USD","EUR","JPY"],"description":"통화 정보."},"tax_free":{"type":"number","description":"면세 공급가액.\n\n기본값은 0 로써, 알아서 amount 의 1/11 로써 부가세 처리됨."},"card_quota":{"type":"number","description":"할부 개월 수.\n\n일시불은 0."},"buyer_name":{"type":"string"},"buyer_email":{"type":"string","format":"email"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"interest_free_by_merchant":{"type":"boolean","description":"카드할부처리할 때, 할부이자가 발생하는 경우 (카드사 무이자 프로모션 제외).\n\n부과되는 할부이자를 고객대신 가맹점이 지불하고자 PG사와 계약된 경우(현재, 나이스페이먼츠만 지원됨)"},"use_card_point":{"type":"boolean","description":"승인요청시 카드사 포인트 차감하며 결제승인처리할지 flag.\n\nPG사 영업담당자와 계약 당시 사전 협의 필요(현재, 나이스페이먼츠만 지원됨)"},"custom_data":{"type":"string","description":"임의 정보를 기재할 수 있다."},"notice_url":{"type":"string","format":"url","description":"결제 성공시 통지될 Notification, 웹훅 URL."},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["merchant_uid","amount","name","customer_uid"],"description":"간편 결제 카드로 결제 신청 입력 정보."},"IIamportResponseIIamportCertification":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCertification","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCertification":{"type":"object","properties":{"imp_uid":{"type":"string","description":"아임포트가 발급해 준 식별자 번호."},"merchant_uid":{"type":"string","nullable":true,"description":"서비스로부터의 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","description":"본인인증대상자 성명."},"gender":{"type":"string","description":"성별."},"birth":{"type":"number","description":"생년월일.\n\n리눅스 타임이 쓰인다."},"birthday":{"type":"string","pattern":"^([0-9]{4})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"생년월일, YYYYMMDD 형식."},"foreigner":{"type":"boolean","description":"외국인 여부."},"phone":{"type":"string","description":"본인인증 대상자 핸드폰 번호."},"carrier":{"type":"string","enum":["SKT","KT","LGT"],"description":"본인인증 대상자 통신사 코드."},"certified":{"type":"boolean","description":"OTP 인증 여부."},"certified_at":{"type":"number","description":"OTP 인증 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"unique_key":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"unique_in_site":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"pg_tid":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"pg_provider":{"type":"string","description":"PG 제공자."},"origin":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"__otp":{"type":"string","description":"(테스트 전용) OTP 코드.\n\n오직 `fake-iamport-server` 에서만 쓰이는 속성으로써, 본인인증을 시뮬레이션할 때,\n어떠한 OTP 코드가 발급되었는 지를 확인하기 위하여 사용된다. 이를 이용하여\n{@link functional.certifications.otp.confirm } 함수를 호출하면, 본인인증을 완료할\n수 있다."}},"nullable":false,"required":["imp_uid","merchant_uid","name","gender","birth","birthday","foreigner","phone","carrier","certified","certified_at","unique_key","unique_in_site","pg_tid","pg_provider","origin"],"description":"본인 인증 내역.\n\n`IIamportCertification` 은 아임포트의 본인인증 정보를 형상화한 자료구조 인터페이스이다.\n\n단, `IIamportCertification` 레코드의 존재가 곧 본인인증의 완결을 뜻하는 것은 아니다.\n{@link IIamportCertification.certified } 값이 `true` 여야만이 비로소, 본인인증\n대상자가 자신의 핸드폰 번호로 전송된 OTP 를 아임포트의 본인인증 팝업창에 정확히 적어,\n본인인증을 완료했음을 의미한다."},"IIamportCertification.ICreate":{"type":"object","properties":{"name":{"type":"string","description":"본인인증대상자 성명."},"phone":{"type":"string","description":"본인인증 대상자 핸드폰 번호.\n\n핸드폰 번호에 \"-\" 값이 들어가던 아니던 상관 없음.\n\n다만, 내부적으로는 \"-\" 값을 제거하여 처리한다."},"birth":{"type":"string","pattern":"^([0-9]{4})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"생년월일.\n\nYYYYMMDD 형식."},"gender_digit":{"type":"string","description":"주민등록 뒷부분 첫 자리."},"carrier":{"type":"string","enum":["SKT","KT","LGT"],"description":"본인인증 대상자 통신사 코드."},"is_mvno":{"type":"boolean","description":"알뜰폰 여부."},"commpany":{"type":"string","description":"가맹점 서비스 명칭 또는 domain URL.\n\nKISA 에서 대상자에게 발송하는 SMS에 안내될 서비스 명칭."},"merchant_uid":{"type":"string","description":"귀사 서비스에서의 본인인증 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"pg":{"type":"string","description":"PG 사 구분자.\n\n다날 상점아이디를 2개 이상 동시에 사용하시려는 경우에 설정하면 된다.\n\n**danal.{상점아이디}** 형태로 지정."}},"nullable":false,"required":["name","phone","birth","gender_digit","carrier"],"description":"본인 인증 입력 정보."},"IIamportResponseIIamportCertification.IAccessor":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCertification.IAccessor","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCertification.IAccessor":{"type":"object","properties":{"imp_uid":{"type":"string","description":"본인인증정보의 식별자 키."}},"nullable":false,"required":["imp_uid"],"description":"본인인증 정보의 접근자 구조체."},"IIamportCertification.IConfirm":{"type":"object","properties":{"otp":{"type":"string","description":"SMS 로 전송된 본인인증 번호."}},"nullable":false,"required":["otp"],"description":"본인인증 승인을 위한 입력 정보."},"IIamportPayment.IWebhook":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"status":{"type":"string","enum":["paid","ready","failed","cancelled"],"description":"현재 상태."}},"nullable":false,"required":["imp_uid","merchant_uid","status"],"description":"웹훅 데이터."},"IIamportPayment.IQuery":{"type":"object","properties":{"extension":{"type":"boolean","description":"페이팔의 경우, 이 값을 `true` 로 할 것."}},"nullable":false,"description":"결제 수단이 페이팔인 경우, 페이팔의 구매자 보호정책에 의해 결제 승인 시점에\nPending 상태를 만든 후, 내부 심사등을 통해 최종 결제 완료라고 변경함.\n\n`iamport` 의 기술적 이슈로 해당 상태를 status: failed 로 기록함. 추후\n페이팔에서 최종결제완료로 변경된 경우, `iamport` 에서 `paid` 로 변경 후,\n해당건에 대한 웹훅 발송. `iamport` 를 사용하는 고객사에서는, failed 로 이미\n처리된 결제건에 대한 paid 상태의 웹훅을 받는 문제점이 생김.\n\n이에, `iamport` 에서 제공하는 `/payment/{imp_uid}` 에 query-string 으로\n`extension=true` 옵션을 추가해야 함"},"IIamportResponseIIamportPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportPayment":{"oneOf":[{"$ref":"#/components/schemas/IIamportCardPayment"},{"$ref":"#/components/schemas/IIamportTransferPayment"},{"$ref":"#/components/schemas/IIamportVBankPayment"},{"$ref":"#/components/schemas/IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint"}],"description":"결제 정보.\n\n`IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.pay_method === \"card\")\n payment.card_number; // payment be IIamportCardPayment\n```"},"IIamportTransferPayment":{"type":"object","properties":{"bank_code":{"type":"string","description":"은행 식별자 코드."},"bank_name":{"type":"string","description":"은행 이름."},"pay_method":{"type":"string","enum":["trans"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["bank_code","bank_name","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"계좌 이체 결제 정보."},"IIamportVBankPayment":{"type":"object","properties":{"vbank_code":{"type":"string","description":"가상 계좌 식별자 코드."},"vbank_name":{"type":"string","description":"가상 게좌 이름"},"vbank_num":{"type":"string","description":"가상 계좌 번호"},"vbank_holder":{"type":"string","description":"가상 계좌 예금주."},"vbank_date":{"type":"number","description":"가상 계좌 입금 만료 기한."},"vbank_issued_at":{"type":"number","description":"가상 계좌 개설 일시."},"pay_method":{"type":"string","enum":["vbank"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["vbank_code","vbank_name","vbank_num","vbank_holder","vbank_date","vbank_issued_at","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"가상 계좌 결제 정보."},"IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint":{"type":"object","properties":{"pay_method":{"type":"string","enum":["phone","kpay","kakaopay","payco","lpay","ssgpay","tosspay","cultureland","smartculture","happymoney","booknlife","point"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"결제 기본 (공통) 정보."},"IIamportPaymentCancel.ICreate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"amount":{"type":"number","description":"취소 금액, 부분 취소도 가능하다.\n\n누락시 전액 취소."},"checksum":{"type":"number","minimum":0,"nullable":true,"description":"취소 트랜잭션 수행 전, 현재 시점의 취소 가능한 잔액.\n\nAPI요청자가 기록하고 있는 취소가능 잔액과 아임포트가 기록하고 있는 취소가능 잔액이\n일치하는지 사전에 검증하고, 검증에 실패하면 트랜잭션을 수행하지 않는다.\n\n`null` 인 경우에는 검증 프로세스를 생략."},"reason":{"type":"string","description":"취소 사유."},"tax_free":{"type":"number","default":0,"description":"취소요청금액 중 면세금액."},"refund_holder":{"type":"string","description":"환불계좌 예금주."},"refund_bank":{"type":"string","description":"환불계좌 은행 코드."},"refund_account":{"type":"string","description":"환불계좌 계좌번호."},"refund_tel":{"type":"string","description":"환불계좌 예금주 연락처"}},"nullable":false,"required":["imp_uid","merchant_uid","checksum","reason"],"description":"결제 취소 입력 정보."},"IIamportResponseIIamportReceipt":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportReceipt","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportReceipt":{"type":"object","properties":{"imp_uid":{"type":"string","description":"귀속 결제의 {@link IIamportPayment.imp_uid }."},"receipt_uid":{"type":"string","description":"현금 영수증의 고유 식별자 ID."},"apply_num":{"type":"string","description":"승인 번호."},"type":{"$ref":"#/components/schemas/IIamportReceipt.Type","description":"발행 타입 (대상)."},"amount":{"type":"number","description":"결제 총액."},"vat":{"type":"number","description":"부가세."},"receipt_url":{"type":"string","format":"url","description":"현금영수증 조회 URL."},"applied_at":{"type":"number","description":"현금영수증 발행 시간."},"cancelled_at":{"type":"number","description":"현금영수증 취소 시간.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."}},"nullable":false,"required":["imp_uid","receipt_uid","apply_num","type","amount","vat","receipt_url","applied_at","cancelled_at"],"description":"현금 영수증 정보."},"IIamportReceipt.Type":{"type":"string","enum":["person","company"],"description":"현금영수증 발행 타입 (대상)."},"IIamportReceipt.ICreate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"귀속 결제의 {@link IIamportPayment.imp_uid }."},"identifier":{"type":"string","description":"현금영수증 발생대상 식별정보.\n\n - 국세청현금영수증카드\n - 휴대폰번호\n - 주민등록번호\n - 사업자등록번호"},"identifier_type":{"type":"string","enum":["phone","person","business","taxcard"],"description":"현금영수증 발행대상 유형.\n\n - person: 주민등록번호\n - business: 사업자등록번호\n - phone: 휴대폰번호\n - taxcard: 국세청현금영수증카드\n\n일부 PG 사의 경우 이 항목이 없어 된다는데, 어지간하면 그냥 쓰기 바람."},"type":{"type":"string","enum":["person","company"],"description":"현금영수증 발행 타입 (대상).\n\n누락시 person 이 사용됨."},"buyer_name":{"type":"string","description":"구매자 이름.\n\n형금영수증 발행건 사후 추적을 위해 가급 입력하기 바람."},"buyer_email":{"type":"string","description":"구매자 이메일."},"buyer_tel":{"type":"string","description":"구매자 전화번호.\n\n현금영수증 발행건 사후 추적을 위해 가급 입력하기 바람."},"tax_free":{"type":"number","description":"면세 금액."}},"nullable":false,"required":["imp_uid","identifier"],"description":"현금영수증 입력 정보."},"IIamportUser.IAccessor":{"type":"object","properties":{"imp_key":{"type":"string","description":"API 키."},"imp_secret":{"type":"string","description":"Secret 키."}},"nullable":false,"required":["imp_key","imp_secret"],"description":"아임포트에서 부여해 준 API 및 secret 키."},"IIamportResponseIIamportUser":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportUser","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportUser":{"type":"object","properties":{"now":{"type":"number","description":"토큰 발행 시간."},"expired_at":{"type":"number","description":"토큰 만료 시간.\n\n리눅스 타임이 기준이며, 이를 JS 에서 사용하려거든, 아래와 같이 변환해야 한다.\n\n```typescript\nnew Date(user.expired_at * 1_000);\n```"},"access_token":{"type":"string","description":"유저 인증 토큰."}},"nullable":false,"required":["now","expired_at","access_token"],"description":"아임포트 유저 인증 정보.\n\n아임포트는 고객사에게 API 및 secret 키 정보, {@link IIamportUser.IAccessor } 를 발급해준다.\n\n하지만 이를 곧장 아임포트의 유저 인증에 사용할 수는 없고, 해당 API 및 secret 키를 토대로 유저\n인증 토큰을 발급받아야 하는데, 이 유저 인증 토큰에는 하필이면 만로 시간이라는 게 존재한다.\n`IIamportUser` 는 바로 이러한 유저 인증 토큰 및 그것의 만료 시간을 형상화한 자료구조\n인터페이스이다.\n\n더하여 이처럼 만료 시간이 존재하는 아임포트의 유저 인증 토큰의 특성상, 이것의 만료 시간이\n초과되지 않도록 관리하는 것은 매우 힘든 일이다. 이에 `iamport-server-api` 에서는 아임포트\n유저 인증 토큰이 만료될 때마다 자동 갱신해주는, {@link IamportConnector } 클래스를 제공한다."},"IIamportVBankPayment.ICreate":{"type":"object","properties":{"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"amount":{"type":"number","description":"총액."},"vbank_code":{"type":"string","description":"가상계좌 은행 코드."},"vbank_due":{"type":"number","description":"가상계좌 입금기한, 유닉스 타임."},"vbank_holder":{"type":"string","description":"예금주."},"name":{"type":"string"},"buyer_name":{"type":"string"},"buyer_email":{"type":"string"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"pg":{"type":"string"},"notice_url":{"type":"string","description":"가상 계좌 입금 정보를 수신할 URL.\n\n누락시 기본 웹훅 URL 사용."},"custom_data":{"type":"string","description":"커스텀 데이터, 자유롭게 사용 가능."},"pg_api_key":{"type":"string","description":"[이니시스 전용] 가맹점 콘솔에서 확인한 API 값."}},"nullable":false,"required":["merchant_uid","amount","vbank_code","vbank_due","vbank_holder"],"description":"가상 계좌 결제 입력 정보.\n\n가상 계좌를 임의 생성할 수 있다.\n\n단, 일부 PG 사 혹은 `fake-iamport-server` 만 가능.\n\n - 세틀뱅크\n - 나이스페이먼츠\n - KG이니시스"},"IIamportResponseIIamportVBankPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportVBankPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportVBankPayment.IUpdate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"대상 결제 기록의 {@link IIamportPayment.imp_uid }."},"amount":{"type":"number","description":"수정할 결제 금액."},"vbank_due":{"type":"number","description":"수정할 가상계좌 입금 기한."}},"nullable":false,"required":["imp_uid"],"description":"가상 계좌 결제의 수정 입력 정보.\n\n아직 입금되지 않은 가상계좌의 입금기한 또는 입금금액을 수정할 수 있다.\n\n다만, 세틀뱅크 혹은 `fake-iamport-server` 만 가능."}},"securitySchemes":{"bearer":{"type":"apiKey","name":"Authorization","in":"header"}}}} \ No newline at end of file diff --git a/packages/iamport-server-api/tsconfig.json b/packages/iamport-server-api/tsconfig.json index 0d70bb0..cff3499 100644 --- a/packages/iamport-server-api/tsconfig.json +++ b/packages/iamport-server-api/tsconfig.json @@ -12,7 +12,7 @@ "target": "ES5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "lib": [ "DOM", - "ES2015" + "ES2020" ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */// "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ diff --git a/packages/payment-api/package.json b/packages/payment-api/package.json index 3fdf959..621447e 100644 --- a/packages/payment-api/package.json +++ b/packages/payment-api/package.json @@ -1,6 +1,6 @@ { "name": "@samchon/payment-api", - "version": "6.0.1", + "version": "6.0.2", "description": "API for Payment Backend", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -35,8 +35,9 @@ }, "dependencies": { "@nestia/fetcher": "^2.4.5", - "iamport-server-api": "^6.0.1", - "toss-payments-server-api": "^6.0.1", - "typia": "^5.3.11" + "@types/node": "^20.11.5", + "iamport-server-api": "^6.0.2", + "toss-payments-server-api": "^6.0.2", + "typia": "^5.3.12" } } \ No newline at end of file diff --git a/packages/payment-api/swagger.json b/packages/payment-api/swagger.json index 9bdc765..eef0c24 100644 --- a/packages/payment-api/swagger.json +++ b/packages/payment-api/swagger.json @@ -1 +1 @@ -{"openapi":"3.0.1","servers":[{"url":"https://github.com/samchon/nestia","description":"insert your server url"}],"info":{"version":"6.0.1","title":"@samchon/payment-backend","description":"Payment Backend Server","license":{"name":"MIT"}},"paths":{"/monitors/health":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":""}}}},"/monitors/performance":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.G.et](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPerformance"}}},"x-nestia-encrypted":true}}}},"/monitors/system":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.G.et](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ISystem"}}},"x-nestia-encrypted":true}}}},"/payments/histories/get":{"patch":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역의 원천 정보 + 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IAccessor"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 상세 조회하기","description":"결제 내역 상세 조회하기."}},"/payments/histories/{id}":{"patch":{"tags":[],"parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"description":"Primary Key","required":true}],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역의 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IPassword"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 상세 조회하기","description":"결제 내역 상세 조회하기."}},"/payments/histories":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ost](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 발행하기","description":"결제 내역 발행하기."}},"/payments/histories/cancel":{"put":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 취소 내역 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentCancelHistory.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ut](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 취소하기","description":"결제 취소하기."}},"/payments/reservations/get":{"patch":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단의 원천 정보 + 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IAccessor"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 조회하기","description":"간편 결제 수단 조회하기."}},"/payments/reservations/{id}":{"patch":{"tags":[],"parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"description":"Primary Key","required":true}],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IPassword"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 조회하기","description":"간편 결제 수단 조회하기."}},"/payments/reservations":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ost](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 등록하기","description":"간편 결제 수단 등록하기."}},"/payments/webhooks/iamport":{"post":{"tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPayment.IWebhook"}}},"required":true},"responses":{"201":{"description":""}}}}},"components":{"schemas":{"IPerformance":{"type":"object","properties":{"cpu":{"$ref":"#/components/schemas/process.global.NodeJS.CpuUsage"},"memory":{"$ref":"#/components/schemas/process.global.NodeJS.MemoryUsage"},"resource":{"$ref":"#/components/schemas/process.global.NodeJS.ResourceUsage"}},"nullable":false,"required":["cpu","memory","resource"]},"process.global.NodeJS.CpuUsage":{"type":"object","properties":{"user":{"type":"number"},"system":{"type":"number"}},"nullable":false,"required":["user","system"]},"process.global.NodeJS.MemoryUsage":{"type":"object","properties":{"rss":{"type":"number"},"heapTotal":{"type":"number"},"heapUsed":{"type":"number"},"external":{"type":"number"},"arrayBuffers":{"type":"number"}},"nullable":false,"required":["rss","heapTotal","heapUsed","external","arrayBuffers"]},"process.global.NodeJS.ResourceUsage":{"type":"object","properties":{"fsRead":{"type":"number"},"fsWrite":{"type":"number"},"involuntaryContextSwitches":{"type":"number"},"ipcReceived":{"type":"number"},"ipcSent":{"type":"number"},"majorPageFault":{"type":"number"},"maxRSS":{"type":"number"},"minorPageFault":{"type":"number"},"sharedMemorySize":{"type":"number"},"signalsCount":{"type":"number"},"swappedOut":{"type":"number"},"systemCPUTime":{"type":"number"},"unsharedDataSize":{"type":"number"},"unsharedStackSize":{"type":"number"},"userCPUTime":{"type":"number"},"voluntaryContextSwitches":{"type":"number"}},"nullable":false,"required":["fsRead","fsWrite","involuntaryContextSwitches","ipcReceived","ipcSent","majorPageFault","maxRSS","minorPageFault","sharedMemorySize","signalsCount","swappedOut","systemCPUTime","unsharedDataSize","unsharedStackSize","userCPUTime","voluntaryContextSwitches"]},"ISystem":{"type":"object","properties":{"uid":{"type":"string","description":"Random Unique ID."},"arguments":{"type":"array","items":{"type":"string"},"description":"`process.argv`"},"commit":{"$ref":"#/components/schemas/ISystem.ICommit","description":"Git commit information."},"package":{"$ref":"#/components/schemas/ISystem.IPackage","description":"`package.json`"},"created_at":{"type":"string","description":"Creation time of this system."}},"nullable":false,"required":["uid","arguments","commit","package","created_at"]},"ISystem.ICommit":{"type":"object","properties":{"shortHash":{"type":"string"},"branch":{"type":"string"},"hash":{"type":"string"},"subject":{"type":"string"},"sanitizedSubject":{"type":"string"},"body":{"type":"string"},"author":{"$ref":"#/components/schemas/ISystem.ICommit.IUser"},"committer":{"$ref":"#/components/schemas/ISystem.ICommit.IUser"},"authored_at":{"type":"string"},"commited_at":{"type":"string"},"notes":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"nullable":false,"required":["shortHash","branch","hash","subject","sanitizedSubject","body","author","committer","authored_at","commited_at","tags"],"description":"Git commit information."},"ISystem.ICommit.IUser":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"nullable":false,"required":["name","email"],"description":"Git user information."},"ISystem.IPackage":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"scripts":{"$ref":"#/components/schemas/Recordstringstring"},"repository":{"type":"object","properties":{"type":{"type":"string","enum":["git"]},"url":{"type":"string"}},"nullable":false,"required":["type","url"]},"author":{"type":"string"},"license":{"type":"string"},"bugs":{"type":"object","properties":{"url":{"type":"string"}},"nullable":false,"required":["url"]},"homepage":{"type":"string"},"devDependencies":{"$ref":"#/components/schemas/Recordstringstring"},"dependencies":{"$ref":"#/components/schemas/Recordstringstring"},"publishConfig":{"type":"object","properties":{"registry":{"type":"string"}},"nullable":false,"required":["registry"]},"main":{"type":"string"},"typings":{"type":"string"},"files":{"type":"array","items":{"type":"string"}}},"nullable":false,"required":["name","version","description","scripts","repository","author","license","bugs","homepage","devDependencies","dependencies"],"description":"NPM package information."},"Recordstringstring":{"type":"object","properties":{},"nullable":false,"description":"Construct a type with a set of properties K of type T"},"IPaymentSource.IAccessor":{"type":"object","properties":{"schema":{"type":"string","description":"DB 스키마 이름"},"table":{"type":"string","description":"DB 테이블 명"},"id":{"type":"string","format":"uuid","description":"참조 레코드의 PK"},"password":{"type":"string","description":"레코드 조회를 위한 비밀번호 입력."}},"nullable":false,"required":["schema","table","id","password"],"description":"접근자 정보.\n\n`IPaymentSource.IAccessor` 는 {@link IPaymentHistory 결제 내역} 내지\n{@link IPaymentReservation 간편 결제 수단 정보}를 조회할 때, 그것의 고유 식별자\nID 가 아닌 원천 레코드 식별자 정보 {@link IPaymentSource } 를 통하여 조회할 때\n사용하는 접근자 정보이다.\n\n다만 `payments-server` 의 모든 개별 레코드는 이를 조회할 시 비밀번호가 필요하기에,\n{@link IPaymentSource } 의 속성들에 비밀번호가 하나 더 추가되었을 뿐이다."},"IPaymentHistory":{"oneOf":[{"$ref":"#/components/schemas/IPaymentHistory.IamportType"},{"$ref":"#/components/schemas/IPaymentHistory.TossType"}],"description":"결제 내역.\n\n`IPaymentHistory` 는 결제 내역을 형상화한 자료구조이자 유니언 타입의 인터페이이다.\n서비스 시스템으로부 결제 사건의 귀속 정보 ({@link IPaymentHistory.ICreate.vendor } +\n{@link IPaymentHistory.ICreate.source }) 를 전달받아, 본 Payment 시스템이 PG 사에\n추가 정보를 취득하여 레코드가 완성된다.\n\n그리고 만일 현 결제 건이 가상계좌와 같이 레코드 생성 시점에 지불이 이루어지지 않은\n경우라면, 사후 {@link IPaymentWebhook 웹훅 이벤트}를 통하여 지불 완료 시각을 뜻하는\n{@link paid_at } 가 설정될 수 있다. 그리고 반대로 이미 결제가 완료된 경우라도,\n환불 등의 이유로 인하여 {@link cancelled_at } 이 사후 기재될 수 있다.\n\n참고로 `if condition` 을 통하여 {@link IPaymentHistory.vendor_code } 값을 특정하면,\n파생 타입이 자동으로 다운 캐스팅 된다.\n\n```typescript\nif (history.vendor_code === \"toss.payments\")\n history.data.paymentKey; // history.data be ITossPayment\n```"},"IPaymentHistory.IamportType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["iamport"],"description":"벤더사 식별자 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. `if condition` 을 통하여\n{@link IPaymentHistory.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamport","description":"벤더 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 래코드 정보."},"data":{"$ref":"#/components/schemas/IIamportPayment","description":"결제 상세 데이터, 벤더별로 데이터 양식이 다르니 주의할 것."},"currency":{"type":"string","description":"통화 단위\n\nKRW, USB, JPY 등."},"price":{"type":"number","minimum":0,"description":"결제 가격."},"refund":{"type":"number","minimum":0,"nullable":true,"description":"결제 취소시의 환불 금액."},"webhook_url":{"type":"string","format":"url","nullable":true,"description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"},"created_at":{"type":"string","format":"date-time","description":"결제 레코드 생성 일시."},"paid_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 완료 일시."},"cancelled_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 취소 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/IPaymentCancelHistory"},"description":"결제 취소 내역 리스트."}},"nullable":false,"required":["id","vendor_code","vendor","source","data","currency","price","refund","webhook_url","created_at","paid_at","cancelled_at","cancels"],"description":"아임포트로부터의 결제 내역."},"IPaymentVendoriamport":{"type":"object","properties":{"code":{"type":"string","enum":["iamport"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IPaymentSource":{"type":"object","properties":{"schema":{"type":"string","description":"DB 스키마 이름"},"table":{"type":"string","description":"DB 테이블 명"},"id":{"type":"string","format":"uuid","description":"참조 레코드의 PK"}},"nullable":false,"required":["schema","table","id"],"description":"원천 레코드 참조 정보.\n\n`IPaymentSource` 는 {@link IPaymentHistory 결제 내역} 및\n{@link IPaymentResrvation 간편 결제 수단}의 원천이 되는 레코드의 참조 정보를 형상화한\n자료구조 인터페이이다. 만일 대상이 {@link IPaymentHistory 결제 내역}이라면 결제의\n근원이 되는 주문에 대한 참조 정보를, 대상이 {@link IPaymentResrvation 간편 결제 수단}\n이라면 이를 기록한 귀사 서비스의 참조 정보를 기입하면 된다."},"IIamportPayment":{"oneOf":[{"$ref":"#/components/schemas/IIamportCardPayment"},{"$ref":"#/components/schemas/IIamportTransferPayment"},{"$ref":"#/components/schemas/IIamportVBankPayment"},{"$ref":"#/components/schemas/IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint"}],"description":"결제 정보.\n\n`IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.pay_method === \"card\")\n payment.card_number; // payment be IIamportCardPayment\n```"},"IIamportCardPayment":{"type":"object","properties":{"card_code":{"type":"string","description":"카드 식별자 코드."},"card_name":{"type":"string","description":"카드 이름."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호."},"card_quota":{"type":"integer","description":"할부 개월 수."},"apply_num":{"type":"string","description":"카드사 승인번호."},"pay_method":{"type":"string","enum":["card","samsung"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["card_code","card_name","card_number","card_quota","apply_num","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"카드 결제 정보."},"IIamportPayment.Currency":{"type":"string","enum":["KRW","USD","EUR","JPY"]},"IIamportPayment.Status":{"type":"string","enum":["paid","ready","failed","cancelled"]},"IIamportPaymentCancel":{"type":"object","properties":{"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"amount":{"type":"number"},"cancelled_at":{"type":"number"},"reason":{"type":"string"},"receipt_url":{"type":"string","format":"url"}},"nullable":false,"required":["pg_id","pg_tid","amount","cancelled_at","reason","receipt_url"],"description":"결제 취소 정보."},"IIamportTransferPayment":{"type":"object","properties":{"bank_code":{"type":"string","description":"은행 식별자 코드."},"bank_name":{"type":"string","description":"은행 이름."},"pay_method":{"type":"string","enum":["trans"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["bank_code","bank_name","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"계좌 이체 결제 정보."},"IIamportVBankPayment":{"type":"object","properties":{"vbank_code":{"type":"string","description":"가상 계좌 식별자 코드."},"vbank_name":{"type":"string","description":"가상 게좌 이름"},"vbank_num":{"type":"string","description":"가상 계좌 번호"},"vbank_holder":{"type":"string","description":"가상 계좌 예금주."},"vbank_date":{"type":"number","description":"가상 계좌 입금 만료 기한."},"vbank_issued_at":{"type":"number","description":"가상 계좌 개설 일시."},"pay_method":{"type":"string","enum":["vbank"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["vbank_code","vbank_name","vbank_num","vbank_holder","vbank_date","vbank_issued_at","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"가상 계좌 결제 정보."},"IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint":{"type":"object","properties":{"pay_method":{"type":"string","enum":["phone","kpay","kakaopay","payco","lpay","ssgpay","tosspay","cultureland","smartculture","happymoney","booknlife","point"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"결제 기본 (공통) 정보."},"IPaymentCancelHistory":{"type":"object","properties":{"reason":{"type":"string","description":"결제 취소 사유."},"price":{"type":"number","minimum":0,"description":"환불 금액."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시.\n\n즉, 결제 취소가 발생한 시각."}},"nullable":false,"required":["reason","price","created_at"],"description":"결제 취소 내역."},"IPaymentHistory.TossType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["toss.payments"],"description":"벤더사 식별자 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. `if condition` 을 통하여\n{@link IPaymentHistory.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendortoss.payments","description":"벤더 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 래코드 정보."},"data":{"$ref":"#/components/schemas/ITossPayment","description":"결제 상세 데이터, 벤더별로 데이터 양식이 다르니 주의할 것."},"currency":{"type":"string","description":"통화 단위\n\nKRW, USB, JPY 등."},"price":{"type":"number","minimum":0,"description":"결제 가격."},"refund":{"type":"number","minimum":0,"nullable":true,"description":"결제 취소시의 환불 금액."},"webhook_url":{"type":"string","format":"url","nullable":true,"description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"},"created_at":{"type":"string","format":"date-time","description":"결제 레코드 생성 일시."},"paid_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 완료 일시."},"cancelled_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 취소 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/IPaymentCancelHistory"},"description":"결제 취소 내역 리스트."}},"nullable":false,"required":["id","vendor_code","vendor","source","data","currency","price","refund","webhook_url","created_at","paid_at","cancelled_at","cancels"],"description":"토스 페이먼츠로부터의 결제 내역."},"IPaymentVendortoss.payments":{"type":"object","properties":{"code":{"type":"string","enum":["toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"ITossPayment":{"oneOf":[{"$ref":"#/components/schemas/ITossCardPayment"},{"$ref":"#/components/schemas/ITossGiftCertificatePayment"},{"$ref":"#/components/schemas/ITossMobilePhonePayment"},{"$ref":"#/components/schemas/ITossTransferPayment"},{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}],"description":"결제 정보.\n\n`ITossPayment` 는 토스 페이먼츠의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.method === \"카드\")\n payment.card; // payment be ITossCardPayment\n```"},"ITossCardPayment":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/ITossCardPayment.ICard","description":"카드 정보."},"discount":{"$ref":"#/components/schemas/ITossCardPayment.IDiscount.Nullable","description":"카드사의 즉시 할인 프로모션 정보."},"easyPay":{"type":"string","enum":["토스결제","페이코","삼성페이"],"nullable":true,"description":"간편결제로 결제한 경우 간편결제 타입 정보."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL","BILLING"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["card","discount","easyPay","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"카드 결제 정보."},"ITossCardPayment.ICard":{"type":"object","properties":{"company":{"type":"string","description":"카드사 이름."},"number":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"installmentPlanMonths":{"type":"number","description":"할부 개월 수."},"isInterestFree":{"type":"boolean","description":"무이자 할부 적용 여부."},"approveNo":{"type":"string","description":"승인 번호."},"useCardPoint":{"type":"boolean","enum":[false],"description":"카드 포인트 사용 여부."},"cardType":{"type":"string","enum":["신용","체크","기프트"],"description":"카드 타입."},"ownerType":{"type":"string","enum":["개인","법인"],"description":"카드의 소유자 타입."},"acquireStatus":{"type":"string","enum":["READY","CANCELED","REQUESTED","COMPLETED","CANCEL_REQUESTED"],"description":"카드 결제의 매입 상태.\n\n - READY: 매입 대기\n - REQUESTED: 매입 요청됨\n - COMPLETED: 매입 완료\n - CANCEL_REQUESTED: 매입 취소 요청됨\n - CANCELD: 매입 취소됨"},"receiptUrl":{"type":"string","format":"url","description":"영수증 URL."}},"nullable":false,"required":["company","number","installmentPlanMonths","isInterestFree","approveNo","useCardPoint","cardType","ownerType","acquireStatus","receiptUrl"],"description":"카드 정보."},"ITossCardPayment.IDiscount.Nullable":{"type":"object","properties":{"amount":{"type":"number","description":"카드사의 즉시 할인 프로모션을 적용한 금액."}},"nullable":true,"required":["amount"],"description":"카드사의 즉시 할인 프로모션 정보."},"ITossPaymentCancel":{"type":"object","properties":{"cancelAmount":{"type":"number","description":"취소 총액."},"cancelReason":{"type":"string","description":"취소 사유."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"taxAmount":{"type":"number","description":"과세 처리된 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."},"canceledAt":{"type":"string","format":"date-time","description":"취소 일시."}},"nullable":false,"required":["cancelAmount","cancelReason","taxFreeAmount","taxAmount","refundableAmount","canceledAt"],"description":"결제 취소 정보."},"ITossCashReceipt.ISummary.Nullable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"amount":{"type":"number","description":"현금 영수증 처리된 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"issueNumber":{"type":"string","description":"현금영수증 발급번호."},"receiptUrl":{"type":"string","description":"현금영수증 조회 페이지 주소."}},"nullable":true,"required":["type","amount","taxFreeAmount","issueNumber","receiptUrl"],"description":"현금 영수증 요약 정보."},"ITossCashReceipt.Type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"ITossGiftCertificatePayment":{"type":"object","properties":{"giftCertificate":{"$ref":"#/components/schemas/ITossGiftCertificatePayment.IGiftCertificate","description":"상품권 정보."},"method":{"type":"string","enum":["상품권"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["giftCertificate","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"상품권 결제 정보."},"ITossGiftCertificatePayment.IGiftCertificate":{"type":"object","properties":{"approveNo":{"type":"string","description":"승인 번호."},"settlementStatus":{"type":"string","enum":["COMPLETE","INCOMPLETE"],"description":"정산 상태."}},"nullable":false,"required":["approveNo","settlementStatus"],"description":"상품권 정보."},"ITossMobilePhonePayment":{"type":"object","properties":{"mobilePhone":{"$ref":"#/components/schemas/ITossMobilePhonePayment.IMobilePhone","description":"휴대폰 정보."},"method":{"type":"string","enum":["휴대폰"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["mobilePhone","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"휴대폰 결제 정보."},"ITossMobilePhonePayment.IMobilePhone":{"type":"object","properties":{"carrier":{"type":"string","description":"통신사."},"customerMobilePhone":{"type":"string","description":"고객 휴대폰 번호."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."}},"nullable":false,"required":["carrier","customerMobilePhone","settlementStatus"],"description":"휴대폰 정보."},"ITossTransferPayment":{"type":"object","properties":{"transfer":{"$ref":"#/components/schemas/ITossTransferPayment.ITransfer","description":"계좌 이체 정보."},"method":{"type":"string","enum":["계좌이체"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["transfer","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"계좌 이체 결제 정보."},"ITossTransferPayment.ITransfer":{"type":"object","properties":{"bank":{"type":"string","description":"은행명."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"이체 상태."}},"nullable":false,"required":["bank","settlementStatus"],"description":"계좌 이체 정보."},"ITossVirtualAccountPayment":{"type":"object","properties":{"secret":{"type":"string","description":"가상 계좌로 결제할 때 전달되는 입금 콜백을 검증하기 위한 값."},"virtualAccount":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.IVirtualAccount","description":"가상 계좌 정보."},"method":{"type":"string","enum":["가상계좌"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["secret","virtualAccount","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"가상 계좌 결제 정보."},"ITossVirtualAccountPayment.IVirtualAccount":{"type":"object","properties":{"accountNumber":{"type":"string","description":"계좌 번호."},"accountType":{"type":"string","enum":["일반","고정"],"description":"가상 계좌 타입."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"dueDate":{"type":"string","format":"date","description":"입금 기한."},"expired":{"type":"boolean","description":"가상 계좌 만료 여부."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."},"refundStatus":{"type":"string","enum":["COMPLETED","NONE","FAILED","PENDING","PARTIAL_FAILED"],"description":"환불 처리 상태.\n\n - NONE: 해당 없음\n - FAILED: 환불 실패\n - PENDING: 환불 처리중\n - PARTIAL_FAILED: 부분 환불 실패\n - COMPLETED: 환불 완료"}},"nullable":false,"required":["accountNumber","accountType","bank","customerName","dueDate","expired","settlementStatus","refundStatus"],"description":"가상 계좌 정보."},"IPaymentSource.IPassword":{"type":"object","properties":{"password":{"type":"string","description":"레코드 조회를 위한 비밀번호 입력."}},"nullable":false,"required":["password"],"description":"비밀번호 입력 정보."},"IPaymentHistory.ICreate":{"type":"object","properties":{"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamporttoss.payments","description":"벤더사 정보"},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"결제의 근간이 된 원천 레코드 정보."},"price":{"type":"number","minimum":0,"description":"결제되어야 할 총액.\n\n실 결제금액과 비교하여 이와 다를 시, 422 에러가 리턴됨."},"password":{"type":"string","description":"레코드 열람에 사용할 비밀번호 설정."},"webhook_url":{"type":"string","format":"url","description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"}},"nullable":false,"required":["vendor","source","price","password","webhook_url"],"description":"결제 입력 정보.\n\nSDK 에서 받은 데이터를 취합하여 결제 진행 상황을 서버에 알려준다."},"IPaymentVendoriamporttoss.payments":{"type":"object","properties":{"code":{"type":"string","enum":["iamport","toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IPaymentCancelHistory.ICreate":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/IPaymentSource","description":"결제의 근간이 된 원천 레코드 정보."},"password":{"type":"string","description":"결제 이력에 대한 비밀번호 입력."},"price":{"type":"number","minimum":0,"description":"환불 금액."},"reason":{"type":"string","description":"결제 취소 사유."},"account":{"$ref":"#/components/schemas/IPaymentCancelHistory.IBankAccount.Nullable","description":"환불 계좌 정보.\n\n가상 계좌로 입금한 경우, 결제 취소시, 이를 환불받을 계좌가 필요함.\n\n단, 이 정보는 본 결제 시스템에 저장하지 아니함."}},"nullable":false,"required":["source","password","price","reason","account"],"description":"결제 취소 입력 정보."},"IPaymentCancelHistory.IBankAccount.Nullable":{"type":"object","properties":{"bank":{"type":"string","description":"은행 이름."},"account":{"type":"string","description":"계좌번호."},"holder":{"type":"string","description":"예금주."},"mobile":{"type":"string","description":"연락처, 핸드폰 번호."}},"nullable":true,"required":["bank","account","holder","mobile"],"description":"은행 계좌 정보.\n\n가상 계좌로 입금한 경우, 결제 취소시, 이를 환불받을 계좌가 필요함.\n\n단, 이 정보는 본 결제 시스템에 저장하지 아니함."},"IPaymentReservation":{"oneOf":[{"$ref":"#/components/schemas/IPaymentReservation.IamportType"},{"$ref":"#/components/schemas/IPaymentReservation.TossType"}],"description":"간편 결제 수단 정보.\n\n`IPaymentReservation` 은 간편 결제 수단을 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 {@link IPaymentReservation.vendor_code } 값을\n특정하면, 파생 타입이 자동으로 다운 캐스팅 된다.\n\n```typescript\nif (history.vendor_code === \"toss.payments\")\n history.data.billingKey; // history.data be ITossBilling\n```"},"IPaymentReservation.IamportType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["iamport"],"description":"벤더사 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. If else condition 을 통하여\n{@link IPaymentReservation.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamport","description":"벤더사."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"대상 액터의 참조 정보."},"title":{"type":"string","description":"제목."},"data":{"$ref":"#/components/schemas/IIamportSubscription","description":"벤더사 데이터."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시."}},"nullable":false,"required":["id","vendor_code","vendor","source","title","data","created_at"],"description":"아임 포트의 간편 결제 카드 정보."},"IIamportSubscription":{"type":"object","properties":{"pg_provider":{"type":"string"},"pg_id":{"type":"string"},"card_name":{"type":"string"},"card_code":{"type":"string"},"card_number":{"type":"string"},"card_type":{"type":"string"},"customer_name":{"type":"string","nullable":true},"customer_tel":{"type":"string","nullable":true},"customer_email":{"type":"string","nullable":true},"customer_addr":{"type":"string","nullable":true},"customer_postcode":{"type":"string","nullable":true},"inserted":{"type":"number"},"updated":{"type":"number"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["pg_provider","pg_id","card_name","card_code","card_number","card_type","customer_name","customer_tel","customer_email","customer_addr","customer_postcode","inserted","updated","customer_uid"],"description":"간편 결제 카드 정보."},"IPaymentReservation.TossType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["toss.payments"],"description":"벤더사 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. If else condition 을 통하여\n{@link IPaymentReservation.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendortoss.payments","description":"벤더사."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"대상 액터의 참조 정보."},"title":{"type":"string","description":"제목."},"data":{"$ref":"#/components/schemas/ITossBilling","description":"벤더사 데이터."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시."}},"nullable":false,"required":["id","vendor_code","vendor","source","title","data","created_at"],"description":"토스의 간편 결제 수단 정보."},"ITossBilling":{"type":"object","properties":{"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"billingKey":{"type":"string","description":"{@link ITossBilling } 의 식별자 키."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"cardCompany":{"type":"string","description":"카드사 이름."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"authenticatedAt":{"type":"string","format":"date-time","description":"인증 일시."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["mId","billingKey","method","cardCompany","cardNumber","authenticatedAt","customerKey"],"description":"간편 결제 등록 수단 정보.\n\n`ITossBilling` 은 간편 결제 등록 수단을 형상화한 자료구조 인터페이스로써, 고객이 자신의\n신용 카드를 서버에 등록해두고, 매번 결제가 필요할 때마다 카드 정보를 반복 입려하는 일\n없이 간편하게 결제를 진행하고자 할 때 사용한다."},"IPaymentReservation.ICreate":{"type":"object","properties":{"vendor":{"$ref":"#/components/schemas/IPaymentVendorIPaymentVendor.Code","description":"벤더사 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 레코드 정보."},"title":{"type":"string","description":"제목"},"password":{"type":"string","description":"간편결제 비밀번호.\n\n주의할 점은 카드 비밀번호가 아니라는 것."}},"nullable":false,"required":["vendor","source","title","password"],"description":"간편 결제 수단 등록 정보.\n\n결제사의 팝업 창로부터 전달받은 식별자 정보를 취합하여 전달한다.\n\n참고로 아임포트의 경우 간편 결제로 등록한 카드에 자체 식별자 번호를 부여하지 않는다.\n따라서 귀하의 서비스가 발행한 식별자 ID 가 곧, 해당 간편 결제 수단의 유일무이한\n식별자ㅏ 되니, 이를 {@link IPaymentVendor.uid } 와 {@link IPaymentSource.id } 에\n모두 동일하게 할당해주면 된다."},"IPaymentVendorIPaymentVendor.Code":{"type":"object","properties":{"code":{"type":"string","enum":["iamport","toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IIamportPayment.IWebhook":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"status":{"type":"string","enum":["paid","ready","failed","cancelled"],"description":"현재 상태."}},"nullable":false,"required":["imp_uid","merchant_uid","status"],"description":"웹훅 데이터."}}}} \ No newline at end of file +{"openapi":"3.0.1","servers":[{"url":"https://github.com/samchon/nestia","description":"insert your server url"}],"info":{"version":"6.0.2","title":"@samchon/payment-backend","description":"Payment Backend Server","license":{"name":"MIT"}},"paths":{"/monitors/health":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":""}}}},"/monitors/performance":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.G.et](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPerformance"}}},"x-nestia-encrypted":true}}}},"/monitors/system":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.G.et](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ISystem"}}},"x-nestia-encrypted":true}}}},"/payments/histories/get":{"patch":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역의 원천 정보 + 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IAccessor"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 상세 조회하기","description":"결제 내역 상세 조회하기."}},"/payments/histories/{id}":{"patch":{"tags":[],"parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"description":"Primary Key","required":true}],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역의 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IPassword"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 상세 조회하기","description":"결제 내역 상세 조회하기."}},"/payments/histories":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ost](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 발행하기","description":"결제 내역 발행하기."}},"/payments/histories/cancel":{"put":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 취소 내역 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentCancelHistory.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ut](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 취소하기","description":"결제 취소하기."}},"/payments/reservations/get":{"patch":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단의 원천 정보 + 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IAccessor"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 조회하기","description":"간편 결제 수단 조회하기."}},"/payments/reservations/{id}":{"patch":{"tags":[],"parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"description":"Primary Key","required":true}],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IPassword"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 조회하기","description":"간편 결제 수단 조회하기."}},"/payments/reservations":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ost](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 등록하기","description":"간편 결제 수단 등록하기."}},"/payments/webhooks/iamport":{"post":{"tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPayment.IWebhook"}}},"required":true},"responses":{"201":{"description":""}}}}},"components":{"schemas":{"IPerformance":{"type":"object","properties":{"cpu":{"$ref":"#/components/schemas/process.global.NodeJS.CpuUsage"},"memory":{"$ref":"#/components/schemas/process.global.NodeJS.MemoryUsage"},"resource":{"$ref":"#/components/schemas/process.global.NodeJS.ResourceUsage"}},"nullable":false,"required":["cpu","memory","resource"]},"process.global.NodeJS.CpuUsage":{"type":"object","properties":{"user":{"type":"number"},"system":{"type":"number"}},"nullable":false,"required":["user","system"]},"process.global.NodeJS.MemoryUsage":{"type":"object","properties":{"rss":{"type":"number"},"heapTotal":{"type":"number"},"heapUsed":{"type":"number"},"external":{"type":"number"},"arrayBuffers":{"type":"number"}},"nullable":false,"required":["rss","heapTotal","heapUsed","external","arrayBuffers"]},"process.global.NodeJS.ResourceUsage":{"type":"object","properties":{"fsRead":{"type":"number"},"fsWrite":{"type":"number"},"involuntaryContextSwitches":{"type":"number"},"ipcReceived":{"type":"number"},"ipcSent":{"type":"number"},"majorPageFault":{"type":"number"},"maxRSS":{"type":"number"},"minorPageFault":{"type":"number"},"sharedMemorySize":{"type":"number"},"signalsCount":{"type":"number"},"swappedOut":{"type":"number"},"systemCPUTime":{"type":"number"},"unsharedDataSize":{"type":"number"},"unsharedStackSize":{"type":"number"},"userCPUTime":{"type":"number"},"voluntaryContextSwitches":{"type":"number"}},"nullable":false,"required":["fsRead","fsWrite","involuntaryContextSwitches","ipcReceived","ipcSent","majorPageFault","maxRSS","minorPageFault","sharedMemorySize","signalsCount","swappedOut","systemCPUTime","unsharedDataSize","unsharedStackSize","userCPUTime","voluntaryContextSwitches"]},"ISystem":{"type":"object","properties":{"uid":{"type":"string","description":"Random Unique ID."},"arguments":{"type":"array","items":{"type":"string"},"description":"`process.argv`"},"commit":{"$ref":"#/components/schemas/ISystem.ICommit","description":"Git commit information."},"package":{"$ref":"#/components/schemas/ISystem.IPackage","description":"`package.json`"},"created_at":{"type":"string","description":"Creation time of this system."}},"nullable":false,"required":["uid","arguments","commit","package","created_at"]},"ISystem.ICommit":{"type":"object","properties":{"shortHash":{"type":"string"},"branch":{"type":"string"},"hash":{"type":"string"},"subject":{"type":"string"},"sanitizedSubject":{"type":"string"},"body":{"type":"string"},"author":{"$ref":"#/components/schemas/ISystem.ICommit.IUser"},"committer":{"$ref":"#/components/schemas/ISystem.ICommit.IUser"},"authored_at":{"type":"string"},"commited_at":{"type":"string"},"notes":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"nullable":false,"required":["shortHash","branch","hash","subject","sanitizedSubject","body","author","committer","authored_at","commited_at","tags"],"description":"Git commit information."},"ISystem.ICommit.IUser":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"nullable":false,"required":["name","email"],"description":"Git user information."},"ISystem.IPackage":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"scripts":{"$ref":"#/components/schemas/Recordstringstring"},"repository":{"type":"object","properties":{"type":{"type":"string","enum":["git"]},"url":{"type":"string"}},"nullable":false,"required":["type","url"]},"author":{"type":"string"},"license":{"type":"string"},"bugs":{"type":"object","properties":{"url":{"type":"string"}},"nullable":false,"required":["url"]},"homepage":{"type":"string"},"devDependencies":{"$ref":"#/components/schemas/Recordstringstring"},"dependencies":{"$ref":"#/components/schemas/Recordstringstring"},"publishConfig":{"type":"object","properties":{"registry":{"type":"string"}},"nullable":false,"required":["registry"]},"main":{"type":"string"},"typings":{"type":"string"},"files":{"type":"array","items":{"type":"string"}}},"nullable":false,"required":["name","version","description","scripts","repository","author","license","bugs","homepage","devDependencies","dependencies"],"description":"NPM package information."},"Recordstringstring":{"type":"object","properties":{},"nullable":false,"description":"Construct a type with a set of properties K of type T"},"IPaymentSource.IAccessor":{"type":"object","properties":{"schema":{"type":"string","description":"DB 스키마 이름"},"table":{"type":"string","description":"DB 테이블 명"},"id":{"type":"string","format":"uuid","description":"참조 레코드의 PK"},"password":{"type":"string","description":"레코드 조회를 위한 비밀번호 입력."}},"nullable":false,"required":["schema","table","id","password"],"description":"접근자 정보.\n\n`IPaymentSource.IAccessor` 는 {@link IPaymentHistory 결제 내역} 내지\n{@link IPaymentReservation 간편 결제 수단 정보}를 조회할 때, 그것의 고유 식별자\nID 가 아닌 원천 레코드 식별자 정보 {@link IPaymentSource } 를 통하여 조회할 때\n사용하는 접근자 정보이다.\n\n다만 `payments-server` 의 모든 개별 레코드는 이를 조회할 시 비밀번호가 필요하기에,\n{@link IPaymentSource } 의 속성들에 비밀번호가 하나 더 추가되었을 뿐이다."},"IPaymentHistory":{"oneOf":[{"$ref":"#/components/schemas/IPaymentHistory.IamportType"},{"$ref":"#/components/schemas/IPaymentHistory.TossType"}],"description":"결제 내역.\n\n`IPaymentHistory` 는 결제 내역을 형상화한 자료구조이자 유니언 타입의 인터페이이다.\n서비스 시스템으로부 결제 사건의 귀속 정보 ({@link IPaymentHistory.ICreate.vendor } +\n{@link IPaymentHistory.ICreate.source }) 를 전달받아, 본 Payment 시스템이 PG 사에\n추가 정보를 취득하여 레코드가 완성된다.\n\n그리고 만일 현 결제 건이 가상계좌와 같이 레코드 생성 시점에 지불이 이루어지지 않은\n경우라면, 사후 {@link IPaymentWebhook 웹훅 이벤트}를 통하여 지불 완료 시각을 뜻하는\n{@link paid_at } 가 설정될 수 있다. 그리고 반대로 이미 결제가 완료된 경우라도,\n환불 등의 이유로 인하여 {@link cancelled_at } 이 사후 기재될 수 있다.\n\n참고로 `if condition` 을 통하여 {@link IPaymentHistory.vendor_code } 값을 특정하면,\n파생 타입이 자동으로 다운 캐스팅 된다.\n\n```typescript\nif (history.vendor_code === \"toss.payments\")\n history.data.paymentKey; // history.data be ITossPayment\n```"},"IPaymentHistory.IamportType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["iamport"],"description":"벤더사 식별자 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. `if condition` 을 통하여\n{@link IPaymentHistory.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamport","description":"벤더 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 래코드 정보."},"data":{"$ref":"#/components/schemas/IIamportPayment","description":"결제 상세 데이터, 벤더별로 데이터 양식이 다르니 주의할 것."},"currency":{"type":"string","description":"통화 단위\n\nKRW, USB, JPY 등."},"price":{"type":"number","minimum":0,"description":"결제 가격."},"refund":{"type":"number","minimum":0,"nullable":true,"description":"결제 취소시의 환불 금액."},"webhook_url":{"type":"string","format":"url","nullable":true,"description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"},"created_at":{"type":"string","format":"date-time","description":"결제 레코드 생성 일시."},"paid_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 완료 일시."},"cancelled_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 취소 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/IPaymentCancelHistory"},"description":"결제 취소 내역 리스트."}},"nullable":false,"required":["id","vendor_code","vendor","source","data","currency","price","refund","webhook_url","created_at","paid_at","cancelled_at","cancels"],"description":"아임포트로부터의 결제 내역."},"IPaymentVendoriamport":{"type":"object","properties":{"code":{"type":"string","enum":["iamport"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IPaymentSource":{"type":"object","properties":{"schema":{"type":"string","description":"DB 스키마 이름"},"table":{"type":"string","description":"DB 테이블 명"},"id":{"type":"string","format":"uuid","description":"참조 레코드의 PK"}},"nullable":false,"required":["schema","table","id"],"description":"원천 레코드 참조 정보.\n\n`IPaymentSource` 는 {@link IPaymentHistory 결제 내역} 및\n{@link IPaymentResrvation 간편 결제 수단}의 원천이 되는 레코드의 참조 정보를 형상화한\n자료구조 인터페이이다. 만일 대상이 {@link IPaymentHistory 결제 내역}이라면 결제의\n근원이 되는 주문에 대한 참조 정보를, 대상이 {@link IPaymentResrvation 간편 결제 수단}\n이라면 이를 기록한 귀사 서비스의 참조 정보를 기입하면 된다."},"IIamportPayment":{"oneOf":[{"$ref":"#/components/schemas/IIamportCardPayment"},{"$ref":"#/components/schemas/IIamportTransferPayment"},{"$ref":"#/components/schemas/IIamportVBankPayment"},{"$ref":"#/components/schemas/IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint"}],"description":"결제 정보.\n\n`IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.pay_method === \"card\")\n payment.card_number; // payment be IIamportCardPayment\n```"},"IIamportCardPayment":{"type":"object","properties":{"card_code":{"type":"string","description":"카드 식별자 코드."},"card_name":{"type":"string","description":"카드 이름."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호."},"card_quota":{"type":"integer","description":"할부 개월 수."},"apply_num":{"type":"string","description":"카드사 승인번호."},"pay_method":{"type":"string","enum":["card","samsung"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["card_code","card_name","card_number","card_quota","apply_num","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"카드 결제 정보."},"IIamportPayment.Currency":{"type":"string","enum":["KRW","USD","EUR","JPY"]},"IIamportPayment.Status":{"type":"string","enum":["paid","ready","failed","cancelled"]},"IIamportPaymentCancel":{"type":"object","properties":{"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"amount":{"type":"number"},"cancelled_at":{"type":"number"},"reason":{"type":"string"},"receipt_url":{"type":"string","format":"url"}},"nullable":false,"required":["pg_id","pg_tid","amount","cancelled_at","reason","receipt_url"],"description":"결제 취소 정보."},"IIamportTransferPayment":{"type":"object","properties":{"bank_code":{"type":"string","description":"은행 식별자 코드."},"bank_name":{"type":"string","description":"은행 이름."},"pay_method":{"type":"string","enum":["trans"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["bank_code","bank_name","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"계좌 이체 결제 정보."},"IIamportVBankPayment":{"type":"object","properties":{"vbank_code":{"type":"string","description":"가상 계좌 식별자 코드."},"vbank_name":{"type":"string","description":"가상 게좌 이름"},"vbank_num":{"type":"string","description":"가상 계좌 번호"},"vbank_holder":{"type":"string","description":"가상 계좌 예금주."},"vbank_date":{"type":"number","description":"가상 계좌 입금 만료 기한."},"vbank_issued_at":{"type":"number","description":"가상 계좌 개설 일시."},"pay_method":{"type":"string","enum":["vbank"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["vbank_code","vbank_name","vbank_num","vbank_holder","vbank_date","vbank_issued_at","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"가상 계좌 결제 정보."},"IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint":{"type":"object","properties":{"pay_method":{"type":"string","enum":["phone","kpay","kakaopay","payco","lpay","ssgpay","tosspay","cultureland","smartculture","happymoney","booknlife","point"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"결제 기본 (공통) 정보."},"IPaymentCancelHistory":{"type":"object","properties":{"reason":{"type":"string","description":"결제 취소 사유."},"price":{"type":"number","minimum":0,"description":"환불 금액."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시.\n\n즉, 결제 취소가 발생한 시각."}},"nullable":false,"required":["reason","price","created_at"],"description":"결제 취소 내역."},"IPaymentHistory.TossType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["toss.payments"],"description":"벤더사 식별자 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. `if condition` 을 통하여\n{@link IPaymentHistory.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendortoss.payments","description":"벤더 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 래코드 정보."},"data":{"$ref":"#/components/schemas/ITossPayment","description":"결제 상세 데이터, 벤더별로 데이터 양식이 다르니 주의할 것."},"currency":{"type":"string","description":"통화 단위\n\nKRW, USB, JPY 등."},"price":{"type":"number","minimum":0,"description":"결제 가격."},"refund":{"type":"number","minimum":0,"nullable":true,"description":"결제 취소시의 환불 금액."},"webhook_url":{"type":"string","format":"url","nullable":true,"description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"},"created_at":{"type":"string","format":"date-time","description":"결제 레코드 생성 일시."},"paid_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 완료 일시."},"cancelled_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 취소 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/IPaymentCancelHistory"},"description":"결제 취소 내역 리스트."}},"nullable":false,"required":["id","vendor_code","vendor","source","data","currency","price","refund","webhook_url","created_at","paid_at","cancelled_at","cancels"],"description":"토스 페이먼츠로부터의 결제 내역."},"IPaymentVendortoss.payments":{"type":"object","properties":{"code":{"type":"string","enum":["toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"ITossPayment":{"oneOf":[{"$ref":"#/components/schemas/ITossCardPayment"},{"$ref":"#/components/schemas/ITossGiftCertificatePayment"},{"$ref":"#/components/schemas/ITossMobilePhonePayment"},{"$ref":"#/components/schemas/ITossTransferPayment"},{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}],"description":"결제 정보.\n\n`ITossPayment` 는 토스 페이먼츠의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.method === \"카드\")\n payment.card; // payment be ITossCardPayment\n```"},"ITossCardPayment":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/ITossCardPayment.ICard","description":"카드 정보."},"discount":{"$ref":"#/components/schemas/ITossCardPayment.IDiscount.Nullable","description":"카드사의 즉시 할인 프로모션 정보."},"easyPay":{"type":"string","enum":["토스결제","페이코","삼성페이"],"nullable":true,"description":"간편결제로 결제한 경우 간편결제 타입 정보."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL","BILLING"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["card","discount","easyPay","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"카드 결제 정보."},"ITossCardPayment.ICard":{"type":"object","properties":{"company":{"type":"string","description":"카드사 이름."},"number":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"installmentPlanMonths":{"type":"number","description":"할부 개월 수."},"isInterestFree":{"type":"boolean","description":"무이자 할부 적용 여부."},"approveNo":{"type":"string","description":"승인 번호."},"useCardPoint":{"type":"boolean","enum":[false],"description":"카드 포인트 사용 여부."},"cardType":{"type":"string","enum":["신용","체크","기프트"],"description":"카드 타입."},"ownerType":{"type":"string","enum":["개인","법인"],"description":"카드의 소유자 타입."},"acquireStatus":{"type":"string","enum":["READY","CANCELED","REQUESTED","COMPLETED","CANCEL_REQUESTED"],"description":"카드 결제의 매입 상태.\n\n - READY: 매입 대기\n - REQUESTED: 매입 요청됨\n - COMPLETED: 매입 완료\n - CANCEL_REQUESTED: 매입 취소 요청됨\n - CANCELD: 매입 취소됨"},"receiptUrl":{"type":"string","format":"url","description":"영수증 URL."}},"nullable":false,"required":["company","number","installmentPlanMonths","isInterestFree","approveNo","useCardPoint","cardType","ownerType","acquireStatus","receiptUrl"],"description":"카드 정보."},"ITossCardPayment.IDiscount.Nullable":{"type":"object","properties":{"amount":{"type":"number","description":"카드사의 즉시 할인 프로모션을 적용한 금액."}},"nullable":true,"required":["amount"],"description":"카드사의 즉시 할인 프로모션 정보."},"ITossPaymentCancel":{"type":"object","properties":{"cancelAmount":{"type":"number","description":"취소 총액."},"cancelReason":{"type":"string","description":"취소 사유."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"taxAmount":{"type":"number","description":"과세 처리된 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."},"canceledAt":{"type":"string","format":"date-time","description":"취소 일시."}},"nullable":false,"required":["cancelAmount","cancelReason","taxFreeAmount","taxAmount","refundableAmount","canceledAt"],"description":"결제 취소 정보."},"ITossCashReceipt.ISummary.Nullable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"amount":{"type":"number","description":"현금 영수증 처리된 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"issueNumber":{"type":"string","description":"현금영수증 발급번호."},"receiptUrl":{"type":"string","description":"현금영수증 조회 페이지 주소."}},"nullable":true,"required":["type","amount","taxFreeAmount","issueNumber","receiptUrl"],"description":"현금 영수증 요약 정보."},"ITossCashReceipt.Type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"ITossGiftCertificatePayment":{"type":"object","properties":{"giftCertificate":{"$ref":"#/components/schemas/ITossGiftCertificatePayment.IGiftCertificate","description":"상품권 정보."},"method":{"type":"string","enum":["상품권"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["giftCertificate","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"상품권 결제 정보."},"ITossGiftCertificatePayment.IGiftCertificate":{"type":"object","properties":{"approveNo":{"type":"string","description":"승인 번호."},"settlementStatus":{"type":"string","enum":["COMPLETE","INCOMPLETE"],"description":"정산 상태."}},"nullable":false,"required":["approveNo","settlementStatus"],"description":"상품권 정보."},"ITossMobilePhonePayment":{"type":"object","properties":{"mobilePhone":{"$ref":"#/components/schemas/ITossMobilePhonePayment.IMobilePhone","description":"휴대폰 정보."},"method":{"type":"string","enum":["휴대폰"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["mobilePhone","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"휴대폰 결제 정보."},"ITossMobilePhonePayment.IMobilePhone":{"type":"object","properties":{"carrier":{"type":"string","description":"통신사."},"customerMobilePhone":{"type":"string","description":"고객 휴대폰 번호."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."}},"nullable":false,"required":["carrier","customerMobilePhone","settlementStatus"],"description":"휴대폰 정보."},"ITossTransferPayment":{"type":"object","properties":{"transfer":{"$ref":"#/components/schemas/ITossTransferPayment.ITransfer","description":"계좌 이체 정보."},"method":{"type":"string","enum":["계좌이체"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["transfer","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"계좌 이체 결제 정보."},"ITossTransferPayment.ITransfer":{"type":"object","properties":{"bank":{"type":"string","description":"은행명."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"이체 상태."}},"nullable":false,"required":["bank","settlementStatus"],"description":"계좌 이체 정보."},"ITossVirtualAccountPayment":{"type":"object","properties":{"secret":{"type":"string","description":"가상 계좌로 결제할 때 전달되는 입금 콜백을 검증하기 위한 값."},"virtualAccount":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.IVirtualAccount","description":"가상 계좌 정보."},"method":{"type":"string","enum":["가상계좌"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["secret","virtualAccount","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"가상 계좌 결제 정보."},"ITossVirtualAccountPayment.IVirtualAccount":{"type":"object","properties":{"accountNumber":{"type":"string","description":"계좌 번호."},"accountType":{"type":"string","enum":["일반","고정"],"description":"가상 계좌 타입."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"dueDate":{"type":"string","format":"date","description":"입금 기한."},"expired":{"type":"boolean","description":"가상 계좌 만료 여부."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."},"refundStatus":{"type":"string","enum":["COMPLETED","NONE","FAILED","PENDING","PARTIAL_FAILED"],"description":"환불 처리 상태.\n\n - NONE: 해당 없음\n - FAILED: 환불 실패\n - PENDING: 환불 처리중\n - PARTIAL_FAILED: 부분 환불 실패\n - COMPLETED: 환불 완료"}},"nullable":false,"required":["accountNumber","accountType","bank","customerName","dueDate","expired","settlementStatus","refundStatus"],"description":"가상 계좌 정보."},"IPaymentSource.IPassword":{"type":"object","properties":{"password":{"type":"string","description":"레코드 조회를 위한 비밀번호 입력."}},"nullable":false,"required":["password"],"description":"비밀번호 입력 정보."},"IPaymentHistory.ICreate":{"type":"object","properties":{"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamporttoss.payments","description":"벤더사 정보"},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"결제의 근간이 된 원천 레코드 정보."},"price":{"type":"number","minimum":0,"description":"결제되어야 할 총액.\n\n실 결제금액과 비교하여 이와 다를 시, 422 에러가 리턴됨."},"password":{"type":"string","description":"레코드 열람에 사용할 비밀번호 설정."},"webhook_url":{"type":"string","format":"url","description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"}},"nullable":false,"required":["vendor","source","price","password","webhook_url"],"description":"결제 입력 정보.\n\nSDK 에서 받은 데이터를 취합하여 결제 진행 상황을 서버에 알려준다."},"IPaymentVendoriamporttoss.payments":{"type":"object","properties":{"code":{"type":"string","enum":["iamport","toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IPaymentCancelHistory.ICreate":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/IPaymentSource","description":"결제의 근간이 된 원천 레코드 정보."},"password":{"type":"string","description":"결제 이력에 대한 비밀번호 입력."},"price":{"type":"number","minimum":0,"description":"환불 금액."},"reason":{"type":"string","description":"결제 취소 사유."},"account":{"$ref":"#/components/schemas/IPaymentCancelHistory.IBankAccount.Nullable","description":"환불 계좌 정보.\n\n가상 계좌로 입금한 경우, 결제 취소시, 이를 환불받을 계좌가 필요함.\n\n단, 이 정보는 본 결제 시스템에 저장하지 아니함."}},"nullable":false,"required":["source","password","price","reason","account"],"description":"결제 취소 입력 정보."},"IPaymentCancelHistory.IBankAccount.Nullable":{"type":"object","properties":{"bank":{"type":"string","description":"은행 이름."},"account":{"type":"string","description":"계좌번호."},"holder":{"type":"string","description":"예금주."},"mobile":{"type":"string","description":"연락처, 핸드폰 번호."}},"nullable":true,"required":["bank","account","holder","mobile"],"description":"은행 계좌 정보.\n\n가상 계좌로 입금한 경우, 결제 취소시, 이를 환불받을 계좌가 필요함.\n\n단, 이 정보는 본 결제 시스템에 저장하지 아니함."},"IPaymentReservation":{"oneOf":[{"$ref":"#/components/schemas/IPaymentReservation.IamportType"},{"$ref":"#/components/schemas/IPaymentReservation.TossType"}],"description":"간편 결제 수단 정보.\n\n`IPaymentReservation` 은 간편 결제 수단을 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 {@link IPaymentReservation.vendor_code } 값을\n특정하면, 파생 타입이 자동으로 다운 캐스팅 된다.\n\n```typescript\nif (history.vendor_code === \"toss.payments\")\n history.data.billingKey; // history.data be ITossBilling\n```"},"IPaymentReservation.IamportType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["iamport"],"description":"벤더사 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. If else condition 을 통하여\n{@link IPaymentReservation.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamport","description":"벤더사."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"대상 액터의 참조 정보."},"title":{"type":"string","description":"제목."},"data":{"$ref":"#/components/schemas/IIamportSubscription","description":"벤더사 데이터."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시."}},"nullable":false,"required":["id","vendor_code","vendor","source","title","data","created_at"],"description":"아임 포트의 간편 결제 카드 정보."},"IIamportSubscription":{"type":"object","properties":{"pg_provider":{"type":"string"},"pg_id":{"type":"string"},"card_name":{"type":"string"},"card_code":{"type":"string"},"card_number":{"type":"string"},"card_type":{"type":"string"},"customer_name":{"type":"string","nullable":true},"customer_tel":{"type":"string","nullable":true},"customer_email":{"type":"string","nullable":true},"customer_addr":{"type":"string","nullable":true},"customer_postcode":{"type":"string","nullable":true},"inserted":{"type":"number"},"updated":{"type":"number"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["pg_provider","pg_id","card_name","card_code","card_number","card_type","customer_name","customer_tel","customer_email","customer_addr","customer_postcode","inserted","updated","customer_uid"],"description":"간편 결제 카드 정보."},"IPaymentReservation.TossType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["toss.payments"],"description":"벤더사 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. If else condition 을 통하여\n{@link IPaymentReservation.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendortoss.payments","description":"벤더사."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"대상 액터의 참조 정보."},"title":{"type":"string","description":"제목."},"data":{"$ref":"#/components/schemas/ITossBilling","description":"벤더사 데이터."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시."}},"nullable":false,"required":["id","vendor_code","vendor","source","title","data","created_at"],"description":"토스의 간편 결제 수단 정보."},"ITossBilling":{"type":"object","properties":{"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"billingKey":{"type":"string","description":"{@link ITossBilling } 의 식별자 키."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"cardCompany":{"type":"string","description":"카드사 이름."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"authenticatedAt":{"type":"string","format":"date-time","description":"인증 일시."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["mId","billingKey","method","cardCompany","cardNumber","authenticatedAt","customerKey"],"description":"간편 결제 등록 수단 정보.\n\n`ITossBilling` 은 간편 결제 등록 수단을 형상화한 자료구조 인터페이스로써, 고객이 자신의\n신용 카드를 서버에 등록해두고, 매번 결제가 필요할 때마다 카드 정보를 반복 입려하는 일\n없이 간편하게 결제를 진행하고자 할 때 사용한다."},"IPaymentReservation.ICreate":{"type":"object","properties":{"vendor":{"$ref":"#/components/schemas/IPaymentVendorIPaymentVendor.Code","description":"벤더사 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 레코드 정보."},"title":{"type":"string","description":"제목"},"password":{"type":"string","description":"간편결제 비밀번호.\n\n주의할 점은 카드 비밀번호가 아니라는 것."}},"nullable":false,"required":["vendor","source","title","password"],"description":"간편 결제 수단 등록 정보.\n\n결제사의 팝업 창로부터 전달받은 식별자 정보를 취합하여 전달한다.\n\n참고로 아임포트의 경우 간편 결제로 등록한 카드에 자체 식별자 번호를 부여하지 않는다.\n따라서 귀하의 서비스가 발행한 식별자 ID 가 곧, 해당 간편 결제 수단의 유일무이한\n식별자ㅏ 되니, 이를 {@link IPaymentVendor.uid } 와 {@link IPaymentSource.id } 에\n모두 동일하게 할당해주면 된다."},"IPaymentVendorIPaymentVendor.Code":{"type":"object","properties":{"code":{"type":"string","enum":["iamport","toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IIamportPayment.IWebhook":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"status":{"type":"string","enum":["paid","ready","failed","cancelled"],"description":"현재 상태."}},"nullable":false,"required":["imp_uid","merchant_uid","status"],"description":"웹훅 데이터."}}}} \ No newline at end of file diff --git a/packages/payment-api/tsconfig.json b/packages/payment-api/tsconfig.json index 31525c6..271e099 100644 --- a/packages/payment-api/tsconfig.json +++ b/packages/payment-api/tsconfig.json @@ -12,7 +12,7 @@ "target": "ES5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "lib": [ "DOM", - "ES2015" + "ES2020" ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */// "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ diff --git a/packages/payment-backend/README.md b/packages/payment-backend/README.md index 79b0bce..fee8f4b 100644 --- a/packages/payment-backend/README.md +++ b/packages/payment-backend/README.md @@ -595,108 +595,3 @@ export async function test_fake_iamport_payment_webhook `@samchon/payment-backend` 에는 이처럼 보안 강화를 위한 강력한 암호화 정책들이 존재한다. 혹여 귀하가 본 `@samchon/payment-backend` 를 확장하여 몇 가지 기능을 더 개발한다 하더라도, 이러한 암호화 원칙들은 부디 지켜주었으면 한다. - - - -## 4. Deploy -### 4.1. Non-distruptive Update System -만일 귀하가 통합 결제 서버 `@samchon/payment-backend` 의 코드를 수정하고 이를 커밋하였다면, 귀하는 이를 기존의 서버 인스턴스를 종료하는 일 없이, 무중단 업데이트를 수행할 수 있다. `npm run update` 명령어를 입력함으로써, 이러한 무중단 업데이트는 실행된다. - - - Pull new commit - - Build the new soure code - - Restart the backend server without distruption - -이러한 무중단 업데이트를 달성하기 위해서는, 서버 인스턴스는 메인 백엔드 서버 프로그램을 시작하기 전, 업데이트 프로그램을 실행해 줄 필요가 있다. 만일 귀하의 서버 인스턴스가 ELB (Elastic Loader Balancer) 등을 통하여 여러 대로 구성되어있고, 현재의 인스턴스가 슬레이브라면, `npm run pm2:start:updator:slave` 명령어를 실행해주면 된다. - -반면 현재가 마스터 인스턴스라면, `npm run pm2:start:updator:master` 명령어를 실행하도록 한다. - -```bash -#---- -# RUN UPDATOR PROGRAM -#---- -# THE INSTANCE IS MASTER -npm run pm2:start:updator:master - -# THE INSTANCE IS SLAVE -npm run pm2:start:updator:slave - -#---- -# MOUNT THE BACKEND SERVER UP -#---- -npm run pm2:start real -``` - -### 4.2. Local Server -간혹 로컬에, [테스트 자동화 프로그램](#33-test-automation-program)이 아닌, `@samchon/payment-backend` 그 자체를 구동해야 할 때가 있다. 이럴 때는 아래와 같이 `npm run pm2:start local` 명령어를 입력해주면, 로컬에 `@samchon/payment-backend` 서버를 개설할 수 있다. 그리고 실행된 서버를 종료하려거든, `npm run pm2:stop` 명령어를 입력해주면 된다. - -```bash -npm run pm2:start local -npm run pm2:stop -``` - -또한, 로컬 개발 환경에서의 무중단 업데이트가 얼마나 의미가 있겠냐만은, 어쨋든 `@samchon/payment-backend` 는 로컬 환경에서도 무중단 업데이트라는 것을 할 수 있다. 아래와 같이 로컬 서버를 구동하기 전 `npm run pm2:start updator:master` 명령어를 통하여 업데이트 관리자 프로그램을 구동하고, 향후 무중단 업데이트가 필요할 때마다 `npm run update local` 명령어를 입력해주면 된다. - -```bash -# START THE LOCAL BACKEND SERVER WITH UPDATOR PROGRAM -npm run pm2:start updator:master -npm run pm2:start local - -# UPDATE THE LOCAL SERVER WITHOUT DISTRUPTION -npm run update local -``` - -### 4.3. Dev Server -Dev 서버를 업데이트하는 것은 매우 간단하다. 그저 소스 코드를 `dev` 브랜치에 커밋한 후, 로컬 개발환경에서 `npm run update dev` 명령어를 입력해주면 끝이다. 이로써 Dev 서버의 소스 코드는 가장 최신의 것으로 바뀌며, 동시에 무중단 업데이트가 실행되어 이것이 서버 API 에 적용될 뿐이다. - -```bash -npm run update dev -``` - -다만 dev 서버의 경우, PostgreSQL 이 별도의 RDS 로 구성된 게 아닌, `@samchon/payment-backend` 가 설치되고 가동되는 EC2 인스턴스에 함께 설치되기도 한다. 그리고 dev 서버는 로컬 서버와 마찬가지로 테스트 용도를 위하여 개설된 목적인 바, 경우에 따라 DB 를 초기화하고 재 구성해야 하는 경우 또한 생기기 마련이다. - -이 경우, 아래와 같이 `npm run ssh:dev` 명령어를 입력하여 dev 서버로 접속한 후, `npm run reset:dev` 명령어를 입력해주면 된다. 이 명령어는 dev 서버의 소스코드를 가장 최신의 것으로 변경한 후, `@samchon/payment-backend` 의 백엔드 및 업데이트 서버를 종료하고, 테스트 프로그램을 가동함으로써 DB 를 초기화하고 필수 및 샘플 데이터를 재 구성한 후, 종료된 `@samchon/payment-backend` 의 백엔드와 업데이트 서버를 재 시작해주는 역할을 한다. - -```bash -# 다음 두 명령어로 리셋 가능 -npm run ssh:dev -npm run reset:dev - -# 참고사항 - npm run reset:dev 를 구성하는 명령어 셋 -git pull -npm install -npm run build -pm2 stop all -npm run test -- --mode=dev -npm run pm2:start:updator:master -npm run pm2:start dev -``` - -더하여 `@samchon/payment-backend` 를 개발하다보면, 문득 현재 가동 중인 `@samchon/payment-backend` 서버의 정보가 이리저리 궁금해질 수 있다. 가령 현재 가동 중인 dev 서버가 사용 중인 소스 코드가 무엇인지 알고 싶어, 해당 서버가 사용 중인 소스 코드의 commit 에 대한 hash code 를 알고싶을 수도 있는 법이다. - -이 때는 망설이지 말고 바로 아래와 같이, `npm run monitor dev` 명령을 수행해주면, 바로 현재의 dev 서버에 대한 각종 정보를 취득할 수 있다. 취득할 수 있는 정보는 아래와 같이 대분류 주제로는 두 가지, 그리고 소분류로는 다섯 가지가 있다. - - - 퍼포먼스 정보: [IPerformance](src/api/structures/monitors/IPerformance.ts) - - CPU 사용량 - - 메모리 사용량 - - 리소스 사용량 - - 시스템 정보: [ISystem](src/api/structures/monitors/ISystem.ts) - - 커밋 정보: 현 서버가 사용 중인 소스 코드의 커밋에 관한 정보 - - 패키지 정보: `package.json` - - 기타 서버 개설 일시 정보 등 - -``` -npm run monitor dev -``` - -### 4.4. Real Server -Real 서버를 업데이트하는 일 또한 [dev](#43-dev-server) 서버 때와 마찬가지로 매우 간단하다. 그저 편집한 소스 코드를 `master` 브랜치에 커밋하고, 로컬 개발 환경에서 `npm run update real` 명령어를 실행함으로써, 마스터 서버가 스스로 무중단 업데이트를 수행하도록 할 수 있다. - -```bash -npm run update real -``` - -또한 master 서버에 대하여도, 아래 명령어를 통하여, 각종 정보를 취득할 수 있다. - -```bash -npm run monitor master -``` diff --git a/packages/payment-backend/package.json b/packages/payment-backend/package.json index 2dd1917..dcbed3f 100644 --- a/packages/payment-backend/package.json +++ b/packages/payment-backend/package.json @@ -1,6 +1,6 @@ { "name": "@samchon/payment-backend", - "version": "6.0.1", + "version": "6.0.2", "description": "Payment Backend Server", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -53,6 +53,7 @@ }, "homepage": "https://github.com/samchon/payments", "devDependencies": { + "@nestia/fetcher": "^2.4.5", "@nestia/sdk": "^2.4.5", "@types/atob": "^2.1.2", "@types/bcryptjs": "^2.4.4", @@ -68,12 +69,12 @@ "cli": "^1.0.1", "copy-webpack-plugin": "^11.0.0", "copyfiles": "^2.4.1", - "iamport-server-api": "^6.0.1", + "iamport-server-api": "^6.0.2", "nestia": "^5.0.3", "pm2": "^4.5.6", "rimraf": "^3.0.2", "sloc": "^0.2.1", - "toss-payments-server-api": "^6.0.1", + "toss-payments-server-api": "^6.0.2", "ts-loader": "^9.5.0", "ts-node": "^10.9.1", "ts-patch": "^3.1.1", @@ -85,25 +86,29 @@ }, "dependencies": { "@nestia/core": "^2.4.5", + "@nestia/e2e": "^0.4.1", "@nestjs/common": "^10.2.8", "@nestjs/core": "^10.2.8", "@nestjs/platform-fastify": "^10.2.8", "@prisma/client": "^5.3.1", + "atob": "^2.1.2", "bcryptjs": "^2.4.3", + "btoa": "^1.2.1", + "commander": "10.0.0", "dotenv": "^16.3.1", "dotenv-expand": "^10.0.0", - "fake-iamport-server": "^6.0.1", - "fake-toss-payments-server": "^6.0.1", + "fake-iamport-server": "^6.0.2", + "fake-toss-payments-server": "^6.0.2", "fastify": "^4.24.3", "git-last-commit": "^1.0.0", "inquirer": "^8.2.5", - "mutex-server": "^0.3.1", "prisma": "^5.3.1", "prisma-markdown": "^1.0.8", "serialize-error": "^4.1.0", "source-map-support": "^0.5.19", "tstl": "^2.5.13", - "typia": "^5.3.11" + "typia": "^5.3.12", + "uuid": "^9.0.1" }, "files": [ "lib", diff --git a/packages/payment-backend/src/PaymentBackend.ts b/packages/payment-backend/src/PaymentBackend.ts index 6e72155..ee80c23 100644 --- a/packages/payment-backend/src/PaymentBackend.ts +++ b/packages/payment-backend/src/PaymentBackend.ts @@ -1,7 +1,6 @@ import { INestApplication } from "@nestjs/common"; import { NestFactory } from "@nestjs/core"; import { FastifyAdapter } from "@nestjs/platform-fastify"; -import express from "express"; import FakeIamport from "fake-iamport-server"; import FakeToss from "fake-toss-payments-server"; @@ -17,8 +16,6 @@ import PaymentAPI from "./api"; */ export class PaymentBackend { private application_?: INestApplication; - private is_closing_: boolean = false; - private fake_servers_: IFakeServer[] = []; /** @@ -42,12 +39,8 @@ export class PaymentBackend { }, ); - // CONFIGURATIONS - this.is_closing_ = false; - this.application_.enableCors(); - this.application_.use(this.middleware.bind(this)); - // DO OPEN + this.application_.enableCors(); await this.application_.listen(PaymentConfiguration.API_PORT(), "0.0.0.0"); // CONFIGURE FAKE SERVERS IF TESTING @@ -66,19 +59,6 @@ export class PaymentBackend { FakeIamport.FakeIamportConfiguration.WEBHOOK_URL = `${host}${PaymentAPI.functional.payments.webhooks.iamport.METADATA.path}`; FakeToss.FakeTossConfiguration.WEBHOOK_URL = `${host}${PaymentAPI.functional.payments.webhooks.toss.METADATA.path}`; } - - //---- - // POST-PROCESSES - //---- - // INFORM TO THE PM2 - if (process.send) process.send("ready"); - - // WHEN KILL COMMAND COMES - process.on("SIGINT", async () => { - this.is_closing_ = true; - await this.close(); - process.exit(0); - }); } /** @@ -91,31 +71,15 @@ export class PaymentBackend { await this.application_.close(); delete this.application_; - // EXIT FROM THE CRITICAL-SERVER - if ((await PaymentGlobal.critical.is_loaded()) === true) { - const critical = await PaymentGlobal.critical.get(); - await critical.close(); - } - // CLOSE FAKE SERVERS for (const server of this.fake_servers_) { await server.close(); } this.fake_servers_ = []; } - - private middleware( - _request: express.Request, - response: express.Response, - next: FunctionLike, - ): void { - if (this.is_closing_ === true) response.set("Connection", "close"); - next(); - } } interface IFakeServer { open(): Promise; close(): Promise; } -type FunctionLike = (...args: any) => any; diff --git a/packages/payment-backend/src/PaymentGlobal.ts b/packages/payment-backend/src/PaymentGlobal.ts index 7a5a647..3fede7e 100644 --- a/packages/payment-backend/src/PaymentGlobal.ts +++ b/packages/payment-backend/src/PaymentGlobal.ts @@ -1,12 +1,9 @@ import { PrismaClient } from "@prisma/client"; import dotenv from "dotenv"; import dotenvExpand from "dotenv-expand"; -import { MutexConnector } from "mutex-server"; -import { MutableSingleton, Singleton } from "tstl"; +import { Singleton } from "tstl"; import typia from "typia"; -import { PaymentConfiguration } from "./PaymentConfiguration"; - /** * 통합 결제 서버의 전역 변수들 모음. * @@ -38,19 +35,6 @@ export class PaymentGlobal { public static get prisma(): PrismaClient { return prismaClient.get(); } - - public static readonly critical: MutableSingleton< - MutexConnector - > = new MutableSingleton(async () => { - const connector: MutexConnector = new MutexConnector( - PaymentConfiguration.SYSTEM_PASSWORD(), - null, - ); - await connector.connect( - `ws://${PaymentConfiguration.MASTER_IP()}:${PaymentConfiguration.UPDATOR_PORT()}/api`, - ); - return connector; - }); } export namespace PaymentGlobal { /** diff --git a/packages/payment-backend/src/PaymentUpdator.ts b/packages/payment-backend/src/PaymentUpdator.ts deleted file mode 100644 index af2aab6..0000000 --- a/packages/payment-backend/src/PaymentUpdator.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { MutexAcceptor, MutexConnector, MutexServer } from "mutex-server"; -import { HashSet } from "tstl/container/HashSet"; - -import { PaymentConfiguration } from "./PaymentConfiguration"; -import { Terminal } from "./utils/Terminal"; - -/** - * 업데이트 리스너. - * - * @author Samchon - */ -export namespace PaymentUpdator { - export interface IController { - update(): Promise; - } - - /** - * 마스터 인스턴스에서의 업데이트 리스터 실행. - * - * @returns 뮤텍스 서버 인스턴스 - */ - export async function master(): Promise< - MutexServer - > { - // PREPARE ASSETS - const server: MutexServer = new MutexServer(); - const clientSet: HashSet> = new HashSet(); - const provider: IController = { - update: async () => { - const clientList: MutexAcceptor[] = [...clientSet]; - const tasks: Promise[] = clientList.map(async (client) => { - try { - await client.getDriver().update(); - } catch {} - }); - await Promise.all(tasks); - }, - }; - - // OPEN SERVER - await server.open(PaymentConfiguration.UPDATOR_PORT(), async (acceptor) => { - if (acceptor.header !== PaymentConfiguration.SYSTEM_PASSWORD()) { - await acceptor.reject(); - return; - } else if (acceptor.path === "/slave") { - await acceptor.accept(null); - - clientSet.insert(acceptor); - acceptor - .join() - .then(() => clientSet.erase(acceptor)) - .catch(() => {}); - } else if (acceptor.path === "/api") await acceptor.accept(null); - else if (acceptor.path === "/update") await acceptor.accept(provider); - }); - return server; - } - - /** - * 슬레이브 인스턴스에서의 업데이트 리스터 실행. - * - * @param 업데이트 리스너 마스터 서버의 host 주소, 생략시 기본값 사용 - * @returns 뮤텍스 커넥터 인스턴스 - */ - export async function slave( - host?: string, - ): Promise> { - const connector: MutexConnector = new MutexConnector( - PaymentConfiguration.SYSTEM_PASSWORD(), - Controller, - ); - await connector.connect( - `ws://${ - host ?? PaymentConfiguration.MASTER_IP() - }:${PaymentConfiguration.UPDATOR_PORT()}/slave`, - ); - return connector; - } - - /** - * @internal - */ - namespace Controller { - export async function update(): Promise { - // REFRESH REPOSITORY - await Terminal.execute("git pull"); - await Terminal.execute("npm install"); - await Terminal.execute("npm run build"); - - // RELOAD PM2 - await Terminal.execute("npm run start:reload"); - } - } -} diff --git a/packages/payment-backend/src/executable/master.ts b/packages/payment-backend/src/executable/master.ts deleted file mode 100644 index 6e34076..0000000 --- a/packages/payment-backend/src/executable/master.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PaymentUpdator } from "../PaymentUpdator"; - -async function main(): Promise { - await PaymentUpdator.master(); -} -main().catch((exp) => { - console.error(exp); - process.exit(-1); -}); diff --git a/packages/payment-backend/src/executable/update.ts b/packages/payment-backend/src/executable/update.ts deleted file mode 100644 index 5849944..0000000 --- a/packages/payment-backend/src/executable/update.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { MutexConnector, RemoteMutex } from "mutex-server"; -import { Promisive } from "tgrid/typings/Promisive"; -import { UniqueLock } from "tstl/thread/UniqueLock"; - -import { PaymentConfiguration } from "../PaymentConfiguration"; -import { PaymentGlobal } from "../PaymentGlobal"; -import { PaymentUpdator } from "../PaymentUpdator"; -import api from "../api"; -import { ISystem } from "../api/structures/monitors/ISystem"; - -async function main(): Promise { - // CONFIGURE MODE - if (process.argv[2]) - PaymentGlobal.setMode( - process.argv[2].toUpperCase() as typeof PaymentGlobal.mode, - ); - - // CONNECT TO THE UPDATOR SERVER - const connector: MutexConnector = new MutexConnector( - PaymentConfiguration.SYSTEM_PASSWORD(), - null, - ); - await connector.connect( - `ws://${PaymentConfiguration.MASTER_IP()}:${PaymentConfiguration.UPDATOR_PORT()}/update`, - ); - - // REQUEST UPDATE WITH MONOPOLYING A GLOBAL MUTEX - const mutex: RemoteMutex = await connector.getMutex("update"); - const success: boolean = await UniqueLock.try_lock(mutex, async () => { - const updator: Promisive = - connector.getDriver(); - await updator.update(); - }); - await connector.close(); - - // SUCCESS OR NOT - if (success === false) { - console.log("Already on updating."); - process.exit(-1); - } - - // PRINT THE COMMIT STATUS - const connection: api.IConnection = { - host: `http://${PaymentConfiguration.MASTER_IP()}:${PaymentConfiguration.API_PORT()}`, - encryption: PaymentConfiguration.ENCRYPTION_PASSWORD(), - }; - const system: ISystem = await api.functional.monitors.system.get(connection); - console.log("branch", system.arguments[2], system.commit.branch); - console.log("hash", system.commit.hash); - console.log("commit-time", system.commit.commited_at); -} -main().catch((exp) => { - console.log(exp); - process.exit(-1); -}); diff --git a/packages/payment-backend/src/executable/updator-master.ts b/packages/payment-backend/src/executable/updator-master.ts deleted file mode 100644 index 37fe3f1..0000000 --- a/packages/payment-backend/src/executable/updator-master.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PaymentUpdator } from "../PaymentUpdator"; - -async function main(): Promise { - await PaymentUpdator.master(); - await PaymentUpdator.slave("127.0.0.1"); -} -main().catch((exp) => { - console.log(exp); - process.exit(-1); -}); diff --git a/packages/payment-backend/src/executable/updator-slave.ts b/packages/payment-backend/src/executable/updator-slave.ts deleted file mode 100644 index 5042204..0000000 --- a/packages/payment-backend/src/executable/updator-slave.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PaymentUpdator } from "../PaymentUpdator"; - -async function main(): Promise { - await PaymentUpdator.slave(); -} -main().catch((exp) => { - console.error(exp); - process.exit(-1); -}); diff --git a/packages/payment-backend/src/module.ts b/packages/payment-backend/src/module.ts index 5341a4e..11ffa8c 100644 --- a/packages/payment-backend/src/module.ts +++ b/packages/payment-backend/src/module.ts @@ -3,4 +3,3 @@ export * from "./PaymentBackend"; export * from "./PaymentConfiguration"; export * from "./PaymentGlobal"; export * from "./PaymentSetupWizard"; -export * from "./PaymentUpdator"; diff --git a/packages/payment-backend/test/index.ts b/packages/payment-backend/test/index.ts index f41cebf..ed6d22d 100644 --- a/packages/payment-backend/test/index.ts +++ b/packages/payment-backend/test/index.ts @@ -9,7 +9,6 @@ import { PaymentConfiguration, PaymentGlobal, PaymentSetupWizard, - PaymentUpdator, } from "../src"; import { ArgumentParser } from "../src/utils/ArgumentParser"; import { ErrorUtil } from "../src/utils/ErrorUtil"; @@ -76,7 +75,6 @@ async function main(): Promise { } // OPEN SERVER - const updator = await PaymentUpdator.master(); const backend: PaymentBackend = new PaymentBackend(); await backend.open(); @@ -106,7 +104,6 @@ async function main(): Promise { // TERMINATE await sleep_for(2500); // WAIT FOR BACKGROUND EVENTS await backend.close(); - await updator.close(); const exceptions: Error[] = report.executions .filter((exec) => exec.error !== null) diff --git a/packages/toss-payments-server-api/package.json b/packages/toss-payments-server-api/package.json index 1416f35..c453dfd 100644 --- a/packages/toss-payments-server-api/package.json +++ b/packages/toss-payments-server-api/package.json @@ -1,6 +1,6 @@ { "name": "toss-payments-server-api", - "version": "6.0.1", + "version": "6.0.2", "description": "API for Toss Payments Server", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -35,6 +35,6 @@ }, "dependencies": { "@nestia/fetcher": "^2.4.5", - "typia": "^5.3.11" + "typia": "^5.3.12" } } \ No newline at end of file diff --git a/packages/toss-payments-server-api/swagger.json b/packages/toss-payments-server-api/swagger.json index 18ea07f..dbb2ff8 100644 --- a/packages/toss-payments-server-api/swagger.json +++ b/packages/toss-payments-server-api/swagger.json @@ -1 +1 @@ -{"openapi":"3.0.1","servers":[{"url":"http://localhost:30771","description":"fake"},{"url":"https://api.tosspayments.com","description":"real"}],"info":{"title":"Toss Payments API","description":"Built by [fake-toss-payments-server](https://github.com/samchon/payments/tree/master/packages/toss-payments-server-api) with [nestia](https://github.com/samchon/nestia)","version":"6.0.1","license":{"name":"MIT"}},"paths":{"/v1/billing/authorizations/card":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"간편 결제 카드 등록 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.ICreate"}}},"required":true},"responses":{"201":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling"}}}}},"summary":"간편 결제 카드 등록하기","description":"간편 결제 카드 등록하기.\n\n`billing.authorizations.card.create` 는 고객이 자신의 신록 카드를 서버에 등록해두고,\n매번 결제가 필요할 때마다 카드 정보를 반복 입력하는 일 없이 간편하게 결제를\n진행하고자 할 때, 호출되는 API 함수이다.\n\n참고로 `billing.authorizations.card.create` 는 클라이언트 어플리케이션이 토스\n페이먼츠가 제공하는 간편 결제 카드 등록 창을 사용하는 경우, 귀하의 백엔드 서버가 이를\n실 서비스에서 호출하는 일은 없을 것이다. 다만, 고객이 간편 결제 카드를 등록하는\n상황을 시뮬레이션하기 위하여, 테스트 자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"basic":[]}]}},"/v1/billing/authorizations/{billingKey}":{"post":{"tags":[],"parameters":[{"name":"billingKey","in":"path","schema":{"type":"string"},"description":"대상 정보의 ","required":true}],"requestBody":{"description":"고객 식별자 키","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.ICustomerKey"}}},"required":true},"responses":{"201":{"description":"간편 결제 수단 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling"}}}}},"summary":"간편 결제로 등록한 수단 조회하기","description":"간편 결제로 등록한 수단 조회하기.\n\n`billing.authorizations.at` 은 고객이 간편 결제를 위하여 토스 페이먼츠 서버에\n등록한 결제 수단을 조회하는 함수이다.\n\n주로 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로 제공하는 결제 창을 사용하는\n경우, 그래서 프론트 어플리케이션이 귀하의 백엔드 서버에 `billingKey` 와` customerKey`\n만을 전달해주어, 상세 간편 결제 수단 정보가 필요할 때 사용한다.","security":[{"basic":[]}]}},"/v1/billing/{billingKey}":{"post":{"tags":[],"parameters":[{"name":"billingKey","in":"path","schema":{"type":"string"},"description":"간편 결제에 등록한 수단의 ","required":true}],"requestBody":{"description":"주문 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.IPaymentStore"}}},"required":true},"responses":{"201":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"간편 결제에 등록한 수단으로 결제하기","description":"간편 결제에 등록한 수단으로 결제하기.\n\n`billing.pay` 는 간편 결제에 등록한 수단으로 결제를 진행하고자 할 때 호출하는 API\n함수이다.\n\n그리고 `billing.pay` 는 결제 수단 중 유일하게, 클라이언트 어플리케이션이 토스\n페이먼츠가 제공하는 결제 창을 사용할 수 없어, 귀하의 백엔드 서버가 토스 페이먼츠의\nAPI 함수를 직접 호출해야 하는 경우에 해당한다. 따라서 간편 결제에 관련하여 토스\n페이먼츠와 연동하는 백엔드 서버 및 프론트 어플리케이션을 개발할 때, 반드시 이 상황에\n대한 별도의 설계 및 개발이 필요하니, 이 점을 염두에 두기 바란다.\n\n더하여 `billing.pay` 는 철저히 귀사 백엔드 서버의 판단 아래 호출되는 API 함수인지라,\n이를 통하여 이루어지는 결제는 일절 {@link payments.approve } 가 필요 없다. 다만\n`billing.pay` 는 이처럼 부차적인 승인 과정 필요없이 그 즉시로 결제가 완성되니, 이를\n호출하는 상황에 대하여 세심히 주의를 기울일 필요가 있다","security":[{"basic":[]}]}},"/v1/cash-receipts":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt.ICreate"}}},"required":true},"responses":{"201":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt"}}}}},"summary":"현금 영수증 발행하기","description":"현금 영수증 발행하기.","security":[{"basic":[]}]}},"/v1/cash-receipts/{receiptKey}/cancel":{"post":{"tags":[],"parameters":[{"name":"receiptKey","in":"path","schema":{"type":"string"},"description":"현금 영수증의 ","required":true}],"requestBody":{"description":"취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt.ICancel"}}},"required":true},"responses":{"201":{"description":"취소된 현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt"}}}}},"summary":"현금 영수증 취소하기","description":"현금 영수증 취소하기.","security":[{"basic":[]}]}},"/internal/webhook":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"웹훅 이벤트 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPaymentWebhook"}}},"required":true},"responses":{"201":{"description":""}},"summary":"웹훅 이벤트 더미 리스너","description":"웹훅 이벤트 더미 리스너.\n\n`internal.webhook` 은 실제 토스 페이먼츠의 결제 서버에는 존재하지 않는 API 로써,\n`fake-toss-payments-server` 의 {@link Configuration.WEBHOOK_URL } 에 아무런 URL 을\n설정하지 않으면, `fake-toss-payments-server` 로부터 발생하는 모든 종류의 웹훅\n이벤트는 이 곳으로 전달되어 무의미하게 사라진다.\n\n따라서 `fake-toss-payments-server` 를 사용하여 토스 페이먼츠 서버와의 연동을 미리\n검증코자 할 때는, 반드시 {@link Configuration.WEBHOOK_URL } 를 설정하여 웹훅\n이벤트가 귀하의 백엔드 서버로 제대로 전달되도록 하자."}},"/internal/{paymentKey}/deposit":{"put":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"대상 가상 계좌 결제 정보의 ","required":true}],"responses":{"201":{"description":"입금 완료된 가상 꼐좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"가상 계좌에 입금하기","description":"가상 계좌에 입금하기.\n\n`internal.virtual_accounts.deposit` 은 실제 토스 페이먼츠의 결제 서버에는 존재하지\n않는 API 로써, 가상 계좌 결제를 신청한 고객이, 이후 가상 계좌에 목표 금액을 입금하는\n상황을 시뮬레이션할 수 있는 함수이다.\n\n즉 `internal.virtual_accounts.deposit` 는 고객이 스스로에게 가상으로 발급된 계좌에\n입금을 하고, 그에 따라 토스 페이먼츠 서버에서 webhook 이벤트가 발생하여 이를 귀하의\n백엔드 서버로 전송하는 일련의 상황을 테스트하기 위한 함수인 셈이다.","security":[{"basic":[]}]}},"/v1/payments/{paymentKey}":{"get":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"결제 정보의 ","required":true}],"responses":{"200":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 정보 조회하기","description":"결제 정보 조회하기.\n\n`payments.at` 은 결제 정보를 조회하는 함수이다.\n\n주로 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로 제공하는 결제 창을 사용하는\n경우, 그래서 프론트 어플리케이션이 귀하의 백엔드 서버에 `paymentKey` 등 극히 일부의\n식별자 정보만을 전달해주어, 상세 결제 정보가 필요할 때 사용한다.\n\n참고로 토스 페이먼츠는 다른 결제 PG 사들과 다르게, 클라이언트 어플리케이션에서 토스\n페이먼츠의 결제 창을 이용하여 진행한 결제가 바로 확정되는 것은 아니다. 귀사의 백엔드\n서버가 현재의 `payments.at` 을 통하여 해당 결제 정보를 확인하고, {@link approve } 를\n호출하여 직접 승인하기 전까지, 해당 결제는 확정되지 않으니, 이 점에 유의하기 바란다."},"post":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"대상 결제의 ","required":true}],"requestBody":{"description":"주문 정보 확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment.IApproval"}}},"required":true},"responses":{"201":{"description":"승인된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 승인하기","description":"결제 승인하기.\n\n토스 페이먼츠는 귀사의 백엔드에서 일어난 결제가 아닌 프론트 어플리케이션의 결제 창에서\n이루어진 결제의 경우, 해당 서비스으 백엔드 서버로부터 결제를 승인받기 전까지, 이를\n확정하지 않는다. `payments.approve` 는 바로 이러한 상황에서, 해당 결제를 승인해주는\n함수이다.\n\n만일 귀하가 `fake-toss-payments-server` 를 이용하여 결제를 시뮬레이션하는 경우라면,\n결제 관련 API 를 호출함에 있어 {@link ITossCardPayment.ICreate.__approved } 내지\n{@link ITossVirtualAccountPayment.ICreate.__approved } 를 `false` 로 함으로써, 별도\n승인이 필요한 이러한 상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}},"/v1/payments/key-in":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"카드 결제 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCardPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCardPayment"}}}}},"summary":"카드로 결제하기","description":"카드로 결제하기.\n\n`payments.key_in` 은 카드를 이용한 결제를 할 때 호출되는 API 함수이다.\n\n참고로 `payments.key_in` 는 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로\n제공하는 결제 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는\n일은 없을 것이다. 다만, 고객이 카드를 통하여 결제하는 상황을 시뮬레이션하기 위하여,\n테스트 자동화 프로그램 수준에서 사용될 수는 있다.\n\n그리고 귀하의 백엔드 서버가 `payments.key-in` 을 직접 호출하는 경우, 토스 페이먼츠\n서버는 이를 완전히 승인된 결제로 보고 바로 확정한다. 때문에 `payments.key-in` 을\n직접 호출하는 경우, 토스 페이먼츠의 결제 창을 이용하여 별도의 {@link approve } 가\n필요한 때 대비, 훨씬 더 세심한 주의가 요구된다.\n\n더하여 만약 귀하의 백엔드 서버가 `fake-toss-payments-server` 를 이용하여 고객의\n카드 결제를 시뮬레이션하는 경우, {@link ITossCardPayment.ICreate.__approved } 값을\n`false` 로 하여 카드 결제의 확정을 고의로 회피할 수 있다. 이를 통하여 토스\n페이먼츠의 결제 창을 이용한 카드 결제의 경우, 별도의 {@link approve } 가 필요한\n상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}},"/v1/payments/{paymentKey}/cancel":{"post":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"결제 정보의 ","required":true}],"requestBody":{"description":"취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPaymentCancel.ICreate"}}},"required":true},"responses":{"201":{"description":"취소된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 취소하기","description":"결제 취소하기.\n\n`payments.cancel` 은 결제를 취소하는 API 이다.\n\n결제 취소 입력 정보 {@link ITossPaymentCancel.ICreate } 에는 취소 사유를 비롯하여,\n고객에게 환불해 줄 금액과 부가세 및 필요시 환불 계좌 정보 등을 입력하게 되어있다.","security":[{"basic":[]}]}},"/v1/virtual-accounts":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"가상 결제 신청 정보.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}}}}},"summary":"가상 계좌로 결제 신청하기","description":"가상 계좌로 결제 신청하기.\n\n`virtual_accounts.create` 는 고객이 결제 수단을 가상 계좌로 선택하는 경우에 호출되는\nAPI 함수이다. 물론 고객이 이처럼 가상 계좌를 선택한 경우, 고객이 지정된 계좌에 돈을\n입금하기 전까지는 결제가 마무리된 것이 아니기에, {@link ITossPayment.status } 값은\n`WAITING_FOR_DEPOSIT` 이 된다.\n\n참고로 `virtual_accounts.create` 는 클라이언트 어플리케이션이 토스 페이먼츠가\n자체적으로 제공하는 결제 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서\n호출하는 일은 없을 것이다. 다만, 고객이 가상 계좌로 결제를 진행하는 상황을\n시뮬레이션하기 위하여, 테스트 자동화 프로그램 수준에서 사용될 수는 있다.\n\n그리고 `virtual_accounts.create` 이후에 고객이 지정된 계좌에 금액을 입금하거든, 토스\n페이먼츠 서버로부터 웹훅 이벤트가 발생되어 귀하의 백엔드 서버로 전송된다. 만약 연동\n대상 토스 페이먼츠 서버가 실제가 아닌 `fake-toss-payments-server` 라면,\n{@link internal.virtual_accounts.deposit } 를 호출하여, 고객이 가상 계좌에 입금하는\n상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}}},"components":{"schemas":{"ITossBilling.ICreate":{"type":"object","properties":{"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"cardExpirationYear":{"type":"string","pattern":"\\d{2}","description":"카드 만료 년도 (2 자리)."},"cardExpirationMonth":{"type":"string","pattern":"^(0[1-9]|1[012])$","description":"카드 만료 월 (2 자리)."},"cardPassword":{"type":"string","description":"카드 비밀번호."},"customerBirthday":{"type":"string","pattern":"^([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"고객의 생년월일.\n\n표기 형식 YYMMDD."},"consumerName":{"type":"string","description":"고객의 이름."},"customerEmail":{"type":"string","format":"email","description":"고객의 이메일."},"vbv":{"type":"object","properties":{"cavv":{"type":"string","description":"3D Secure 인증 세션에 대한 인증 값."},"xid":{"type":"string","description":"트랜잭션 ID."},"eci":{"type":"string","description":"3DS 인증 결과에 대한 코드 값."}},"nullable":false,"required":["cavv","xid","eci"],"description":"해외카드로 결제하는 경우 3DS 인증 적용을 위해 사용.\n\n3DS 인증 결과를 전송해야 하는 경우에만 필수."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["cardNumber","cardExpirationYear","cardExpirationMonth","cardPassword","customerBirthday","customerKey"],"description":"간편 결제 카드 등록 정보."},"ITossBilling":{"type":"object","properties":{"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"billingKey":{"type":"string","description":"{@link ITossBilling } 의 식별자 키."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"cardCompany":{"type":"string","description":"카드사 이름."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"authenticatedAt":{"type":"string","format":"date-time","description":"인증 일시."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["mId","billingKey","method","cardCompany","cardNumber","authenticatedAt","customerKey"],"description":"간편 결제 등록 수단 정보.\n\n`ITossBilling` 은 간편 결제 등록 수단을 형상화한 자료구조 인터페이스로써, 고객이 자신의\n신용 카드를 서버에 등록해두고, 매번 결제가 필요할 때마다 카드 정보를 반복 입려하는 일\n없이 간편하게 결제를 진행하고자 할 때 사용한다."},"ITossBilling.ICustomerKey":{"type":"object","properties":{"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["customerKey"],"description":"고객 식별자 정보."},"ITossBilling.IPaymentStore":{"type":"object","properties":{"method":{"type":"string","enum":["billing"],"description":"결제 수단이 간편 결제임을 의미함."},"billingKey":{"type":"string","description":"{@link IPaymentStore } 의 식별자 키."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["method","billingKey","orderId","amount","customerKey"],"description":"간편 결제를 이용한 결제 신청 정보."},"ITossPayment":{"oneOf":[{"$ref":"#/components/schemas/ITossCardPayment"},{"$ref":"#/components/schemas/ITossGiftCertificatePayment"},{"$ref":"#/components/schemas/ITossMobilePhonePayment"},{"$ref":"#/components/schemas/ITossTransferPayment"},{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}],"description":"결제 정보.\n\n`ITossPayment` 는 토스 페이먼츠의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.method === \"카드\")\n payment.card; // payment be ITossCardPayment\n```"},"ITossCardPayment":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/ITossCardPayment.ICard","description":"카드 정보."},"discount":{"$ref":"#/components/schemas/ITossCardPayment.IDiscount.Nullable","description":"카드사의 즉시 할인 프로모션 정보."},"easyPay":{"type":"string","enum":["토스결제","페이코","삼성페이"],"nullable":true,"description":"간편결제로 결제한 경우 간편결제 타입 정보."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL","BILLING"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["card","discount","easyPay","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"카드 결제 정보."},"ITossCardPayment.ICard":{"type":"object","properties":{"company":{"type":"string","description":"카드사 이름."},"number":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"installmentPlanMonths":{"type":"number","description":"할부 개월 수."},"isInterestFree":{"type":"boolean","description":"무이자 할부 적용 여부."},"approveNo":{"type":"string","description":"승인 번호."},"useCardPoint":{"type":"boolean","enum":[false],"description":"카드 포인트 사용 여부."},"cardType":{"type":"string","enum":["신용","체크","기프트"],"description":"카드 타입."},"ownerType":{"type":"string","enum":["개인","법인"],"description":"카드의 소유자 타입."},"acquireStatus":{"type":"string","enum":["READY","CANCELED","REQUESTED","COMPLETED","CANCEL_REQUESTED"],"description":"카드 결제의 매입 상태.\n\n - READY: 매입 대기\n - REQUESTED: 매입 요청됨\n - COMPLETED: 매입 완료\n - CANCEL_REQUESTED: 매입 취소 요청됨\n - CANCELD: 매입 취소됨"},"receiptUrl":{"type":"string","format":"url","description":"영수증 URL."}},"nullable":false,"required":["company","number","installmentPlanMonths","isInterestFree","approveNo","useCardPoint","cardType","ownerType","acquireStatus","receiptUrl"],"description":"카드 정보."},"ITossCardPayment.IDiscount.Nullable":{"type":"object","properties":{"amount":{"type":"number","description":"카드사의 즉시 할인 프로모션을 적용한 금액."}},"nullable":true,"required":["amount"],"description":"카드사의 즉시 할인 프로모션 정보."},"ITossPaymentCancel":{"type":"object","properties":{"cancelAmount":{"type":"number","description":"취소 총액."},"cancelReason":{"type":"string","description":"취소 사유."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"taxAmount":{"type":"number","description":"과세 처리된 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."},"canceledAt":{"type":"string","format":"date-time","description":"취소 일시."}},"nullable":false,"required":["cancelAmount","cancelReason","taxFreeAmount","taxAmount","refundableAmount","canceledAt"],"description":"결제 취소 정보."},"ITossCashReceipt.ISummary.Nullable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"amount":{"type":"number","description":"현금 영수증 처리된 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"issueNumber":{"type":"string","description":"현금영수증 발급번호."},"receiptUrl":{"type":"string","description":"현금영수증 조회 페이지 주소."}},"nullable":true,"required":["type","amount","taxFreeAmount","issueNumber","receiptUrl"],"description":"현금 영수증 요약 정보."},"ITossCashReceipt.Type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"ITossGiftCertificatePayment":{"type":"object","properties":{"giftCertificate":{"$ref":"#/components/schemas/ITossGiftCertificatePayment.IGiftCertificate","description":"상품권 정보."},"method":{"type":"string","enum":["상품권"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["giftCertificate","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"상품권 결제 정보."},"ITossGiftCertificatePayment.IGiftCertificate":{"type":"object","properties":{"approveNo":{"type":"string","description":"승인 번호."},"settlementStatus":{"type":"string","enum":["COMPLETE","INCOMPLETE"],"description":"정산 상태."}},"nullable":false,"required":["approveNo","settlementStatus"],"description":"상품권 정보."},"ITossMobilePhonePayment":{"type":"object","properties":{"mobilePhone":{"$ref":"#/components/schemas/ITossMobilePhonePayment.IMobilePhone","description":"휴대폰 정보."},"method":{"type":"string","enum":["휴대폰"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["mobilePhone","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"휴대폰 결제 정보."},"ITossMobilePhonePayment.IMobilePhone":{"type":"object","properties":{"carrier":{"type":"string","description":"통신사."},"customerMobilePhone":{"type":"string","description":"고객 휴대폰 번호."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."}},"nullable":false,"required":["carrier","customerMobilePhone","settlementStatus"],"description":"휴대폰 정보."},"ITossTransferPayment":{"type":"object","properties":{"transfer":{"$ref":"#/components/schemas/ITossTransferPayment.ITransfer","description":"계좌 이체 정보."},"method":{"type":"string","enum":["계좌이체"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["transfer","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"계좌 이체 결제 정보."},"ITossTransferPayment.ITransfer":{"type":"object","properties":{"bank":{"type":"string","description":"은행명."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"이체 상태."}},"nullable":false,"required":["bank","settlementStatus"],"description":"계좌 이체 정보."},"ITossVirtualAccountPayment":{"type":"object","properties":{"secret":{"type":"string","description":"가상 계좌로 결제할 때 전달되는 입금 콜백을 검증하기 위한 값."},"virtualAccount":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.IVirtualAccount","description":"가상 계좌 정보."},"method":{"type":"string","enum":["가상계좌"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["secret","virtualAccount","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"가상 계좌 결제 정보."},"ITossVirtualAccountPayment.IVirtualAccount":{"type":"object","properties":{"accountNumber":{"type":"string","description":"계좌 번호."},"accountType":{"type":"string","enum":["일반","고정"],"description":"가상 계좌 타입."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"dueDate":{"type":"string","format":"date","description":"입금 기한."},"expired":{"type":"boolean","description":"가상 계좌 만료 여부."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."},"refundStatus":{"type":"string","enum":["COMPLETED","NONE","FAILED","PENDING","PARTIAL_FAILED"],"description":"환불 처리 상태.\n\n - NONE: 해당 없음\n - FAILED: 환불 실패\n - PENDING: 환불 처리중\n - PARTIAL_FAILED: 부분 환불 실패\n - COMPLETED: 환불 완료"}},"nullable":false,"required":["accountNumber","accountType","bank","customerName","dueDate","expired","settlementStatus","refundStatus"],"description":"가상 계좌 정보."},"ITossCashReceipt.ICreate":{"type":"object","properties":{"type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"paymentKey":{"type":"string","description":"귀속 결제의 {@link ITossPayment.paymentKey }."},"orderId":{"type":"string","description":"주문의 식별자 ID."},"orderName":{"type":"string","description":"주문 이름."},"registrationNumber":{"type":"string","description":"현금 영수증 발급을 위한 개인 식별 번호.\n\n현금 영수증의 종류에 따라 휴대폰 번호나 주민등록번호 또는 사업자등록번호 및\n카드 번호를 입력할 수 있다."},"amount":{"type":"number","description":"현금 영수증을 발행할 금액."},"taxFreeAmount":{"type":"number","description":"면세 금액."},"businessNumber":{"type":"string","description":"사업자 등록번호."}},"nullable":false,"required":["type","paymentKey","orderId","orderName","registrationNumber","amount"],"description":"현금 영수증 입력 정보."},"ITossCashReceipt":{"type":"object","properties":{"receiptKey":{"type":"string","description":"현금 영수증의 식별자 키."},"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"orderId":{"type":"string","description":"주문의 식별자 ID."},"orderName":{"type":"string","description":"주문 이름."},"approvalNumber":{"type":"string","description":"현금 영수증 승인 번호."},"approvedAt":{"type":"string","format":"date-time","description":"현금 영수증 승인 일시."},"canceledAt":{"type":"string","format":"date-time","nullable":true,"description":"현금 영수증 취소 일시."},"receiptUrl":{"type":"string","description":"영수증 URL."}},"nullable":false,"required":["receiptKey","type","orderId","orderName","approvalNumber","approvedAt","canceledAt","receiptUrl"],"description":"현금 영수증 정보."},"ITossCashReceipt.ICancel":{"type":"object","properties":{"amount":{"type":"number","description":"취소 금액.\n\n미 입력시 현금 영수증에 기재된 {@link ITossCashReceipt.amount 총액}이 취소됨."}},"nullable":false,"description":"현금 영수증 취소 입력 정보."},"ITossPaymentWebhook":{"type":"object","properties":{"eventType":{"type":"string","enum":["PAYMENT_STATUS_CHANGED"],"description":"이벤트 타입."},"data":{"$ref":"#/components/schemas/ITossPaymentWebhook.IData","description":"이벤트 데이터."}},"nullable":false,"required":["eventType","data"],"description":"웹훅 이벤트 정보."},"ITossPaymentWebhook.IData":{"type":"object","properties":{"paymentKey":{"type":"string","description":"{@link ITossPayment } 의 식별자 키."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"status":{"type":"string","enum":["WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED"],"description":"결제 상태.\n\n - DONE: 결제 완료\n - CANCELED: 결제가 취소됨\n - PARTIAL_CANCELED: 결제가 부분 취소됨\n - WAITING_FOR_DEPOSIT: 입금 대기 중"}},"nullable":false,"required":["paymentKey","orderId","status"],"description":"웹훅 이벤트 데이터."},"ITossCardPayment.ICreate":{"type":"object","properties":{"method":{"type":"string","enum":["card"],"description":"결제 수단이 신용 카드임을 의미."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"cardExpirationYear":{"type":"string","pattern":"\\d{2}","description":"카드 만료 년도 (2 자리)."},"cardExpirationMonth":{"type":"string","pattern":"^(0[1-9]|1[012])$","description":"카드 만료 월 (2 자리)."},"cardPassword":{"type":"string","description":"카드 비밀번호."},"cardInstallmentPlan":{"type":"number","description":"할부 개월 수."},"amount":{"type":"number","description":"지불 총액."},"taxFreeAmount":{"type":"number","description":"면세금 총액."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"customerBirthday":{"type":"string","pattern":"^([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"고객의 생년월일.\n\n표기 형식 YYMMDD."},"customerEmail":{"type":"string","format":"email","description":"고객의 이메일."},"vbv":{"type":"object","properties":{"cavv":{"type":"string","description":"3D Secure 인증 세션에 대한 인증 값."},"xid":{"type":"string","description":"트랜잭션 ID."},"eci":{"type":"string","description":"3DS 인증 결과에 대한 코드 값."}},"nullable":false,"required":["cavv","xid","eci"],"description":"해외카드로 결제하는 경우 3DS 인증 적용을 위해 사용.\n\n3DS 인증 결과를 전송해야 하는 경우에만 필수."},"__approved":{"type":"boolean","description":"결제 승인 여부.\n\n오직 가짜 페이먼츠 서버 `fake-toss-payments-server` 에서만 사용되는 값으로써,\n결제 승인을 고의로 지연시키거나 할 때 사용된다. 이 값을 `false` 로 하면, 프론트\n어플리케이션이 토스 페이먼츠가 제공해주는 결제 창을 사용하여 결제를 진행하는\n상황을 시뮬레이션할 수 있다.\n\n본디 토스 페이먼츠 서버는 프론트 어플리케이션에서 백엔드 서버를 거치지 않고,\n토스 페이먼츠가 제공해주는 결제 창을 이용하여 직접 결제를 요청하는 경우,\n백엔드에서 이를 별도 {@link functional.payments.approve 승인} 처리해주기 전까지\n정식 결제로 인청치 아니한다.\n\n반면 백엔드 서버에서 토스 페이먼츠 서버의 API 를 호출하는 경우, 토스 페이먼츠는\n이를 그 즉시로 승인해주기, `fake-toss-payments-server` 에서 별도의 승인 처리가\n필요한 상황을 시뮬레이션하기 위해서는 이러한 속성이 필요한 것."}},"nullable":false,"required":["method","cardNumber","cardExpirationYear","cardExpirationMonth","amount","orderId"],"description":"신용 카드를 이용한 결제 신청 정보."},"ITossPayment.IApproval":{"type":"object","properties":{"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."}},"nullable":false,"required":["orderId","amount"],"description":"결제 승인 정보."},"ITossPaymentCancel.ICreate":{"type":"object","properties":{"paymentKey":{"type":"string","description":"{@link ITossPayment } 의 식별자 키."},"cancelReason":{"type":"string","description":"취소 사유."},"cancelAmount":{"type":"number","description":"취소 총액."},"refundReceiveAccount":{"type":"object","properties":{"bank":{"type":"string","description":"은행 정보."},"accountNumber":{"type":"string","pattern":"^[0-9]{0,20}$","description":"계좌 번호."},"holderName":{"type":"string","description":"예금주."}},"nullable":false,"required":["bank","accountNumber","holderName"],"description":"환불 계좌 정보.\n\n결제를 가상 계좌로 하였을 때에만 해당함."},"taxAmount":{"type":"number","description":"과세 처리 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."}},"nullable":false,"required":["paymentKey","cancelReason"],"description":"결제 취소 신청 정보."},"ITossVirtualAccountPayment.ICreate":{"type":"object","properties":{"method":{"type":"string","enum":["virtual-account"],"description":"결제 수단이 가상 계좌임을 의미."},"orderId":{"type":"string","description":"주문 식별자 번호.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"amount":{"type":"number","description":"결제 총액."},"__approved":{"type":"boolean","description":"결제 승인 여부.\n\n오직 가짜 페이먼츠 서버 `fake-toss-payments-server` 에서만 사용되는 값으로써,\n결제 승인을 고의로 지연시키거나 할 때 사용된다. 이 값을 `false` 로 하면, 프론트\n어플리케이션이 토스 페이먼츠가 제공해주는 결제 창을 사용하여 결제를 진행하는\n상황을 시뮬레이션할 수 있다.\n\n본디 토스 페이먼츠 서버는 프론트 어플리케이션에서 백엔드 서버를 거치지 않고,\n토스 페이먼츠가 제공해주는 결제 창을 이용하여 직접 결제를 요청하는 경우,\n백엔드에서 이를 별도 {@link functional.payments.approve 승인} 처리해주기 전까지\n정식 결제로 인청치 아니한다.\n\n반면 백엔드 서버에서 토스 페이먼츠 서버의 API 를 호출하는 경우, 토스 페이먼츠는\n이를 그 즉시로 승인해주기, `fake-toss-payments-server` 에서 별도의 승인 처리가\n필요한 상황을 시뮬레이션하기 위해서는 이러한 속성이 필요한 것."}},"nullable":false,"required":["method","orderId","orderName","bank","customerName","amount"],"description":"가상 계좌를 이용한 결제 신청 정보."}},"securitySchemes":{"basic":{"type":"apiKey","name":"Authorization","in":"header"}}}} \ No newline at end of file +{"openapi":"3.0.1","servers":[{"url":"http://localhost:30771","description":"fake"},{"url":"https://api.tosspayments.com","description":"real"}],"info":{"title":"Toss Payments API","description":"Built by [fake-toss-payments-server](https://github.com/samchon/payments/tree/master/packages/toss-payments-server-api) with [nestia](https://github.com/samchon/nestia)","version":"6.0.2","license":{"name":"MIT"}},"paths":{"/v1/billing/authorizations/card":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"간편 결제 카드 등록 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.ICreate"}}},"required":true},"responses":{"201":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling"}}}}},"summary":"간편 결제 카드 등록하기","description":"간편 결제 카드 등록하기.\n\n`billing.authorizations.card.create` 는 고객이 자신의 신록 카드를 서버에 등록해두고,\n매번 결제가 필요할 때마다 카드 정보를 반복 입력하는 일 없이 간편하게 결제를\n진행하고자 할 때, 호출되는 API 함수이다.\n\n참고로 `billing.authorizations.card.create` 는 클라이언트 어플리케이션이 토스\n페이먼츠가 제공하는 간편 결제 카드 등록 창을 사용하는 경우, 귀하의 백엔드 서버가 이를\n실 서비스에서 호출하는 일은 없을 것이다. 다만, 고객이 간편 결제 카드를 등록하는\n상황을 시뮬레이션하기 위하여, 테스트 자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"basic":[]}]}},"/v1/billing/authorizations/{billingKey}":{"post":{"tags":[],"parameters":[{"name":"billingKey","in":"path","schema":{"type":"string"},"description":"대상 정보의 ","required":true}],"requestBody":{"description":"고객 식별자 키","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.ICustomerKey"}}},"required":true},"responses":{"201":{"description":"간편 결제 수단 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling"}}}}},"summary":"간편 결제로 등록한 수단 조회하기","description":"간편 결제로 등록한 수단 조회하기.\n\n`billing.authorizations.at` 은 고객이 간편 결제를 위하여 토스 페이먼츠 서버에\n등록한 결제 수단을 조회하는 함수이다.\n\n주로 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로 제공하는 결제 창을 사용하는\n경우, 그래서 프론트 어플리케이션이 귀하의 백엔드 서버에 `billingKey` 와` customerKey`\n만을 전달해주어, 상세 간편 결제 수단 정보가 필요할 때 사용한다.","security":[{"basic":[]}]}},"/v1/billing/{billingKey}":{"post":{"tags":[],"parameters":[{"name":"billingKey","in":"path","schema":{"type":"string"},"description":"간편 결제에 등록한 수단의 ","required":true}],"requestBody":{"description":"주문 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.IPaymentStore"}}},"required":true},"responses":{"201":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"간편 결제에 등록한 수단으로 결제하기","description":"간편 결제에 등록한 수단으로 결제하기.\n\n`billing.pay` 는 간편 결제에 등록한 수단으로 결제를 진행하고자 할 때 호출하는 API\n함수이다.\n\n그리고 `billing.pay` 는 결제 수단 중 유일하게, 클라이언트 어플리케이션이 토스\n페이먼츠가 제공하는 결제 창을 사용할 수 없어, 귀하의 백엔드 서버가 토스 페이먼츠의\nAPI 함수를 직접 호출해야 하는 경우에 해당한다. 따라서 간편 결제에 관련하여 토스\n페이먼츠와 연동하는 백엔드 서버 및 프론트 어플리케이션을 개발할 때, 반드시 이 상황에\n대한 별도의 설계 및 개발이 필요하니, 이 점을 염두에 두기 바란다.\n\n더하여 `billing.pay` 는 철저히 귀사 백엔드 서버의 판단 아래 호출되는 API 함수인지라,\n이를 통하여 이루어지는 결제는 일절 {@link payments.approve } 가 필요 없다. 다만\n`billing.pay` 는 이처럼 부차적인 승인 과정 필요없이 그 즉시로 결제가 완성되니, 이를\n호출하는 상황에 대하여 세심히 주의를 기울일 필요가 있다","security":[{"basic":[]}]}},"/v1/cash-receipts":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt.ICreate"}}},"required":true},"responses":{"201":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt"}}}}},"summary":"현금 영수증 발행하기","description":"현금 영수증 발행하기.","security":[{"basic":[]}]}},"/v1/cash-receipts/{receiptKey}/cancel":{"post":{"tags":[],"parameters":[{"name":"receiptKey","in":"path","schema":{"type":"string"},"description":"현금 영수증의 ","required":true}],"requestBody":{"description":"취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt.ICancel"}}},"required":true},"responses":{"201":{"description":"취소된 현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt"}}}}},"summary":"현금 영수증 취소하기","description":"현금 영수증 취소하기.","security":[{"basic":[]}]}},"/internal/webhook":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"웹훅 이벤트 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPaymentWebhook"}}},"required":true},"responses":{"201":{"description":""}},"summary":"웹훅 이벤트 더미 리스너","description":"웹훅 이벤트 더미 리스너.\n\n`internal.webhook` 은 실제 토스 페이먼츠의 결제 서버에는 존재하지 않는 API 로써,\n`fake-toss-payments-server` 의 {@link Configuration.WEBHOOK_URL } 에 아무런 URL 을\n설정하지 않으면, `fake-toss-payments-server` 로부터 발생하는 모든 종류의 웹훅\n이벤트는 이 곳으로 전달되어 무의미하게 사라진다.\n\n따라서 `fake-toss-payments-server` 를 사용하여 토스 페이먼츠 서버와의 연동을 미리\n검증코자 할 때는, 반드시 {@link Configuration.WEBHOOK_URL } 를 설정하여 웹훅\n이벤트가 귀하의 백엔드 서버로 제대로 전달되도록 하자."}},"/internal/{paymentKey}/deposit":{"put":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"대상 가상 계좌 결제 정보의 ","required":true}],"responses":{"201":{"description":"입금 완료된 가상 꼐좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"가상 계좌에 입금하기","description":"가상 계좌에 입금하기.\n\n`internal.virtual_accounts.deposit` 은 실제 토스 페이먼츠의 결제 서버에는 존재하지\n않는 API 로써, 가상 계좌 결제를 신청한 고객이, 이후 가상 계좌에 목표 금액을 입금하는\n상황을 시뮬레이션할 수 있는 함수이다.\n\n즉 `internal.virtual_accounts.deposit` 는 고객이 스스로에게 가상으로 발급된 계좌에\n입금을 하고, 그에 따라 토스 페이먼츠 서버에서 webhook 이벤트가 발생하여 이를 귀하의\n백엔드 서버로 전송하는 일련의 상황을 테스트하기 위한 함수인 셈이다.","security":[{"basic":[]}]}},"/v1/payments/{paymentKey}":{"get":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"결제 정보의 ","required":true}],"responses":{"200":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 정보 조회하기","description":"결제 정보 조회하기.\n\n`payments.at` 은 결제 정보를 조회하는 함수이다.\n\n주로 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로 제공하는 결제 창을 사용하는\n경우, 그래서 프론트 어플리케이션이 귀하의 백엔드 서버에 `paymentKey` 등 극히 일부의\n식별자 정보만을 전달해주어, 상세 결제 정보가 필요할 때 사용한다.\n\n참고로 토스 페이먼츠는 다른 결제 PG 사들과 다르게, 클라이언트 어플리케이션에서 토스\n페이먼츠의 결제 창을 이용하여 진행한 결제가 바로 확정되는 것은 아니다. 귀사의 백엔드\n서버가 현재의 `payments.at` 을 통하여 해당 결제 정보를 확인하고, {@link approve } 를\n호출하여 직접 승인하기 전까지, 해당 결제는 확정되지 않으니, 이 점에 유의하기 바란다."},"post":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"대상 결제의 ","required":true}],"requestBody":{"description":"주문 정보 확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment.IApproval"}}},"required":true},"responses":{"201":{"description":"승인된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 승인하기","description":"결제 승인하기.\n\n토스 페이먼츠는 귀사의 백엔드에서 일어난 결제가 아닌 프론트 어플리케이션의 결제 창에서\n이루어진 결제의 경우, 해당 서비스으 백엔드 서버로부터 결제를 승인받기 전까지, 이를\n확정하지 않는다. `payments.approve` 는 바로 이러한 상황에서, 해당 결제를 승인해주는\n함수이다.\n\n만일 귀하가 `fake-toss-payments-server` 를 이용하여 결제를 시뮬레이션하는 경우라면,\n결제 관련 API 를 호출함에 있어 {@link ITossCardPayment.ICreate.__approved } 내지\n{@link ITossVirtualAccountPayment.ICreate.__approved } 를 `false` 로 함으로써, 별도\n승인이 필요한 이러한 상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}},"/v1/payments/key-in":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"카드 결제 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCardPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCardPayment"}}}}},"summary":"카드로 결제하기","description":"카드로 결제하기.\n\n`payments.key_in` 은 카드를 이용한 결제를 할 때 호출되는 API 함수이다.\n\n참고로 `payments.key_in` 는 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로\n제공하는 결제 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는\n일은 없을 것이다. 다만, 고객이 카드를 통하여 결제하는 상황을 시뮬레이션하기 위하여,\n테스트 자동화 프로그램 수준에서 사용될 수는 있다.\n\n그리고 귀하의 백엔드 서버가 `payments.key-in` 을 직접 호출하는 경우, 토스 페이먼츠\n서버는 이를 완전히 승인된 결제로 보고 바로 확정한다. 때문에 `payments.key-in` 을\n직접 호출하는 경우, 토스 페이먼츠의 결제 창을 이용하여 별도의 {@link approve } 가\n필요한 때 대비, 훨씬 더 세심한 주의가 요구된다.\n\n더하여 만약 귀하의 백엔드 서버가 `fake-toss-payments-server` 를 이용하여 고객의\n카드 결제를 시뮬레이션하는 경우, {@link ITossCardPayment.ICreate.__approved } 값을\n`false` 로 하여 카드 결제의 확정을 고의로 회피할 수 있다. 이를 통하여 토스\n페이먼츠의 결제 창을 이용한 카드 결제의 경우, 별도의 {@link approve } 가 필요한\n상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}},"/v1/payments/{paymentKey}/cancel":{"post":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"결제 정보의 ","required":true}],"requestBody":{"description":"취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPaymentCancel.ICreate"}}},"required":true},"responses":{"201":{"description":"취소된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 취소하기","description":"결제 취소하기.\n\n`payments.cancel` 은 결제를 취소하는 API 이다.\n\n결제 취소 입력 정보 {@link ITossPaymentCancel.ICreate } 에는 취소 사유를 비롯하여,\n고객에게 환불해 줄 금액과 부가세 및 필요시 환불 계좌 정보 등을 입력하게 되어있다.","security":[{"basic":[]}]}},"/v1/virtual-accounts":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"가상 결제 신청 정보.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}}}}},"summary":"가상 계좌로 결제 신청하기","description":"가상 계좌로 결제 신청하기.\n\n`virtual_accounts.create` 는 고객이 결제 수단을 가상 계좌로 선택하는 경우에 호출되는\nAPI 함수이다. 물론 고객이 이처럼 가상 계좌를 선택한 경우, 고객이 지정된 계좌에 돈을\n입금하기 전까지는 결제가 마무리된 것이 아니기에, {@link ITossPayment.status } 값은\n`WAITING_FOR_DEPOSIT` 이 된다.\n\n참고로 `virtual_accounts.create` 는 클라이언트 어플리케이션이 토스 페이먼츠가\n자체적으로 제공하는 결제 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서\n호출하는 일은 없을 것이다. 다만, 고객이 가상 계좌로 결제를 진행하는 상황을\n시뮬레이션하기 위하여, 테스트 자동화 프로그램 수준에서 사용될 수는 있다.\n\n그리고 `virtual_accounts.create` 이후에 고객이 지정된 계좌에 금액을 입금하거든, 토스\n페이먼츠 서버로부터 웹훅 이벤트가 발생되어 귀하의 백엔드 서버로 전송된다. 만약 연동\n대상 토스 페이먼츠 서버가 실제가 아닌 `fake-toss-payments-server` 라면,\n{@link internal.virtual_accounts.deposit } 를 호출하여, 고객이 가상 계좌에 입금하는\n상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}}},"components":{"schemas":{"ITossBilling.ICreate":{"type":"object","properties":{"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"cardExpirationYear":{"type":"string","pattern":"\\d{2}","description":"카드 만료 년도 (2 자리)."},"cardExpirationMonth":{"type":"string","pattern":"^(0[1-9]|1[012])$","description":"카드 만료 월 (2 자리)."},"cardPassword":{"type":"string","description":"카드 비밀번호."},"customerBirthday":{"type":"string","pattern":"^([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"고객의 생년월일.\n\n표기 형식 YYMMDD."},"consumerName":{"type":"string","description":"고객의 이름."},"customerEmail":{"type":"string","format":"email","description":"고객의 이메일."},"vbv":{"type":"object","properties":{"cavv":{"type":"string","description":"3D Secure 인증 세션에 대한 인증 값."},"xid":{"type":"string","description":"트랜잭션 ID."},"eci":{"type":"string","description":"3DS 인증 결과에 대한 코드 값."}},"nullable":false,"required":["cavv","xid","eci"],"description":"해외카드로 결제하는 경우 3DS 인증 적용을 위해 사용.\n\n3DS 인증 결과를 전송해야 하는 경우에만 필수."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["cardNumber","cardExpirationYear","cardExpirationMonth","cardPassword","customerBirthday","customerKey"],"description":"간편 결제 카드 등록 정보."},"ITossBilling":{"type":"object","properties":{"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"billingKey":{"type":"string","description":"{@link ITossBilling } 의 식별자 키."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"cardCompany":{"type":"string","description":"카드사 이름."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"authenticatedAt":{"type":"string","format":"date-time","description":"인증 일시."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["mId","billingKey","method","cardCompany","cardNumber","authenticatedAt","customerKey"],"description":"간편 결제 등록 수단 정보.\n\n`ITossBilling` 은 간편 결제 등록 수단을 형상화한 자료구조 인터페이스로써, 고객이 자신의\n신용 카드를 서버에 등록해두고, 매번 결제가 필요할 때마다 카드 정보를 반복 입려하는 일\n없이 간편하게 결제를 진행하고자 할 때 사용한다."},"ITossBilling.ICustomerKey":{"type":"object","properties":{"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["customerKey"],"description":"고객 식별자 정보."},"ITossBilling.IPaymentStore":{"type":"object","properties":{"method":{"type":"string","enum":["billing"],"description":"결제 수단이 간편 결제임을 의미함."},"billingKey":{"type":"string","description":"{@link IPaymentStore } 의 식별자 키."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["method","billingKey","orderId","amount","customerKey"],"description":"간편 결제를 이용한 결제 신청 정보."},"ITossPayment":{"oneOf":[{"$ref":"#/components/schemas/ITossCardPayment"},{"$ref":"#/components/schemas/ITossGiftCertificatePayment"},{"$ref":"#/components/schemas/ITossMobilePhonePayment"},{"$ref":"#/components/schemas/ITossTransferPayment"},{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}],"description":"결제 정보.\n\n`ITossPayment` 는 토스 페이먼츠의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.method === \"카드\")\n payment.card; // payment be ITossCardPayment\n```"},"ITossCardPayment":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/ITossCardPayment.ICard","description":"카드 정보."},"discount":{"$ref":"#/components/schemas/ITossCardPayment.IDiscount.Nullable","description":"카드사의 즉시 할인 프로모션 정보."},"easyPay":{"type":"string","enum":["토스결제","페이코","삼성페이"],"nullable":true,"description":"간편결제로 결제한 경우 간편결제 타입 정보."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL","BILLING"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["card","discount","easyPay","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"카드 결제 정보."},"ITossCardPayment.ICard":{"type":"object","properties":{"company":{"type":"string","description":"카드사 이름."},"number":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"installmentPlanMonths":{"type":"number","description":"할부 개월 수."},"isInterestFree":{"type":"boolean","description":"무이자 할부 적용 여부."},"approveNo":{"type":"string","description":"승인 번호."},"useCardPoint":{"type":"boolean","enum":[false],"description":"카드 포인트 사용 여부."},"cardType":{"type":"string","enum":["신용","체크","기프트"],"description":"카드 타입."},"ownerType":{"type":"string","enum":["개인","법인"],"description":"카드의 소유자 타입."},"acquireStatus":{"type":"string","enum":["READY","CANCELED","REQUESTED","COMPLETED","CANCEL_REQUESTED"],"description":"카드 결제의 매입 상태.\n\n - READY: 매입 대기\n - REQUESTED: 매입 요청됨\n - COMPLETED: 매입 완료\n - CANCEL_REQUESTED: 매입 취소 요청됨\n - CANCELD: 매입 취소됨"},"receiptUrl":{"type":"string","format":"url","description":"영수증 URL."}},"nullable":false,"required":["company","number","installmentPlanMonths","isInterestFree","approveNo","useCardPoint","cardType","ownerType","acquireStatus","receiptUrl"],"description":"카드 정보."},"ITossCardPayment.IDiscount.Nullable":{"type":"object","properties":{"amount":{"type":"number","description":"카드사의 즉시 할인 프로모션을 적용한 금액."}},"nullable":true,"required":["amount"],"description":"카드사의 즉시 할인 프로모션 정보."},"ITossPaymentCancel":{"type":"object","properties":{"cancelAmount":{"type":"number","description":"취소 총액."},"cancelReason":{"type":"string","description":"취소 사유."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"taxAmount":{"type":"number","description":"과세 처리된 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."},"canceledAt":{"type":"string","format":"date-time","description":"취소 일시."}},"nullable":false,"required":["cancelAmount","cancelReason","taxFreeAmount","taxAmount","refundableAmount","canceledAt"],"description":"결제 취소 정보."},"ITossCashReceipt.ISummary.Nullable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"amount":{"type":"number","description":"현금 영수증 처리된 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"issueNumber":{"type":"string","description":"현금영수증 발급번호."},"receiptUrl":{"type":"string","description":"현금영수증 조회 페이지 주소."}},"nullable":true,"required":["type","amount","taxFreeAmount","issueNumber","receiptUrl"],"description":"현금 영수증 요약 정보."},"ITossCashReceipt.Type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"ITossGiftCertificatePayment":{"type":"object","properties":{"giftCertificate":{"$ref":"#/components/schemas/ITossGiftCertificatePayment.IGiftCertificate","description":"상품권 정보."},"method":{"type":"string","enum":["상품권"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["giftCertificate","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"상품권 결제 정보."},"ITossGiftCertificatePayment.IGiftCertificate":{"type":"object","properties":{"approveNo":{"type":"string","description":"승인 번호."},"settlementStatus":{"type":"string","enum":["COMPLETE","INCOMPLETE"],"description":"정산 상태."}},"nullable":false,"required":["approveNo","settlementStatus"],"description":"상품권 정보."},"ITossMobilePhonePayment":{"type":"object","properties":{"mobilePhone":{"$ref":"#/components/schemas/ITossMobilePhonePayment.IMobilePhone","description":"휴대폰 정보."},"method":{"type":"string","enum":["휴대폰"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["mobilePhone","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"휴대폰 결제 정보."},"ITossMobilePhonePayment.IMobilePhone":{"type":"object","properties":{"carrier":{"type":"string","description":"통신사."},"customerMobilePhone":{"type":"string","description":"고객 휴대폰 번호."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."}},"nullable":false,"required":["carrier","customerMobilePhone","settlementStatus"],"description":"휴대폰 정보."},"ITossTransferPayment":{"type":"object","properties":{"transfer":{"$ref":"#/components/schemas/ITossTransferPayment.ITransfer","description":"계좌 이체 정보."},"method":{"type":"string","enum":["계좌이체"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["transfer","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"계좌 이체 결제 정보."},"ITossTransferPayment.ITransfer":{"type":"object","properties":{"bank":{"type":"string","description":"은행명."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"이체 상태."}},"nullable":false,"required":["bank","settlementStatus"],"description":"계좌 이체 정보."},"ITossVirtualAccountPayment":{"type":"object","properties":{"secret":{"type":"string","description":"가상 계좌로 결제할 때 전달되는 입금 콜백을 검증하기 위한 값."},"virtualAccount":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.IVirtualAccount","description":"가상 계좌 정보."},"method":{"type":"string","enum":["가상계좌"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["secret","virtualAccount","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"가상 계좌 결제 정보."},"ITossVirtualAccountPayment.IVirtualAccount":{"type":"object","properties":{"accountNumber":{"type":"string","description":"계좌 번호."},"accountType":{"type":"string","enum":["일반","고정"],"description":"가상 계좌 타입."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"dueDate":{"type":"string","format":"date","description":"입금 기한."},"expired":{"type":"boolean","description":"가상 계좌 만료 여부."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."},"refundStatus":{"type":"string","enum":["COMPLETED","NONE","FAILED","PENDING","PARTIAL_FAILED"],"description":"환불 처리 상태.\n\n - NONE: 해당 없음\n - FAILED: 환불 실패\n - PENDING: 환불 처리중\n - PARTIAL_FAILED: 부분 환불 실패\n - COMPLETED: 환불 완료"}},"nullable":false,"required":["accountNumber","accountType","bank","customerName","dueDate","expired","settlementStatus","refundStatus"],"description":"가상 계좌 정보."},"ITossCashReceipt.ICreate":{"type":"object","properties":{"type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"paymentKey":{"type":"string","description":"귀속 결제의 {@link ITossPayment.paymentKey }."},"orderId":{"type":"string","description":"주문의 식별자 ID."},"orderName":{"type":"string","description":"주문 이름."},"registrationNumber":{"type":"string","description":"현금 영수증 발급을 위한 개인 식별 번호.\n\n현금 영수증의 종류에 따라 휴대폰 번호나 주민등록번호 또는 사업자등록번호 및\n카드 번호를 입력할 수 있다."},"amount":{"type":"number","description":"현금 영수증을 발행할 금액."},"taxFreeAmount":{"type":"number","description":"면세 금액."},"businessNumber":{"type":"string","description":"사업자 등록번호."}},"nullable":false,"required":["type","paymentKey","orderId","orderName","registrationNumber","amount"],"description":"현금 영수증 입력 정보."},"ITossCashReceipt":{"type":"object","properties":{"receiptKey":{"type":"string","description":"현금 영수증의 식별자 키."},"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"orderId":{"type":"string","description":"주문의 식별자 ID."},"orderName":{"type":"string","description":"주문 이름."},"approvalNumber":{"type":"string","description":"현금 영수증 승인 번호."},"approvedAt":{"type":"string","format":"date-time","description":"현금 영수증 승인 일시."},"canceledAt":{"type":"string","format":"date-time","nullable":true,"description":"현금 영수증 취소 일시."},"receiptUrl":{"type":"string","description":"영수증 URL."}},"nullable":false,"required":["receiptKey","type","orderId","orderName","approvalNumber","approvedAt","canceledAt","receiptUrl"],"description":"현금 영수증 정보."},"ITossCashReceipt.ICancel":{"type":"object","properties":{"amount":{"type":"number","description":"취소 금액.\n\n미 입력시 현금 영수증에 기재된 {@link ITossCashReceipt.amount 총액}이 취소됨."}},"nullable":false,"description":"현금 영수증 취소 입력 정보."},"ITossPaymentWebhook":{"type":"object","properties":{"eventType":{"type":"string","enum":["PAYMENT_STATUS_CHANGED"],"description":"이벤트 타입."},"data":{"$ref":"#/components/schemas/ITossPaymentWebhook.IData","description":"이벤트 데이터."}},"nullable":false,"required":["eventType","data"],"description":"웹훅 이벤트 정보."},"ITossPaymentWebhook.IData":{"type":"object","properties":{"paymentKey":{"type":"string","description":"{@link ITossPayment } 의 식별자 키."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"status":{"type":"string","enum":["WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED"],"description":"결제 상태.\n\n - DONE: 결제 완료\n - CANCELED: 결제가 취소됨\n - PARTIAL_CANCELED: 결제가 부분 취소됨\n - WAITING_FOR_DEPOSIT: 입금 대기 중"}},"nullable":false,"required":["paymentKey","orderId","status"],"description":"웹훅 이벤트 데이터."},"ITossCardPayment.ICreate":{"type":"object","properties":{"method":{"type":"string","enum":["card"],"description":"결제 수단이 신용 카드임을 의미."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"cardExpirationYear":{"type":"string","pattern":"\\d{2}","description":"카드 만료 년도 (2 자리)."},"cardExpirationMonth":{"type":"string","pattern":"^(0[1-9]|1[012])$","description":"카드 만료 월 (2 자리)."},"cardPassword":{"type":"string","description":"카드 비밀번호."},"cardInstallmentPlan":{"type":"number","description":"할부 개월 수."},"amount":{"type":"number","description":"지불 총액."},"taxFreeAmount":{"type":"number","description":"면세금 총액."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"customerBirthday":{"type":"string","pattern":"^([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"고객의 생년월일.\n\n표기 형식 YYMMDD."},"customerEmail":{"type":"string","format":"email","description":"고객의 이메일."},"vbv":{"type":"object","properties":{"cavv":{"type":"string","description":"3D Secure 인증 세션에 대한 인증 값."},"xid":{"type":"string","description":"트랜잭션 ID."},"eci":{"type":"string","description":"3DS 인증 결과에 대한 코드 값."}},"nullable":false,"required":["cavv","xid","eci"],"description":"해외카드로 결제하는 경우 3DS 인증 적용을 위해 사용.\n\n3DS 인증 결과를 전송해야 하는 경우에만 필수."},"__approved":{"type":"boolean","description":"결제 승인 여부.\n\n오직 가짜 페이먼츠 서버 `fake-toss-payments-server` 에서만 사용되는 값으로써,\n결제 승인을 고의로 지연시키거나 할 때 사용된다. 이 값을 `false` 로 하면, 프론트\n어플리케이션이 토스 페이먼츠가 제공해주는 결제 창을 사용하여 결제를 진행하는\n상황을 시뮬레이션할 수 있다.\n\n본디 토스 페이먼츠 서버는 프론트 어플리케이션에서 백엔드 서버를 거치지 않고,\n토스 페이먼츠가 제공해주는 결제 창을 이용하여 직접 결제를 요청하는 경우,\n백엔드에서 이를 별도 {@link functional.payments.approve 승인} 처리해주기 전까지\n정식 결제로 인청치 아니한다.\n\n반면 백엔드 서버에서 토스 페이먼츠 서버의 API 를 호출하는 경우, 토스 페이먼츠는\n이를 그 즉시로 승인해주기, `fake-toss-payments-server` 에서 별도의 승인 처리가\n필요한 상황을 시뮬레이션하기 위해서는 이러한 속성이 필요한 것."}},"nullable":false,"required":["method","cardNumber","cardExpirationYear","cardExpirationMonth","amount","orderId"],"description":"신용 카드를 이용한 결제 신청 정보."},"ITossPayment.IApproval":{"type":"object","properties":{"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."}},"nullable":false,"required":["orderId","amount"],"description":"결제 승인 정보."},"ITossPaymentCancel.ICreate":{"type":"object","properties":{"paymentKey":{"type":"string","description":"{@link ITossPayment } 의 식별자 키."},"cancelReason":{"type":"string","description":"취소 사유."},"cancelAmount":{"type":"number","description":"취소 총액."},"refundReceiveAccount":{"type":"object","properties":{"bank":{"type":"string","description":"은행 정보."},"accountNumber":{"type":"string","pattern":"^[0-9]{0,20}$","description":"계좌 번호."},"holderName":{"type":"string","description":"예금주."}},"nullable":false,"required":["bank","accountNumber","holderName"],"description":"환불 계좌 정보.\n\n결제를 가상 계좌로 하였을 때에만 해당함."},"taxAmount":{"type":"number","description":"과세 처리 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."}},"nullable":false,"required":["paymentKey","cancelReason"],"description":"결제 취소 신청 정보."},"ITossVirtualAccountPayment.ICreate":{"type":"object","properties":{"method":{"type":"string","enum":["virtual-account"],"description":"결제 수단이 가상 계좌임을 의미."},"orderId":{"type":"string","description":"주문 식별자 번호.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"amount":{"type":"number","description":"결제 총액."},"__approved":{"type":"boolean","description":"결제 승인 여부.\n\n오직 가짜 페이먼츠 서버 `fake-toss-payments-server` 에서만 사용되는 값으로써,\n결제 승인을 고의로 지연시키거나 할 때 사용된다. 이 값을 `false` 로 하면, 프론트\n어플리케이션이 토스 페이먼츠가 제공해주는 결제 창을 사용하여 결제를 진행하는\n상황을 시뮬레이션할 수 있다.\n\n본디 토스 페이먼츠 서버는 프론트 어플리케이션에서 백엔드 서버를 거치지 않고,\n토스 페이먼츠가 제공해주는 결제 창을 이용하여 직접 결제를 요청하는 경우,\n백엔드에서 이를 별도 {@link functional.payments.approve 승인} 처리해주기 전까지\n정식 결제로 인청치 아니한다.\n\n반면 백엔드 서버에서 토스 페이먼츠 서버의 API 를 호출하는 경우, 토스 페이먼츠는\n이를 그 즉시로 승인해주기, `fake-toss-payments-server` 에서 별도의 승인 처리가\n필요한 상황을 시뮬레이션하기 위해서는 이러한 속성이 필요한 것."}},"nullable":false,"required":["method","orderId","orderName","bank","customerName","amount"],"description":"가상 계좌를 이용한 결제 신청 정보."}},"securitySchemes":{"basic":{"type":"apiKey","name":"Authorization","in":"header"}}}} \ No newline at end of file diff --git a/packages/toss-payments-server-api/tsconfig.json b/packages/toss-payments-server-api/tsconfig.json index 5bde0b8..7e8fe8c 100644 --- a/packages/toss-payments-server-api/tsconfig.json +++ b/packages/toss-payments-server-api/tsconfig.json @@ -12,7 +12,7 @@ "target": "ES5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "lib": [ "DOM", - "ES2015" + "ES2020" ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */// "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ From b6897b711737dac0a7a0d12b4ad024bd1071949e Mon Sep 17 00:00:00 2001 From: Jeongho Nam Date: Tue, 23 Jan 2024 03:06:13 +0900 Subject: [PATCH 2/4] Solve special problem of `prisma` and `pnpm` --- packages/payment-backend/package.json | 21 +---- packages/payment-backend/src/schema.prisma | 1 + packages/payment-backend/test/webpack.ts | 94 ++++++++++++++++++++++ 3 files changed, 98 insertions(+), 18 deletions(-) create mode 100644 packages/payment-backend/test/webpack.ts diff --git a/packages/payment-backend/package.json b/packages/payment-backend/package.json index dcbed3f..041f7c2 100644 --- a/packages/payment-backend/package.json +++ b/packages/payment-backend/package.json @@ -6,7 +6,6 @@ "typings": "lib/index.d.ts", "scripts": { "test": "node bin/test", - "test:update": "node bin/test/manual/update", "------------------------BUILDS------------------------": "", "build": "npm run build:sdk && npm run build:main && npm run build:test", "build:api": "rimraf packages/api/lib && nestia sdk && tsc -p packages/api/tsconfig.json", @@ -22,25 +21,10 @@ "------------------------WEBPACK------------------------": "", "webpack": "rimraf dist && npm run build:prisma && webpack", "webpack:start": "cd dist && node server", - "webpack:start:testing": "cd dist && node server testing", - "webpack:start:updator:master": "cd dist && node updator-master", - "webpack:start:updator:slave": "cd dist && node updator-slave", + "webpack:test": "npm run webpack && rimraf prisma/migrations && node bin/test/webpack.js", "------------------------DEPLOYS------------------------": "", - "revert": "node lib/executable/revert", "schema": "node lib/executable/schema", - "start": "node lib/executable/server", - "start:testing": "node lib/executable/server local", - "start:updator:master": "node lib/executable/updator-master", - "start:updator:slave": "node lib/executable/updator-slave", - "update": "node lib/executable/update", - "--------------------------PM2--------------------------": "", - "pm2:start": "pm2 start lib/executable/server.js -i 0 --name payments-server-backend-server --wait-ready --listen-timeout 120000 --kill-timeout 15000 --", - "pm2:start:updator:master": "pm2 start --name payments-server-backend-updator-master lib/executable/updator-master.js", - "pm2:start:updator:slave": "pm2 start --name payments-server-backend-updator-slave lib/executable/updator-slave.js", - "pm2:start:reload": "pm2 reload payments-server-backend-server", - "pm2:stop": "pm2 delete payments-server-backend-server", - "pm2:stop:updator:master": "pm2 delete payments-server-backend-updator-master", - "pm2:stop:updator:slave": "pm2 delete payments-server-backend-updator-slave" + "start": "node lib/executable/server" }, "repository": { "type": "git", @@ -102,6 +86,7 @@ "fastify": "^4.24.3", "git-last-commit": "^1.0.0", "inquirer": "^8.2.5", + "node-fetch": "^2.7.0", "prisma": "^5.3.1", "prisma-markdown": "^1.0.8", "serialize-error": "^4.1.0", diff --git a/packages/payment-backend/src/schema.prisma b/packages/payment-backend/src/schema.prisma index 5184f66..ac65179 100644 --- a/packages/payment-backend/src/schema.prisma +++ b/packages/payment-backend/src/schema.prisma @@ -6,6 +6,7 @@ datasource db { generator client { provider = "prisma-client-js" binaryTargets = ["native", "linux-musl-arm64-openssl-3.0.x"] + output = "../node_modules/.prisma/client" } generator markdown { diff --git a/packages/payment-backend/test/webpack.ts b/packages/payment-backend/test/webpack.ts new file mode 100644 index 0000000..0691e2c --- /dev/null +++ b/packages/payment-backend/test/webpack.ts @@ -0,0 +1,94 @@ +import { DynamicExecutor } from "@nestia/e2e"; +import api from "@samchon/payment-api/lib/index"; +import fs from "fs"; +import { Singleton, randint } from "tstl"; +import { sleep_for } from "tstl/thread/global"; + +import { PaymentBackend, PaymentConfiguration, PaymentGlobal } from "../src"; +import { ErrorUtil } from "../src/utils/ErrorUtil"; + +function cipher(val: number): string { + if (val < 10) return "0" + val; + else return String(val); +} + +async function handle_error(exp: any): Promise { + try { + const date: Date = new Date(); + const fileName: string = `${date.getFullYear()}${cipher( + date.getMonth() + 1, + )}${cipher(date.getDate())}${cipher(date.getHours())}${cipher( + date.getMinutes(), + )}${cipher(date.getSeconds())}.${randint(0, Number.MAX_SAFE_INTEGER)}`; + const content: string = JSON.stringify(ErrorUtil.toJSON(exp), null, 4); + + await directory.get(); + await fs.promises.writeFile( + `${__dirname}/../../assets/logs/errors/${fileName}.log`, + content, + "utf8", + ); + } catch {} +} + +async function main(): Promise { + // UNEXPECTED ERRORS + global.process.on("uncaughtException", handle_error); + global.process.on("unhandledRejection", handle_error); + + // OPEN SERVER + PaymentGlobal.testing = true; + const backend: PaymentBackend = new PaymentBackend(); + await backend.open(); + + // DO TEST + const connection: api.IConnection = { + host: `http://127.0.0.1:${PaymentConfiguration.API_PORT()}`, + encryption: { + key: PaymentConfiguration.ENCRYPTION_PASSWORD().key, + iv: PaymentConfiguration.ENCRYPTION_PASSWORD().iv, + }, + }; + const report: DynamicExecutor.IReport = await DynamicExecutor.validate({ + prefix: "test", + parameters: () => [ + { + host: connection.host, + encryption: connection.encryption, + }, + ], + })(__dirname + "/features"); + + // TERMINATE + await sleep_for(2500); // WAIT FOR BACKGROUND EVENTS + await backend.close(); + + const exceptions: Error[] = report.executions + .filter((exec) => exec.error !== null) + .map((exec) => exec.error!); + if (exceptions.length === 0) { + console.log("Success"); + console.log("Elapsed time", report.time.toLocaleString(), `ms`); + } else { + for (const exp of exceptions) console.log(exp); + console.log("Failed"); + console.log("Elapsed time", report.time.toLocaleString(), `ms`); + process.exit(-1); + } +} +main().catch((exp) => { + console.log(exp); + process.exit(-1); +}); + +const directory = new Singleton(async () => { + await mkdir(`${__dirname}/../../assets`); + await mkdir(`${__dirname}/../../assets/logs`); + await mkdir(`${__dirname}/../../assets/logs/errors`); +}); + +async function mkdir(path: string): Promise { + try { + await fs.promises.mkdir(path); + } catch {} +} From 8336875bf6da8f388cce663b085e91afcf083f03 Mon Sep 17 00:00:00 2001 From: Jeongho Nam Date: Tue, 23 Jan 2024 04:01:48 +0900 Subject: [PATCH 3/4] Special webpack configuration for `prisma` and `pnpm`. --- packages/payment-backend/package.json | 4 ++-- packages/payment-backend/{src => prisma}/schema.prisma | 0 packages/payment-backend/src/PaymentSetupWizard.ts | 2 +- packages/payment-backend/src/migrations/migration_lock.toml | 3 --- packages/payment-backend/webpack.config.js | 5 ++++- 5 files changed, 7 insertions(+), 7 deletions(-) rename packages/payment-backend/{src => prisma}/schema.prisma (100%) delete mode 100644 packages/payment-backend/src/migrations/migration_lock.toml diff --git a/packages/payment-backend/package.json b/packages/payment-backend/package.json index 041f7c2..ba48cff 100644 --- a/packages/payment-backend/package.json +++ b/packages/payment-backend/package.json @@ -5,12 +5,12 @@ "main": "lib/index.js", "typings": "lib/index.d.ts", "scripts": { - "test": "node bin/test", + "test": "rimraf prisma/migrations && node bin/test", "------------------------BUILDS------------------------": "", "build": "npm run build:sdk && npm run build:main && npm run build:test", "build:api": "rimraf packages/api/lib && nestia sdk && tsc -p packages/api/tsconfig.json", "build:main": "rimraf lib && tsc", - "build:prisma": "prisma generate --schema=src/schema.prisma", + "build:prisma": "prisma generate --schema=prisma/schema.prisma", "build:sdk": "rimraf src/api/functional && nestia sdk", "build:swagger": "nestia swagger", "build:test": "rimraf bin && tsc -p test/tsconfig.json", diff --git a/packages/payment-backend/src/schema.prisma b/packages/payment-backend/prisma/schema.prisma similarity index 100% rename from packages/payment-backend/src/schema.prisma rename to packages/payment-backend/prisma/schema.prisma diff --git a/packages/payment-backend/src/PaymentSetupWizard.ts b/packages/payment-backend/src/PaymentSetupWizard.ts index 48fe79f..97bd4a9 100644 --- a/packages/payment-backend/src/PaymentSetupWizard.ts +++ b/packages/payment-backend/src/PaymentSetupWizard.ts @@ -12,7 +12,7 @@ export namespace PaymentSetupWizard { const execute = (type: string) => (argv: string) => cp.execSync( - `npx prisma migrate ${type} --schema=src/schema.prisma ${argv}`, + `npx prisma migrate ${type} --schema=prisma/schema.prisma ${argv}`, { stdio: "ignore", cwd: PaymentConfiguration.ROOT, diff --git a/packages/payment-backend/src/migrations/migration_lock.toml b/packages/payment-backend/src/migrations/migration_lock.toml deleted file mode 100644 index fbffa92..0000000 --- a/packages/payment-backend/src/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file diff --git a/packages/payment-backend/webpack.config.js b/packages/payment-backend/webpack.config.js index 03ea8a6..ad7e19e 100644 --- a/packages/payment-backend/webpack.config.js +++ b/packages/payment-backend/webpack.config.js @@ -50,8 +50,11 @@ module.exports = { to: "[name][ext]", }, { - from: "./node_modules/.prisma/client/*.node", + from: "./node_modules/**/.prisma/client/*.node", to: () => Promise.resolve("[path][name][ext]"), + globOptions: { + dot: true, + }, }, ], }), From 5a5b90e7c689d8552ceb6553db240757b4d9d007 Mon Sep 17 00:00:00 2001 From: Jeongho Nam Date: Tue, 23 Jan 2024 10:35:35 +0900 Subject: [PATCH 4/4] Finalize `pnpm` compatible development --- package.json | 2 +- packages/fake-iamport-server/nestia.config.ts | 55 +++-- packages/fake-iamport-server/package.json | 2 +- .../api/functional/certifications/index.ts | 80 ++----- .../functional/certifications/otp/index.ts | 111 +++------ .../src/api/functional/internal/index.ts | 78 ++----- .../src/api/functional/payments/index.ts | 97 ++------ .../src/api/functional/receipts/index.ts | 136 +++-------- .../functional/subscribe/customers/index.ts | 136 +++-------- .../functional/subscribe/payments/index.ts | 108 +++------ .../src/api/functional/users/index.ts | 55 ++--- .../src/api/functional/vbanks/index.ts | 108 +++------ .../nestia.config.ts | 55 +++-- .../fake-toss-payments-server/package.json | 2 +- .../src/api/functional/internal/index.ts | 86 ++----- .../v1/billing/authorizations/card/index.ts | 55 ++--- .../v1/billing/authorizations/index.ts | 58 ++--- .../src/api/functional/v1/billing/index.ts | 58 ++--- .../api/functional/v1/cash_receipts/index.ts | 111 +++------ .../src/api/functional/v1/payments/index.ts | 206 ++++------------- .../functional/v1/virtual_accounts/index.ts | 55 ++--- packages/iamport-server-api/package.json | 2 +- packages/iamport-server-api/swagger.json | 2 +- packages/payment-api/package.json | 6 +- packages/payment-api/swagger.json | 2 +- packages/payment-backend/nestia.config.ts | 1 - packages/payment-backend/package.json | 10 +- packages/payment-backend/prisma/schema.prisma | 1 - .../api/functional/monitors/health/index.ts | 22 +- .../functional/monitors/performance/index.ts | 31 +-- .../api/functional/monitors/system/index.ts | 31 +-- .../functional/payments/histories/index.ts | 217 +++++------------- .../api/functional/payments/internal/index.ts | 47 ++-- .../functional/payments/reservations/index.ts | 164 ++++--------- .../api/functional/payments/webhooks/index.ts | 93 +++----- .../toss-payments-server-api/package.json | 2 +- .../toss-payments-server-api/swagger.json | 2 +- 37 files changed, 595 insertions(+), 1692 deletions(-) diff --git a/package.json b/package.json index 7a4364c..5823bcc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@samchon/payments", - "version": "6.0.2", + "version": "6.0.3", "description": "Collection of Payment system of Samchon", "scripts": { "package:latest": "node deploy latest", diff --git a/packages/fake-iamport-server/nestia.config.ts b/packages/fake-iamport-server/nestia.config.ts index 14f4c02..9336c88 100644 --- a/packages/fake-iamport-server/nestia.config.ts +++ b/packages/fake-iamport-server/nestia.config.ts @@ -4,34 +4,33 @@ import { NestFactory } from "@nestjs/core"; import { FakeIamportModule } from "./src/FakeIamportModule"; const NESTIA_CONFIG: INestiaConfig = { - input: () => NestFactory.create(FakeIamportModule), - output: "src/api", - simulate: true, - distribute: "../iamport-server-api", - swagger: { - output: "../iamport-server-api/swagger.json", - info: { - title: "Iamport API", - description: - "Built by [fake-iamport-server](https://github.com/samchon/payments/tree/master/packages/fake-iamport-server) with [nestia](https://github.com/samchon/nestia)", - }, - servers: [ - { - url: "http://localhost:10851", - description: "fake", - }, - { - url: "https://api.iamport.kr", - description: "real", - }, - ], - security: { - bearer: { - type: "apiKey", - name: "Authorization", - in: "header", - }, - }, + input: () => NestFactory.create(FakeIamportModule), + output: "src/api", + distribute: "../iamport-server-api", + swagger: { + output: "../iamport-server-api/swagger.json", + info: { + title: "Iamport API", + description: + "Built by [fake-iamport-server](https://github.com/samchon/payments/tree/master/packages/fake-iamport-server) with [nestia](https://github.com/samchon/nestia)", }, + servers: [ + { + url: "http://localhost:10851", + description: "fake", + }, + { + url: "https://api.iamport.kr", + description: "real", + }, + ], + security: { + bearer: { + type: "apiKey", + name: "Authorization", + in: "header", + }, + }, + }, }; export default NESTIA_CONFIG; diff --git a/packages/fake-iamport-server/package.json b/packages/fake-iamport-server/package.json index 7ddcaed..8c725de 100644 --- a/packages/fake-iamport-server/package.json +++ b/packages/fake-iamport-server/package.json @@ -1,6 +1,6 @@ { "name": "fake-iamport-server", - "version": "6.0.2", + "version": "6.0.3", "description": "Fake iamport server for testing", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/fake-iamport-server/src/api/functional/certifications/index.ts b/packages/fake-iamport-server/src/api/functional/certifications/index.ts index d72d588..2415490 100644 --- a/packages/fake-iamport-server/src/api/functional/certifications/index.ts +++ b/packages/fake-iamport-server/src/api/functional/certifications/index.ts @@ -6,11 +6,9 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportCertification } from "../../structures/IIamportCertification"; import type { IIamportResponse } from "../../structures/IIamportResponse"; -import { NestiaSimulator } from "../../utils/NestiaSimulator"; export * as otp from "./otp"; @@ -37,18 +35,13 @@ export async function at( connection: IConnection, imp_uid: string, ): Promise { - return !!connection.simulate - ? at.simulate( - connection, - imp_uid, - ) - : PlainFetcher.fetch( - connection, - { - ...at.METADATA, - path: at.path(imp_uid), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...at.METADATA, + path: at.path(imp_uid), + } as const, + ); } export namespace at { export type Output = Primitive>; @@ -67,26 +60,6 @@ export namespace at { export const path = (imp_uid: string): string => { return `/certifications/${encodeURIComponent(imp_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - imp_uid: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(imp_uid), - contentType: "application/json", - }); - assert.param("imp_uid")(() => typia.assert(imp_uid)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -105,18 +78,13 @@ export async function erase( connection: IConnection, imp_uid: string, ): Promise { - return !!connection.simulate - ? erase.simulate( - connection, - imp_uid, - ) - : PlainFetcher.fetch( - connection, - { - ...erase.METADATA, - path: erase.path(imp_uid), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...erase.METADATA, + path: erase.path(imp_uid), + } as const, + ); } export namespace erase { export type Output = Primitive>; @@ -135,24 +103,4 @@ export namespace erase { export const path = (imp_uid: string): string => { return `/certifications/${encodeURIComponent(imp_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - imp_uid: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(imp_uid), - contentType: "application/json", - }); - assert.param("imp_uid")(() => typia.assert(imp_uid)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-iamport-server/src/api/functional/certifications/otp/index.ts b/packages/fake-iamport-server/src/api/functional/certifications/otp/index.ts index 3291f61..e22d7ad 100644 --- a/packages/fake-iamport-server/src/api/functional/certifications/otp/index.ts +++ b/packages/fake-iamport-server/src/api/functional/certifications/otp/index.ts @@ -6,11 +6,9 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportCertification } from "../../../structures/IIamportCertification"; import type { IIamportResponse } from "../../../structures/IIamportResponse"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * 본인인증 요청하기. @@ -38,25 +36,20 @@ export async function request( connection: IConnection, input: request.Input, ): Promise { - return !!connection.simulate - ? request.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...request.METADATA, - path: request.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...request.METADATA, + path: request.path(), + } as const, + input, + ); } export namespace request { export type Input = Primitive; @@ -79,26 +72,6 @@ export namespace request { export const path = (): string => { return `/certifications/otp/request`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - input: request.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -128,26 +101,20 @@ export async function confirm( imp_uid: string, input: confirm.Input, ): Promise { - return !!connection.simulate - ? confirm.simulate( - connection, - imp_uid, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...confirm.METADATA, - path: confirm.path(imp_uid), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...confirm.METADATA, + path: confirm.path(imp_uid), + } as const, + input, + ); } export namespace confirm { export type Input = Primitive; @@ -170,26 +137,4 @@ export namespace confirm { export const path = (imp_uid: string): string => { return `/certifications/otp/confirm/${encodeURIComponent(imp_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - imp_uid: string, - input: confirm.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(imp_uid), - contentType: "application/json", - }); - assert.param("imp_uid")(() => typia.assert(imp_uid)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-iamport-server/src/api/functional/internal/index.ts b/packages/fake-iamport-server/src/api/functional/internal/index.ts index 1f70d07..3d61fe9 100644 --- a/packages/fake-iamport-server/src/api/functional/internal/index.ts +++ b/packages/fake-iamport-server/src/api/functional/internal/index.ts @@ -6,10 +6,8 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportPayment } from "../../structures/IIamportPayment"; -import { NestiaSimulator } from "../../utils/NestiaSimulator"; /** * 웹훅 이벤트 더미 리스너. @@ -34,25 +32,20 @@ export async function webhook( connection: IConnection, input: webhook.Input, ): Promise { - return !!connection.simulate - ? webhook.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...webhook.METADATA, - path: webhook.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...webhook.METADATA, + path: webhook.path(), + } as const, + input, + ); } export namespace webhook { export type Input = Primitive; @@ -74,18 +67,6 @@ export namespace webhook { export const path = (): string => { return `/internal/webhook`; } - export const simulate = async ( - connection: IConnection, - input: webhook.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - } } /** @@ -111,18 +92,13 @@ export async function deposit( connection: IConnection, imp_uid: string, ): Promise { - return !!connection.simulate - ? deposit.simulate( - connection, - imp_uid, - ) - : PlainFetcher.fetch( - connection, - { - ...deposit.METADATA, - path: deposit.path(imp_uid), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...deposit.METADATA, + path: deposit.path(imp_uid), + } as const, + ); } export namespace deposit { @@ -140,16 +116,4 @@ export namespace deposit { export const path = (imp_uid: string): string => { return `/internal/deposit/${encodeURIComponent(imp_uid ?? "null")}`; } - export const simulate = async ( - connection: IConnection, - imp_uid: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(imp_uid), - contentType: "application/json", - }); - assert.param("imp_uid")(() => typia.assert(imp_uid)); - } } \ No newline at end of file diff --git a/packages/fake-iamport-server/src/api/functional/payments/index.ts b/packages/fake-iamport-server/src/api/functional/payments/index.ts index 7e5a074..c85d167 100644 --- a/packages/fake-iamport-server/src/api/functional/payments/index.ts +++ b/packages/fake-iamport-server/src/api/functional/payments/index.ts @@ -6,12 +6,10 @@ //================================================================ import type { IConnection, Primitive, Resolved } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportPayment } from "../../structures/IIamportPayment"; import type { IIamportPaymentCancel } from "../../structures/IIamportPaymentCancel"; import type { IIamportResponse } from "../../structures/IIamportResponse"; -import { NestiaSimulator } from "../../utils/NestiaSimulator"; /** * 결제 기록 열람하기. @@ -33,19 +31,13 @@ export async function at( imp_uid: string, query: at.Query, ): Promise { - return !!connection.simulate - ? at.simulate( - connection, - imp_uid, - query, - ) - : PlainFetcher.fetch( - connection, - { - ...at.METADATA, - path: at.path(imp_uid, query), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...at.METADATA, + path: at.path(imp_uid, query), + } as const, + ); } export namespace at { export type Query = Resolved; @@ -74,28 +66,6 @@ export namespace at { const encoded: string = search.toString(); return `/payments/${encodeURIComponent(imp_uid ?? "null")}${encoded.length ? `?${encoded}` : ""}`;; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - imp_uid: string, - query: at.Query, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(imp_uid, query), - contentType: "application/json", - }); - assert.param("imp_uid")(() => typia.assert(imp_uid)); - assert.query(() => typia.assert(query)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -116,25 +86,20 @@ export async function cancel( connection: IConnection, input: cancel.Input, ): Promise { - return !!connection.simulate - ? cancel.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...cancel.METADATA, - path: cancel.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...cancel.METADATA, + path: cancel.path(), + } as const, + input, + ); } export namespace cancel { export type Input = Primitive; @@ -157,24 +122,4 @@ export namespace cancel { export const path = (): string => { return `/payments/cancel`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - input: cancel.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-iamport-server/src/api/functional/receipts/index.ts b/packages/fake-iamport-server/src/api/functional/receipts/index.ts index 77bf753..faf4f11 100644 --- a/packages/fake-iamport-server/src/api/functional/receipts/index.ts +++ b/packages/fake-iamport-server/src/api/functional/receipts/index.ts @@ -6,11 +6,9 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportReceipt } from "../../structures/IIamportReceipt"; import type { IIamportResponse } from "../../structures/IIamportResponse"; -import { NestiaSimulator } from "../../utils/NestiaSimulator"; /** * 현금 영수증 조회하기. @@ -28,18 +26,13 @@ export async function at( connection: IConnection, imp_uid: string, ): Promise { - return !!connection.simulate - ? at.simulate( - connection, - imp_uid, - ) - : PlainFetcher.fetch( - connection, - { - ...at.METADATA, - path: at.path(imp_uid), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...at.METADATA, + path: at.path(imp_uid), + } as const, + ); } export namespace at { export type Output = Primitive>; @@ -58,26 +51,6 @@ export namespace at { export const path = (imp_uid: string): string => { return `/receipts/${encodeURIComponent(imp_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - imp_uid: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(imp_uid), - contentType: "application/json", - }); - assert.param("imp_uid")(() => typia.assert(imp_uid)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -98,26 +71,20 @@ export async function create( imp_uid: string, input: create.Input, ): Promise { - return !!connection.simulate - ? create.simulate( - connection, - imp_uid, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...create.METADATA, - path: create.path(imp_uid), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...create.METADATA, + path: create.path(imp_uid), + } as const, + input, + ); } export namespace create { export type Input = Primitive; @@ -140,28 +107,6 @@ export namespace create { export const path = (imp_uid: string): string => { return `/receipts/${encodeURIComponent(imp_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - imp_uid: string, - input: create.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(imp_uid), - contentType: "application/json", - }); - assert.param("imp_uid")(() => typia.assert(imp_uid)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -180,18 +125,13 @@ export async function erase( connection: IConnection, imp_uid: string, ): Promise { - return !!connection.simulate - ? erase.simulate( - connection, - imp_uid, - ) - : PlainFetcher.fetch( - connection, - { - ...erase.METADATA, - path: erase.path(imp_uid), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...erase.METADATA, + path: erase.path(imp_uid), + } as const, + ); } export namespace erase { export type Output = Primitive>; @@ -210,24 +150,4 @@ export namespace erase { export const path = (imp_uid: string): string => { return `/receipts/${encodeURIComponent(imp_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - imp_uid: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(imp_uid), - contentType: "application/json", - }); - assert.param("imp_uid")(() => typia.assert(imp_uid)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-iamport-server/src/api/functional/subscribe/customers/index.ts b/packages/fake-iamport-server/src/api/functional/subscribe/customers/index.ts index 19562f0..202f064 100644 --- a/packages/fake-iamport-server/src/api/functional/subscribe/customers/index.ts +++ b/packages/fake-iamport-server/src/api/functional/subscribe/customers/index.ts @@ -6,11 +6,9 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportResponse } from "../../../structures/IIamportResponse"; import type { IIamportSubscription } from "../../../structures/IIamportSubscription"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * 간편 결제 카드 정보 조회하기. @@ -32,18 +30,13 @@ export async function at( connection: IConnection, customer_uid: string, ): Promise { - return !!connection.simulate - ? at.simulate( - connection, - customer_uid, - ) - : PlainFetcher.fetch( - connection, - { - ...at.METADATA, - path: at.path(customer_uid), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...at.METADATA, + path: at.path(customer_uid), + } as const, + ); } export namespace at { export type Output = Primitive>; @@ -62,26 +55,6 @@ export namespace at { export const path = (customer_uid: string): string => { return `/subscribe/customers/${encodeURIComponent(customer_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - customer_uid: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(customer_uid), - contentType: "application/json", - }); - assert.param("customer_uid")(() => typia.assert(customer_uid)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -111,26 +84,20 @@ export async function create( customer_uid: string, input: create.Input, ): Promise { - return !!connection.simulate - ? create.simulate( - connection, - customer_uid, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...create.METADATA, - path: create.path(customer_uid), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...create.METADATA, + path: create.path(customer_uid), + } as const, + input, + ); } export namespace create { export type Input = Primitive; @@ -153,28 +120,6 @@ export namespace create { export const path = (customer_uid: string): string => { return `/subscribe/customers/${encodeURIComponent(customer_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - customer_uid: string, - input: create.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(customer_uid), - contentType: "application/json", - }); - assert.param("customer_uid")(() => typia.assert(customer_uid)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -195,18 +140,13 @@ export async function erase( connection: IConnection, customer_uid: string, ): Promise { - return !!connection.simulate - ? erase.simulate( - connection, - customer_uid, - ) - : PlainFetcher.fetch( - connection, - { - ...erase.METADATA, - path: erase.path(customer_uid), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...erase.METADATA, + path: erase.path(customer_uid), + } as const, + ); } export namespace erase { export type Output = Primitive>; @@ -225,24 +165,4 @@ export namespace erase { export const path = (customer_uid: string): string => { return `/subscribe/customers/${encodeURIComponent(customer_uid ?? "null")}`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - customer_uid: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(customer_uid), - contentType: "application/json", - }); - assert.param("customer_uid")(() => typia.assert(customer_uid)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-iamport-server/src/api/functional/subscribe/payments/index.ts b/packages/fake-iamport-server/src/api/functional/subscribe/payments/index.ts index f5e8834..beddb6d 100644 --- a/packages/fake-iamport-server/src/api/functional/subscribe/payments/index.ts +++ b/packages/fake-iamport-server/src/api/functional/subscribe/payments/index.ts @@ -6,12 +6,10 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportCardPayment } from "../../../structures/IIamportCardPayment"; import type { IIamportResponse } from "../../../structures/IIamportResponse"; import type { IIamportSubscription } from "../../../structures/IIamportSubscription"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * 카드로 결제하기, 더불어 간편 결제용으로 등록 가능. @@ -45,25 +43,20 @@ export async function onetime( connection: IConnection, input: onetime.Input, ): Promise { - return !!connection.simulate - ? onetime.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...onetime.METADATA, - path: onetime.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...onetime.METADATA, + path: onetime.path(), + } as const, + input, + ); } export namespace onetime { export type Input = Primitive; @@ -86,26 +79,6 @@ export namespace onetime { export const path = (): string => { return `/subscribe/payments/onetime`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - input: onetime.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -134,25 +107,20 @@ export async function again( connection: IConnection, input: again.Input, ): Promise { - return !!connection.simulate - ? again.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...again.METADATA, - path: again.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...again.METADATA, + path: again.path(), + } as const, + input, + ); } export namespace again { export type Input = Primitive; @@ -175,24 +143,4 @@ export namespace again { export const path = (): string => { return `/subscribe/payments/again`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - input: again.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-iamport-server/src/api/functional/users/index.ts b/packages/fake-iamport-server/src/api/functional/users/index.ts index 864cef1..bfac30a 100644 --- a/packages/fake-iamport-server/src/api/functional/users/index.ts +++ b/packages/fake-iamport-server/src/api/functional/users/index.ts @@ -6,11 +6,9 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportResponse } from "../../structures/IIamportResponse"; import type { IIamportUser } from "../../structures/IIamportUser"; -import { NestiaSimulator } from "../../utils/NestiaSimulator"; /** * 유저 인증 토큰 발행하기. @@ -34,25 +32,20 @@ export async function getToken( connection: IConnection, input: getToken.Input, ): Promise { - return !!connection.simulate - ? getToken.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...getToken.METADATA, - path: getToken.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...getToken.METADATA, + path: getToken.path(), + } as const, + input, + ); } export namespace getToken { export type Input = Primitive; @@ -75,24 +68,4 @@ export namespace getToken { export const path = (): string => { return `/users/getToken`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - input: getToken.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-iamport-server/src/api/functional/vbanks/index.ts b/packages/fake-iamport-server/src/api/functional/vbanks/index.ts index d588384..ff5dd85 100644 --- a/packages/fake-iamport-server/src/api/functional/vbanks/index.ts +++ b/packages/fake-iamport-server/src/api/functional/vbanks/index.ts @@ -6,11 +6,9 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { IIamportResponse } from "../../structures/IIamportResponse"; import type { IIamportVBankPayment } from "../../structures/IIamportVBankPayment"; -import { NestiaSimulator } from "../../utils/NestiaSimulator"; /** * 가상 계좌 발급하기. @@ -28,25 +26,20 @@ export async function create( connection: IConnection, input: create.Input, ): Promise { - return !!connection.simulate - ? create.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...create.METADATA, - path: create.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...create.METADATA, + path: create.path(), + } as const, + input, + ); } export namespace create { export type Input = Primitive; @@ -69,26 +62,6 @@ export namespace create { export const path = (): string => { return `/vbanks`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - input: create.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -107,25 +80,20 @@ export async function update( connection: IConnection, input: update.Input, ): Promise { - return !!connection.simulate - ? update.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...update.METADATA, - path: update.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...update.METADATA, + path: update.path(), + } as const, + input, + ); } export namespace update { export type Input = Primitive; @@ -148,24 +116,4 @@ export namespace update { export const path = (): string => { return `/vbanks`; } - export const random = (g?: Partial): Primitive> => - typia.random>>(g); - export const simulate = async ( - connection: IConnection, - input: update.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-toss-payments-server/nestia.config.ts b/packages/fake-toss-payments-server/nestia.config.ts index 6a5ed94..50d078b 100644 --- a/packages/fake-toss-payments-server/nestia.config.ts +++ b/packages/fake-toss-payments-server/nestia.config.ts @@ -4,34 +4,33 @@ import { NestFactory } from "@nestjs/core"; import { FakeTossModule } from "./src/FakeTossModule"; const NESTIA_CONFIG: INestiaConfig = { - simulate: true, - input: () => NestFactory.create(FakeTossModule), - output: "src/api", - distribute: "../toss-payments-server-api", - swagger: { - output: "../toss-payments-server-api/swagger.json", - info: { - title: "Toss Payments API", - description: - "Built by [fake-toss-payments-server](https://github.com/samchon/payments/tree/master/packages/toss-payments-server-api) with [nestia](https://github.com/samchon/nestia)", - }, - servers: [ - { - url: "http://localhost:30771", - description: "fake", - }, - { - url: "https://api.tosspayments.com", - description: "real", - }, - ], - security: { - basic: { - type: "apiKey", - name: "Authorization", - in: "header", - }, - }, + input: () => NestFactory.create(FakeTossModule), + output: "src/api", + distribute: "../toss-payments-server-api", + swagger: { + output: "../toss-payments-server-api/swagger.json", + info: { + title: "Toss Payments API", + description: + "Built by [fake-toss-payments-server](https://github.com/samchon/payments/tree/master/packages/toss-payments-server-api) with [nestia](https://github.com/samchon/nestia)", }, + servers: [ + { + url: "http://localhost:30771", + description: "fake", + }, + { + url: "https://api.tosspayments.com", + description: "real", + }, + ], + security: { + basic: { + type: "apiKey", + name: "Authorization", + in: "header", + }, + }, + }, }; export default NESTIA_CONFIG; diff --git a/packages/fake-toss-payments-server/package.json b/packages/fake-toss-payments-server/package.json index 73c63c5..56e0794 100644 --- a/packages/fake-toss-payments-server/package.json +++ b/packages/fake-toss-payments-server/package.json @@ -1,6 +1,6 @@ { "name": "fake-toss-payments-server", - "version": "6.0.2", + "version": "6.0.3", "description": "Fake toss-payments server for testing", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/fake-toss-payments-server/src/api/functional/internal/index.ts b/packages/fake-toss-payments-server/src/api/functional/internal/index.ts index 0adf00f..ae1da5b 100644 --- a/packages/fake-toss-payments-server/src/api/functional/internal/index.ts +++ b/packages/fake-toss-payments-server/src/api/functional/internal/index.ts @@ -6,11 +6,9 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { ITossPayment } from "../../structures/ITossPayment"; import type { ITossPaymentWebhook } from "../../structures/ITossPaymentWebhook"; -import { NestiaSimulator } from "../../utils/NestiaSimulator"; /** * 웹훅 이벤트 더미 리스너. @@ -35,25 +33,20 @@ export async function webhook( connection: IConnection, input: webhook.Input, ): Promise { - return !!connection.simulate - ? webhook.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...webhook.METADATA, - path: webhook.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...webhook.METADATA, + path: webhook.path(), + } as const, + input, + ); } export namespace webhook { export type Input = Primitive; @@ -75,18 +68,6 @@ export namespace webhook { export const path = (): string => { return `/internal/webhook`; } - export const simulate = async ( - connection: IConnection, - input: webhook.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - } } /** @@ -113,18 +94,13 @@ export async function deposit( connection: IConnection, paymentKey: string, ): Promise { - return !!connection.simulate - ? deposit.simulate( - connection, - paymentKey, - ) - : PlainFetcher.fetch( - connection, - { - ...deposit.METADATA, - path: deposit.path(paymentKey), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...deposit.METADATA, + path: deposit.path(paymentKey), + } as const, + ); } export namespace deposit { export type Output = Primitive; @@ -143,24 +119,4 @@ export namespace deposit { export const path = (paymentKey: string): string => { return `/internal/${encodeURIComponent(paymentKey ?? "null")}/deposit`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - paymentKey: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(paymentKey), - contentType: "application/json", - }); - assert.param("paymentKey")(() => typia.assert(paymentKey)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-toss-payments-server/src/api/functional/v1/billing/authorizations/card/index.ts b/packages/fake-toss-payments-server/src/api/functional/v1/billing/authorizations/card/index.ts index d301fc1..bee3178 100644 --- a/packages/fake-toss-payments-server/src/api/functional/v1/billing/authorizations/card/index.ts +++ b/packages/fake-toss-payments-server/src/api/functional/v1/billing/authorizations/card/index.ts @@ -6,10 +6,8 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { ITossBilling } from "../../../../../structures/ITossBilling"; -import { NestiaSimulator } from "../../../../../utils/NestiaSimulator"; /** * 간편 결제 카드 등록하기. @@ -36,25 +34,20 @@ export async function create( connection: IConnection, input: create.Input, ): Promise { - return !!connection.simulate - ? create.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...create.METADATA, - path: create.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...create.METADATA, + path: create.path(), + } as const, + input, + ); } export namespace create { export type Input = Primitive; @@ -77,24 +70,4 @@ export namespace create { export const path = (): string => { return `/v1/billing/authorizations/card`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: create.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-toss-payments-server/src/api/functional/v1/billing/authorizations/index.ts b/packages/fake-toss-payments-server/src/api/functional/v1/billing/authorizations/index.ts index 014bc53..bc6a442 100644 --- a/packages/fake-toss-payments-server/src/api/functional/v1/billing/authorizations/index.ts +++ b/packages/fake-toss-payments-server/src/api/functional/v1/billing/authorizations/index.ts @@ -6,10 +6,8 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { ITossBilling } from "../../../../structures/ITossBilling"; -import { NestiaSimulator } from "../../../../utils/NestiaSimulator"; export * as card from "./card"; @@ -38,26 +36,20 @@ export async function at( billingKey: string, input: at.Input, ): Promise { - return !!connection.simulate - ? at.simulate( - connection, - billingKey, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...at.METADATA, - path: at.path(billingKey), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...at.METADATA, + path: at.path(billingKey), + } as const, + input, + ); } export namespace at { export type Input = Primitive; @@ -80,26 +72,4 @@ export namespace at { export const path = (billingKey: string): string => { return `/v1/billing/authorizations/${encodeURIComponent(billingKey ?? "null")}`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - billingKey: string, - input: at.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(billingKey), - contentType: "application/json", - }); - assert.param("billingKey")(() => typia.assert(billingKey)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-toss-payments-server/src/api/functional/v1/billing/index.ts b/packages/fake-toss-payments-server/src/api/functional/v1/billing/index.ts index 56ace01..214c179 100644 --- a/packages/fake-toss-payments-server/src/api/functional/v1/billing/index.ts +++ b/packages/fake-toss-payments-server/src/api/functional/v1/billing/index.ts @@ -6,11 +6,9 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { ITossBilling } from "../../../structures/ITossBilling"; import type { ITossPayment } from "../../../structures/ITossPayment"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; export * as authorizations from "./authorizations"; @@ -46,26 +44,20 @@ export async function pay( billingKey: string, input: pay.Input, ): Promise { - return !!connection.simulate - ? pay.simulate( - connection, - billingKey, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...pay.METADATA, - path: pay.path(billingKey), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...pay.METADATA, + path: pay.path(billingKey), + } as const, + input, + ); } export namespace pay { export type Input = Primitive; @@ -88,26 +80,4 @@ export namespace pay { export const path = (billingKey: string): string => { return `/v1/billing/${encodeURIComponent(billingKey ?? "null")}`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - billingKey: string, - input: pay.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(billingKey), - contentType: "application/json", - }); - assert.param("billingKey")(() => typia.assert(billingKey)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-toss-payments-server/src/api/functional/v1/cash_receipts/index.ts b/packages/fake-toss-payments-server/src/api/functional/v1/cash_receipts/index.ts index 91338e8..f612a1c 100644 --- a/packages/fake-toss-payments-server/src/api/functional/v1/cash_receipts/index.ts +++ b/packages/fake-toss-payments-server/src/api/functional/v1/cash_receipts/index.ts @@ -6,10 +6,8 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { ITossCashReceipt } from "../../../structures/ITossCashReceipt"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * 현금 영수증 발행하기. @@ -27,25 +25,20 @@ export async function create( connection: IConnection, input: create.Input, ): Promise { - return !!connection.simulate - ? create.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...create.METADATA, - path: create.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...create.METADATA, + path: create.path(), + } as const, + input, + ); } export namespace create { export type Input = Primitive; @@ -68,26 +61,6 @@ export namespace create { export const path = (): string => { return `/v1/cash-receipts`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: create.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -108,26 +81,20 @@ export async function cancel( receiptKey: string, input: cancel.Input, ): Promise { - return !!connection.simulate - ? cancel.simulate( - connection, - receiptKey, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...cancel.METADATA, - path: cancel.path(receiptKey), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...cancel.METADATA, + path: cancel.path(receiptKey), + } as const, + input, + ); } export namespace cancel { export type Input = Primitive; @@ -150,26 +117,4 @@ export namespace cancel { export const path = (receiptKey: string): string => { return `/v1/cash-receipts/${encodeURIComponent(receiptKey ?? "null")}/cancel`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - receiptKey: string, - input: cancel.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(receiptKey), - contentType: "application/json", - }); - assert.param("receiptKey")(() => typia.assert(receiptKey)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-toss-payments-server/src/api/functional/v1/payments/index.ts b/packages/fake-toss-payments-server/src/api/functional/v1/payments/index.ts index b470753..4022f7f 100644 --- a/packages/fake-toss-payments-server/src/api/functional/v1/payments/index.ts +++ b/packages/fake-toss-payments-server/src/api/functional/v1/payments/index.ts @@ -6,12 +6,10 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { ITossCardPayment } from "../../../structures/ITossCardPayment"; import type { ITossPayment } from "../../../structures/ITossPayment"; import type { ITossPaymentCancel } from "../../../structures/ITossPaymentCancel"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * 결제 정보 조회하기. @@ -39,18 +37,13 @@ export async function at( connection: IConnection, paymentKey: string, ): Promise { - return !!connection.simulate - ? at.simulate( - connection, - paymentKey, - ) - : PlainFetcher.fetch( - connection, - { - ...at.METADATA, - path: at.path(paymentKey), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...at.METADATA, + path: at.path(paymentKey), + } as const, + ); } export namespace at { export type Output = Primitive; @@ -69,26 +62,6 @@ export namespace at { export const path = (paymentKey: string): string => { return `/v1/payments/${encodeURIComponent(paymentKey ?? "null")}`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - paymentKey: string, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(paymentKey), - contentType: "application/json", - }); - assert.param("paymentKey")(() => typia.assert(paymentKey)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -125,25 +98,20 @@ export async function key_in( connection: IConnection, input: key_in.Input, ): Promise { - return !!connection.simulate - ? key_in.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...key_in.METADATA, - path: key_in.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...key_in.METADATA, + path: key_in.path(), + } as const, + input, + ); } export namespace key_in { export type Input = Primitive; @@ -166,26 +134,6 @@ export namespace key_in { export const path = (): string => { return `/v1/payments/key-in`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: key_in.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -216,26 +164,20 @@ export async function approve( paymentKey: string, input: approve.Input, ): Promise { - return !!connection.simulate - ? approve.simulate( - connection, - paymentKey, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...approve.METADATA, - path: approve.path(paymentKey), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...approve.METADATA, + path: approve.path(paymentKey), + } as const, + input, + ); } export namespace approve { export type Input = Primitive; @@ -258,28 +200,6 @@ export namespace approve { export const path = (paymentKey: string): string => { return `/v1/payments/${encodeURIComponent(paymentKey ?? "null")}`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - paymentKey: string, - input: approve.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(paymentKey), - contentType: "application/json", - }); - assert.param("paymentKey")(() => typia.assert(paymentKey)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -305,26 +225,20 @@ export async function cancel( paymentKey: string, input: cancel.Input, ): Promise { - return !!connection.simulate - ? cancel.simulate( - connection, - paymentKey, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...cancel.METADATA, - path: cancel.path(paymentKey), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...cancel.METADATA, + path: cancel.path(paymentKey), + } as const, + input, + ); } export namespace cancel { export type Input = Primitive; @@ -347,26 +261,4 @@ export namespace cancel { export const path = (paymentKey: string): string => { return `/v1/payments/${encodeURIComponent(paymentKey ?? "null")}/cancel`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - paymentKey: string, - input: cancel.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(paymentKey), - contentType: "application/json", - }); - assert.param("paymentKey")(() => typia.assert(paymentKey)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/fake-toss-payments-server/src/api/functional/v1/virtual_accounts/index.ts b/packages/fake-toss-payments-server/src/api/functional/v1/virtual_accounts/index.ts index 4b85840..93f3407 100644 --- a/packages/fake-toss-payments-server/src/api/functional/v1/virtual_accounts/index.ts +++ b/packages/fake-toss-payments-server/src/api/functional/v1/virtual_accounts/index.ts @@ -6,10 +6,8 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; -import typia from "typia"; import type { ITossVirtualAccountPayment } from "../../../structures/ITossVirtualAccountPayment"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * 가상 계좌로 결제 신청하기. @@ -43,25 +41,20 @@ export async function create( connection: IConnection, input: create.Input, ): Promise { - return !!connection.simulate - ? create.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...create.METADATA, - path: create.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...create.METADATA, + path: create.path(), + } as const, + input, + ); } export namespace create { export type Input = Primitive; @@ -84,24 +77,4 @@ export namespace create { export const path = (): string => { return `/v1/virtual-accounts`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: create.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/iamport-server-api/package.json b/packages/iamport-server-api/package.json index d355aae..f753560 100644 --- a/packages/iamport-server-api/package.json +++ b/packages/iamport-server-api/package.json @@ -1,6 +1,6 @@ { "name": "iamport-server-api", - "version": "6.0.2", + "version": "6.0.3", "description": "API for Iamport Server", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/iamport-server-api/swagger.json b/packages/iamport-server-api/swagger.json index 4548787..baacae0 100644 --- a/packages/iamport-server-api/swagger.json +++ b/packages/iamport-server-api/swagger.json @@ -1 +1 @@ -{"openapi":"3.0.1","servers":[{"url":"http://localhost:10851","description":"fake"},{"url":"https://api.iamport.kr","description":"real"}],"info":{"title":"Iamport API","description":"Built by [fake-iamport-server](https://github.com/samchon/payments/tree/master/packages/fake-iamport-server) with [nestia](https://github.com/samchon/nestia)","version":"6.0.2","license":{"name":"MIT"}},"paths":{"/subscribe/customers/{customer_uid}":{"get":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"responses":{"200":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 정보 조회하기","description":"간편 결제 카드 정보 조회하기.\n\n`subscribe.customers.at` 은 고객이 {@link create } 나 혹은 아임포트가 제공하는\n간편 결제 카드 등록 창을 이용하여 저장한 간편 결제 카드 정보를 조회하는 API\n함수이다.","security":[{"bearer":[]}]},"post":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"requestBody":{"description":"카드 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.ICreate"}}},"required":true},"responses":{"201":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 등록하기","description":"간편 결제 카드 등록하기.\n\n`subscribe.customers.stoer` 는 고객이 자신의 카드를 서버에 등록해두고, 매번 결제가\n필요할 때마다 카드 정보를 반복 입력하는 일 없이, 간편하게 결제를 진행하고자 할 때\n사용하는 API 함수이다.\n\n참고로 `subscribe.customers.create` 는 클라이언트 어플리케이션이 아임포트가 제공하는\n간편 결제 카드 등록 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는\n일은 없을 것이다. 다만, 고객이 간편 결제 카드를 등록하는 상황을 시뮬레이션하기 위하여,\n테스트 자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"responses":{"200":{"description":"삭제된 간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 삭제하기","description":"간편 결제 카드 삭제하기.\n\n간편 결제를 위하여 등록한 카드를 제거한다.","security":[{"bearer":[]}]}},"/subscribe/payments/onetime":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"카드 결제 신청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.IOnetime"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCardPayment"}}}}},"summary":"카드로 결제하기, 더불어 간편 결제용으로 등록 가능","description":"카드로 결제하기, 더불어 간편 결제용으로 등록 가능.\n\n`subscribe.payments.onetime` 은 카드를 매개로 한 결제를 하고자 할 때 호출하는 API\n함수이다. 더하여 입력 값에 {@link IIamportSubscription.IOnetime.customer_uid } 를\n기입하는 경우, 결제에 사용한 카드를 그대로 간편 결제용 카드\n{@link IIamportSubscription } 로 등록해버린다.\n\n다만, 정히 간편 카드 등록과 결제를 동시에 하고 싶다면,\n`subscribe.payments.onetime` 에 {@link IIamportSubscription.IOnetime.customer_uid }\n를 더하기보다, {@link subscribe.customers.create } 와 {@link subscribe.payments.again }\n을 각각 호출하는 것을 권장한다. 그것이 예외적인 상황에 보다 안전하게 대처할 수 있기\n때문이다.\n\n더하여 `subscribe.payments.onetime` 은 클라이언트 어플리케이션이 아임포트가 제공하는\n결제 창을 그대로 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는 일은\n없을 것이다. 다만, 고객이 카드를 통하여 결제하는 상황을 시뮬레이션하기 위하여, 테스트\n자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"bearer":[]}]}},"/subscribe/payments/again":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"미리 등록한 카드를 이용한 결제 신청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.IAgain"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCardPayment"}}}}},"summary":"간편 결제에 등록된 카드로 결제하기","description":"간편 결제에 등록된 카드로 결제하기.\n\n`subscribe.payments.again` 은 고객이 간편 결제에 등록한 카드로 결제를 진행하고자 할 때\n호출하는 API 함수이다. 이는 간편하고 불편하고를 떠나, 본질적으로 카드 결제의 일환이기에,\n리턴값은 일반적인 카드 결제 때와 동일한 {@link IIamportCardPayment } 이다.\n\n그리고 `subscribe.payments.again` 은 결제 수단 중 유일하게, 클라이언트 어플리케이션이\n아임포트가 제공하는 결체 창을 사용할 수 없어, 오직 귀하의 백엔드 서버가 아임포트의 API\n함수를 직접 호출해야하는 경우에 해당한다. 따라서 간편 결제에 관하여 아임포트 서버와\n연동하는 백엔드 서버 및 프론트 어플리케이션을 개발할 때, 반드시 이 상황에 대한 별도의\n설계 및 개발이 필요하니, 이 점을 염두에 두기 바란다.","security":[{"bearer":[]}]}},"/certifications/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"responses":{"200":{"description":"본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 정보 열람하기","description":"본인인증 정보 열람하기.\n\n`certiciations.at` 은 본인인증 정보를 열람할 때 사용하는 API 함수이다.\n\n다만 이 API 함수를 통하여 열람한 본인인증 정보 {@link IIamportCertification } 이\n곧 OTP 인증까지 마쳐 본인인증을 모두 마친 레코드라는 보장은 없다. 본인인증의 완결\n여부는 오직, {@link IIamportCertification.certified } 값을 직접 검사해봐야만 알\n수 있기 때문이다.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"responses":{"200":{"description":"삭제된 본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 정보 삭제하기","description":"본인인증 정보 삭제하기.","security":[{"bearer":[]}]}},"/certifications/otp/request":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"본인인증 요청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportCertification.ICreate"}}},"required":true},"responses":{"201":{"description":"진행 중인 본인인증의 식별자 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification.IAccessor"}}}}},"summary":"본인인증 요청하기","description":"본인인증 요청하기.\n\n`certifications.otp.request` 는 아임포트 서버에 본인인증을 요청하는 API 함수이다.\n이 API 를 호출하면 본인인증 대상자의 핸드폰으로 OTP 문자가 전송되며, 본인인증\n대상자가 {@link certifications.otp.confirm } 을 통하여 이 OTP 번호를 정확히\n입력함으로써, 본인인증이 완결된다.\n\n또한 본인인증 대상자가 자신의 핸드폰으로 전송된 OTP 문자를 입력하기 전에도,\n여전히해당 본인인증 내역은 {@link certifications.at } 함수를 통하여 조회할 수 있다.\n다만, 이 때 리턴되는 {@link IIamportCertification } 에서 인증의 완결 여부를\n지칭하는 {@link IIamportCertification.certified } 값은 `false` 이다.","security":[{"bearer":[]}]}},"/certifications/otp/confirm/{imp_uid}":{"post":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"requestBody":{"description":"OTP 코드","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportCertification.IConfirm"}}},"required":true},"responses":{"201":{"description":"인증 완료된 본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 시 발급된 OTP 코드 입력하기","description":"본인인증 시 발급된 OTP 코드 입력하기.\n\n`certifications.otp.confirm` 는 {@link certifications.otp.request } 를 통하여\n발급된 본인인증 건에 대하여, 본인인증 대상자의 휴대폰으로 전송된 OTP 번호를\n검증하고, 입력한 OTP 번호가 맞거든 해당 본인인증 건을 승인하여 완료 처리해주는\nAPI 함수이다.\n\n이처럼 본인인증을 완료하거든, 해당 본인인증 건 {@link IIamportCertification } 의\n{@link IIamportCertification.certified } 값이 비로소 `true` 로 변경되어,\n비로소 완결된다.","security":[{"bearer":[]}]}},"/internal/webhook":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"웹훅 이벤트 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPayment.IWebhook"}}},"required":true},"responses":{"201":{"description":""}},"summary":"웹훅 이벤트 더미 리스너","description":"웹훅 이벤트 더미 리스너.\n\n`internal.webhook` 은 실제 아임포트의 서버에는 존재하지 않는 API 로써,\n`fake-impoart-server` 의 {@link Configuration.WEBHOOK_URL } 에 아무런 URL 을 설정하지\n않으면, `fake-iamport-server` 로부터 발생하는 모든 종류의 웹훅 이벤트는 이 곳으로 전달되어\n무의미하게 사라진다.\n\n따라서 `fake-iamport-server` 를 사용하여 아임포트 서버와의 연동을 미리 검증코자 할 때는,\n반드시 {@link Configuration.WEBHOOK_URL } 를 설정하여 웹훅 이벤트가 귀하의 백엔드 서버로\n제대로 전달되도록 하자."}},"/internal/deposit/{imp_uid}":{"put":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 결제의 ","required":true}],"responses":{"201":{"description":""}},"summary":"가상 계좌에 입금하기","description":"가상 계좌에 입금하기.\n\n`internal.deposit` 은 실제 아임포트 결제 서버에는 존재하지 않는 API 로써, 가상 계좌\n결제를 신청한 고객이, 이후 가상 계좌에 목표 금액을 입금하는 상황을 시뮬레이션 할 수 있는\n함수이다.\n\n즉, `internal.deposit` 는 고객이 스스로에게 가상으로 발급된 계좌에 입금을 하고, 그에 따라\n아임포트 서버에서 webhook 이벤트가 발생, 이를 귀하의 백엔드 서버로 전송하는 일련의 상황을\n시뮬레이션하기 위하여 설계된 테스트 함수다.","security":[{"bearer":[]}]}},"/payments/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 결제 기록의 ","required":true},{"name":"query","in":"query","schema":{"$ref":"#/components/schemas/IIamportPayment.IQuery"},"description":"결제 수단이 페이팔인 경우에 사용","required":true}],"responses":{"200":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportPayment"}}}}},"summary":"결제 기록 열람하기","description":"결제 기록 열람하기.\n\n아임포트를 통하여 발생한 결제 기록을 열람한다.","security":[{"bearer":[]}]}},"/payments/cancel":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"결제 취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPaymentCancel.ICreate"}}},"required":true},"responses":{"201":{"description":"취소된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportPayment"}}}}},"summary":"결제 취소하기","description":"결제 취소하기.\n\n만약 가상 계좌를 통한 결제였다면, 반드시 환불 계좌 정보를 입력해줘야 한다.","security":[{"bearer":[]}]}},"/receipts/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"responses":{"200":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 조회하기","description":"현금 영수증 조회하기.","security":[{"bearer":[]}]},"post":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"requestBody":{"description":"현금 영수증 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportReceipt.ICreate"}}},"required":true},"responses":{"201":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 발행하기","description":"현금 영수증 발행하기.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"responses":{"200":{"description":"취소된 현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 취소하기","description":"현금 영수증 취소하기.","security":[{"bearer":[]}]}},"/users/getToken":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"아임포트의 API 및 secret 키 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportUser.IAccessor"}}},"required":true},"responses":{"201":{"description":"유저 인증 토큰 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportUser"}}}}},"summary":"유저 인증 토큰 발행하기","description":"유저 인증 토큰 발행하기.\n\n아임포트에 가입하여 부여받은 API 및 secret 키를 토대로, 유저 인증 토큰을 발행한다.\n\n단, 아임포트가 발급해주는 유저 인증 토큰에는 유효 시간 {@link IIamportUser.expired_at }\n이 있어, 해당 시간이 지나거든 기 발급 토큰이 만료되어 더 이상 쓸 수 없게 된다. 때문에\n아임포트의 이러한 시간 제한에 구애받지 않고 자유로이 아임포트의 API 를 이용하고 싶다면,\n`iamport-server-api` 에서 제공해주는 {@link IamportConnector } 를 활용하도록 하자."}},"/vbanks":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"가상 계좌 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportVBankPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportVBankPayment"}}}}},"summary":"가상 계좌 발급하기","description":"가상 계좌 발급하기.","security":[{"bearer":[]}]},"put":{"tags":[],"parameters":[],"requestBody":{"description":"가상 계좌 편집 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportVBankPayment.IUpdate"}}},"required":true},"responses":{"201":{"description":"편집된 가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportVBankPayment"}}}}},"summary":"가상 계좌 편집하기","description":"가상 계좌 편집하기.","security":[{"bearer":[]}]}}},"components":{"schemas":{"IIamportResponseIIamportSubscription":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportSubscription","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportSubscription":{"type":"object","properties":{"pg_provider":{"type":"string"},"pg_id":{"type":"string"},"card_name":{"type":"string"},"card_code":{"type":"string"},"card_number":{"type":"string"},"card_type":{"type":"string"},"customer_name":{"type":"string","nullable":true},"customer_tel":{"type":"string","nullable":true},"customer_email":{"type":"string","nullable":true},"customer_addr":{"type":"string","nullable":true},"customer_postcode":{"type":"string","nullable":true},"inserted":{"type":"number"},"updated":{"type":"number"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["pg_provider","pg_id","card_name","card_code","card_number","card_type","customer_name","customer_tel","customer_email","customer_addr","customer_postcode","inserted","updated","customer_uid"],"description":"간편 결제 카드 정보."},"IIamportSubscription.ICreate":{"type":"object","properties":{"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호.\n\n형식: XXXX-XXXX-XXXX-XXXX"},"expiry":{"type":"string","pattern":"^([0-9]{4})-(0[1-9]|1[012])$","description":"카드 유효기간.\n\n형식: YYYY-MM"},"birth":{"type":"string","pattern":"^(([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))|(\\d{10})$","description":"생년월일 YYMMDD 또는 사업자등록번호 10자리."},"pwd_2digit":{"type":"string","pattern":"\\d{2}","description":"카드 비밀번호 앞 두 자리."},"cvc":{"type":"string","pattern":"\\d{2}","description":"카드 인증번호 (카드 뒷면 3 자리)."},"customer_name":{"type":"string"},"customer_tel":{"type":"string"},"customer_email":{"type":"string","format":"email"},"customr_addr":{"type":"string"},"customer_postcode":{"type":"string"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["card_number","expiry","birth","customer_uid"],"description":"간편 결제 카드 입력 정보."},"IIamportSubscription.IOnetime":{"type":"object","properties":{"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함.\n\n이를 생략시 단순 결제로만 그치며, 카드 정보가 간편 결제용으로 등록되지 아니함."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호.\n\n형식: XXXX-XXXX-XXXX-XXXX"},"expiry":{"type":"string","pattern":"^([0-9]{4})-(0[1-9]|1[012])$","description":"카드 유효기간.\n\n형식: YYYY-MM"},"birth":{"type":"string","pattern":"^(([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))|(\\d{10})$","description":"생년월일 YYMMDD 또는 사업자등록번호 10자리."},"pwd_2digit":{"type":"string","pattern":"\\d{2}","description":"카드 비밀번호 앞 두 자리."},"cvc":{"type":"string","pattern":"\\d{2}","description":"카드 인증번호 (카드 뒷면 3 자리)."},"customer_name":{"type":"string"},"customer_tel":{"type":"string"},"customer_email":{"type":"string","format":"email"},"customr_addr":{"type":"string"},"customer_postcode":{"type":"string"},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트가 아닌 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"name":{"type":"string","description":"주문 이름."},"currency":{"type":"string","enum":["KRW","USD","EUR","JPY"],"description":"통화 정보."},"tax_free":{"type":"number","description":"면세 공급가액.\n\n기본값은 0 로써, 알아서 amount 의 1/11 로써 부가세 처리됨."},"card_quota":{"type":"number","description":"할부 개월 수.\n\n일시불은 0."},"buyer_name":{"type":"string"},"buyer_email":{"type":"string","format":"email"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"interest_free_by_merchant":{"type":"boolean","description":"카드할부처리할 때, 할부이자가 발생하는 경우 (카드사 무이자 프로모션 제외).\n\n부과되는 할부이자를 고객대신 가맹점이 지불하고자 PG사와 계약된 경우(현재, 나이스페이먼츠만 지원됨)"},"use_card_point":{"type":"boolean","description":"승인요청시 카드사 포인트 차감하며 결제승인처리할지 flag.\n\nPG사 영업담당자와 계약 당시 사전 협의 필요(현재, 나이스페이먼츠만 지원됨)"},"custom_data":{"type":"string","description":"임의 정보를 기재할 수 있다."},"notice_url":{"type":"string","format":"url","description":"결제 성공시 통지될 Notification, 웹훅 URL."}},"nullable":false,"required":["card_number","expiry","birth","merchant_uid","amount","name"],"description":"결제 신청 입력 정보."},"IIamportResponseIIamportCardPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCardPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCardPayment":{"type":"object","properties":{"card_code":{"type":"string","description":"카드 식별자 코드."},"card_name":{"type":"string","description":"카드 이름."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호."},"card_quota":{"type":"integer","description":"할부 개월 수."},"apply_num":{"type":"string","description":"카드사 승인번호."},"pay_method":{"type":"string","enum":["card","samsung"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["card_code","card_name","card_number","card_quota","apply_num","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"카드 결제 정보."},"IIamportPayment.Currency":{"type":"string","enum":["KRW","USD","EUR","JPY"]},"IIamportPayment.Status":{"type":"string","enum":["paid","ready","failed","cancelled"]},"IIamportPaymentCancel":{"type":"object","properties":{"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"amount":{"type":"number"},"cancelled_at":{"type":"number"},"reason":{"type":"string"},"receipt_url":{"type":"string","format":"url"}},"nullable":false,"required":["pg_id","pg_tid","amount","cancelled_at","reason","receipt_url"],"description":"결제 취소 정보."},"IIamportSubscription.IAgain":{"type":"object","properties":{"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트가 아닌 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"name":{"type":"string","description":"주문 이름."},"currency":{"type":"string","enum":["KRW","USD","EUR","JPY"],"description":"통화 정보."},"tax_free":{"type":"number","description":"면세 공급가액.\n\n기본값은 0 로써, 알아서 amount 의 1/11 로써 부가세 처리됨."},"card_quota":{"type":"number","description":"할부 개월 수.\n\n일시불은 0."},"buyer_name":{"type":"string"},"buyer_email":{"type":"string","format":"email"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"interest_free_by_merchant":{"type":"boolean","description":"카드할부처리할 때, 할부이자가 발생하는 경우 (카드사 무이자 프로모션 제외).\n\n부과되는 할부이자를 고객대신 가맹점이 지불하고자 PG사와 계약된 경우(현재, 나이스페이먼츠만 지원됨)"},"use_card_point":{"type":"boolean","description":"승인요청시 카드사 포인트 차감하며 결제승인처리할지 flag.\n\nPG사 영업담당자와 계약 당시 사전 협의 필요(현재, 나이스페이먼츠만 지원됨)"},"custom_data":{"type":"string","description":"임의 정보를 기재할 수 있다."},"notice_url":{"type":"string","format":"url","description":"결제 성공시 통지될 Notification, 웹훅 URL."},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["merchant_uid","amount","name","customer_uid"],"description":"간편 결제 카드로 결제 신청 입력 정보."},"IIamportResponseIIamportCertification":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCertification","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCertification":{"type":"object","properties":{"imp_uid":{"type":"string","description":"아임포트가 발급해 준 식별자 번호."},"merchant_uid":{"type":"string","nullable":true,"description":"서비스로부터의 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","description":"본인인증대상자 성명."},"gender":{"type":"string","description":"성별."},"birth":{"type":"number","description":"생년월일.\n\n리눅스 타임이 쓰인다."},"birthday":{"type":"string","pattern":"^([0-9]{4})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"생년월일, YYYYMMDD 형식."},"foreigner":{"type":"boolean","description":"외국인 여부."},"phone":{"type":"string","description":"본인인증 대상자 핸드폰 번호."},"carrier":{"type":"string","enum":["SKT","KT","LGT"],"description":"본인인증 대상자 통신사 코드."},"certified":{"type":"boolean","description":"OTP 인증 여부."},"certified_at":{"type":"number","description":"OTP 인증 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"unique_key":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"unique_in_site":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"pg_tid":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"pg_provider":{"type":"string","description":"PG 제공자."},"origin":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"__otp":{"type":"string","description":"(테스트 전용) OTP 코드.\n\n오직 `fake-iamport-server` 에서만 쓰이는 속성으로써, 본인인증을 시뮬레이션할 때,\n어떠한 OTP 코드가 발급되었는 지를 확인하기 위하여 사용된다. 이를 이용하여\n{@link functional.certifications.otp.confirm } 함수를 호출하면, 본인인증을 완료할\n수 있다."}},"nullable":false,"required":["imp_uid","merchant_uid","name","gender","birth","birthday","foreigner","phone","carrier","certified","certified_at","unique_key","unique_in_site","pg_tid","pg_provider","origin"],"description":"본인 인증 내역.\n\n`IIamportCertification` 은 아임포트의 본인인증 정보를 형상화한 자료구조 인터페이스이다.\n\n단, `IIamportCertification` 레코드의 존재가 곧 본인인증의 완결을 뜻하는 것은 아니다.\n{@link IIamportCertification.certified } 값이 `true` 여야만이 비로소, 본인인증\n대상자가 자신의 핸드폰 번호로 전송된 OTP 를 아임포트의 본인인증 팝업창에 정확히 적어,\n본인인증을 완료했음을 의미한다."},"IIamportCertification.ICreate":{"type":"object","properties":{"name":{"type":"string","description":"본인인증대상자 성명."},"phone":{"type":"string","description":"본인인증 대상자 핸드폰 번호.\n\n핸드폰 번호에 \"-\" 값이 들어가던 아니던 상관 없음.\n\n다만, 내부적으로는 \"-\" 값을 제거하여 처리한다."},"birth":{"type":"string","pattern":"^([0-9]{4})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"생년월일.\n\nYYYYMMDD 형식."},"gender_digit":{"type":"string","description":"주민등록 뒷부분 첫 자리."},"carrier":{"type":"string","enum":["SKT","KT","LGT"],"description":"본인인증 대상자 통신사 코드."},"is_mvno":{"type":"boolean","description":"알뜰폰 여부."},"commpany":{"type":"string","description":"가맹점 서비스 명칭 또는 domain URL.\n\nKISA 에서 대상자에게 발송하는 SMS에 안내될 서비스 명칭."},"merchant_uid":{"type":"string","description":"귀사 서비스에서의 본인인증 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"pg":{"type":"string","description":"PG 사 구분자.\n\n다날 상점아이디를 2개 이상 동시에 사용하시려는 경우에 설정하면 된다.\n\n**danal.{상점아이디}** 형태로 지정."}},"nullable":false,"required":["name","phone","birth","gender_digit","carrier"],"description":"본인 인증 입력 정보."},"IIamportResponseIIamportCertification.IAccessor":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCertification.IAccessor","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCertification.IAccessor":{"type":"object","properties":{"imp_uid":{"type":"string","description":"본인인증정보의 식별자 키."}},"nullable":false,"required":["imp_uid"],"description":"본인인증 정보의 접근자 구조체."},"IIamportCertification.IConfirm":{"type":"object","properties":{"otp":{"type":"string","description":"SMS 로 전송된 본인인증 번호."}},"nullable":false,"required":["otp"],"description":"본인인증 승인을 위한 입력 정보."},"IIamportPayment.IWebhook":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"status":{"type":"string","enum":["paid","ready","failed","cancelled"],"description":"현재 상태."}},"nullable":false,"required":["imp_uid","merchant_uid","status"],"description":"웹훅 데이터."},"IIamportPayment.IQuery":{"type":"object","properties":{"extension":{"type":"boolean","description":"페이팔의 경우, 이 값을 `true` 로 할 것."}},"nullable":false,"description":"결제 수단이 페이팔인 경우, 페이팔의 구매자 보호정책에 의해 결제 승인 시점에\nPending 상태를 만든 후, 내부 심사등을 통해 최종 결제 완료라고 변경함.\n\n`iamport` 의 기술적 이슈로 해당 상태를 status: failed 로 기록함. 추후\n페이팔에서 최종결제완료로 변경된 경우, `iamport` 에서 `paid` 로 변경 후,\n해당건에 대한 웹훅 발송. `iamport` 를 사용하는 고객사에서는, failed 로 이미\n처리된 결제건에 대한 paid 상태의 웹훅을 받는 문제점이 생김.\n\n이에, `iamport` 에서 제공하는 `/payment/{imp_uid}` 에 query-string 으로\n`extension=true` 옵션을 추가해야 함"},"IIamportResponseIIamportPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportPayment":{"oneOf":[{"$ref":"#/components/schemas/IIamportCardPayment"},{"$ref":"#/components/schemas/IIamportTransferPayment"},{"$ref":"#/components/schemas/IIamportVBankPayment"},{"$ref":"#/components/schemas/IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint"}],"description":"결제 정보.\n\n`IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.pay_method === \"card\")\n payment.card_number; // payment be IIamportCardPayment\n```"},"IIamportTransferPayment":{"type":"object","properties":{"bank_code":{"type":"string","description":"은행 식별자 코드."},"bank_name":{"type":"string","description":"은행 이름."},"pay_method":{"type":"string","enum":["trans"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["bank_code","bank_name","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"계좌 이체 결제 정보."},"IIamportVBankPayment":{"type":"object","properties":{"vbank_code":{"type":"string","description":"가상 계좌 식별자 코드."},"vbank_name":{"type":"string","description":"가상 게좌 이름"},"vbank_num":{"type":"string","description":"가상 계좌 번호"},"vbank_holder":{"type":"string","description":"가상 계좌 예금주."},"vbank_date":{"type":"number","description":"가상 계좌 입금 만료 기한."},"vbank_issued_at":{"type":"number","description":"가상 계좌 개설 일시."},"pay_method":{"type":"string","enum":["vbank"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["vbank_code","vbank_name","vbank_num","vbank_holder","vbank_date","vbank_issued_at","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"가상 계좌 결제 정보."},"IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint":{"type":"object","properties":{"pay_method":{"type":"string","enum":["phone","kpay","kakaopay","payco","lpay","ssgpay","tosspay","cultureland","smartculture","happymoney","booknlife","point"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"결제 기본 (공통) 정보."},"IIamportPaymentCancel.ICreate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"amount":{"type":"number","description":"취소 금액, 부분 취소도 가능하다.\n\n누락시 전액 취소."},"checksum":{"type":"number","minimum":0,"nullable":true,"description":"취소 트랜잭션 수행 전, 현재 시점의 취소 가능한 잔액.\n\nAPI요청자가 기록하고 있는 취소가능 잔액과 아임포트가 기록하고 있는 취소가능 잔액이\n일치하는지 사전에 검증하고, 검증에 실패하면 트랜잭션을 수행하지 않는다.\n\n`null` 인 경우에는 검증 프로세스를 생략."},"reason":{"type":"string","description":"취소 사유."},"tax_free":{"type":"number","default":0,"description":"취소요청금액 중 면세금액."},"refund_holder":{"type":"string","description":"환불계좌 예금주."},"refund_bank":{"type":"string","description":"환불계좌 은행 코드."},"refund_account":{"type":"string","description":"환불계좌 계좌번호."},"refund_tel":{"type":"string","description":"환불계좌 예금주 연락처"}},"nullable":false,"required":["imp_uid","merchant_uid","checksum","reason"],"description":"결제 취소 입력 정보."},"IIamportResponseIIamportReceipt":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportReceipt","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportReceipt":{"type":"object","properties":{"imp_uid":{"type":"string","description":"귀속 결제의 {@link IIamportPayment.imp_uid }."},"receipt_uid":{"type":"string","description":"현금 영수증의 고유 식별자 ID."},"apply_num":{"type":"string","description":"승인 번호."},"type":{"$ref":"#/components/schemas/IIamportReceipt.Type","description":"발행 타입 (대상)."},"amount":{"type":"number","description":"결제 총액."},"vat":{"type":"number","description":"부가세."},"receipt_url":{"type":"string","format":"url","description":"현금영수증 조회 URL."},"applied_at":{"type":"number","description":"현금영수증 발행 시간."},"cancelled_at":{"type":"number","description":"현금영수증 취소 시간.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."}},"nullable":false,"required":["imp_uid","receipt_uid","apply_num","type","amount","vat","receipt_url","applied_at","cancelled_at"],"description":"현금 영수증 정보."},"IIamportReceipt.Type":{"type":"string","enum":["person","company"],"description":"현금영수증 발행 타입 (대상)."},"IIamportReceipt.ICreate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"귀속 결제의 {@link IIamportPayment.imp_uid }."},"identifier":{"type":"string","description":"현금영수증 발생대상 식별정보.\n\n - 국세청현금영수증카드\n - 휴대폰번호\n - 주민등록번호\n - 사업자등록번호"},"identifier_type":{"type":"string","enum":["phone","person","business","taxcard"],"description":"현금영수증 발행대상 유형.\n\n - person: 주민등록번호\n - business: 사업자등록번호\n - phone: 휴대폰번호\n - taxcard: 국세청현금영수증카드\n\n일부 PG 사의 경우 이 항목이 없어 된다는데, 어지간하면 그냥 쓰기 바람."},"type":{"type":"string","enum":["person","company"],"description":"현금영수증 발행 타입 (대상).\n\n누락시 person 이 사용됨."},"buyer_name":{"type":"string","description":"구매자 이름.\n\n형금영수증 발행건 사후 추적을 위해 가급 입력하기 바람."},"buyer_email":{"type":"string","description":"구매자 이메일."},"buyer_tel":{"type":"string","description":"구매자 전화번호.\n\n현금영수증 발행건 사후 추적을 위해 가급 입력하기 바람."},"tax_free":{"type":"number","description":"면세 금액."}},"nullable":false,"required":["imp_uid","identifier"],"description":"현금영수증 입력 정보."},"IIamportUser.IAccessor":{"type":"object","properties":{"imp_key":{"type":"string","description":"API 키."},"imp_secret":{"type":"string","description":"Secret 키."}},"nullable":false,"required":["imp_key","imp_secret"],"description":"아임포트에서 부여해 준 API 및 secret 키."},"IIamportResponseIIamportUser":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportUser","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportUser":{"type":"object","properties":{"now":{"type":"number","description":"토큰 발행 시간."},"expired_at":{"type":"number","description":"토큰 만료 시간.\n\n리눅스 타임이 기준이며, 이를 JS 에서 사용하려거든, 아래와 같이 변환해야 한다.\n\n```typescript\nnew Date(user.expired_at * 1_000);\n```"},"access_token":{"type":"string","description":"유저 인증 토큰."}},"nullable":false,"required":["now","expired_at","access_token"],"description":"아임포트 유저 인증 정보.\n\n아임포트는 고객사에게 API 및 secret 키 정보, {@link IIamportUser.IAccessor } 를 발급해준다.\n\n하지만 이를 곧장 아임포트의 유저 인증에 사용할 수는 없고, 해당 API 및 secret 키를 토대로 유저\n인증 토큰을 발급받아야 하는데, 이 유저 인증 토큰에는 하필이면 만로 시간이라는 게 존재한다.\n`IIamportUser` 는 바로 이러한 유저 인증 토큰 및 그것의 만료 시간을 형상화한 자료구조\n인터페이스이다.\n\n더하여 이처럼 만료 시간이 존재하는 아임포트의 유저 인증 토큰의 특성상, 이것의 만료 시간이\n초과되지 않도록 관리하는 것은 매우 힘든 일이다. 이에 `iamport-server-api` 에서는 아임포트\n유저 인증 토큰이 만료될 때마다 자동 갱신해주는, {@link IamportConnector } 클래스를 제공한다."},"IIamportVBankPayment.ICreate":{"type":"object","properties":{"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"amount":{"type":"number","description":"총액."},"vbank_code":{"type":"string","description":"가상계좌 은행 코드."},"vbank_due":{"type":"number","description":"가상계좌 입금기한, 유닉스 타임."},"vbank_holder":{"type":"string","description":"예금주."},"name":{"type":"string"},"buyer_name":{"type":"string"},"buyer_email":{"type":"string"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"pg":{"type":"string"},"notice_url":{"type":"string","description":"가상 계좌 입금 정보를 수신할 URL.\n\n누락시 기본 웹훅 URL 사용."},"custom_data":{"type":"string","description":"커스텀 데이터, 자유롭게 사용 가능."},"pg_api_key":{"type":"string","description":"[이니시스 전용] 가맹점 콘솔에서 확인한 API 값."}},"nullable":false,"required":["merchant_uid","amount","vbank_code","vbank_due","vbank_holder"],"description":"가상 계좌 결제 입력 정보.\n\n가상 계좌를 임의 생성할 수 있다.\n\n단, 일부 PG 사 혹은 `fake-iamport-server` 만 가능.\n\n - 세틀뱅크\n - 나이스페이먼츠\n - KG이니시스"},"IIamportResponseIIamportVBankPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportVBankPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportVBankPayment.IUpdate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"대상 결제 기록의 {@link IIamportPayment.imp_uid }."},"amount":{"type":"number","description":"수정할 결제 금액."},"vbank_due":{"type":"number","description":"수정할 가상계좌 입금 기한."}},"nullable":false,"required":["imp_uid"],"description":"가상 계좌 결제의 수정 입력 정보.\n\n아직 입금되지 않은 가상계좌의 입금기한 또는 입금금액을 수정할 수 있다.\n\n다만, 세틀뱅크 혹은 `fake-iamport-server` 만 가능."}},"securitySchemes":{"bearer":{"type":"apiKey","name":"Authorization","in":"header"}}}} \ No newline at end of file +{"openapi":"3.0.1","servers":[{"url":"http://localhost:10851","description":"fake"},{"url":"https://api.iamport.kr","description":"real"}],"info":{"title":"Iamport API","description":"Built by [fake-iamport-server](https://github.com/samchon/payments/tree/master/packages/fake-iamport-server) with [nestia](https://github.com/samchon/nestia)","version":"6.0.3","license":{"name":"MIT"}},"paths":{"/subscribe/customers/{customer_uid}":{"get":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"responses":{"200":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 정보 조회하기","description":"간편 결제 카드 정보 조회하기.\n\n`subscribe.customers.at` 은 고객이 {@link create } 나 혹은 아임포트가 제공하는\n간편 결제 카드 등록 창을 이용하여 저장한 간편 결제 카드 정보를 조회하는 API\n함수이다.","security":[{"bearer":[]}]},"post":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"requestBody":{"description":"카드 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.ICreate"}}},"required":true},"responses":{"201":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 등록하기","description":"간편 결제 카드 등록하기.\n\n`subscribe.customers.stoer` 는 고객이 자신의 카드를 서버에 등록해두고, 매번 결제가\n필요할 때마다 카드 정보를 반복 입력하는 일 없이, 간편하게 결제를 진행하고자 할 때\n사용하는 API 함수이다.\n\n참고로 `subscribe.customers.create` 는 클라이언트 어플리케이션이 아임포트가 제공하는\n간편 결제 카드 등록 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는\n일은 없을 것이다. 다만, 고객이 간편 결제 카드를 등록하는 상황을 시뮬레이션하기 위하여,\n테스트 자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"customer_uid","in":"path","schema":{"type":"string"},"description":"고객 (간편 결제 카드) 식별자 키","required":true}],"responses":{"200":{"description":"삭제된 간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportSubscription"}}}}},"summary":"간편 결제 카드 삭제하기","description":"간편 결제 카드 삭제하기.\n\n간편 결제를 위하여 등록한 카드를 제거한다.","security":[{"bearer":[]}]}},"/subscribe/payments/onetime":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"카드 결제 신청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.IOnetime"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCardPayment"}}}}},"summary":"카드로 결제하기, 더불어 간편 결제용으로 등록 가능","description":"카드로 결제하기, 더불어 간편 결제용으로 등록 가능.\n\n`subscribe.payments.onetime` 은 카드를 매개로 한 결제를 하고자 할 때 호출하는 API\n함수이다. 더하여 입력 값에 {@link IIamportSubscription.IOnetime.customer_uid } 를\n기입하는 경우, 결제에 사용한 카드를 그대로 간편 결제용 카드\n{@link IIamportSubscription } 로 등록해버린다.\n\n다만, 정히 간편 카드 등록과 결제를 동시에 하고 싶다면,\n`subscribe.payments.onetime` 에 {@link IIamportSubscription.IOnetime.customer_uid }\n를 더하기보다, {@link subscribe.customers.create } 와 {@link subscribe.payments.again }\n을 각각 호출하는 것을 권장한다. 그것이 예외적인 상황에 보다 안전하게 대처할 수 있기\n때문이다.\n\n더하여 `subscribe.payments.onetime` 은 클라이언트 어플리케이션이 아임포트가 제공하는\n결제 창을 그대로 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는 일은\n없을 것이다. 다만, 고객이 카드를 통하여 결제하는 상황을 시뮬레이션하기 위하여, 테스트\n자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"bearer":[]}]}},"/subscribe/payments/again":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"미리 등록한 카드를 이용한 결제 신청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportSubscription.IAgain"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCardPayment"}}}}},"summary":"간편 결제에 등록된 카드로 결제하기","description":"간편 결제에 등록된 카드로 결제하기.\n\n`subscribe.payments.again` 은 고객이 간편 결제에 등록한 카드로 결제를 진행하고자 할 때\n호출하는 API 함수이다. 이는 간편하고 불편하고를 떠나, 본질적으로 카드 결제의 일환이기에,\n리턴값은 일반적인 카드 결제 때와 동일한 {@link IIamportCardPayment } 이다.\n\n그리고 `subscribe.payments.again` 은 결제 수단 중 유일하게, 클라이언트 어플리케이션이\n아임포트가 제공하는 결체 창을 사용할 수 없어, 오직 귀하의 백엔드 서버가 아임포트의 API\n함수를 직접 호출해야하는 경우에 해당한다. 따라서 간편 결제에 관하여 아임포트 서버와\n연동하는 백엔드 서버 및 프론트 어플리케이션을 개발할 때, 반드시 이 상황에 대한 별도의\n설계 및 개발이 필요하니, 이 점을 염두에 두기 바란다.","security":[{"bearer":[]}]}},"/certifications/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"responses":{"200":{"description":"본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 정보 열람하기","description":"본인인증 정보 열람하기.\n\n`certiciations.at` 은 본인인증 정보를 열람할 때 사용하는 API 함수이다.\n\n다만 이 API 함수를 통하여 열람한 본인인증 정보 {@link IIamportCertification } 이\n곧 OTP 인증까지 마쳐 본인인증을 모두 마친 레코드라는 보장은 없다. 본인인증의 완결\n여부는 오직, {@link IIamportCertification.certified } 값을 직접 검사해봐야만 알\n수 있기 때문이다.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"responses":{"200":{"description":"삭제된 본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 정보 삭제하기","description":"본인인증 정보 삭제하기.","security":[{"bearer":[]}]}},"/certifications/otp/request":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"본인인증 요청 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportCertification.ICreate"}}},"required":true},"responses":{"201":{"description":"진행 중인 본인인증의 식별자 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification.IAccessor"}}}}},"summary":"본인인증 요청하기","description":"본인인증 요청하기.\n\n`certifications.otp.request` 는 아임포트 서버에 본인인증을 요청하는 API 함수이다.\n이 API 를 호출하면 본인인증 대상자의 핸드폰으로 OTP 문자가 전송되며, 본인인증\n대상자가 {@link certifications.otp.confirm } 을 통하여 이 OTP 번호를 정확히\n입력함으로써, 본인인증이 완결된다.\n\n또한 본인인증 대상자가 자신의 핸드폰으로 전송된 OTP 문자를 입력하기 전에도,\n여전히해당 본인인증 내역은 {@link certifications.at } 함수를 통하여 조회할 수 있다.\n다만, 이 때 리턴되는 {@link IIamportCertification } 에서 인증의 완결 여부를\n지칭하는 {@link IIamportCertification.certified } 값은 `false` 이다.","security":[{"bearer":[]}]}},"/certifications/otp/confirm/{imp_uid}":{"post":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 본인인증 정보의 ","required":true}],"requestBody":{"description":"OTP 코드","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportCertification.IConfirm"}}},"required":true},"responses":{"201":{"description":"인증 완료된 본인인증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportCertification"}}}}},"summary":"본인인증 시 발급된 OTP 코드 입력하기","description":"본인인증 시 발급된 OTP 코드 입력하기.\n\n`certifications.otp.confirm` 는 {@link certifications.otp.request } 를 통하여\n발급된 본인인증 건에 대하여, 본인인증 대상자의 휴대폰으로 전송된 OTP 번호를\n검증하고, 입력한 OTP 번호가 맞거든 해당 본인인증 건을 승인하여 완료 처리해주는\nAPI 함수이다.\n\n이처럼 본인인증을 완료하거든, 해당 본인인증 건 {@link IIamportCertification } 의\n{@link IIamportCertification.certified } 값이 비로소 `true` 로 변경되어,\n비로소 완결된다.","security":[{"bearer":[]}]}},"/internal/webhook":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"웹훅 이벤트 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPayment.IWebhook"}}},"required":true},"responses":{"201":{"description":""}},"summary":"웹훅 이벤트 더미 리스너","description":"웹훅 이벤트 더미 리스너.\n\n`internal.webhook` 은 실제 아임포트의 서버에는 존재하지 않는 API 로써,\n`fake-impoart-server` 의 {@link Configuration.WEBHOOK_URL } 에 아무런 URL 을 설정하지\n않으면, `fake-iamport-server` 로부터 발생하는 모든 종류의 웹훅 이벤트는 이 곳으로 전달되어\n무의미하게 사라진다.\n\n따라서 `fake-iamport-server` 를 사용하여 아임포트 서버와의 연동을 미리 검증코자 할 때는,\n반드시 {@link Configuration.WEBHOOK_URL } 를 설정하여 웹훅 이벤트가 귀하의 백엔드 서버로\n제대로 전달되도록 하자."}},"/internal/deposit/{imp_uid}":{"put":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 결제의 ","required":true}],"responses":{"201":{"description":""}},"summary":"가상 계좌에 입금하기","description":"가상 계좌에 입금하기.\n\n`internal.deposit` 은 실제 아임포트 결제 서버에는 존재하지 않는 API 로써, 가상 계좌\n결제를 신청한 고객이, 이후 가상 계좌에 목표 금액을 입금하는 상황을 시뮬레이션 할 수 있는\n함수이다.\n\n즉, `internal.deposit` 는 고객이 스스로에게 가상으로 발급된 계좌에 입금을 하고, 그에 따라\n아임포트 서버에서 webhook 이벤트가 발생, 이를 귀하의 백엔드 서버로 전송하는 일련의 상황을\n시뮬레이션하기 위하여 설계된 테스트 함수다.","security":[{"bearer":[]}]}},"/payments/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"대상 결제 기록의 ","required":true},{"name":"query","in":"query","schema":{"$ref":"#/components/schemas/IIamportPayment.IQuery"},"description":"결제 수단이 페이팔인 경우에 사용","required":true}],"responses":{"200":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportPayment"}}}}},"summary":"결제 기록 열람하기","description":"결제 기록 열람하기.\n\n아임포트를 통하여 발생한 결제 기록을 열람한다.","security":[{"bearer":[]}]}},"/payments/cancel":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"결제 취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPaymentCancel.ICreate"}}},"required":true},"responses":{"201":{"description":"취소된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportPayment"}}}}},"summary":"결제 취소하기","description":"결제 취소하기.\n\n만약 가상 계좌를 통한 결제였다면, 반드시 환불 계좌 정보를 입력해줘야 한다.","security":[{"bearer":[]}]}},"/receipts/{imp_uid}":{"get":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"responses":{"200":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 조회하기","description":"현금 영수증 조회하기.","security":[{"bearer":[]}]},"post":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"requestBody":{"description":"현금 영수증 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportReceipt.ICreate"}}},"required":true},"responses":{"201":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 발행하기","description":"현금 영수증 발행하기.","security":[{"bearer":[]}]},"delete":{"tags":[],"parameters":[{"name":"imp_uid","in":"path","schema":{"type":"string"},"description":"귀속 결제의 ","required":true}],"responses":{"200":{"description":"취소된 현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportReceipt"}}}}},"summary":"현금 영수증 취소하기","description":"현금 영수증 취소하기.","security":[{"bearer":[]}]}},"/users/getToken":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"아임포트의 API 및 secret 키 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportUser.IAccessor"}}},"required":true},"responses":{"201":{"description":"유저 인증 토큰 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportUser"}}}}},"summary":"유저 인증 토큰 발행하기","description":"유저 인증 토큰 발행하기.\n\n아임포트에 가입하여 부여받은 API 및 secret 키를 토대로, 유저 인증 토큰을 발행한다.\n\n단, 아임포트가 발급해주는 유저 인증 토큰에는 유효 시간 {@link IIamportUser.expired_at }\n이 있어, 해당 시간이 지나거든 기 발급 토큰이 만료되어 더 이상 쓸 수 없게 된다. 때문에\n아임포트의 이러한 시간 제한에 구애받지 않고 자유로이 아임포트의 API 를 이용하고 싶다면,\n`iamport-server-api` 에서 제공해주는 {@link IamportConnector } 를 활용하도록 하자."}},"/vbanks":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"가상 계좌 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportVBankPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportVBankPayment"}}}}},"summary":"가상 계좌 발급하기","description":"가상 계좌 발급하기.","security":[{"bearer":[]}]},"put":{"tags":[],"parameters":[],"requestBody":{"description":"가상 계좌 편집 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportVBankPayment.IUpdate"}}},"required":true},"responses":{"201":{"description":"편집된 가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportResponseIIamportVBankPayment"}}}}},"summary":"가상 계좌 편집하기","description":"가상 계좌 편집하기.","security":[{"bearer":[]}]}}},"components":{"schemas":{"IIamportResponseIIamportSubscription":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportSubscription","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportSubscription":{"type":"object","properties":{"pg_provider":{"type":"string"},"pg_id":{"type":"string"},"card_name":{"type":"string"},"card_code":{"type":"string"},"card_number":{"type":"string"},"card_type":{"type":"string"},"customer_name":{"type":"string","nullable":true},"customer_tel":{"type":"string","nullable":true},"customer_email":{"type":"string","nullable":true},"customer_addr":{"type":"string","nullable":true},"customer_postcode":{"type":"string","nullable":true},"inserted":{"type":"number"},"updated":{"type":"number"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["pg_provider","pg_id","card_name","card_code","card_number","card_type","customer_name","customer_tel","customer_email","customer_addr","customer_postcode","inserted","updated","customer_uid"],"description":"간편 결제 카드 정보."},"IIamportSubscription.ICreate":{"type":"object","properties":{"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호.\n\n형식: XXXX-XXXX-XXXX-XXXX"},"expiry":{"type":"string","pattern":"^([0-9]{4})-(0[1-9]|1[012])$","description":"카드 유효기간.\n\n형식: YYYY-MM"},"birth":{"type":"string","pattern":"^(([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))|(\\d{10})$","description":"생년월일 YYMMDD 또는 사업자등록번호 10자리."},"pwd_2digit":{"type":"string","pattern":"\\d{2}","description":"카드 비밀번호 앞 두 자리."},"cvc":{"type":"string","pattern":"\\d{2}","description":"카드 인증번호 (카드 뒷면 3 자리)."},"customer_name":{"type":"string"},"customer_tel":{"type":"string"},"customer_email":{"type":"string","format":"email"},"customr_addr":{"type":"string"},"customer_postcode":{"type":"string"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["card_number","expiry","birth","customer_uid"],"description":"간편 결제 카드 입력 정보."},"IIamportSubscription.IOnetime":{"type":"object","properties":{"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함.\n\n이를 생략시 단순 결제로만 그치며, 카드 정보가 간편 결제용으로 등록되지 아니함."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호.\n\n형식: XXXX-XXXX-XXXX-XXXX"},"expiry":{"type":"string","pattern":"^([0-9]{4})-(0[1-9]|1[012])$","description":"카드 유효기간.\n\n형식: YYYY-MM"},"birth":{"type":"string","pattern":"^(([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))|(\\d{10})$","description":"생년월일 YYMMDD 또는 사업자등록번호 10자리."},"pwd_2digit":{"type":"string","pattern":"\\d{2}","description":"카드 비밀번호 앞 두 자리."},"cvc":{"type":"string","pattern":"\\d{2}","description":"카드 인증번호 (카드 뒷면 3 자리)."},"customer_name":{"type":"string"},"customer_tel":{"type":"string"},"customer_email":{"type":"string","format":"email"},"customr_addr":{"type":"string"},"customer_postcode":{"type":"string"},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트가 아닌 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"name":{"type":"string","description":"주문 이름."},"currency":{"type":"string","enum":["KRW","USD","EUR","JPY"],"description":"통화 정보."},"tax_free":{"type":"number","description":"면세 공급가액.\n\n기본값은 0 로써, 알아서 amount 의 1/11 로써 부가세 처리됨."},"card_quota":{"type":"number","description":"할부 개월 수.\n\n일시불은 0."},"buyer_name":{"type":"string"},"buyer_email":{"type":"string","format":"email"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"interest_free_by_merchant":{"type":"boolean","description":"카드할부처리할 때, 할부이자가 발생하는 경우 (카드사 무이자 프로모션 제외).\n\n부과되는 할부이자를 고객대신 가맹점이 지불하고자 PG사와 계약된 경우(현재, 나이스페이먼츠만 지원됨)"},"use_card_point":{"type":"boolean","description":"승인요청시 카드사 포인트 차감하며 결제승인처리할지 flag.\n\nPG사 영업담당자와 계약 당시 사전 협의 필요(현재, 나이스페이먼츠만 지원됨)"},"custom_data":{"type":"string","description":"임의 정보를 기재할 수 있다."},"notice_url":{"type":"string","format":"url","description":"결제 성공시 통지될 Notification, 웹훅 URL."}},"nullable":false,"required":["card_number","expiry","birth","merchant_uid","amount","name"],"description":"결제 신청 입력 정보."},"IIamportResponseIIamportCardPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCardPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCardPayment":{"type":"object","properties":{"card_code":{"type":"string","description":"카드 식별자 코드."},"card_name":{"type":"string","description":"카드 이름."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호."},"card_quota":{"type":"integer","description":"할부 개월 수."},"apply_num":{"type":"string","description":"카드사 승인번호."},"pay_method":{"type":"string","enum":["card","samsung"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["card_code","card_name","card_number","card_quota","apply_num","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"카드 결제 정보."},"IIamportPayment.Currency":{"type":"string","enum":["KRW","USD","EUR","JPY"]},"IIamportPayment.Status":{"type":"string","enum":["paid","ready","failed","cancelled"]},"IIamportPaymentCancel":{"type":"object","properties":{"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"amount":{"type":"number"},"cancelled_at":{"type":"number"},"reason":{"type":"string"},"receipt_url":{"type":"string","format":"url"}},"nullable":false,"required":["pg_id","pg_tid","amount","cancelled_at","reason","receipt_url"],"description":"결제 취소 정보."},"IIamportSubscription.IAgain":{"type":"object","properties":{"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트가 아닌 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"name":{"type":"string","description":"주문 이름."},"currency":{"type":"string","enum":["KRW","USD","EUR","JPY"],"description":"통화 정보."},"tax_free":{"type":"number","description":"면세 공급가액.\n\n기본값은 0 로써, 알아서 amount 의 1/11 로써 부가세 처리됨."},"card_quota":{"type":"number","description":"할부 개월 수.\n\n일시불은 0."},"buyer_name":{"type":"string"},"buyer_email":{"type":"string","format":"email"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"interest_free_by_merchant":{"type":"boolean","description":"카드할부처리할 때, 할부이자가 발생하는 경우 (카드사 무이자 프로모션 제외).\n\n부과되는 할부이자를 고객대신 가맹점이 지불하고자 PG사와 계약된 경우(현재, 나이스페이먼츠만 지원됨)"},"use_card_point":{"type":"boolean","description":"승인요청시 카드사 포인트 차감하며 결제승인처리할지 flag.\n\nPG사 영업담당자와 계약 당시 사전 협의 필요(현재, 나이스페이먼츠만 지원됨)"},"custom_data":{"type":"string","description":"임의 정보를 기재할 수 있다."},"notice_url":{"type":"string","format":"url","description":"결제 성공시 통지될 Notification, 웹훅 URL."},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["merchant_uid","amount","name","customer_uid"],"description":"간편 결제 카드로 결제 신청 입력 정보."},"IIamportResponseIIamportCertification":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCertification","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCertification":{"type":"object","properties":{"imp_uid":{"type":"string","description":"아임포트가 발급해 준 식별자 번호."},"merchant_uid":{"type":"string","nullable":true,"description":"서비스로부터의 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","description":"본인인증대상자 성명."},"gender":{"type":"string","description":"성별."},"birth":{"type":"number","description":"생년월일.\n\n리눅스 타임이 쓰인다."},"birthday":{"type":"string","pattern":"^([0-9]{4})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"생년월일, YYYYMMDD 형식."},"foreigner":{"type":"boolean","description":"외국인 여부."},"phone":{"type":"string","description":"본인인증 대상자 핸드폰 번호."},"carrier":{"type":"string","enum":["SKT","KT","LGT"],"description":"본인인증 대상자 통신사 코드."},"certified":{"type":"boolean","description":"OTP 인증 여부."},"certified_at":{"type":"number","description":"OTP 인증 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"unique_key":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"unique_in_site":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"pg_tid":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"pg_provider":{"type":"string","description":"PG 제공자."},"origin":{"type":"string","description":"뭔지 잘 모름, 용도 아시는 분?"},"__otp":{"type":"string","description":"(테스트 전용) OTP 코드.\n\n오직 `fake-iamport-server` 에서만 쓰이는 속성으로써, 본인인증을 시뮬레이션할 때,\n어떠한 OTP 코드가 발급되었는 지를 확인하기 위하여 사용된다. 이를 이용하여\n{@link functional.certifications.otp.confirm } 함수를 호출하면, 본인인증을 완료할\n수 있다."}},"nullable":false,"required":["imp_uid","merchant_uid","name","gender","birth","birthday","foreigner","phone","carrier","certified","certified_at","unique_key","unique_in_site","pg_tid","pg_provider","origin"],"description":"본인 인증 내역.\n\n`IIamportCertification` 은 아임포트의 본인인증 정보를 형상화한 자료구조 인터페이스이다.\n\n단, `IIamportCertification` 레코드의 존재가 곧 본인인증의 완결을 뜻하는 것은 아니다.\n{@link IIamportCertification.certified } 값이 `true` 여야만이 비로소, 본인인증\n대상자가 자신의 핸드폰 번호로 전송된 OTP 를 아임포트의 본인인증 팝업창에 정확히 적어,\n본인인증을 완료했음을 의미한다."},"IIamportCertification.ICreate":{"type":"object","properties":{"name":{"type":"string","description":"본인인증대상자 성명."},"phone":{"type":"string","description":"본인인증 대상자 핸드폰 번호.\n\n핸드폰 번호에 \"-\" 값이 들어가던 아니던 상관 없음.\n\n다만, 내부적으로는 \"-\" 값을 제거하여 처리한다."},"birth":{"type":"string","pattern":"^([0-9]{4})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"생년월일.\n\nYYYYMMDD 형식."},"gender_digit":{"type":"string","description":"주민등록 뒷부분 첫 자리."},"carrier":{"type":"string","enum":["SKT","KT","LGT"],"description":"본인인증 대상자 통신사 코드."},"is_mvno":{"type":"boolean","description":"알뜰폰 여부."},"commpany":{"type":"string","description":"가맹점 서비스 명칭 또는 domain URL.\n\nKISA 에서 대상자에게 발송하는 SMS에 안내될 서비스 명칭."},"merchant_uid":{"type":"string","description":"귀사 서비스에서의 본인인증 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"pg":{"type":"string","description":"PG 사 구분자.\n\n다날 상점아이디를 2개 이상 동시에 사용하시려는 경우에 설정하면 된다.\n\n**danal.{상점아이디}** 형태로 지정."}},"nullable":false,"required":["name","phone","birth","gender_digit","carrier"],"description":"본인 인증 입력 정보."},"IIamportResponseIIamportCertification.IAccessor":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportCertification.IAccessor","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportCertification.IAccessor":{"type":"object","properties":{"imp_uid":{"type":"string","description":"본인인증정보의 식별자 키."}},"nullable":false,"required":["imp_uid"],"description":"본인인증 정보의 접근자 구조체."},"IIamportCertification.IConfirm":{"type":"object","properties":{"otp":{"type":"string","description":"SMS 로 전송된 본인인증 번호."}},"nullable":false,"required":["otp"],"description":"본인인증 승인을 위한 입력 정보."},"IIamportPayment.IWebhook":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"status":{"type":"string","enum":["paid","ready","failed","cancelled"],"description":"현재 상태."}},"nullable":false,"required":["imp_uid","merchant_uid","status"],"description":"웹훅 데이터."},"IIamportPayment.IQuery":{"type":"object","properties":{"extension":{"type":"boolean","description":"페이팔의 경우, 이 값을 `true` 로 할 것."}},"nullable":false,"description":"결제 수단이 페이팔인 경우, 페이팔의 구매자 보호정책에 의해 결제 승인 시점에\nPending 상태를 만든 후, 내부 심사등을 통해 최종 결제 완료라고 변경함.\n\n`iamport` 의 기술적 이슈로 해당 상태를 status: failed 로 기록함. 추후\n페이팔에서 최종결제완료로 변경된 경우, `iamport` 에서 `paid` 로 변경 후,\n해당건에 대한 웹훅 발송. `iamport` 를 사용하는 고객사에서는, failed 로 이미\n처리된 결제건에 대한 paid 상태의 웹훅을 받는 문제점이 생김.\n\n이에, `iamport` 에서 제공하는 `/payment/{imp_uid}` 에 query-string 으로\n`extension=true` 옵션을 추가해야 함"},"IIamportResponseIIamportPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportPayment":{"oneOf":[{"$ref":"#/components/schemas/IIamportCardPayment"},{"$ref":"#/components/schemas/IIamportTransferPayment"},{"$ref":"#/components/schemas/IIamportVBankPayment"},{"$ref":"#/components/schemas/IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint"}],"description":"결제 정보.\n\n`IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.pay_method === \"card\")\n payment.card_number; // payment be IIamportCardPayment\n```"},"IIamportTransferPayment":{"type":"object","properties":{"bank_code":{"type":"string","description":"은행 식별자 코드."},"bank_name":{"type":"string","description":"은행 이름."},"pay_method":{"type":"string","enum":["trans"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["bank_code","bank_name","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"계좌 이체 결제 정보."},"IIamportVBankPayment":{"type":"object","properties":{"vbank_code":{"type":"string","description":"가상 계좌 식별자 코드."},"vbank_name":{"type":"string","description":"가상 게좌 이름"},"vbank_num":{"type":"string","description":"가상 계좌 번호"},"vbank_holder":{"type":"string","description":"가상 계좌 예금주."},"vbank_date":{"type":"number","description":"가상 계좌 입금 만료 기한."},"vbank_issued_at":{"type":"number","description":"가상 계좌 개설 일시."},"pay_method":{"type":"string","enum":["vbank"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["vbank_code","vbank_name","vbank_num","vbank_holder","vbank_date","vbank_issued_at","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"가상 계좌 결제 정보."},"IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint":{"type":"object","properties":{"pay_method":{"type":"string","enum":["phone","kpay","kakaopay","payco","lpay","ssgpay","tosspay","cultureland","smartculture","happymoney","booknlife","point"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"결제 기본 (공통) 정보."},"IIamportPaymentCancel.ICreate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"amount":{"type":"number","description":"취소 금액, 부분 취소도 가능하다.\n\n누락시 전액 취소."},"checksum":{"type":"number","minimum":0,"nullable":true,"description":"취소 트랜잭션 수행 전, 현재 시점의 취소 가능한 잔액.\n\nAPI요청자가 기록하고 있는 취소가능 잔액과 아임포트가 기록하고 있는 취소가능 잔액이\n일치하는지 사전에 검증하고, 검증에 실패하면 트랜잭션을 수행하지 않는다.\n\n`null` 인 경우에는 검증 프로세스를 생략."},"reason":{"type":"string","description":"취소 사유."},"tax_free":{"type":"number","default":0,"description":"취소요청금액 중 면세금액."},"refund_holder":{"type":"string","description":"환불계좌 예금주."},"refund_bank":{"type":"string","description":"환불계좌 은행 코드."},"refund_account":{"type":"string","description":"환불계좌 계좌번호."},"refund_tel":{"type":"string","description":"환불계좌 예금주 연락처"}},"nullable":false,"required":["imp_uid","merchant_uid","checksum","reason"],"description":"결제 취소 입력 정보."},"IIamportResponseIIamportReceipt":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportReceipt","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportReceipt":{"type":"object","properties":{"imp_uid":{"type":"string","description":"귀속 결제의 {@link IIamportPayment.imp_uid }."},"receipt_uid":{"type":"string","description":"현금 영수증의 고유 식별자 ID."},"apply_num":{"type":"string","description":"승인 번호."},"type":{"$ref":"#/components/schemas/IIamportReceipt.Type","description":"발행 타입 (대상)."},"amount":{"type":"number","description":"결제 총액."},"vat":{"type":"number","description":"부가세."},"receipt_url":{"type":"string","format":"url","description":"현금영수증 조회 URL."},"applied_at":{"type":"number","description":"현금영수증 발행 시간."},"cancelled_at":{"type":"number","description":"현금영수증 취소 시간.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."}},"nullable":false,"required":["imp_uid","receipt_uid","apply_num","type","amount","vat","receipt_url","applied_at","cancelled_at"],"description":"현금 영수증 정보."},"IIamportReceipt.Type":{"type":"string","enum":["person","company"],"description":"현금영수증 발행 타입 (대상)."},"IIamportReceipt.ICreate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"귀속 결제의 {@link IIamportPayment.imp_uid }."},"identifier":{"type":"string","description":"현금영수증 발생대상 식별정보.\n\n - 국세청현금영수증카드\n - 휴대폰번호\n - 주민등록번호\n - 사업자등록번호"},"identifier_type":{"type":"string","enum":["phone","person","business","taxcard"],"description":"현금영수증 발행대상 유형.\n\n - person: 주민등록번호\n - business: 사업자등록번호\n - phone: 휴대폰번호\n - taxcard: 국세청현금영수증카드\n\n일부 PG 사의 경우 이 항목이 없어 된다는데, 어지간하면 그냥 쓰기 바람."},"type":{"type":"string","enum":["person","company"],"description":"현금영수증 발행 타입 (대상).\n\n누락시 person 이 사용됨."},"buyer_name":{"type":"string","description":"구매자 이름.\n\n형금영수증 발행건 사후 추적을 위해 가급 입력하기 바람."},"buyer_email":{"type":"string","description":"구매자 이메일."},"buyer_tel":{"type":"string","description":"구매자 전화번호.\n\n현금영수증 발행건 사후 추적을 위해 가급 입력하기 바람."},"tax_free":{"type":"number","description":"면세 금액."}},"nullable":false,"required":["imp_uid","identifier"],"description":"현금영수증 입력 정보."},"IIamportUser.IAccessor":{"type":"object","properties":{"imp_key":{"type":"string","description":"API 키."},"imp_secret":{"type":"string","description":"Secret 키."}},"nullable":false,"required":["imp_key","imp_secret"],"description":"아임포트에서 부여해 준 API 및 secret 키."},"IIamportResponseIIamportUser":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportUser","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportUser":{"type":"object","properties":{"now":{"type":"number","description":"토큰 발행 시간."},"expired_at":{"type":"number","description":"토큰 만료 시간.\n\n리눅스 타임이 기준이며, 이를 JS 에서 사용하려거든, 아래와 같이 변환해야 한다.\n\n```typescript\nnew Date(user.expired_at * 1_000);\n```"},"access_token":{"type":"string","description":"유저 인증 토큰."}},"nullable":false,"required":["now","expired_at","access_token"],"description":"아임포트 유저 인증 정보.\n\n아임포트는 고객사에게 API 및 secret 키 정보, {@link IIamportUser.IAccessor } 를 발급해준다.\n\n하지만 이를 곧장 아임포트의 유저 인증에 사용할 수는 없고, 해당 API 및 secret 키를 토대로 유저\n인증 토큰을 발급받아야 하는데, 이 유저 인증 토큰에는 하필이면 만로 시간이라는 게 존재한다.\n`IIamportUser` 는 바로 이러한 유저 인증 토큰 및 그것의 만료 시간을 형상화한 자료구조\n인터페이스이다.\n\n더하여 이처럼 만료 시간이 존재하는 아임포트의 유저 인증 토큰의 특성상, 이것의 만료 시간이\n초과되지 않도록 관리하는 것은 매우 힘든 일이다. 이에 `iamport-server-api` 에서는 아임포트\n유저 인증 토큰이 만료될 때마다 자동 갱신해주는, {@link IamportConnector } 클래스를 제공한다."},"IIamportVBankPayment.ICreate":{"type":"object","properties":{"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"amount":{"type":"number","description":"총액."},"vbank_code":{"type":"string","description":"가상계좌 은행 코드."},"vbank_due":{"type":"number","description":"가상계좌 입금기한, 유닉스 타임."},"vbank_holder":{"type":"string","description":"예금주."},"name":{"type":"string"},"buyer_name":{"type":"string"},"buyer_email":{"type":"string"},"buyer_tel":{"type":"string"},"buyer_addr":{"type":"string"},"buyer_postcode":{"type":"string"},"pg":{"type":"string"},"notice_url":{"type":"string","description":"가상 계좌 입금 정보를 수신할 URL.\n\n누락시 기본 웹훅 URL 사용."},"custom_data":{"type":"string","description":"커스텀 데이터, 자유롭게 사용 가능."},"pg_api_key":{"type":"string","description":"[이니시스 전용] 가맹점 콘솔에서 확인한 API 값."}},"nullable":false,"required":["merchant_uid","amount","vbank_code","vbank_due","vbank_holder"],"description":"가상 계좌 결제 입력 정보.\n\n가상 계좌를 임의 생성할 수 있다.\n\n단, 일부 PG 사 혹은 `fake-iamport-server` 만 가능.\n\n - 세틀뱅크\n - 나이스페이먼츠\n - KG이니시스"},"IIamportResponseIIamportVBankPayment":{"type":"object","properties":{"code":{"type":"number","description":"에러 코드.\n\n값이 0 이면 오류가 없다는 뜻."},"message":{"type":"string","description":"성공 또는 오류 메시지."},"response":{"$ref":"#/components/schemas/IIamportVBankPayment","description":"응답 데이터, 사실상 본문."}},"nullable":false,"required":["code","message","response"],"description":"아임포트 고유의 응답 데이터."},"IIamportVBankPayment.IUpdate":{"type":"object","properties":{"imp_uid":{"type":"string","description":"대상 결제 기록의 {@link IIamportPayment.imp_uid }."},"amount":{"type":"number","description":"수정할 결제 금액."},"vbank_due":{"type":"number","description":"수정할 가상계좌 입금 기한."}},"nullable":false,"required":["imp_uid"],"description":"가상 계좌 결제의 수정 입력 정보.\n\n아직 입금되지 않은 가상계좌의 입금기한 또는 입금금액을 수정할 수 있다.\n\n다만, 세틀뱅크 혹은 `fake-iamport-server` 만 가능."}},"securitySchemes":{"bearer":{"type":"apiKey","name":"Authorization","in":"header"}}}} \ No newline at end of file diff --git a/packages/payment-api/package.json b/packages/payment-api/package.json index 621447e..b3dcd04 100644 --- a/packages/payment-api/package.json +++ b/packages/payment-api/package.json @@ -1,6 +1,6 @@ { "name": "@samchon/payment-api", - "version": "6.0.2", + "version": "6.0.3", "description": "API for Payment Backend", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -36,8 +36,8 @@ "dependencies": { "@nestia/fetcher": "^2.4.5", "@types/node": "^20.11.5", - "iamport-server-api": "^6.0.2", - "toss-payments-server-api": "^6.0.2", + "iamport-server-api": "^6.0.3", + "toss-payments-server-api": "^6.0.3", "typia": "^5.3.12" } } \ No newline at end of file diff --git a/packages/payment-api/swagger.json b/packages/payment-api/swagger.json index eef0c24..cfcbb86 100644 --- a/packages/payment-api/swagger.json +++ b/packages/payment-api/swagger.json @@ -1 +1 @@ -{"openapi":"3.0.1","servers":[{"url":"https://github.com/samchon/nestia","description":"insert your server url"}],"info":{"version":"6.0.2","title":"@samchon/payment-backend","description":"Payment Backend Server","license":{"name":"MIT"}},"paths":{"/monitors/health":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":""}}}},"/monitors/performance":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.G.et](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPerformance"}}},"x-nestia-encrypted":true}}}},"/monitors/system":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.G.et](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ISystem"}}},"x-nestia-encrypted":true}}}},"/payments/histories/get":{"patch":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역의 원천 정보 + 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IAccessor"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 상세 조회하기","description":"결제 내역 상세 조회하기."}},"/payments/histories/{id}":{"patch":{"tags":[],"parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"description":"Primary Key","required":true}],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역의 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IPassword"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 상세 조회하기","description":"결제 내역 상세 조회하기."}},"/payments/histories":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ost](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 발행하기","description":"결제 내역 발행하기."}},"/payments/histories/cancel":{"put":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 취소 내역 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentCancelHistory.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ut](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 취소하기","description":"결제 취소하기."}},"/payments/reservations/get":{"patch":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단의 원천 정보 + 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IAccessor"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 조회하기","description":"간편 결제 수단 조회하기."}},"/payments/reservations/{id}":{"patch":{"tags":[],"parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"description":"Primary Key","required":true}],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IPassword"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 조회하기","description":"간편 결제 수단 조회하기."}},"/payments/reservations":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ost](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 등록하기","description":"간편 결제 수단 등록하기."}},"/payments/webhooks/iamport":{"post":{"tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPayment.IWebhook"}}},"required":true},"responses":{"201":{"description":""}}}}},"components":{"schemas":{"IPerformance":{"type":"object","properties":{"cpu":{"$ref":"#/components/schemas/process.global.NodeJS.CpuUsage"},"memory":{"$ref":"#/components/schemas/process.global.NodeJS.MemoryUsage"},"resource":{"$ref":"#/components/schemas/process.global.NodeJS.ResourceUsage"}},"nullable":false,"required":["cpu","memory","resource"]},"process.global.NodeJS.CpuUsage":{"type":"object","properties":{"user":{"type":"number"},"system":{"type":"number"}},"nullable":false,"required":["user","system"]},"process.global.NodeJS.MemoryUsage":{"type":"object","properties":{"rss":{"type":"number"},"heapTotal":{"type":"number"},"heapUsed":{"type":"number"},"external":{"type":"number"},"arrayBuffers":{"type":"number"}},"nullable":false,"required":["rss","heapTotal","heapUsed","external","arrayBuffers"]},"process.global.NodeJS.ResourceUsage":{"type":"object","properties":{"fsRead":{"type":"number"},"fsWrite":{"type":"number"},"involuntaryContextSwitches":{"type":"number"},"ipcReceived":{"type":"number"},"ipcSent":{"type":"number"},"majorPageFault":{"type":"number"},"maxRSS":{"type":"number"},"minorPageFault":{"type":"number"},"sharedMemorySize":{"type":"number"},"signalsCount":{"type":"number"},"swappedOut":{"type":"number"},"systemCPUTime":{"type":"number"},"unsharedDataSize":{"type":"number"},"unsharedStackSize":{"type":"number"},"userCPUTime":{"type":"number"},"voluntaryContextSwitches":{"type":"number"}},"nullable":false,"required":["fsRead","fsWrite","involuntaryContextSwitches","ipcReceived","ipcSent","majorPageFault","maxRSS","minorPageFault","sharedMemorySize","signalsCount","swappedOut","systemCPUTime","unsharedDataSize","unsharedStackSize","userCPUTime","voluntaryContextSwitches"]},"ISystem":{"type":"object","properties":{"uid":{"type":"string","description":"Random Unique ID."},"arguments":{"type":"array","items":{"type":"string"},"description":"`process.argv`"},"commit":{"$ref":"#/components/schemas/ISystem.ICommit","description":"Git commit information."},"package":{"$ref":"#/components/schemas/ISystem.IPackage","description":"`package.json`"},"created_at":{"type":"string","description":"Creation time of this system."}},"nullable":false,"required":["uid","arguments","commit","package","created_at"]},"ISystem.ICommit":{"type":"object","properties":{"shortHash":{"type":"string"},"branch":{"type":"string"},"hash":{"type":"string"},"subject":{"type":"string"},"sanitizedSubject":{"type":"string"},"body":{"type":"string"},"author":{"$ref":"#/components/schemas/ISystem.ICommit.IUser"},"committer":{"$ref":"#/components/schemas/ISystem.ICommit.IUser"},"authored_at":{"type":"string"},"commited_at":{"type":"string"},"notes":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"nullable":false,"required":["shortHash","branch","hash","subject","sanitizedSubject","body","author","committer","authored_at","commited_at","tags"],"description":"Git commit information."},"ISystem.ICommit.IUser":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"nullable":false,"required":["name","email"],"description":"Git user information."},"ISystem.IPackage":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"scripts":{"$ref":"#/components/schemas/Recordstringstring"},"repository":{"type":"object","properties":{"type":{"type":"string","enum":["git"]},"url":{"type":"string"}},"nullable":false,"required":["type","url"]},"author":{"type":"string"},"license":{"type":"string"},"bugs":{"type":"object","properties":{"url":{"type":"string"}},"nullable":false,"required":["url"]},"homepage":{"type":"string"},"devDependencies":{"$ref":"#/components/schemas/Recordstringstring"},"dependencies":{"$ref":"#/components/schemas/Recordstringstring"},"publishConfig":{"type":"object","properties":{"registry":{"type":"string"}},"nullable":false,"required":["registry"]},"main":{"type":"string"},"typings":{"type":"string"},"files":{"type":"array","items":{"type":"string"}}},"nullable":false,"required":["name","version","description","scripts","repository","author","license","bugs","homepage","devDependencies","dependencies"],"description":"NPM package information."},"Recordstringstring":{"type":"object","properties":{},"nullable":false,"description":"Construct a type with a set of properties K of type T"},"IPaymentSource.IAccessor":{"type":"object","properties":{"schema":{"type":"string","description":"DB 스키마 이름"},"table":{"type":"string","description":"DB 테이블 명"},"id":{"type":"string","format":"uuid","description":"참조 레코드의 PK"},"password":{"type":"string","description":"레코드 조회를 위한 비밀번호 입력."}},"nullable":false,"required":["schema","table","id","password"],"description":"접근자 정보.\n\n`IPaymentSource.IAccessor` 는 {@link IPaymentHistory 결제 내역} 내지\n{@link IPaymentReservation 간편 결제 수단 정보}를 조회할 때, 그것의 고유 식별자\nID 가 아닌 원천 레코드 식별자 정보 {@link IPaymentSource } 를 통하여 조회할 때\n사용하는 접근자 정보이다.\n\n다만 `payments-server` 의 모든 개별 레코드는 이를 조회할 시 비밀번호가 필요하기에,\n{@link IPaymentSource } 의 속성들에 비밀번호가 하나 더 추가되었을 뿐이다."},"IPaymentHistory":{"oneOf":[{"$ref":"#/components/schemas/IPaymentHistory.IamportType"},{"$ref":"#/components/schemas/IPaymentHistory.TossType"}],"description":"결제 내역.\n\n`IPaymentHistory` 는 결제 내역을 형상화한 자료구조이자 유니언 타입의 인터페이이다.\n서비스 시스템으로부 결제 사건의 귀속 정보 ({@link IPaymentHistory.ICreate.vendor } +\n{@link IPaymentHistory.ICreate.source }) 를 전달받아, 본 Payment 시스템이 PG 사에\n추가 정보를 취득하여 레코드가 완성된다.\n\n그리고 만일 현 결제 건이 가상계좌와 같이 레코드 생성 시점에 지불이 이루어지지 않은\n경우라면, 사후 {@link IPaymentWebhook 웹훅 이벤트}를 통하여 지불 완료 시각을 뜻하는\n{@link paid_at } 가 설정될 수 있다. 그리고 반대로 이미 결제가 완료된 경우라도,\n환불 등의 이유로 인하여 {@link cancelled_at } 이 사후 기재될 수 있다.\n\n참고로 `if condition` 을 통하여 {@link IPaymentHistory.vendor_code } 값을 특정하면,\n파생 타입이 자동으로 다운 캐스팅 된다.\n\n```typescript\nif (history.vendor_code === \"toss.payments\")\n history.data.paymentKey; // history.data be ITossPayment\n```"},"IPaymentHistory.IamportType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["iamport"],"description":"벤더사 식별자 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. `if condition` 을 통하여\n{@link IPaymentHistory.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamport","description":"벤더 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 래코드 정보."},"data":{"$ref":"#/components/schemas/IIamportPayment","description":"결제 상세 데이터, 벤더별로 데이터 양식이 다르니 주의할 것."},"currency":{"type":"string","description":"통화 단위\n\nKRW, USB, JPY 등."},"price":{"type":"number","minimum":0,"description":"결제 가격."},"refund":{"type":"number","minimum":0,"nullable":true,"description":"결제 취소시의 환불 금액."},"webhook_url":{"type":"string","format":"url","nullable":true,"description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"},"created_at":{"type":"string","format":"date-time","description":"결제 레코드 생성 일시."},"paid_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 완료 일시."},"cancelled_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 취소 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/IPaymentCancelHistory"},"description":"결제 취소 내역 리스트."}},"nullable":false,"required":["id","vendor_code","vendor","source","data","currency","price","refund","webhook_url","created_at","paid_at","cancelled_at","cancels"],"description":"아임포트로부터의 결제 내역."},"IPaymentVendoriamport":{"type":"object","properties":{"code":{"type":"string","enum":["iamport"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IPaymentSource":{"type":"object","properties":{"schema":{"type":"string","description":"DB 스키마 이름"},"table":{"type":"string","description":"DB 테이블 명"},"id":{"type":"string","format":"uuid","description":"참조 레코드의 PK"}},"nullable":false,"required":["schema","table","id"],"description":"원천 레코드 참조 정보.\n\n`IPaymentSource` 는 {@link IPaymentHistory 결제 내역} 및\n{@link IPaymentResrvation 간편 결제 수단}의 원천이 되는 레코드의 참조 정보를 형상화한\n자료구조 인터페이이다. 만일 대상이 {@link IPaymentHistory 결제 내역}이라면 결제의\n근원이 되는 주문에 대한 참조 정보를, 대상이 {@link IPaymentResrvation 간편 결제 수단}\n이라면 이를 기록한 귀사 서비스의 참조 정보를 기입하면 된다."},"IIamportPayment":{"oneOf":[{"$ref":"#/components/schemas/IIamportCardPayment"},{"$ref":"#/components/schemas/IIamportTransferPayment"},{"$ref":"#/components/schemas/IIamportVBankPayment"},{"$ref":"#/components/schemas/IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint"}],"description":"결제 정보.\n\n`IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.pay_method === \"card\")\n payment.card_number; // payment be IIamportCardPayment\n```"},"IIamportCardPayment":{"type":"object","properties":{"card_code":{"type":"string","description":"카드 식별자 코드."},"card_name":{"type":"string","description":"카드 이름."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호."},"card_quota":{"type":"integer","description":"할부 개월 수."},"apply_num":{"type":"string","description":"카드사 승인번호."},"pay_method":{"type":"string","enum":["card","samsung"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["card_code","card_name","card_number","card_quota","apply_num","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"카드 결제 정보."},"IIamportPayment.Currency":{"type":"string","enum":["KRW","USD","EUR","JPY"]},"IIamportPayment.Status":{"type":"string","enum":["paid","ready","failed","cancelled"]},"IIamportPaymentCancel":{"type":"object","properties":{"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"amount":{"type":"number"},"cancelled_at":{"type":"number"},"reason":{"type":"string"},"receipt_url":{"type":"string","format":"url"}},"nullable":false,"required":["pg_id","pg_tid","amount","cancelled_at","reason","receipt_url"],"description":"결제 취소 정보."},"IIamportTransferPayment":{"type":"object","properties":{"bank_code":{"type":"string","description":"은행 식별자 코드."},"bank_name":{"type":"string","description":"은행 이름."},"pay_method":{"type":"string","enum":["trans"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["bank_code","bank_name","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"계좌 이체 결제 정보."},"IIamportVBankPayment":{"type":"object","properties":{"vbank_code":{"type":"string","description":"가상 계좌 식별자 코드."},"vbank_name":{"type":"string","description":"가상 게좌 이름"},"vbank_num":{"type":"string","description":"가상 계좌 번호"},"vbank_holder":{"type":"string","description":"가상 계좌 예금주."},"vbank_date":{"type":"number","description":"가상 계좌 입금 만료 기한."},"vbank_issued_at":{"type":"number","description":"가상 계좌 개설 일시."},"pay_method":{"type":"string","enum":["vbank"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["vbank_code","vbank_name","vbank_num","vbank_holder","vbank_date","vbank_issued_at","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"가상 계좌 결제 정보."},"IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint":{"type":"object","properties":{"pay_method":{"type":"string","enum":["phone","kpay","kakaopay","payco","lpay","ssgpay","tosspay","cultureland","smartculture","happymoney","booknlife","point"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"결제 기본 (공통) 정보."},"IPaymentCancelHistory":{"type":"object","properties":{"reason":{"type":"string","description":"결제 취소 사유."},"price":{"type":"number","minimum":0,"description":"환불 금액."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시.\n\n즉, 결제 취소가 발생한 시각."}},"nullable":false,"required":["reason","price","created_at"],"description":"결제 취소 내역."},"IPaymentHistory.TossType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["toss.payments"],"description":"벤더사 식별자 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. `if condition` 을 통하여\n{@link IPaymentHistory.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendortoss.payments","description":"벤더 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 래코드 정보."},"data":{"$ref":"#/components/schemas/ITossPayment","description":"결제 상세 데이터, 벤더별로 데이터 양식이 다르니 주의할 것."},"currency":{"type":"string","description":"통화 단위\n\nKRW, USB, JPY 등."},"price":{"type":"number","minimum":0,"description":"결제 가격."},"refund":{"type":"number","minimum":0,"nullable":true,"description":"결제 취소시의 환불 금액."},"webhook_url":{"type":"string","format":"url","nullable":true,"description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"},"created_at":{"type":"string","format":"date-time","description":"결제 레코드 생성 일시."},"paid_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 완료 일시."},"cancelled_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 취소 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/IPaymentCancelHistory"},"description":"결제 취소 내역 리스트."}},"nullable":false,"required":["id","vendor_code","vendor","source","data","currency","price","refund","webhook_url","created_at","paid_at","cancelled_at","cancels"],"description":"토스 페이먼츠로부터의 결제 내역."},"IPaymentVendortoss.payments":{"type":"object","properties":{"code":{"type":"string","enum":["toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"ITossPayment":{"oneOf":[{"$ref":"#/components/schemas/ITossCardPayment"},{"$ref":"#/components/schemas/ITossGiftCertificatePayment"},{"$ref":"#/components/schemas/ITossMobilePhonePayment"},{"$ref":"#/components/schemas/ITossTransferPayment"},{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}],"description":"결제 정보.\n\n`ITossPayment` 는 토스 페이먼츠의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.method === \"카드\")\n payment.card; // payment be ITossCardPayment\n```"},"ITossCardPayment":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/ITossCardPayment.ICard","description":"카드 정보."},"discount":{"$ref":"#/components/schemas/ITossCardPayment.IDiscount.Nullable","description":"카드사의 즉시 할인 프로모션 정보."},"easyPay":{"type":"string","enum":["토스결제","페이코","삼성페이"],"nullable":true,"description":"간편결제로 결제한 경우 간편결제 타입 정보."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL","BILLING"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["card","discount","easyPay","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"카드 결제 정보."},"ITossCardPayment.ICard":{"type":"object","properties":{"company":{"type":"string","description":"카드사 이름."},"number":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"installmentPlanMonths":{"type":"number","description":"할부 개월 수."},"isInterestFree":{"type":"boolean","description":"무이자 할부 적용 여부."},"approveNo":{"type":"string","description":"승인 번호."},"useCardPoint":{"type":"boolean","enum":[false],"description":"카드 포인트 사용 여부."},"cardType":{"type":"string","enum":["신용","체크","기프트"],"description":"카드 타입."},"ownerType":{"type":"string","enum":["개인","법인"],"description":"카드의 소유자 타입."},"acquireStatus":{"type":"string","enum":["READY","CANCELED","REQUESTED","COMPLETED","CANCEL_REQUESTED"],"description":"카드 결제의 매입 상태.\n\n - READY: 매입 대기\n - REQUESTED: 매입 요청됨\n - COMPLETED: 매입 완료\n - CANCEL_REQUESTED: 매입 취소 요청됨\n - CANCELD: 매입 취소됨"},"receiptUrl":{"type":"string","format":"url","description":"영수증 URL."}},"nullable":false,"required":["company","number","installmentPlanMonths","isInterestFree","approveNo","useCardPoint","cardType","ownerType","acquireStatus","receiptUrl"],"description":"카드 정보."},"ITossCardPayment.IDiscount.Nullable":{"type":"object","properties":{"amount":{"type":"number","description":"카드사의 즉시 할인 프로모션을 적용한 금액."}},"nullable":true,"required":["amount"],"description":"카드사의 즉시 할인 프로모션 정보."},"ITossPaymentCancel":{"type":"object","properties":{"cancelAmount":{"type":"number","description":"취소 총액."},"cancelReason":{"type":"string","description":"취소 사유."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"taxAmount":{"type":"number","description":"과세 처리된 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."},"canceledAt":{"type":"string","format":"date-time","description":"취소 일시."}},"nullable":false,"required":["cancelAmount","cancelReason","taxFreeAmount","taxAmount","refundableAmount","canceledAt"],"description":"결제 취소 정보."},"ITossCashReceipt.ISummary.Nullable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"amount":{"type":"number","description":"현금 영수증 처리된 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"issueNumber":{"type":"string","description":"현금영수증 발급번호."},"receiptUrl":{"type":"string","description":"현금영수증 조회 페이지 주소."}},"nullable":true,"required":["type","amount","taxFreeAmount","issueNumber","receiptUrl"],"description":"현금 영수증 요약 정보."},"ITossCashReceipt.Type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"ITossGiftCertificatePayment":{"type":"object","properties":{"giftCertificate":{"$ref":"#/components/schemas/ITossGiftCertificatePayment.IGiftCertificate","description":"상품권 정보."},"method":{"type":"string","enum":["상품권"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["giftCertificate","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"상품권 결제 정보."},"ITossGiftCertificatePayment.IGiftCertificate":{"type":"object","properties":{"approveNo":{"type":"string","description":"승인 번호."},"settlementStatus":{"type":"string","enum":["COMPLETE","INCOMPLETE"],"description":"정산 상태."}},"nullable":false,"required":["approveNo","settlementStatus"],"description":"상품권 정보."},"ITossMobilePhonePayment":{"type":"object","properties":{"mobilePhone":{"$ref":"#/components/schemas/ITossMobilePhonePayment.IMobilePhone","description":"휴대폰 정보."},"method":{"type":"string","enum":["휴대폰"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["mobilePhone","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"휴대폰 결제 정보."},"ITossMobilePhonePayment.IMobilePhone":{"type":"object","properties":{"carrier":{"type":"string","description":"통신사."},"customerMobilePhone":{"type":"string","description":"고객 휴대폰 번호."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."}},"nullable":false,"required":["carrier","customerMobilePhone","settlementStatus"],"description":"휴대폰 정보."},"ITossTransferPayment":{"type":"object","properties":{"transfer":{"$ref":"#/components/schemas/ITossTransferPayment.ITransfer","description":"계좌 이체 정보."},"method":{"type":"string","enum":["계좌이체"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["transfer","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"계좌 이체 결제 정보."},"ITossTransferPayment.ITransfer":{"type":"object","properties":{"bank":{"type":"string","description":"은행명."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"이체 상태."}},"nullable":false,"required":["bank","settlementStatus"],"description":"계좌 이체 정보."},"ITossVirtualAccountPayment":{"type":"object","properties":{"secret":{"type":"string","description":"가상 계좌로 결제할 때 전달되는 입금 콜백을 검증하기 위한 값."},"virtualAccount":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.IVirtualAccount","description":"가상 계좌 정보."},"method":{"type":"string","enum":["가상계좌"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["secret","virtualAccount","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"가상 계좌 결제 정보."},"ITossVirtualAccountPayment.IVirtualAccount":{"type":"object","properties":{"accountNumber":{"type":"string","description":"계좌 번호."},"accountType":{"type":"string","enum":["일반","고정"],"description":"가상 계좌 타입."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"dueDate":{"type":"string","format":"date","description":"입금 기한."},"expired":{"type":"boolean","description":"가상 계좌 만료 여부."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."},"refundStatus":{"type":"string","enum":["COMPLETED","NONE","FAILED","PENDING","PARTIAL_FAILED"],"description":"환불 처리 상태.\n\n - NONE: 해당 없음\n - FAILED: 환불 실패\n - PENDING: 환불 처리중\n - PARTIAL_FAILED: 부분 환불 실패\n - COMPLETED: 환불 완료"}},"nullable":false,"required":["accountNumber","accountType","bank","customerName","dueDate","expired","settlementStatus","refundStatus"],"description":"가상 계좌 정보."},"IPaymentSource.IPassword":{"type":"object","properties":{"password":{"type":"string","description":"레코드 조회를 위한 비밀번호 입력."}},"nullable":false,"required":["password"],"description":"비밀번호 입력 정보."},"IPaymentHistory.ICreate":{"type":"object","properties":{"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamporttoss.payments","description":"벤더사 정보"},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"결제의 근간이 된 원천 레코드 정보."},"price":{"type":"number","minimum":0,"description":"결제되어야 할 총액.\n\n실 결제금액과 비교하여 이와 다를 시, 422 에러가 리턴됨."},"password":{"type":"string","description":"레코드 열람에 사용할 비밀번호 설정."},"webhook_url":{"type":"string","format":"url","description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"}},"nullable":false,"required":["vendor","source","price","password","webhook_url"],"description":"결제 입력 정보.\n\nSDK 에서 받은 데이터를 취합하여 결제 진행 상황을 서버에 알려준다."},"IPaymentVendoriamporttoss.payments":{"type":"object","properties":{"code":{"type":"string","enum":["iamport","toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IPaymentCancelHistory.ICreate":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/IPaymentSource","description":"결제의 근간이 된 원천 레코드 정보."},"password":{"type":"string","description":"결제 이력에 대한 비밀번호 입력."},"price":{"type":"number","minimum":0,"description":"환불 금액."},"reason":{"type":"string","description":"결제 취소 사유."},"account":{"$ref":"#/components/schemas/IPaymentCancelHistory.IBankAccount.Nullable","description":"환불 계좌 정보.\n\n가상 계좌로 입금한 경우, 결제 취소시, 이를 환불받을 계좌가 필요함.\n\n단, 이 정보는 본 결제 시스템에 저장하지 아니함."}},"nullable":false,"required":["source","password","price","reason","account"],"description":"결제 취소 입력 정보."},"IPaymentCancelHistory.IBankAccount.Nullable":{"type":"object","properties":{"bank":{"type":"string","description":"은행 이름."},"account":{"type":"string","description":"계좌번호."},"holder":{"type":"string","description":"예금주."},"mobile":{"type":"string","description":"연락처, 핸드폰 번호."}},"nullable":true,"required":["bank","account","holder","mobile"],"description":"은행 계좌 정보.\n\n가상 계좌로 입금한 경우, 결제 취소시, 이를 환불받을 계좌가 필요함.\n\n단, 이 정보는 본 결제 시스템에 저장하지 아니함."},"IPaymentReservation":{"oneOf":[{"$ref":"#/components/schemas/IPaymentReservation.IamportType"},{"$ref":"#/components/schemas/IPaymentReservation.TossType"}],"description":"간편 결제 수단 정보.\n\n`IPaymentReservation` 은 간편 결제 수단을 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 {@link IPaymentReservation.vendor_code } 값을\n특정하면, 파생 타입이 자동으로 다운 캐스팅 된다.\n\n```typescript\nif (history.vendor_code === \"toss.payments\")\n history.data.billingKey; // history.data be ITossBilling\n```"},"IPaymentReservation.IamportType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["iamport"],"description":"벤더사 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. If else condition 을 통하여\n{@link IPaymentReservation.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamport","description":"벤더사."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"대상 액터의 참조 정보."},"title":{"type":"string","description":"제목."},"data":{"$ref":"#/components/schemas/IIamportSubscription","description":"벤더사 데이터."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시."}},"nullable":false,"required":["id","vendor_code","vendor","source","title","data","created_at"],"description":"아임 포트의 간편 결제 카드 정보."},"IIamportSubscription":{"type":"object","properties":{"pg_provider":{"type":"string"},"pg_id":{"type":"string"},"card_name":{"type":"string"},"card_code":{"type":"string"},"card_number":{"type":"string"},"card_type":{"type":"string"},"customer_name":{"type":"string","nullable":true},"customer_tel":{"type":"string","nullable":true},"customer_email":{"type":"string","nullable":true},"customer_addr":{"type":"string","nullable":true},"customer_postcode":{"type":"string","nullable":true},"inserted":{"type":"number"},"updated":{"type":"number"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["pg_provider","pg_id","card_name","card_code","card_number","card_type","customer_name","customer_tel","customer_email","customer_addr","customer_postcode","inserted","updated","customer_uid"],"description":"간편 결제 카드 정보."},"IPaymentReservation.TossType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["toss.payments"],"description":"벤더사 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. If else condition 을 통하여\n{@link IPaymentReservation.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendortoss.payments","description":"벤더사."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"대상 액터의 참조 정보."},"title":{"type":"string","description":"제목."},"data":{"$ref":"#/components/schemas/ITossBilling","description":"벤더사 데이터."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시."}},"nullable":false,"required":["id","vendor_code","vendor","source","title","data","created_at"],"description":"토스의 간편 결제 수단 정보."},"ITossBilling":{"type":"object","properties":{"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"billingKey":{"type":"string","description":"{@link ITossBilling } 의 식별자 키."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"cardCompany":{"type":"string","description":"카드사 이름."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"authenticatedAt":{"type":"string","format":"date-time","description":"인증 일시."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["mId","billingKey","method","cardCompany","cardNumber","authenticatedAt","customerKey"],"description":"간편 결제 등록 수단 정보.\n\n`ITossBilling` 은 간편 결제 등록 수단을 형상화한 자료구조 인터페이스로써, 고객이 자신의\n신용 카드를 서버에 등록해두고, 매번 결제가 필요할 때마다 카드 정보를 반복 입려하는 일\n없이 간편하게 결제를 진행하고자 할 때 사용한다."},"IPaymentReservation.ICreate":{"type":"object","properties":{"vendor":{"$ref":"#/components/schemas/IPaymentVendorIPaymentVendor.Code","description":"벤더사 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 레코드 정보."},"title":{"type":"string","description":"제목"},"password":{"type":"string","description":"간편결제 비밀번호.\n\n주의할 점은 카드 비밀번호가 아니라는 것."}},"nullable":false,"required":["vendor","source","title","password"],"description":"간편 결제 수단 등록 정보.\n\n결제사의 팝업 창로부터 전달받은 식별자 정보를 취합하여 전달한다.\n\n참고로 아임포트의 경우 간편 결제로 등록한 카드에 자체 식별자 번호를 부여하지 않는다.\n따라서 귀하의 서비스가 발행한 식별자 ID 가 곧, 해당 간편 결제 수단의 유일무이한\n식별자ㅏ 되니, 이를 {@link IPaymentVendor.uid } 와 {@link IPaymentSource.id } 에\n모두 동일하게 할당해주면 된다."},"IPaymentVendorIPaymentVendor.Code":{"type":"object","properties":{"code":{"type":"string","enum":["iamport","toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IIamportPayment.IWebhook":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"status":{"type":"string","enum":["paid","ready","failed","cancelled"],"description":"현재 상태."}},"nullable":false,"required":["imp_uid","merchant_uid","status"],"description":"웹훅 데이터."}}}} \ No newline at end of file +{"openapi":"3.0.1","servers":[{"url":"https://github.com/samchon/nestia","description":"insert your server url"}],"info":{"version":"6.0.3","title":"@samchon/payment-backend","description":"Payment Backend Server","license":{"name":"MIT"}},"paths":{"/monitors/health":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":""}}}},"/monitors/performance":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.G.et](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPerformance"}}},"x-nestia-encrypted":true}}}},"/monitors/system":{"get":{"tags":[],"parameters":[],"responses":{"200":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.G.et](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/ISystem"}}},"x-nestia-encrypted":true}}}},"/payments/histories/get":{"patch":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역의 원천 정보 + 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IAccessor"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 상세 조회하기","description":"결제 내역 상세 조회하기."}},"/payments/histories/{id}":{"patch":{"tags":[],"parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"description":"Primary Key","required":true}],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역의 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IPassword"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 상세 조회하기","description":"결제 내역 상세 조회하기."}},"/payments/histories":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ost](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 내역 발행하기","description":"결제 내역 발행하기."}},"/payments/histories/cancel":{"put":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 취소 내역 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentCancelHistory.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ut](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentHistory"}}},"x-nestia-encrypted":true}},"summary":"결제 취소하기","description":"결제 취소하기."}},"/payments/reservations/get":{"patch":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단의 원천 정보 + 비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IAccessor"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n결제 내역","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 조회하기","description":"간편 결제 수단 조회하기."}},"/payments/reservations/{id}":{"patch":{"tags":[],"parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"description":"Primary Key","required":true}],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n비밀번호","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentSource.IPassword"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.atch](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 조회하기","description":"간편 결제 수단 조회하기."}},"/payments/reservations":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"## Warning\n\nRequest body must be encrypted.\n\nThe request body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedBody](https://github.com/samchon/@nestia/core#encryptedbody) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 입력 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation.ICreate"}}},"required":true,"x-nestia-encrypted":true},"responses":{"201":{"description":"## Warning\n\nResponse data have been encrypted.\n\nThe response body data would be encrypted as \"AES-128(256) / CBC mode / PKCS#5 Padding / Base64 Encoding\", through the [EncryptedRoute.P.ost](https://github.com/samchon/@nestia/core#encryptedroute) component.\n\nTherefore, just utilize this swagger editor only for referencing. If you need to call the real API, using [SDK](https://github.com/samchon/nestia#software-development-kit) would be much better.\n\n----------------\n\n간편 결제 수단 정보","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/IPaymentReservation"}}},"x-nestia-encrypted":true}},"summary":"간편 결제 수단 등록하기","description":"간편 결제 수단 등록하기."}},"/payments/webhooks/iamport":{"post":{"tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IIamportPayment.IWebhook"}}},"required":true},"responses":{"201":{"description":""}}}}},"components":{"schemas":{"IPerformance":{"type":"object","properties":{"cpu":{"$ref":"#/components/schemas/process.global.NodeJS.CpuUsage"},"memory":{"$ref":"#/components/schemas/process.global.NodeJS.MemoryUsage"},"resource":{"$ref":"#/components/schemas/process.global.NodeJS.ResourceUsage"}},"nullable":false,"required":["cpu","memory","resource"]},"process.global.NodeJS.CpuUsage":{"type":"object","properties":{"user":{"type":"number"},"system":{"type":"number"}},"nullable":false,"required":["user","system"]},"process.global.NodeJS.MemoryUsage":{"type":"object","properties":{"rss":{"type":"number"},"heapTotal":{"type":"number"},"heapUsed":{"type":"number"},"external":{"type":"number"},"arrayBuffers":{"type":"number"}},"nullable":false,"required":["rss","heapTotal","heapUsed","external","arrayBuffers"]},"process.global.NodeJS.ResourceUsage":{"type":"object","properties":{"fsRead":{"type":"number"},"fsWrite":{"type":"number"},"involuntaryContextSwitches":{"type":"number"},"ipcReceived":{"type":"number"},"ipcSent":{"type":"number"},"majorPageFault":{"type":"number"},"maxRSS":{"type":"number"},"minorPageFault":{"type":"number"},"sharedMemorySize":{"type":"number"},"signalsCount":{"type":"number"},"swappedOut":{"type":"number"},"systemCPUTime":{"type":"number"},"unsharedDataSize":{"type":"number"},"unsharedStackSize":{"type":"number"},"userCPUTime":{"type":"number"},"voluntaryContextSwitches":{"type":"number"}},"nullable":false,"required":["fsRead","fsWrite","involuntaryContextSwitches","ipcReceived","ipcSent","majorPageFault","maxRSS","minorPageFault","sharedMemorySize","signalsCount","swappedOut","systemCPUTime","unsharedDataSize","unsharedStackSize","userCPUTime","voluntaryContextSwitches"]},"ISystem":{"type":"object","properties":{"uid":{"type":"string","description":"Random Unique ID."},"arguments":{"type":"array","items":{"type":"string"},"description":"`process.argv`"},"commit":{"$ref":"#/components/schemas/ISystem.ICommit","description":"Git commit information."},"package":{"$ref":"#/components/schemas/ISystem.IPackage","description":"`package.json`"},"created_at":{"type":"string","description":"Creation time of this system."}},"nullable":false,"required":["uid","arguments","commit","package","created_at"]},"ISystem.ICommit":{"type":"object","properties":{"shortHash":{"type":"string"},"branch":{"type":"string"},"hash":{"type":"string"},"subject":{"type":"string"},"sanitizedSubject":{"type":"string"},"body":{"type":"string"},"author":{"$ref":"#/components/schemas/ISystem.ICommit.IUser"},"committer":{"$ref":"#/components/schemas/ISystem.ICommit.IUser"},"authored_at":{"type":"string"},"commited_at":{"type":"string"},"notes":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"nullable":false,"required":["shortHash","branch","hash","subject","sanitizedSubject","body","author","committer","authored_at","commited_at","tags"],"description":"Git commit information."},"ISystem.ICommit.IUser":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"nullable":false,"required":["name","email"],"description":"Git user information."},"ISystem.IPackage":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"scripts":{"$ref":"#/components/schemas/Recordstringstring"},"repository":{"type":"object","properties":{"type":{"type":"string","enum":["git"]},"url":{"type":"string"}},"nullable":false,"required":["type","url"]},"author":{"type":"string"},"license":{"type":"string"},"bugs":{"type":"object","properties":{"url":{"type":"string"}},"nullable":false,"required":["url"]},"homepage":{"type":"string"},"devDependencies":{"$ref":"#/components/schemas/Recordstringstring"},"dependencies":{"$ref":"#/components/schemas/Recordstringstring"},"publishConfig":{"type":"object","properties":{"registry":{"type":"string"}},"nullable":false,"required":["registry"]},"main":{"type":"string"},"typings":{"type":"string"},"files":{"type":"array","items":{"type":"string"}}},"nullable":false,"required":["name","version","description","scripts","repository","author","license","bugs","homepage","devDependencies","dependencies"],"description":"NPM package information."},"Recordstringstring":{"type":"object","properties":{},"nullable":false,"description":"Construct a type with a set of properties K of type T"},"IPaymentSource.IAccessor":{"type":"object","properties":{"schema":{"type":"string","description":"DB 스키마 이름"},"table":{"type":"string","description":"DB 테이블 명"},"id":{"type":"string","format":"uuid","description":"참조 레코드의 PK"},"password":{"type":"string","description":"레코드 조회를 위한 비밀번호 입력."}},"nullable":false,"required":["schema","table","id","password"],"description":"접근자 정보.\n\n`IPaymentSource.IAccessor` 는 {@link IPaymentHistory 결제 내역} 내지\n{@link IPaymentReservation 간편 결제 수단 정보}를 조회할 때, 그것의 고유 식별자\nID 가 아닌 원천 레코드 식별자 정보 {@link IPaymentSource } 를 통하여 조회할 때\n사용하는 접근자 정보이다.\n\n다만 `payments-server` 의 모든 개별 레코드는 이를 조회할 시 비밀번호가 필요하기에,\n{@link IPaymentSource } 의 속성들에 비밀번호가 하나 더 추가되었을 뿐이다."},"IPaymentHistory":{"oneOf":[{"$ref":"#/components/schemas/IPaymentHistory.IamportType"},{"$ref":"#/components/schemas/IPaymentHistory.TossType"}],"description":"결제 내역.\n\n`IPaymentHistory` 는 결제 내역을 형상화한 자료구조이자 유니언 타입의 인터페이이다.\n서비스 시스템으로부 결제 사건의 귀속 정보 ({@link IPaymentHistory.ICreate.vendor } +\n{@link IPaymentHistory.ICreate.source }) 를 전달받아, 본 Payment 시스템이 PG 사에\n추가 정보를 취득하여 레코드가 완성된다.\n\n그리고 만일 현 결제 건이 가상계좌와 같이 레코드 생성 시점에 지불이 이루어지지 않은\n경우라면, 사후 {@link IPaymentWebhook 웹훅 이벤트}를 통하여 지불 완료 시각을 뜻하는\n{@link paid_at } 가 설정될 수 있다. 그리고 반대로 이미 결제가 완료된 경우라도,\n환불 등의 이유로 인하여 {@link cancelled_at } 이 사후 기재될 수 있다.\n\n참고로 `if condition` 을 통하여 {@link IPaymentHistory.vendor_code } 값을 특정하면,\n파생 타입이 자동으로 다운 캐스팅 된다.\n\n```typescript\nif (history.vendor_code === \"toss.payments\")\n history.data.paymentKey; // history.data be ITossPayment\n```"},"IPaymentHistory.IamportType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["iamport"],"description":"벤더사 식별자 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. `if condition` 을 통하여\n{@link IPaymentHistory.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamport","description":"벤더 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 래코드 정보."},"data":{"$ref":"#/components/schemas/IIamportPayment","description":"결제 상세 데이터, 벤더별로 데이터 양식이 다르니 주의할 것."},"currency":{"type":"string","description":"통화 단위\n\nKRW, USB, JPY 등."},"price":{"type":"number","minimum":0,"description":"결제 가격."},"refund":{"type":"number","minimum":0,"nullable":true,"description":"결제 취소시의 환불 금액."},"webhook_url":{"type":"string","format":"url","nullable":true,"description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"},"created_at":{"type":"string","format":"date-time","description":"결제 레코드 생성 일시."},"paid_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 완료 일시."},"cancelled_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 취소 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/IPaymentCancelHistory"},"description":"결제 취소 내역 리스트."}},"nullable":false,"required":["id","vendor_code","vendor","source","data","currency","price","refund","webhook_url","created_at","paid_at","cancelled_at","cancels"],"description":"아임포트로부터의 결제 내역."},"IPaymentVendoriamport":{"type":"object","properties":{"code":{"type":"string","enum":["iamport"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IPaymentSource":{"type":"object","properties":{"schema":{"type":"string","description":"DB 스키마 이름"},"table":{"type":"string","description":"DB 테이블 명"},"id":{"type":"string","format":"uuid","description":"참조 레코드의 PK"}},"nullable":false,"required":["schema","table","id"],"description":"원천 레코드 참조 정보.\n\n`IPaymentSource` 는 {@link IPaymentHistory 결제 내역} 및\n{@link IPaymentResrvation 간편 결제 수단}의 원천이 되는 레코드의 참조 정보를 형상화한\n자료구조 인터페이이다. 만일 대상이 {@link IPaymentHistory 결제 내역}이라면 결제의\n근원이 되는 주문에 대한 참조 정보를, 대상이 {@link IPaymentResrvation 간편 결제 수단}\n이라면 이를 기록한 귀사 서비스의 참조 정보를 기입하면 된다."},"IIamportPayment":{"oneOf":[{"$ref":"#/components/schemas/IIamportCardPayment"},{"$ref":"#/components/schemas/IIamportTransferPayment"},{"$ref":"#/components/schemas/IIamportVBankPayment"},{"$ref":"#/components/schemas/IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint"}],"description":"결제 정보.\n\n`IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.pay_method === \"card\")\n payment.card_number; // payment be IIamportCardPayment\n```"},"IIamportCardPayment":{"type":"object","properties":{"card_code":{"type":"string","description":"카드 식별자 코드."},"card_name":{"type":"string","description":"카드 이름."},"card_number":{"type":"string","pattern":"\\d{4}-\\d{4}-\\d{4}-\\d{4}","description":"카드 번호."},"card_quota":{"type":"integer","description":"할부 개월 수."},"apply_num":{"type":"string","description":"카드사 승인번호."},"pay_method":{"type":"string","enum":["card","samsung"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["card_code","card_name","card_number","card_quota","apply_num","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"카드 결제 정보."},"IIamportPayment.Currency":{"type":"string","enum":["KRW","USD","EUR","JPY"]},"IIamportPayment.Status":{"type":"string","enum":["paid","ready","failed","cancelled"]},"IIamportPaymentCancel":{"type":"object","properties":{"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"amount":{"type":"number"},"cancelled_at":{"type":"number"},"reason":{"type":"string"},"receipt_url":{"type":"string","format":"url"}},"nullable":false,"required":["pg_id","pg_tid","amount","cancelled_at","reason","receipt_url"],"description":"결제 취소 정보."},"IIamportTransferPayment":{"type":"object","properties":{"bank_code":{"type":"string","description":"은행 식별자 코드."},"bank_name":{"type":"string","description":"은행 이름."},"pay_method":{"type":"string","enum":["trans"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["bank_code","bank_name","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"계좌 이체 결제 정보."},"IIamportVBankPayment":{"type":"object","properties":{"vbank_code":{"type":"string","description":"가상 계좌 식별자 코드."},"vbank_name":{"type":"string","description":"가상 게좌 이름"},"vbank_num":{"type":"string","description":"가상 계좌 번호"},"vbank_holder":{"type":"string","description":"가상 계좌 예금주."},"vbank_date":{"type":"number","description":"가상 계좌 입금 만료 기한."},"vbank_issued_at":{"type":"number","description":"가상 계좌 개설 일시."},"pay_method":{"type":"string","enum":["vbank"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["vbank_code","vbank_name","vbank_num","vbank_holder","vbank_date","vbank_issued_at","pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"가상 계좌 결제 정보."},"IIamportPayment.IBasephonekpaykakaopaypaycolpayssgpaytosspayculturelandsmartculturehappymoneybooknlifepoint":{"type":"object","properties":{"pay_method":{"type":"string","enum":["phone","kpay","kakaopay","payco","lpay","ssgpay","tosspay","cultureland","smartculture","happymoney","booknlife","point"]},"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"name":{"type":"string","nullable":true,"description":"주문명, 누락 가능."},"amount":{"type":"number","description":"결제 총액."},"cancel_amount":{"type":"number","description":"결제 취소, 환불 총액."},"currency":{"$ref":"#/components/schemas/IIamportPayment.Currency","description":"통화 단위."},"receipt_url":{"type":"string","format":"url","description":"영수증 URL."},"cash_receipt_issue":{"type":"boolean","description":"현금 영수증 발행 여부."},"channel":{"type":"string"},"pg_provider":{"type":"string"},"emb_pg_provider":{"type":"string","nullable":true},"pg_id":{"type":"string"},"pg_tid":{"type":"string"},"escrow":{"type":"boolean"},"buyer_name":{"type":"string","nullable":true},"buyer_email":{"type":"string","format":"email","nullable":true},"buyer_tel":{"type":"string","nullable":true},"buyer_addr":{"type":"string","nullable":true},"buyer_postcode":{"type":"string","nullable":true},"customer_uid":{"type":"string","nullable":true},"customer_uid_usage":{"type":"string","nullable":true},"custom_data":{"type":"string","nullable":true},"user_agent":{"type":"string","nullable":true},"status":{"$ref":"#/components/schemas/IIamportPayment.Status","description":"결제의 현재 (진행) 상태."},"started_at":{"type":"number","description":"결제 신청 일시.\n\n리눅스 타임이 쓰임."},"paid_at":{"type":"number","description":"결제 (지불) 완료 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"failed_at":{"type":"number","description":"결제 실패 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"cancelled_at":{"type":"number","description":"결제 취소 일시.\n\n리눅스 타임이 쓰이며, `null` 대신 0 을 씀."},"fail_reason":{"type":"string","nullable":true},"cancel_reason":{"type":"string","nullable":true},"cancel_history":{"type":"array","items":{"$ref":"#/components/schemas/IIamportPaymentCancel"}}},"nullable":false,"required":["pay_method","imp_uid","merchant_uid","name","amount","cancel_amount","currency","receipt_url","cash_receipt_issue","channel","pg_provider","emb_pg_provider","pg_id","pg_tid","escrow","buyer_name","buyer_email","buyer_tel","buyer_addr","buyer_postcode","customer_uid","customer_uid_usage","custom_data","user_agent","status","started_at","paid_at","failed_at","cancelled_at","fail_reason","cancel_reason","cancel_history"],"description":"결제 기본 (공통) 정보."},"IPaymentCancelHistory":{"type":"object","properties":{"reason":{"type":"string","description":"결제 취소 사유."},"price":{"type":"number","minimum":0,"description":"환불 금액."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시.\n\n즉, 결제 취소가 발생한 시각."}},"nullable":false,"required":["reason","price","created_at"],"description":"결제 취소 내역."},"IPaymentHistory.TossType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["toss.payments"],"description":"벤더사 식별자 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. `if condition` 을 통하여\n{@link IPaymentHistory.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendortoss.payments","description":"벤더 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 래코드 정보."},"data":{"$ref":"#/components/schemas/ITossPayment","description":"결제 상세 데이터, 벤더별로 데이터 양식이 다르니 주의할 것."},"currency":{"type":"string","description":"통화 단위\n\nKRW, USB, JPY 등."},"price":{"type":"number","minimum":0,"description":"결제 가격."},"refund":{"type":"number","minimum":0,"nullable":true,"description":"결제 취소시의 환불 금액."},"webhook_url":{"type":"string","format":"url","nullable":true,"description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"},"created_at":{"type":"string","format":"date-time","description":"결제 레코드 생성 일시."},"paid_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 완료 일시."},"cancelled_at":{"type":"string","format":"date-time","nullable":true,"description":"결제 취소 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/IPaymentCancelHistory"},"description":"결제 취소 내역 리스트."}},"nullable":false,"required":["id","vendor_code","vendor","source","data","currency","price","refund","webhook_url","created_at","paid_at","cancelled_at","cancels"],"description":"토스 페이먼츠로부터의 결제 내역."},"IPaymentVendortoss.payments":{"type":"object","properties":{"code":{"type":"string","enum":["toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"ITossPayment":{"oneOf":[{"$ref":"#/components/schemas/ITossCardPayment"},{"$ref":"#/components/schemas/ITossGiftCertificatePayment"},{"$ref":"#/components/schemas/ITossMobilePhonePayment"},{"$ref":"#/components/schemas/ITossTransferPayment"},{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}],"description":"결제 정보.\n\n`ITossPayment` 는 토스 페이먼츠의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.method === \"카드\")\n payment.card; // payment be ITossCardPayment\n```"},"ITossCardPayment":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/ITossCardPayment.ICard","description":"카드 정보."},"discount":{"$ref":"#/components/schemas/ITossCardPayment.IDiscount.Nullable","description":"카드사의 즉시 할인 프로모션 정보."},"easyPay":{"type":"string","enum":["토스결제","페이코","삼성페이"],"nullable":true,"description":"간편결제로 결제한 경우 간편결제 타입 정보."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL","BILLING"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["card","discount","easyPay","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"카드 결제 정보."},"ITossCardPayment.ICard":{"type":"object","properties":{"company":{"type":"string","description":"카드사 이름."},"number":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"installmentPlanMonths":{"type":"number","description":"할부 개월 수."},"isInterestFree":{"type":"boolean","description":"무이자 할부 적용 여부."},"approveNo":{"type":"string","description":"승인 번호."},"useCardPoint":{"type":"boolean","enum":[false],"description":"카드 포인트 사용 여부."},"cardType":{"type":"string","enum":["신용","체크","기프트"],"description":"카드 타입."},"ownerType":{"type":"string","enum":["개인","법인"],"description":"카드의 소유자 타입."},"acquireStatus":{"type":"string","enum":["READY","CANCELED","REQUESTED","COMPLETED","CANCEL_REQUESTED"],"description":"카드 결제의 매입 상태.\n\n - READY: 매입 대기\n - REQUESTED: 매입 요청됨\n - COMPLETED: 매입 완료\n - CANCEL_REQUESTED: 매입 취소 요청됨\n - CANCELD: 매입 취소됨"},"receiptUrl":{"type":"string","format":"url","description":"영수증 URL."}},"nullable":false,"required":["company","number","installmentPlanMonths","isInterestFree","approveNo","useCardPoint","cardType","ownerType","acquireStatus","receiptUrl"],"description":"카드 정보."},"ITossCardPayment.IDiscount.Nullable":{"type":"object","properties":{"amount":{"type":"number","description":"카드사의 즉시 할인 프로모션을 적용한 금액."}},"nullable":true,"required":["amount"],"description":"카드사의 즉시 할인 프로모션 정보."},"ITossPaymentCancel":{"type":"object","properties":{"cancelAmount":{"type":"number","description":"취소 총액."},"cancelReason":{"type":"string","description":"취소 사유."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"taxAmount":{"type":"number","description":"과세 처리된 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."},"canceledAt":{"type":"string","format":"date-time","description":"취소 일시."}},"nullable":false,"required":["cancelAmount","cancelReason","taxFreeAmount","taxAmount","refundableAmount","canceledAt"],"description":"결제 취소 정보."},"ITossCashReceipt.ISummary.Nullable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"amount":{"type":"number","description":"현금 영수증 처리된 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"issueNumber":{"type":"string","description":"현금영수증 발급번호."},"receiptUrl":{"type":"string","description":"현금영수증 조회 페이지 주소."}},"nullable":true,"required":["type","amount","taxFreeAmount","issueNumber","receiptUrl"],"description":"현금 영수증 요약 정보."},"ITossCashReceipt.Type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"ITossGiftCertificatePayment":{"type":"object","properties":{"giftCertificate":{"$ref":"#/components/schemas/ITossGiftCertificatePayment.IGiftCertificate","description":"상품권 정보."},"method":{"type":"string","enum":["상품권"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["giftCertificate","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"상품권 결제 정보."},"ITossGiftCertificatePayment.IGiftCertificate":{"type":"object","properties":{"approveNo":{"type":"string","description":"승인 번호."},"settlementStatus":{"type":"string","enum":["COMPLETE","INCOMPLETE"],"description":"정산 상태."}},"nullable":false,"required":["approveNo","settlementStatus"],"description":"상품권 정보."},"ITossMobilePhonePayment":{"type":"object","properties":{"mobilePhone":{"$ref":"#/components/schemas/ITossMobilePhonePayment.IMobilePhone","description":"휴대폰 정보."},"method":{"type":"string","enum":["휴대폰"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["mobilePhone","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"휴대폰 결제 정보."},"ITossMobilePhonePayment.IMobilePhone":{"type":"object","properties":{"carrier":{"type":"string","description":"통신사."},"customerMobilePhone":{"type":"string","description":"고객 휴대폰 번호."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."}},"nullable":false,"required":["carrier","customerMobilePhone","settlementStatus"],"description":"휴대폰 정보."},"ITossTransferPayment":{"type":"object","properties":{"transfer":{"$ref":"#/components/schemas/ITossTransferPayment.ITransfer","description":"계좌 이체 정보."},"method":{"type":"string","enum":["계좌이체"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["transfer","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"계좌 이체 결제 정보."},"ITossTransferPayment.ITransfer":{"type":"object","properties":{"bank":{"type":"string","description":"은행명."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"이체 상태."}},"nullable":false,"required":["bank","settlementStatus"],"description":"계좌 이체 정보."},"ITossVirtualAccountPayment":{"type":"object","properties":{"secret":{"type":"string","description":"가상 계좌로 결제할 때 전달되는 입금 콜백을 검증하기 위한 값."},"virtualAccount":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.IVirtualAccount","description":"가상 계좌 정보."},"method":{"type":"string","enum":["가상계좌"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["secret","virtualAccount","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"가상 계좌 결제 정보."},"ITossVirtualAccountPayment.IVirtualAccount":{"type":"object","properties":{"accountNumber":{"type":"string","description":"계좌 번호."},"accountType":{"type":"string","enum":["일반","고정"],"description":"가상 계좌 타입."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"dueDate":{"type":"string","format":"date","description":"입금 기한."},"expired":{"type":"boolean","description":"가상 계좌 만료 여부."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."},"refundStatus":{"type":"string","enum":["COMPLETED","NONE","FAILED","PENDING","PARTIAL_FAILED"],"description":"환불 처리 상태.\n\n - NONE: 해당 없음\n - FAILED: 환불 실패\n - PENDING: 환불 처리중\n - PARTIAL_FAILED: 부분 환불 실패\n - COMPLETED: 환불 완료"}},"nullable":false,"required":["accountNumber","accountType","bank","customerName","dueDate","expired","settlementStatus","refundStatus"],"description":"가상 계좌 정보."},"IPaymentSource.IPassword":{"type":"object","properties":{"password":{"type":"string","description":"레코드 조회를 위한 비밀번호 입력."}},"nullable":false,"required":["password"],"description":"비밀번호 입력 정보."},"IPaymentHistory.ICreate":{"type":"object","properties":{"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamporttoss.payments","description":"벤더사 정보"},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"결제의 근간이 된 원천 레코드 정보."},"price":{"type":"number","minimum":0,"description":"결제되어야 할 총액.\n\n실 결제금액과 비교하여 이와 다를 시, 422 에러가 리턴됨."},"password":{"type":"string","description":"레코드 열람에 사용할 비밀번호 설정."},"webhook_url":{"type":"string","format":"url","description":"결제 정보가 갱신되었을 때, 이를 수신할 URL"}},"nullable":false,"required":["vendor","source","price","password","webhook_url"],"description":"결제 입력 정보.\n\nSDK 에서 받은 데이터를 취합하여 결제 진행 상황을 서버에 알려준다."},"IPaymentVendoriamporttoss.payments":{"type":"object","properties":{"code":{"type":"string","enum":["iamport","toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IPaymentCancelHistory.ICreate":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/IPaymentSource","description":"결제의 근간이 된 원천 레코드 정보."},"password":{"type":"string","description":"결제 이력에 대한 비밀번호 입력."},"price":{"type":"number","minimum":0,"description":"환불 금액."},"reason":{"type":"string","description":"결제 취소 사유."},"account":{"$ref":"#/components/schemas/IPaymentCancelHistory.IBankAccount.Nullable","description":"환불 계좌 정보.\n\n가상 계좌로 입금한 경우, 결제 취소시, 이를 환불받을 계좌가 필요함.\n\n단, 이 정보는 본 결제 시스템에 저장하지 아니함."}},"nullable":false,"required":["source","password","price","reason","account"],"description":"결제 취소 입력 정보."},"IPaymentCancelHistory.IBankAccount.Nullable":{"type":"object","properties":{"bank":{"type":"string","description":"은행 이름."},"account":{"type":"string","description":"계좌번호."},"holder":{"type":"string","description":"예금주."},"mobile":{"type":"string","description":"연락처, 핸드폰 번호."}},"nullable":true,"required":["bank","account","holder","mobile"],"description":"은행 계좌 정보.\n\n가상 계좌로 입금한 경우, 결제 취소시, 이를 환불받을 계좌가 필요함.\n\n단, 이 정보는 본 결제 시스템에 저장하지 아니함."},"IPaymentReservation":{"oneOf":[{"$ref":"#/components/schemas/IPaymentReservation.IamportType"},{"$ref":"#/components/schemas/IPaymentReservation.TossType"}],"description":"간편 결제 수단 정보.\n\n`IPaymentReservation` 은 간편 결제 수단을 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 {@link IPaymentReservation.vendor_code } 값을\n특정하면, 파생 타입이 자동으로 다운 캐스팅 된다.\n\n```typescript\nif (history.vendor_code === \"toss.payments\")\n history.data.billingKey; // history.data be ITossBilling\n```"},"IPaymentReservation.IamportType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["iamport"],"description":"벤더사 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. If else condition 을 통하여\n{@link IPaymentReservation.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendoriamport","description":"벤더사."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"대상 액터의 참조 정보."},"title":{"type":"string","description":"제목."},"data":{"$ref":"#/components/schemas/IIamportSubscription","description":"벤더사 데이터."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시."}},"nullable":false,"required":["id","vendor_code","vendor","source","title","data","created_at"],"description":"아임 포트의 간편 결제 카드 정보."},"IIamportSubscription":{"type":"object","properties":{"pg_provider":{"type":"string"},"pg_id":{"type":"string"},"card_name":{"type":"string"},"card_code":{"type":"string"},"card_number":{"type":"string"},"card_type":{"type":"string"},"customer_name":{"type":"string","nullable":true},"customer_tel":{"type":"string","nullable":true},"customer_email":{"type":"string","nullable":true},"customer_addr":{"type":"string","nullable":true},"customer_postcode":{"type":"string","nullable":true},"inserted":{"type":"number"},"updated":{"type":"number"},"customer_uid":{"type":"string","description":"고객 식별자 키.\n\n아임포트가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키.\n\n다만 고객이라기보다 실제로는 카드의 식별자 키로 써야함."}},"nullable":false,"required":["pg_provider","pg_id","card_name","card_code","card_number","card_type","customer_name","customer_tel","customer_email","customer_addr","customer_postcode","inserted","updated","customer_uid"],"description":"간편 결제 카드 정보."},"IPaymentReservation.TossType":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Primary Key."},"vendor_code":{"type":"string","enum":["toss.payments"],"description":"벤더사 코드.\n\n{@link IPaymentVendor.code }와 완전히 동일한 값이되, 단지 union type\nspecialization 을 위해 중복 표기하였을 뿐이다. If else condition 을 통하여\n{@link IPaymentReservation.data }의 타입을 특정할 수 있다."},"vendor":{"$ref":"#/components/schemas/IPaymentVendortoss.payments","description":"벤더사."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"대상 액터의 참조 정보."},"title":{"type":"string","description":"제목."},"data":{"$ref":"#/components/schemas/ITossBilling","description":"벤더사 데이터."},"created_at":{"type":"string","format":"date-time","description":"레코드 생성 일시."}},"nullable":false,"required":["id","vendor_code","vendor","source","title","data","created_at"],"description":"토스의 간편 결제 수단 정보."},"ITossBilling":{"type":"object","properties":{"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"billingKey":{"type":"string","description":"{@link ITossBilling } 의 식별자 키."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"cardCompany":{"type":"string","description":"카드사 이름."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"authenticatedAt":{"type":"string","format":"date-time","description":"인증 일시."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["mId","billingKey","method","cardCompany","cardNumber","authenticatedAt","customerKey"],"description":"간편 결제 등록 수단 정보.\n\n`ITossBilling` 은 간편 결제 등록 수단을 형상화한 자료구조 인터페이스로써, 고객이 자신의\n신용 카드를 서버에 등록해두고, 매번 결제가 필요할 때마다 카드 정보를 반복 입려하는 일\n없이 간편하게 결제를 진행하고자 할 때 사용한다."},"IPaymentReservation.ICreate":{"type":"object","properties":{"vendor":{"$ref":"#/components/schemas/IPaymentVendorIPaymentVendor.Code","description":"벤더사 정보."},"source":{"$ref":"#/components/schemas/IPaymentSource","description":"원천 레코드 정보."},"title":{"type":"string","description":"제목"},"password":{"type":"string","description":"간편결제 비밀번호.\n\n주의할 점은 카드 비밀번호가 아니라는 것."}},"nullable":false,"required":["vendor","source","title","password"],"description":"간편 결제 수단 등록 정보.\n\n결제사의 팝업 창로부터 전달받은 식별자 정보를 취합하여 전달한다.\n\n참고로 아임포트의 경우 간편 결제로 등록한 카드에 자체 식별자 번호를 부여하지 않는다.\n따라서 귀하의 서비스가 발행한 식별자 ID 가 곧, 해당 간편 결제 수단의 유일무이한\n식별자ㅏ 되니, 이를 {@link IPaymentVendor.uid } 와 {@link IPaymentSource.id } 에\n모두 동일하게 할당해주면 된다."},"IPaymentVendorIPaymentVendor.Code":{"type":"object","properties":{"code":{"type":"string","enum":["iamport","toss.payments"],"description":"벤더사 식별자 코드.\n\n아임포트의 경우에는 `iamport` 를, 토스의 경우에는 `toss.payments` 를 적어주면 된다."},"store_id":{"type":"string","description":"벤더사에 등록한 스토어 ID.\n\n결제 PG 사들은 서비스 주소가 다르거나, 또는 동일한 서비스이되 연결되는 백엔드 서버\n주소가 다르거든, 각기 다른 스토어 계정을 신청해 사용하라고 한다. 이는 요즘같이 MSA\n(Micro Service Architecture) 가 대세인 시대에 매우 불합리한 방식이기는 하지만, 어쨋든\n이러한 이유로 인하여, 한 회사 내지 단체가 복수의 스토어 ID 를 가지는 경우가 왕왕\n있다.\n\n때문에 `payments-server` 는, {@link IPaymentHistory 결제 내역}을 발행하거나\n{@link IPaymentReservation 간편 결제 수단}을 등록할 때 모두, 사용된 스토어의 ID\n를 반드시 기재하도록 하고 있다."},"uid":{"type":"string","description":"벤더사로부터 발급받은 식별자 번호.\n\n결제 PG 사들이 제공하는 팝업창을 이용하여 결제를 진행하거나 혹은 간편 결제 수단을\n등록하거든, 결제 PG 사들은 해당 건에 대하여 별도의 식별자 번호를 발급한다.\n`IPaymentVendor.uid` 는 이처럼 결제 PG 사들이 발급해 준 식별자 번호를 기재하는\n속성이다.\n\n단 예외가 하나 있어, 아임포트는 간편 결제 카드 등록 건에 대하여 별도의 식별자 번호를\n부여하지 않고, 귀하의 서비스에서 발급해 준 ID 를 그대로 사용한다. 때문에 아임포트를\n통한 간편 결제 카드 등록의 건만 예외적으로, `IPaymentVendor.uid` 에\n{@link IPaymentSource.id } 를 동일하게 할당해주어야 한다."}},"nullable":false,"required":["code","store_id","uid"],"description":"벤더사 정보.\n\n`IPaymentVendor` 결제 PG 벤더사에 관련된 정보를 형상화한 자료구조 인터페이스이다."},"IIamportPayment.IWebhook":{"type":"object","properties":{"imp_uid":{"type":"string","description":"결제 정보 {@link IIamportPayment } 의 식별자 키."},"merchant_uid":{"type":"string","description":"주문 식별자 키.\n\n아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다."},"status":{"type":"string","enum":["paid","ready","failed","cancelled"],"description":"현재 상태."}},"nullable":false,"required":["imp_uid","merchant_uid","status"],"description":"웹훅 데이터."}}}} \ No newline at end of file diff --git a/packages/payment-backend/nestia.config.ts b/packages/payment-backend/nestia.config.ts index 863ceb1..22b852d 100644 --- a/packages/payment-backend/nestia.config.ts +++ b/packages/payment-backend/nestia.config.ts @@ -4,7 +4,6 @@ import { NestFactory } from "@nestjs/core"; import { PaymentModule } from "./src/PaymentModule"; const NESTIA_CONFIG: INestiaConfig = { - simulate: true, input: () => NestFactory.create(PaymentModule), output: "src/api", distribute: "../payment-api", diff --git a/packages/payment-backend/package.json b/packages/payment-backend/package.json index ba48cff..bece4ce 100644 --- a/packages/payment-backend/package.json +++ b/packages/payment-backend/package.json @@ -1,6 +1,6 @@ { "name": "@samchon/payment-backend", - "version": "6.0.2", + "version": "6.0.3", "description": "Payment Backend Server", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -53,12 +53,12 @@ "cli": "^1.0.1", "copy-webpack-plugin": "^11.0.0", "copyfiles": "^2.4.1", - "iamport-server-api": "^6.0.2", + "iamport-server-api": "^6.0.3", "nestia": "^5.0.3", "pm2": "^4.5.6", "rimraf": "^3.0.2", "sloc": "^0.2.1", - "toss-payments-server-api": "^6.0.2", + "toss-payments-server-api": "^6.0.3", "ts-loader": "^9.5.0", "ts-node": "^10.9.1", "ts-patch": "^3.1.1", @@ -81,8 +81,8 @@ "commander": "10.0.0", "dotenv": "^16.3.1", "dotenv-expand": "^10.0.0", - "fake-iamport-server": "^6.0.2", - "fake-toss-payments-server": "^6.0.2", + "fake-iamport-server": "^6.0.3", + "fake-toss-payments-server": "^6.0.3", "fastify": "^4.24.3", "git-last-commit": "^1.0.0", "inquirer": "^8.2.5", diff --git a/packages/payment-backend/prisma/schema.prisma b/packages/payment-backend/prisma/schema.prisma index ac65179..5184f66 100644 --- a/packages/payment-backend/prisma/schema.prisma +++ b/packages/payment-backend/prisma/schema.prisma @@ -6,7 +6,6 @@ datasource db { generator client { provider = "prisma-client-js" binaryTargets = ["native", "linux-musl-arm64-openssl-3.0.x"] - output = "../node_modules/.prisma/client" } generator markdown { diff --git a/packages/payment-backend/src/api/functional/monitors/health/index.ts b/packages/payment-backend/src/api/functional/monitors/health/index.ts index c6a7258..cd715b2 100644 --- a/packages/payment-backend/src/api/functional/monitors/health/index.ts +++ b/packages/payment-backend/src/api/functional/monitors/health/index.ts @@ -15,17 +15,13 @@ import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; export async function get( connection: IConnection, ): Promise { - return !!connection.simulate - ? get.simulate( - connection, - ) - : PlainFetcher.fetch( - connection, - { - ...get.METADATA, - path: get.path(), - } as const, - ); + return PlainFetcher.fetch( + connection, + { + ...get.METADATA, + path: get.path(), + } as const, + ); } export namespace get { @@ -43,8 +39,4 @@ export namespace get { export const path = (): string => { return `/monitors/health`; } - export const simulate = async ( - _connection: IConnection, - ): Promise => { - } } \ No newline at end of file diff --git a/packages/payment-backend/src/api/functional/monitors/performance/index.ts b/packages/payment-backend/src/api/functional/monitors/performance/index.ts index 2a720dd..c48fb3b 100644 --- a/packages/payment-backend/src/api/functional/monitors/performance/index.ts +++ b/packages/payment-backend/src/api/functional/monitors/performance/index.ts @@ -6,7 +6,6 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { EncryptedFetcher } from "@nestia/fetcher/lib/EncryptedFetcher"; -import typia from "typia"; import type { IPerformance } from "../../../structures/monitors/IPerformance"; @@ -18,17 +17,13 @@ import type { IPerformance } from "../../../structures/monitors/IPerformance"; export async function get( connection: IConnection, ): Promise { - return !!connection.simulate - ? get.simulate( - connection, - ) - : EncryptedFetcher.fetch( - connection, - { - ...get.METADATA, - path: get.path(), - } as const, - ); + return EncryptedFetcher.fetch( + connection, + { + ...get.METADATA, + path: get.path(), + } as const, + ); } export namespace get { export type Output = Primitive; @@ -47,16 +42,4 @@ export namespace get { export const path = (): string => { return `/monitors/performance`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - ): Promise => { - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/payment-backend/src/api/functional/monitors/system/index.ts b/packages/payment-backend/src/api/functional/monitors/system/index.ts index d1ac16e..b3d3f03 100644 --- a/packages/payment-backend/src/api/functional/monitors/system/index.ts +++ b/packages/payment-backend/src/api/functional/monitors/system/index.ts @@ -6,7 +6,6 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { EncryptedFetcher } from "@nestia/fetcher/lib/EncryptedFetcher"; -import typia from "typia"; import type { ISystem } from "../../../structures/monitors/ISystem"; @@ -18,17 +17,13 @@ import type { ISystem } from "../../../structures/monitors/ISystem"; export async function get( connection: IConnection, ): Promise { - return !!connection.simulate - ? get.simulate( - connection, - ) - : EncryptedFetcher.fetch( - connection, - { - ...get.METADATA, - path: get.path(), - } as const, - ); + return EncryptedFetcher.fetch( + connection, + { + ...get.METADATA, + path: get.path(), + } as const, + ); } export namespace get { export type Output = Primitive; @@ -47,16 +42,4 @@ export namespace get { export const path = (): string => { return `/monitors/system`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - ): Promise => { - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/payment-backend/src/api/functional/payments/histories/index.ts b/packages/payment-backend/src/api/functional/payments/histories/index.ts index 0cdfc58..b4a07ce 100644 --- a/packages/payment-backend/src/api/functional/payments/histories/index.ts +++ b/packages/payment-backend/src/api/functional/payments/histories/index.ts @@ -6,13 +6,11 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { EncryptedFetcher } from "@nestia/fetcher/lib/EncryptedFetcher"; -import typia from "typia"; import type { Format } from "typia/lib/tags/Format"; import type { IPaymentCancelHistory } from "../../../structures/payments/IPaymentCancelHistory"; import type { IPaymentHistory } from "../../../structures/payments/IPaymentHistory"; import type { IPaymentSource } from "../../../structures/payments/IPaymentSource"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * 결제 내역 상세 조회하기. @@ -29,25 +27,20 @@ export async function get( connection: IConnection, input: get.Input, ): Promise { - return !!connection.simulate - ? get.simulate( - connection, - input, - ) - : EncryptedFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "text/plain", - }, - }, - { - ...get.METADATA, - path: get.path(), - } as const, - input, - ); + return EncryptedFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "text/plain", + }, + }, + { + ...get.METADATA, + path: get.path(), + } as const, + input, + ); } export namespace get { export type Input = Primitive; @@ -70,26 +63,6 @@ export namespace get { export const path = (): string => { return `/payments/histories/get`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: get.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "text/plain", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -109,26 +82,20 @@ export async function at( id: string & Format<"uuid">, input: at.Input, ): Promise { - return !!connection.simulate - ? at.simulate( - connection, - id, - input, - ) - : EncryptedFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "text/plain", - }, - }, - { - ...at.METADATA, - path: at.path(id), - } as const, - input, - ); + return EncryptedFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "text/plain", + }, + }, + { + ...at.METADATA, + path: at.path(id), + } as const, + input, + ); } export namespace at { export type Input = Primitive; @@ -151,28 +118,6 @@ export namespace at { export const path = (id: string & Format<"uuid">): string => { return `/payments/histories/${encodeURIComponent(id ?? "null")}`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - id: string & Format<"uuid">, - input: at.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(id), - contentType: "text/plain", - }); - assert.param("id")(() => typia.assert(id)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -190,25 +135,20 @@ export async function create( connection: IConnection, input: create.Input, ): Promise { - return !!connection.simulate - ? create.simulate( - connection, - input, - ) - : EncryptedFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "text/plain", - }, - }, - { - ...create.METADATA, - path: create.path(), - } as const, - input, - ); + return EncryptedFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "text/plain", + }, + }, + { + ...create.METADATA, + path: create.path(), + } as const, + input, + ); } export namespace create { export type Input = Primitive; @@ -231,26 +171,6 @@ export namespace create { export const path = (): string => { return `/payments/histories`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: create.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "text/plain", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -267,25 +187,20 @@ export async function cancel( connection: IConnection, input: cancel.Input, ): Promise { - return !!connection.simulate - ? cancel.simulate( - connection, - input, - ) - : EncryptedFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "text/plain", - }, - }, - { - ...cancel.METADATA, - path: cancel.path(), - } as const, - input, - ); + return EncryptedFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "text/plain", + }, + }, + { + ...cancel.METADATA, + path: cancel.path(), + } as const, + input, + ); } export namespace cancel { export type Input = Primitive; @@ -308,24 +223,4 @@ export namespace cancel { export const path = (): string => { return `/payments/histories/cancel`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: cancel.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "text/plain", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/payment-backend/src/api/functional/payments/internal/index.ts b/packages/payment-backend/src/api/functional/payments/internal/index.ts index 2011806..23cd1a6 100644 --- a/packages/payment-backend/src/api/functional/payments/internal/index.ts +++ b/packages/payment-backend/src/api/functional/payments/internal/index.ts @@ -6,10 +6,8 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { EncryptedFetcher } from "@nestia/fetcher/lib/EncryptedFetcher"; -import typia from "typia"; import type { IPaymentWebhookHistory } from "../../../structures/payments/IPaymentWebhookHistory"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * @@ -23,25 +21,20 @@ export async function webhook( connection: IConnection, input: webhook.Input, ): Promise { - return !!connection.simulate - ? webhook.simulate( - connection, - input, - ) - : EncryptedFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "text/plain", - }, - }, - { - ...webhook.METADATA, - path: webhook.path(), - } as const, - input, - ); + return EncryptedFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "text/plain", + }, + }, + { + ...webhook.METADATA, + path: webhook.path(), + } as const, + input, + ); } export namespace webhook { export type Input = Primitive; @@ -63,16 +56,4 @@ export namespace webhook { export const path = (): string => { return `/payments/internal/webhook`; } - export const simulate = async ( - connection: IConnection, - input: webhook.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "text/plain", - }); - assert.body(() => typia.assert(input)); - } } \ No newline at end of file diff --git a/packages/payment-backend/src/api/functional/payments/reservations/index.ts b/packages/payment-backend/src/api/functional/payments/reservations/index.ts index 3b26894..20a8145 100644 --- a/packages/payment-backend/src/api/functional/payments/reservations/index.ts +++ b/packages/payment-backend/src/api/functional/payments/reservations/index.ts @@ -6,12 +6,10 @@ //================================================================ import type { IConnection, Primitive } from "@nestia/fetcher"; import { EncryptedFetcher } from "@nestia/fetcher/lib/EncryptedFetcher"; -import typia from "typia"; import type { Format } from "typia/lib/tags/Format"; import type { IPaymentReservation } from "../../../structures/payments/IPaymentReservation"; import type { IPaymentSource } from "../../../structures/payments/IPaymentSource"; -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * 간편 결제 수단 조회하기. @@ -27,25 +25,20 @@ export async function get( connection: IConnection, input: get.Input, ): Promise { - return !!connection.simulate - ? get.simulate( - connection, - input, - ) - : EncryptedFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "text/plain", - }, - }, - { - ...get.METADATA, - path: get.path(), - } as const, - input, - ); + return EncryptedFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "text/plain", + }, + }, + { + ...get.METADATA, + path: get.path(), + } as const, + input, + ); } export namespace get { export type Input = Primitive; @@ -68,26 +61,6 @@ export namespace get { export const path = (): string => { return `/payments/reservations/get`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: get.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "text/plain", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -106,26 +79,20 @@ export async function at( id: string & Format<"uuid">, input: at.Input, ): Promise { - return !!connection.simulate - ? at.simulate( - connection, - id, - input, - ) - : EncryptedFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "text/plain", - }, - }, - { - ...at.METADATA, - path: at.path(id), - } as const, - input, - ); + return EncryptedFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "text/plain", + }, + }, + { + ...at.METADATA, + path: at.path(id), + } as const, + input, + ); } export namespace at { export type Input = Primitive; @@ -148,28 +115,6 @@ export namespace at { export const path = (id: string & Format<"uuid">): string => { return `/payments/reservations/${encodeURIComponent(id ?? "null")}`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - id: string & Format<"uuid">, - input: at.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(id), - contentType: "text/plain", - }); - assert.param("id")(() => typia.assert(id)); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } /** @@ -186,25 +131,20 @@ export async function create( connection: IConnection, input: create.Input, ): Promise { - return !!connection.simulate - ? create.simulate( - connection, - input, - ) - : EncryptedFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "text/plain", - }, - }, - { - ...create.METADATA, - path: create.path(), - } as const, - input, - ); + return EncryptedFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "text/plain", + }, + }, + { + ...create.METADATA, + path: create.path(), + } as const, + input, + ); } export namespace create { export type Input = Primitive; @@ -227,24 +167,4 @@ export namespace create { export const path = (): string => { return `/payments/reservations`; } - export const random = (g?: Partial): Primitive => - typia.random>(g); - export const simulate = async ( - connection: IConnection, - input: create.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "text/plain", - }); - assert.body(() => typia.assert(input)); - return random( - typeof connection.simulate === 'object' && - connection.simulate !== null - ? connection.simulate - : undefined - ); - } } \ No newline at end of file diff --git a/packages/payment-backend/src/api/functional/payments/webhooks/index.ts b/packages/payment-backend/src/api/functional/payments/webhooks/index.ts index 01ea638..ff4891f 100644 --- a/packages/payment-backend/src/api/functional/payments/webhooks/index.ts +++ b/packages/payment-backend/src/api/functional/payments/webhooks/index.ts @@ -8,9 +8,6 @@ import type { IConnection, Primitive } from "@nestia/fetcher"; import { PlainFetcher } from "@nestia/fetcher/lib/PlainFetcher"; import type { IIamportPayment } from "iamport-server-api/lib/structures/IIamportPayment"; import type { ITossPaymentWebhook } from "toss-payments-server-api/lib/structures/ITossPaymentWebhook"; -import typia from "typia"; - -import { NestiaSimulator } from "../../../utils/NestiaSimulator"; /** * @@ -24,25 +21,20 @@ export async function iamport( connection: IConnection, input: iamport.Input, ): Promise { - return !!connection.simulate - ? iamport.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...iamport.METADATA, - path: iamport.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...iamport.METADATA, + path: iamport.path(), + } as const, + input, + ); } export namespace iamport { export type Input = Primitive; @@ -64,18 +56,6 @@ export namespace iamport { export const path = (): string => { return `/payments/webhooks/iamport`; } - export const simulate = async ( - connection: IConnection, - input: iamport.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - } } /** @@ -90,25 +70,20 @@ export async function toss( connection: IConnection, input: toss.Input, ): Promise { - return !!connection.simulate - ? toss.simulate( - connection, - input, - ) - : PlainFetcher.fetch( - { - ...connection, - headers: { - ...(connection.headers ?? {}), - "Content-Type": "application/json", - }, - }, - { - ...toss.METADATA, - path: toss.path(), - } as const, - input, - ); + return PlainFetcher.fetch( + { + ...connection, + headers: { + ...(connection.headers ?? {}), + "Content-Type": "application/json", + }, + }, + { + ...toss.METADATA, + path: toss.path(), + } as const, + input, + ); } export namespace toss { export type Input = Primitive; @@ -130,16 +105,4 @@ export namespace toss { export const path = (): string => { return `/payments/webhooks/toss`; } - export const simulate = async ( - connection: IConnection, - input: toss.Input, - ): Promise => { - const assert = NestiaSimulator.assert({ - method: METADATA.method, - host: connection.host, - path: path(), - contentType: "application/json", - }); - assert.body(() => typia.assert(input)); - } } \ No newline at end of file diff --git a/packages/toss-payments-server-api/package.json b/packages/toss-payments-server-api/package.json index c453dfd..2719c2d 100644 --- a/packages/toss-payments-server-api/package.json +++ b/packages/toss-payments-server-api/package.json @@ -1,6 +1,6 @@ { "name": "toss-payments-server-api", - "version": "6.0.2", + "version": "6.0.3", "description": "API for Toss Payments Server", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/toss-payments-server-api/swagger.json b/packages/toss-payments-server-api/swagger.json index dbb2ff8..1940fbf 100644 --- a/packages/toss-payments-server-api/swagger.json +++ b/packages/toss-payments-server-api/swagger.json @@ -1 +1 @@ -{"openapi":"3.0.1","servers":[{"url":"http://localhost:30771","description":"fake"},{"url":"https://api.tosspayments.com","description":"real"}],"info":{"title":"Toss Payments API","description":"Built by [fake-toss-payments-server](https://github.com/samchon/payments/tree/master/packages/toss-payments-server-api) with [nestia](https://github.com/samchon/nestia)","version":"6.0.2","license":{"name":"MIT"}},"paths":{"/v1/billing/authorizations/card":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"간편 결제 카드 등록 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.ICreate"}}},"required":true},"responses":{"201":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling"}}}}},"summary":"간편 결제 카드 등록하기","description":"간편 결제 카드 등록하기.\n\n`billing.authorizations.card.create` 는 고객이 자신의 신록 카드를 서버에 등록해두고,\n매번 결제가 필요할 때마다 카드 정보를 반복 입력하는 일 없이 간편하게 결제를\n진행하고자 할 때, 호출되는 API 함수이다.\n\n참고로 `billing.authorizations.card.create` 는 클라이언트 어플리케이션이 토스\n페이먼츠가 제공하는 간편 결제 카드 등록 창을 사용하는 경우, 귀하의 백엔드 서버가 이를\n실 서비스에서 호출하는 일은 없을 것이다. 다만, 고객이 간편 결제 카드를 등록하는\n상황을 시뮬레이션하기 위하여, 테스트 자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"basic":[]}]}},"/v1/billing/authorizations/{billingKey}":{"post":{"tags":[],"parameters":[{"name":"billingKey","in":"path","schema":{"type":"string"},"description":"대상 정보의 ","required":true}],"requestBody":{"description":"고객 식별자 키","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.ICustomerKey"}}},"required":true},"responses":{"201":{"description":"간편 결제 수단 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling"}}}}},"summary":"간편 결제로 등록한 수단 조회하기","description":"간편 결제로 등록한 수단 조회하기.\n\n`billing.authorizations.at` 은 고객이 간편 결제를 위하여 토스 페이먼츠 서버에\n등록한 결제 수단을 조회하는 함수이다.\n\n주로 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로 제공하는 결제 창을 사용하는\n경우, 그래서 프론트 어플리케이션이 귀하의 백엔드 서버에 `billingKey` 와` customerKey`\n만을 전달해주어, 상세 간편 결제 수단 정보가 필요할 때 사용한다.","security":[{"basic":[]}]}},"/v1/billing/{billingKey}":{"post":{"tags":[],"parameters":[{"name":"billingKey","in":"path","schema":{"type":"string"},"description":"간편 결제에 등록한 수단의 ","required":true}],"requestBody":{"description":"주문 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.IPaymentStore"}}},"required":true},"responses":{"201":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"간편 결제에 등록한 수단으로 결제하기","description":"간편 결제에 등록한 수단으로 결제하기.\n\n`billing.pay` 는 간편 결제에 등록한 수단으로 결제를 진행하고자 할 때 호출하는 API\n함수이다.\n\n그리고 `billing.pay` 는 결제 수단 중 유일하게, 클라이언트 어플리케이션이 토스\n페이먼츠가 제공하는 결제 창을 사용할 수 없어, 귀하의 백엔드 서버가 토스 페이먼츠의\nAPI 함수를 직접 호출해야 하는 경우에 해당한다. 따라서 간편 결제에 관련하여 토스\n페이먼츠와 연동하는 백엔드 서버 및 프론트 어플리케이션을 개발할 때, 반드시 이 상황에\n대한 별도의 설계 및 개발이 필요하니, 이 점을 염두에 두기 바란다.\n\n더하여 `billing.pay` 는 철저히 귀사 백엔드 서버의 판단 아래 호출되는 API 함수인지라,\n이를 통하여 이루어지는 결제는 일절 {@link payments.approve } 가 필요 없다. 다만\n`billing.pay` 는 이처럼 부차적인 승인 과정 필요없이 그 즉시로 결제가 완성되니, 이를\n호출하는 상황에 대하여 세심히 주의를 기울일 필요가 있다","security":[{"basic":[]}]}},"/v1/cash-receipts":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt.ICreate"}}},"required":true},"responses":{"201":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt"}}}}},"summary":"현금 영수증 발행하기","description":"현금 영수증 발행하기.","security":[{"basic":[]}]}},"/v1/cash-receipts/{receiptKey}/cancel":{"post":{"tags":[],"parameters":[{"name":"receiptKey","in":"path","schema":{"type":"string"},"description":"현금 영수증의 ","required":true}],"requestBody":{"description":"취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt.ICancel"}}},"required":true},"responses":{"201":{"description":"취소된 현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt"}}}}},"summary":"현금 영수증 취소하기","description":"현금 영수증 취소하기.","security":[{"basic":[]}]}},"/internal/webhook":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"웹훅 이벤트 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPaymentWebhook"}}},"required":true},"responses":{"201":{"description":""}},"summary":"웹훅 이벤트 더미 리스너","description":"웹훅 이벤트 더미 리스너.\n\n`internal.webhook` 은 실제 토스 페이먼츠의 결제 서버에는 존재하지 않는 API 로써,\n`fake-toss-payments-server` 의 {@link Configuration.WEBHOOK_URL } 에 아무런 URL 을\n설정하지 않으면, `fake-toss-payments-server` 로부터 발생하는 모든 종류의 웹훅\n이벤트는 이 곳으로 전달되어 무의미하게 사라진다.\n\n따라서 `fake-toss-payments-server` 를 사용하여 토스 페이먼츠 서버와의 연동을 미리\n검증코자 할 때는, 반드시 {@link Configuration.WEBHOOK_URL } 를 설정하여 웹훅\n이벤트가 귀하의 백엔드 서버로 제대로 전달되도록 하자."}},"/internal/{paymentKey}/deposit":{"put":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"대상 가상 계좌 결제 정보의 ","required":true}],"responses":{"201":{"description":"입금 완료된 가상 꼐좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"가상 계좌에 입금하기","description":"가상 계좌에 입금하기.\n\n`internal.virtual_accounts.deposit` 은 실제 토스 페이먼츠의 결제 서버에는 존재하지\n않는 API 로써, 가상 계좌 결제를 신청한 고객이, 이후 가상 계좌에 목표 금액을 입금하는\n상황을 시뮬레이션할 수 있는 함수이다.\n\n즉 `internal.virtual_accounts.deposit` 는 고객이 스스로에게 가상으로 발급된 계좌에\n입금을 하고, 그에 따라 토스 페이먼츠 서버에서 webhook 이벤트가 발생하여 이를 귀하의\n백엔드 서버로 전송하는 일련의 상황을 테스트하기 위한 함수인 셈이다.","security":[{"basic":[]}]}},"/v1/payments/{paymentKey}":{"get":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"결제 정보의 ","required":true}],"responses":{"200":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 정보 조회하기","description":"결제 정보 조회하기.\n\n`payments.at` 은 결제 정보를 조회하는 함수이다.\n\n주로 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로 제공하는 결제 창을 사용하는\n경우, 그래서 프론트 어플리케이션이 귀하의 백엔드 서버에 `paymentKey` 등 극히 일부의\n식별자 정보만을 전달해주어, 상세 결제 정보가 필요할 때 사용한다.\n\n참고로 토스 페이먼츠는 다른 결제 PG 사들과 다르게, 클라이언트 어플리케이션에서 토스\n페이먼츠의 결제 창을 이용하여 진행한 결제가 바로 확정되는 것은 아니다. 귀사의 백엔드\n서버가 현재의 `payments.at` 을 통하여 해당 결제 정보를 확인하고, {@link approve } 를\n호출하여 직접 승인하기 전까지, 해당 결제는 확정되지 않으니, 이 점에 유의하기 바란다."},"post":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"대상 결제의 ","required":true}],"requestBody":{"description":"주문 정보 확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment.IApproval"}}},"required":true},"responses":{"201":{"description":"승인된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 승인하기","description":"결제 승인하기.\n\n토스 페이먼츠는 귀사의 백엔드에서 일어난 결제가 아닌 프론트 어플리케이션의 결제 창에서\n이루어진 결제의 경우, 해당 서비스으 백엔드 서버로부터 결제를 승인받기 전까지, 이를\n확정하지 않는다. `payments.approve` 는 바로 이러한 상황에서, 해당 결제를 승인해주는\n함수이다.\n\n만일 귀하가 `fake-toss-payments-server` 를 이용하여 결제를 시뮬레이션하는 경우라면,\n결제 관련 API 를 호출함에 있어 {@link ITossCardPayment.ICreate.__approved } 내지\n{@link ITossVirtualAccountPayment.ICreate.__approved } 를 `false` 로 함으로써, 별도\n승인이 필요한 이러한 상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}},"/v1/payments/key-in":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"카드 결제 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCardPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCardPayment"}}}}},"summary":"카드로 결제하기","description":"카드로 결제하기.\n\n`payments.key_in` 은 카드를 이용한 결제를 할 때 호출되는 API 함수이다.\n\n참고로 `payments.key_in` 는 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로\n제공하는 결제 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는\n일은 없을 것이다. 다만, 고객이 카드를 통하여 결제하는 상황을 시뮬레이션하기 위하여,\n테스트 자동화 프로그램 수준에서 사용될 수는 있다.\n\n그리고 귀하의 백엔드 서버가 `payments.key-in` 을 직접 호출하는 경우, 토스 페이먼츠\n서버는 이를 완전히 승인된 결제로 보고 바로 확정한다. 때문에 `payments.key-in` 을\n직접 호출하는 경우, 토스 페이먼츠의 결제 창을 이용하여 별도의 {@link approve } 가\n필요한 때 대비, 훨씬 더 세심한 주의가 요구된다.\n\n더하여 만약 귀하의 백엔드 서버가 `fake-toss-payments-server` 를 이용하여 고객의\n카드 결제를 시뮬레이션하는 경우, {@link ITossCardPayment.ICreate.__approved } 값을\n`false` 로 하여 카드 결제의 확정을 고의로 회피할 수 있다. 이를 통하여 토스\n페이먼츠의 결제 창을 이용한 카드 결제의 경우, 별도의 {@link approve } 가 필요한\n상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}},"/v1/payments/{paymentKey}/cancel":{"post":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"결제 정보의 ","required":true}],"requestBody":{"description":"취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPaymentCancel.ICreate"}}},"required":true},"responses":{"201":{"description":"취소된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 취소하기","description":"결제 취소하기.\n\n`payments.cancel` 은 결제를 취소하는 API 이다.\n\n결제 취소 입력 정보 {@link ITossPaymentCancel.ICreate } 에는 취소 사유를 비롯하여,\n고객에게 환불해 줄 금액과 부가세 및 필요시 환불 계좌 정보 등을 입력하게 되어있다.","security":[{"basic":[]}]}},"/v1/virtual-accounts":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"가상 결제 신청 정보.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}}}}},"summary":"가상 계좌로 결제 신청하기","description":"가상 계좌로 결제 신청하기.\n\n`virtual_accounts.create` 는 고객이 결제 수단을 가상 계좌로 선택하는 경우에 호출되는\nAPI 함수이다. 물론 고객이 이처럼 가상 계좌를 선택한 경우, 고객이 지정된 계좌에 돈을\n입금하기 전까지는 결제가 마무리된 것이 아니기에, {@link ITossPayment.status } 값은\n`WAITING_FOR_DEPOSIT` 이 된다.\n\n참고로 `virtual_accounts.create` 는 클라이언트 어플리케이션이 토스 페이먼츠가\n자체적으로 제공하는 결제 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서\n호출하는 일은 없을 것이다. 다만, 고객이 가상 계좌로 결제를 진행하는 상황을\n시뮬레이션하기 위하여, 테스트 자동화 프로그램 수준에서 사용될 수는 있다.\n\n그리고 `virtual_accounts.create` 이후에 고객이 지정된 계좌에 금액을 입금하거든, 토스\n페이먼츠 서버로부터 웹훅 이벤트가 발생되어 귀하의 백엔드 서버로 전송된다. 만약 연동\n대상 토스 페이먼츠 서버가 실제가 아닌 `fake-toss-payments-server` 라면,\n{@link internal.virtual_accounts.deposit } 를 호출하여, 고객이 가상 계좌에 입금하는\n상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}}},"components":{"schemas":{"ITossBilling.ICreate":{"type":"object","properties":{"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"cardExpirationYear":{"type":"string","pattern":"\\d{2}","description":"카드 만료 년도 (2 자리)."},"cardExpirationMonth":{"type":"string","pattern":"^(0[1-9]|1[012])$","description":"카드 만료 월 (2 자리)."},"cardPassword":{"type":"string","description":"카드 비밀번호."},"customerBirthday":{"type":"string","pattern":"^([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"고객의 생년월일.\n\n표기 형식 YYMMDD."},"consumerName":{"type":"string","description":"고객의 이름."},"customerEmail":{"type":"string","format":"email","description":"고객의 이메일."},"vbv":{"type":"object","properties":{"cavv":{"type":"string","description":"3D Secure 인증 세션에 대한 인증 값."},"xid":{"type":"string","description":"트랜잭션 ID."},"eci":{"type":"string","description":"3DS 인증 결과에 대한 코드 값."}},"nullable":false,"required":["cavv","xid","eci"],"description":"해외카드로 결제하는 경우 3DS 인증 적용을 위해 사용.\n\n3DS 인증 결과를 전송해야 하는 경우에만 필수."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["cardNumber","cardExpirationYear","cardExpirationMonth","cardPassword","customerBirthday","customerKey"],"description":"간편 결제 카드 등록 정보."},"ITossBilling":{"type":"object","properties":{"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"billingKey":{"type":"string","description":"{@link ITossBilling } 의 식별자 키."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"cardCompany":{"type":"string","description":"카드사 이름."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"authenticatedAt":{"type":"string","format":"date-time","description":"인증 일시."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["mId","billingKey","method","cardCompany","cardNumber","authenticatedAt","customerKey"],"description":"간편 결제 등록 수단 정보.\n\n`ITossBilling` 은 간편 결제 등록 수단을 형상화한 자료구조 인터페이스로써, 고객이 자신의\n신용 카드를 서버에 등록해두고, 매번 결제가 필요할 때마다 카드 정보를 반복 입려하는 일\n없이 간편하게 결제를 진행하고자 할 때 사용한다."},"ITossBilling.ICustomerKey":{"type":"object","properties":{"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["customerKey"],"description":"고객 식별자 정보."},"ITossBilling.IPaymentStore":{"type":"object","properties":{"method":{"type":"string","enum":["billing"],"description":"결제 수단이 간편 결제임을 의미함."},"billingKey":{"type":"string","description":"{@link IPaymentStore } 의 식별자 키."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["method","billingKey","orderId","amount","customerKey"],"description":"간편 결제를 이용한 결제 신청 정보."},"ITossPayment":{"oneOf":[{"$ref":"#/components/schemas/ITossCardPayment"},{"$ref":"#/components/schemas/ITossGiftCertificatePayment"},{"$ref":"#/components/schemas/ITossMobilePhonePayment"},{"$ref":"#/components/schemas/ITossTransferPayment"},{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}],"description":"결제 정보.\n\n`ITossPayment` 는 토스 페이먼츠의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.method === \"카드\")\n payment.card; // payment be ITossCardPayment\n```"},"ITossCardPayment":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/ITossCardPayment.ICard","description":"카드 정보."},"discount":{"$ref":"#/components/schemas/ITossCardPayment.IDiscount.Nullable","description":"카드사의 즉시 할인 프로모션 정보."},"easyPay":{"type":"string","enum":["토스결제","페이코","삼성페이"],"nullable":true,"description":"간편결제로 결제한 경우 간편결제 타입 정보."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL","BILLING"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["card","discount","easyPay","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"카드 결제 정보."},"ITossCardPayment.ICard":{"type":"object","properties":{"company":{"type":"string","description":"카드사 이름."},"number":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"installmentPlanMonths":{"type":"number","description":"할부 개월 수."},"isInterestFree":{"type":"boolean","description":"무이자 할부 적용 여부."},"approveNo":{"type":"string","description":"승인 번호."},"useCardPoint":{"type":"boolean","enum":[false],"description":"카드 포인트 사용 여부."},"cardType":{"type":"string","enum":["신용","체크","기프트"],"description":"카드 타입."},"ownerType":{"type":"string","enum":["개인","법인"],"description":"카드의 소유자 타입."},"acquireStatus":{"type":"string","enum":["READY","CANCELED","REQUESTED","COMPLETED","CANCEL_REQUESTED"],"description":"카드 결제의 매입 상태.\n\n - READY: 매입 대기\n - REQUESTED: 매입 요청됨\n - COMPLETED: 매입 완료\n - CANCEL_REQUESTED: 매입 취소 요청됨\n - CANCELD: 매입 취소됨"},"receiptUrl":{"type":"string","format":"url","description":"영수증 URL."}},"nullable":false,"required":["company","number","installmentPlanMonths","isInterestFree","approveNo","useCardPoint","cardType","ownerType","acquireStatus","receiptUrl"],"description":"카드 정보."},"ITossCardPayment.IDiscount.Nullable":{"type":"object","properties":{"amount":{"type":"number","description":"카드사의 즉시 할인 프로모션을 적용한 금액."}},"nullable":true,"required":["amount"],"description":"카드사의 즉시 할인 프로모션 정보."},"ITossPaymentCancel":{"type":"object","properties":{"cancelAmount":{"type":"number","description":"취소 총액."},"cancelReason":{"type":"string","description":"취소 사유."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"taxAmount":{"type":"number","description":"과세 처리된 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."},"canceledAt":{"type":"string","format":"date-time","description":"취소 일시."}},"nullable":false,"required":["cancelAmount","cancelReason","taxFreeAmount","taxAmount","refundableAmount","canceledAt"],"description":"결제 취소 정보."},"ITossCashReceipt.ISummary.Nullable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"amount":{"type":"number","description":"현금 영수증 처리된 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"issueNumber":{"type":"string","description":"현금영수증 발급번호."},"receiptUrl":{"type":"string","description":"현금영수증 조회 페이지 주소."}},"nullable":true,"required":["type","amount","taxFreeAmount","issueNumber","receiptUrl"],"description":"현금 영수증 요약 정보."},"ITossCashReceipt.Type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"ITossGiftCertificatePayment":{"type":"object","properties":{"giftCertificate":{"$ref":"#/components/schemas/ITossGiftCertificatePayment.IGiftCertificate","description":"상품권 정보."},"method":{"type":"string","enum":["상품권"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["giftCertificate","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"상품권 결제 정보."},"ITossGiftCertificatePayment.IGiftCertificate":{"type":"object","properties":{"approveNo":{"type":"string","description":"승인 번호."},"settlementStatus":{"type":"string","enum":["COMPLETE","INCOMPLETE"],"description":"정산 상태."}},"nullable":false,"required":["approveNo","settlementStatus"],"description":"상품권 정보."},"ITossMobilePhonePayment":{"type":"object","properties":{"mobilePhone":{"$ref":"#/components/schemas/ITossMobilePhonePayment.IMobilePhone","description":"휴대폰 정보."},"method":{"type":"string","enum":["휴대폰"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["mobilePhone","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"휴대폰 결제 정보."},"ITossMobilePhonePayment.IMobilePhone":{"type":"object","properties":{"carrier":{"type":"string","description":"통신사."},"customerMobilePhone":{"type":"string","description":"고객 휴대폰 번호."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."}},"nullable":false,"required":["carrier","customerMobilePhone","settlementStatus"],"description":"휴대폰 정보."},"ITossTransferPayment":{"type":"object","properties":{"transfer":{"$ref":"#/components/schemas/ITossTransferPayment.ITransfer","description":"계좌 이체 정보."},"method":{"type":"string","enum":["계좌이체"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["transfer","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"계좌 이체 결제 정보."},"ITossTransferPayment.ITransfer":{"type":"object","properties":{"bank":{"type":"string","description":"은행명."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"이체 상태."}},"nullable":false,"required":["bank","settlementStatus"],"description":"계좌 이체 정보."},"ITossVirtualAccountPayment":{"type":"object","properties":{"secret":{"type":"string","description":"가상 계좌로 결제할 때 전달되는 입금 콜백을 검증하기 위한 값."},"virtualAccount":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.IVirtualAccount","description":"가상 계좌 정보."},"method":{"type":"string","enum":["가상계좌"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["secret","virtualAccount","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"가상 계좌 결제 정보."},"ITossVirtualAccountPayment.IVirtualAccount":{"type":"object","properties":{"accountNumber":{"type":"string","description":"계좌 번호."},"accountType":{"type":"string","enum":["일반","고정"],"description":"가상 계좌 타입."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"dueDate":{"type":"string","format":"date","description":"입금 기한."},"expired":{"type":"boolean","description":"가상 계좌 만료 여부."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."},"refundStatus":{"type":"string","enum":["COMPLETED","NONE","FAILED","PENDING","PARTIAL_FAILED"],"description":"환불 처리 상태.\n\n - NONE: 해당 없음\n - FAILED: 환불 실패\n - PENDING: 환불 처리중\n - PARTIAL_FAILED: 부분 환불 실패\n - COMPLETED: 환불 완료"}},"nullable":false,"required":["accountNumber","accountType","bank","customerName","dueDate","expired","settlementStatus","refundStatus"],"description":"가상 계좌 정보."},"ITossCashReceipt.ICreate":{"type":"object","properties":{"type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"paymentKey":{"type":"string","description":"귀속 결제의 {@link ITossPayment.paymentKey }."},"orderId":{"type":"string","description":"주문의 식별자 ID."},"orderName":{"type":"string","description":"주문 이름."},"registrationNumber":{"type":"string","description":"현금 영수증 발급을 위한 개인 식별 번호.\n\n현금 영수증의 종류에 따라 휴대폰 번호나 주민등록번호 또는 사업자등록번호 및\n카드 번호를 입력할 수 있다."},"amount":{"type":"number","description":"현금 영수증을 발행할 금액."},"taxFreeAmount":{"type":"number","description":"면세 금액."},"businessNumber":{"type":"string","description":"사업자 등록번호."}},"nullable":false,"required":["type","paymentKey","orderId","orderName","registrationNumber","amount"],"description":"현금 영수증 입력 정보."},"ITossCashReceipt":{"type":"object","properties":{"receiptKey":{"type":"string","description":"현금 영수증의 식별자 키."},"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"orderId":{"type":"string","description":"주문의 식별자 ID."},"orderName":{"type":"string","description":"주문 이름."},"approvalNumber":{"type":"string","description":"현금 영수증 승인 번호."},"approvedAt":{"type":"string","format":"date-time","description":"현금 영수증 승인 일시."},"canceledAt":{"type":"string","format":"date-time","nullable":true,"description":"현금 영수증 취소 일시."},"receiptUrl":{"type":"string","description":"영수증 URL."}},"nullable":false,"required":["receiptKey","type","orderId","orderName","approvalNumber","approvedAt","canceledAt","receiptUrl"],"description":"현금 영수증 정보."},"ITossCashReceipt.ICancel":{"type":"object","properties":{"amount":{"type":"number","description":"취소 금액.\n\n미 입력시 현금 영수증에 기재된 {@link ITossCashReceipt.amount 총액}이 취소됨."}},"nullable":false,"description":"현금 영수증 취소 입력 정보."},"ITossPaymentWebhook":{"type":"object","properties":{"eventType":{"type":"string","enum":["PAYMENT_STATUS_CHANGED"],"description":"이벤트 타입."},"data":{"$ref":"#/components/schemas/ITossPaymentWebhook.IData","description":"이벤트 데이터."}},"nullable":false,"required":["eventType","data"],"description":"웹훅 이벤트 정보."},"ITossPaymentWebhook.IData":{"type":"object","properties":{"paymentKey":{"type":"string","description":"{@link ITossPayment } 의 식별자 키."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"status":{"type":"string","enum":["WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED"],"description":"결제 상태.\n\n - DONE: 결제 완료\n - CANCELED: 결제가 취소됨\n - PARTIAL_CANCELED: 결제가 부분 취소됨\n - WAITING_FOR_DEPOSIT: 입금 대기 중"}},"nullable":false,"required":["paymentKey","orderId","status"],"description":"웹훅 이벤트 데이터."},"ITossCardPayment.ICreate":{"type":"object","properties":{"method":{"type":"string","enum":["card"],"description":"결제 수단이 신용 카드임을 의미."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"cardExpirationYear":{"type":"string","pattern":"\\d{2}","description":"카드 만료 년도 (2 자리)."},"cardExpirationMonth":{"type":"string","pattern":"^(0[1-9]|1[012])$","description":"카드 만료 월 (2 자리)."},"cardPassword":{"type":"string","description":"카드 비밀번호."},"cardInstallmentPlan":{"type":"number","description":"할부 개월 수."},"amount":{"type":"number","description":"지불 총액."},"taxFreeAmount":{"type":"number","description":"면세금 총액."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"customerBirthday":{"type":"string","pattern":"^([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"고객의 생년월일.\n\n표기 형식 YYMMDD."},"customerEmail":{"type":"string","format":"email","description":"고객의 이메일."},"vbv":{"type":"object","properties":{"cavv":{"type":"string","description":"3D Secure 인증 세션에 대한 인증 값."},"xid":{"type":"string","description":"트랜잭션 ID."},"eci":{"type":"string","description":"3DS 인증 결과에 대한 코드 값."}},"nullable":false,"required":["cavv","xid","eci"],"description":"해외카드로 결제하는 경우 3DS 인증 적용을 위해 사용.\n\n3DS 인증 결과를 전송해야 하는 경우에만 필수."},"__approved":{"type":"boolean","description":"결제 승인 여부.\n\n오직 가짜 페이먼츠 서버 `fake-toss-payments-server` 에서만 사용되는 값으로써,\n결제 승인을 고의로 지연시키거나 할 때 사용된다. 이 값을 `false` 로 하면, 프론트\n어플리케이션이 토스 페이먼츠가 제공해주는 결제 창을 사용하여 결제를 진행하는\n상황을 시뮬레이션할 수 있다.\n\n본디 토스 페이먼츠 서버는 프론트 어플리케이션에서 백엔드 서버를 거치지 않고,\n토스 페이먼츠가 제공해주는 결제 창을 이용하여 직접 결제를 요청하는 경우,\n백엔드에서 이를 별도 {@link functional.payments.approve 승인} 처리해주기 전까지\n정식 결제로 인청치 아니한다.\n\n반면 백엔드 서버에서 토스 페이먼츠 서버의 API 를 호출하는 경우, 토스 페이먼츠는\n이를 그 즉시로 승인해주기, `fake-toss-payments-server` 에서 별도의 승인 처리가\n필요한 상황을 시뮬레이션하기 위해서는 이러한 속성이 필요한 것."}},"nullable":false,"required":["method","cardNumber","cardExpirationYear","cardExpirationMonth","amount","orderId"],"description":"신용 카드를 이용한 결제 신청 정보."},"ITossPayment.IApproval":{"type":"object","properties":{"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."}},"nullable":false,"required":["orderId","amount"],"description":"결제 승인 정보."},"ITossPaymentCancel.ICreate":{"type":"object","properties":{"paymentKey":{"type":"string","description":"{@link ITossPayment } 의 식별자 키."},"cancelReason":{"type":"string","description":"취소 사유."},"cancelAmount":{"type":"number","description":"취소 총액."},"refundReceiveAccount":{"type":"object","properties":{"bank":{"type":"string","description":"은행 정보."},"accountNumber":{"type":"string","pattern":"^[0-9]{0,20}$","description":"계좌 번호."},"holderName":{"type":"string","description":"예금주."}},"nullable":false,"required":["bank","accountNumber","holderName"],"description":"환불 계좌 정보.\n\n결제를 가상 계좌로 하였을 때에만 해당함."},"taxAmount":{"type":"number","description":"과세 처리 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."}},"nullable":false,"required":["paymentKey","cancelReason"],"description":"결제 취소 신청 정보."},"ITossVirtualAccountPayment.ICreate":{"type":"object","properties":{"method":{"type":"string","enum":["virtual-account"],"description":"결제 수단이 가상 계좌임을 의미."},"orderId":{"type":"string","description":"주문 식별자 번호.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"amount":{"type":"number","description":"결제 총액."},"__approved":{"type":"boolean","description":"결제 승인 여부.\n\n오직 가짜 페이먼츠 서버 `fake-toss-payments-server` 에서만 사용되는 값으로써,\n결제 승인을 고의로 지연시키거나 할 때 사용된다. 이 값을 `false` 로 하면, 프론트\n어플리케이션이 토스 페이먼츠가 제공해주는 결제 창을 사용하여 결제를 진행하는\n상황을 시뮬레이션할 수 있다.\n\n본디 토스 페이먼츠 서버는 프론트 어플리케이션에서 백엔드 서버를 거치지 않고,\n토스 페이먼츠가 제공해주는 결제 창을 이용하여 직접 결제를 요청하는 경우,\n백엔드에서 이를 별도 {@link functional.payments.approve 승인} 처리해주기 전까지\n정식 결제로 인청치 아니한다.\n\n반면 백엔드 서버에서 토스 페이먼츠 서버의 API 를 호출하는 경우, 토스 페이먼츠는\n이를 그 즉시로 승인해주기, `fake-toss-payments-server` 에서 별도의 승인 처리가\n필요한 상황을 시뮬레이션하기 위해서는 이러한 속성이 필요한 것."}},"nullable":false,"required":["method","orderId","orderName","bank","customerName","amount"],"description":"가상 계좌를 이용한 결제 신청 정보."}},"securitySchemes":{"basic":{"type":"apiKey","name":"Authorization","in":"header"}}}} \ No newline at end of file +{"openapi":"3.0.1","servers":[{"url":"http://localhost:30771","description":"fake"},{"url":"https://api.tosspayments.com","description":"real"}],"info":{"title":"Toss Payments API","description":"Built by [fake-toss-payments-server](https://github.com/samchon/payments/tree/master/packages/toss-payments-server-api) with [nestia](https://github.com/samchon/nestia)","version":"6.0.3","license":{"name":"MIT"}},"paths":{"/v1/billing/authorizations/card":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"간편 결제 카드 등록 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.ICreate"}}},"required":true},"responses":{"201":{"description":"간편 결제 카드 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling"}}}}},"summary":"간편 결제 카드 등록하기","description":"간편 결제 카드 등록하기.\n\n`billing.authorizations.card.create` 는 고객이 자신의 신록 카드를 서버에 등록해두고,\n매번 결제가 필요할 때마다 카드 정보를 반복 입력하는 일 없이 간편하게 결제를\n진행하고자 할 때, 호출되는 API 함수이다.\n\n참고로 `billing.authorizations.card.create` 는 클라이언트 어플리케이션이 토스\n페이먼츠가 제공하는 간편 결제 카드 등록 창을 사용하는 경우, 귀하의 백엔드 서버가 이를\n실 서비스에서 호출하는 일은 없을 것이다. 다만, 고객이 간편 결제 카드를 등록하는\n상황을 시뮬레이션하기 위하여, 테스트 자동화 프로그램 수준에서 사용될 수는 있다.","security":[{"basic":[]}]}},"/v1/billing/authorizations/{billingKey}":{"post":{"tags":[],"parameters":[{"name":"billingKey","in":"path","schema":{"type":"string"},"description":"대상 정보의 ","required":true}],"requestBody":{"description":"고객 식별자 키","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.ICustomerKey"}}},"required":true},"responses":{"201":{"description":"간편 결제 수단 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling"}}}}},"summary":"간편 결제로 등록한 수단 조회하기","description":"간편 결제로 등록한 수단 조회하기.\n\n`billing.authorizations.at` 은 고객이 간편 결제를 위하여 토스 페이먼츠 서버에\n등록한 결제 수단을 조회하는 함수이다.\n\n주로 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로 제공하는 결제 창을 사용하는\n경우, 그래서 프론트 어플리케이션이 귀하의 백엔드 서버에 `billingKey` 와` customerKey`\n만을 전달해주어, 상세 간편 결제 수단 정보가 필요할 때 사용한다.","security":[{"basic":[]}]}},"/v1/billing/{billingKey}":{"post":{"tags":[],"parameters":[{"name":"billingKey","in":"path","schema":{"type":"string"},"description":"간편 결제에 등록한 수단의 ","required":true}],"requestBody":{"description":"주문 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossBilling.IPaymentStore"}}},"required":true},"responses":{"201":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"간편 결제에 등록한 수단으로 결제하기","description":"간편 결제에 등록한 수단으로 결제하기.\n\n`billing.pay` 는 간편 결제에 등록한 수단으로 결제를 진행하고자 할 때 호출하는 API\n함수이다.\n\n그리고 `billing.pay` 는 결제 수단 중 유일하게, 클라이언트 어플리케이션이 토스\n페이먼츠가 제공하는 결제 창을 사용할 수 없어, 귀하의 백엔드 서버가 토스 페이먼츠의\nAPI 함수를 직접 호출해야 하는 경우에 해당한다. 따라서 간편 결제에 관련하여 토스\n페이먼츠와 연동하는 백엔드 서버 및 프론트 어플리케이션을 개발할 때, 반드시 이 상황에\n대한 별도의 설계 및 개발이 필요하니, 이 점을 염두에 두기 바란다.\n\n더하여 `billing.pay` 는 철저히 귀사 백엔드 서버의 판단 아래 호출되는 API 함수인지라,\n이를 통하여 이루어지는 결제는 일절 {@link payments.approve } 가 필요 없다. 다만\n`billing.pay` 는 이처럼 부차적인 승인 과정 필요없이 그 즉시로 결제가 완성되니, 이를\n호출하는 상황에 대하여 세심히 주의를 기울일 필요가 있다","security":[{"basic":[]}]}},"/v1/cash-receipts":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt.ICreate"}}},"required":true},"responses":{"201":{"description":"현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt"}}}}},"summary":"현금 영수증 발행하기","description":"현금 영수증 발행하기.","security":[{"basic":[]}]}},"/v1/cash-receipts/{receiptKey}/cancel":{"post":{"tags":[],"parameters":[{"name":"receiptKey","in":"path","schema":{"type":"string"},"description":"현금 영수증의 ","required":true}],"requestBody":{"description":"취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt.ICancel"}}},"required":true},"responses":{"201":{"description":"취소된 현금 영수증 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCashReceipt"}}}}},"summary":"현금 영수증 취소하기","description":"현금 영수증 취소하기.","security":[{"basic":[]}]}},"/internal/webhook":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"웹훅 이벤트 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPaymentWebhook"}}},"required":true},"responses":{"201":{"description":""}},"summary":"웹훅 이벤트 더미 리스너","description":"웹훅 이벤트 더미 리스너.\n\n`internal.webhook` 은 실제 토스 페이먼츠의 결제 서버에는 존재하지 않는 API 로써,\n`fake-toss-payments-server` 의 {@link Configuration.WEBHOOK_URL } 에 아무런 URL 을\n설정하지 않으면, `fake-toss-payments-server` 로부터 발생하는 모든 종류의 웹훅\n이벤트는 이 곳으로 전달되어 무의미하게 사라진다.\n\n따라서 `fake-toss-payments-server` 를 사용하여 토스 페이먼츠 서버와의 연동을 미리\n검증코자 할 때는, 반드시 {@link Configuration.WEBHOOK_URL } 를 설정하여 웹훅\n이벤트가 귀하의 백엔드 서버로 제대로 전달되도록 하자."}},"/internal/{paymentKey}/deposit":{"put":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"대상 가상 계좌 결제 정보의 ","required":true}],"responses":{"201":{"description":"입금 완료된 가상 꼐좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"가상 계좌에 입금하기","description":"가상 계좌에 입금하기.\n\n`internal.virtual_accounts.deposit` 은 실제 토스 페이먼츠의 결제 서버에는 존재하지\n않는 API 로써, 가상 계좌 결제를 신청한 고객이, 이후 가상 계좌에 목표 금액을 입금하는\n상황을 시뮬레이션할 수 있는 함수이다.\n\n즉 `internal.virtual_accounts.deposit` 는 고객이 스스로에게 가상으로 발급된 계좌에\n입금을 하고, 그에 따라 토스 페이먼츠 서버에서 webhook 이벤트가 발생하여 이를 귀하의\n백엔드 서버로 전송하는 일련의 상황을 테스트하기 위한 함수인 셈이다.","security":[{"basic":[]}]}},"/v1/payments/{paymentKey}":{"get":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"결제 정보의 ","required":true}],"responses":{"200":{"description":"결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 정보 조회하기","description":"결제 정보 조회하기.\n\n`payments.at` 은 결제 정보를 조회하는 함수이다.\n\n주로 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로 제공하는 결제 창을 사용하는\n경우, 그래서 프론트 어플리케이션이 귀하의 백엔드 서버에 `paymentKey` 등 극히 일부의\n식별자 정보만을 전달해주어, 상세 결제 정보가 필요할 때 사용한다.\n\n참고로 토스 페이먼츠는 다른 결제 PG 사들과 다르게, 클라이언트 어플리케이션에서 토스\n페이먼츠의 결제 창을 이용하여 진행한 결제가 바로 확정되는 것은 아니다. 귀사의 백엔드\n서버가 현재의 `payments.at` 을 통하여 해당 결제 정보를 확인하고, {@link approve } 를\n호출하여 직접 승인하기 전까지, 해당 결제는 확정되지 않으니, 이 점에 유의하기 바란다."},"post":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"대상 결제의 ","required":true}],"requestBody":{"description":"주문 정보 확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment.IApproval"}}},"required":true},"responses":{"201":{"description":"승인된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 승인하기","description":"결제 승인하기.\n\n토스 페이먼츠는 귀사의 백엔드에서 일어난 결제가 아닌 프론트 어플리케이션의 결제 창에서\n이루어진 결제의 경우, 해당 서비스으 백엔드 서버로부터 결제를 승인받기 전까지, 이를\n확정하지 않는다. `payments.approve` 는 바로 이러한 상황에서, 해당 결제를 승인해주는\n함수이다.\n\n만일 귀하가 `fake-toss-payments-server` 를 이용하여 결제를 시뮬레이션하는 경우라면,\n결제 관련 API 를 호출함에 있어 {@link ITossCardPayment.ICreate.__approved } 내지\n{@link ITossVirtualAccountPayment.ICreate.__approved } 를 `false` 로 함으로써, 별도\n승인이 필요한 이러한 상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}},"/v1/payments/key-in":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"카드 결제 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCardPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"카드 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossCardPayment"}}}}},"summary":"카드로 결제하기","description":"카드로 결제하기.\n\n`payments.key_in` 은 카드를 이용한 결제를 할 때 호출되는 API 함수이다.\n\n참고로 `payments.key_in` 는 클라이언트 어플리케이션이 토스 페이먼츠가 자체적으로\n제공하는 결제 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서 호출하는\n일은 없을 것이다. 다만, 고객이 카드를 통하여 결제하는 상황을 시뮬레이션하기 위하여,\n테스트 자동화 프로그램 수준에서 사용될 수는 있다.\n\n그리고 귀하의 백엔드 서버가 `payments.key-in` 을 직접 호출하는 경우, 토스 페이먼츠\n서버는 이를 완전히 승인된 결제로 보고 바로 확정한다. 때문에 `payments.key-in` 을\n직접 호출하는 경우, 토스 페이먼츠의 결제 창을 이용하여 별도의 {@link approve } 가\n필요한 때 대비, 훨씬 더 세심한 주의가 요구된다.\n\n더하여 만약 귀하의 백엔드 서버가 `fake-toss-payments-server` 를 이용하여 고객의\n카드 결제를 시뮬레이션하는 경우, {@link ITossCardPayment.ICreate.__approved } 값을\n`false` 로 하여 카드 결제의 확정을 고의로 회피할 수 있다. 이를 통하여 토스\n페이먼츠의 결제 창을 이용한 카드 결제의 경우, 별도의 {@link approve } 가 필요한\n상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}},"/v1/payments/{paymentKey}/cancel":{"post":{"tags":[],"parameters":[{"name":"paymentKey","in":"path","schema":{"type":"string"},"description":"결제 정보의 ","required":true}],"requestBody":{"description":"취소 입력 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPaymentCancel.ICreate"}}},"required":true},"responses":{"201":{"description":"취소된 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossPayment"}}}}},"summary":"결제 취소하기","description":"결제 취소하기.\n\n`payments.cancel` 은 결제를 취소하는 API 이다.\n\n결제 취소 입력 정보 {@link ITossPaymentCancel.ICreate } 에는 취소 사유를 비롯하여,\n고객에게 환불해 줄 금액과 부가세 및 필요시 환불 계좌 정보 등을 입력하게 되어있다.","security":[{"basic":[]}]}},"/v1/virtual-accounts":{"post":{"tags":[],"parameters":[],"requestBody":{"description":"가상 결제 신청 정보.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.ICreate"}}},"required":true},"responses":{"201":{"description":"가상 계좌 결제 정보","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}}}}},"summary":"가상 계좌로 결제 신청하기","description":"가상 계좌로 결제 신청하기.\n\n`virtual_accounts.create` 는 고객이 결제 수단을 가상 계좌로 선택하는 경우에 호출되는\nAPI 함수이다. 물론 고객이 이처럼 가상 계좌를 선택한 경우, 고객이 지정된 계좌에 돈을\n입금하기 전까지는 결제가 마무리된 것이 아니기에, {@link ITossPayment.status } 값은\n`WAITING_FOR_DEPOSIT` 이 된다.\n\n참고로 `virtual_accounts.create` 는 클라이언트 어플리케이션이 토스 페이먼츠가\n자체적으로 제공하는 결제 창을 사용하는 경우, 귀하의 백엔드 서버가 이를 실 서비스에서\n호출하는 일은 없을 것이다. 다만, 고객이 가상 계좌로 결제를 진행하는 상황을\n시뮬레이션하기 위하여, 테스트 자동화 프로그램 수준에서 사용될 수는 있다.\n\n그리고 `virtual_accounts.create` 이후에 고객이 지정된 계좌에 금액을 입금하거든, 토스\n페이먼츠 서버로부터 웹훅 이벤트가 발생되어 귀하의 백엔드 서버로 전송된다. 만약 연동\n대상 토스 페이먼츠 서버가 실제가 아닌 `fake-toss-payments-server` 라면,\n{@link internal.virtual_accounts.deposit } 를 호출하여, 고객이 가상 계좌에 입금하는\n상황을 시뮬레이션 할 수 있다.","security":[{"basic":[]}]}}},"components":{"schemas":{"ITossBilling.ICreate":{"type":"object","properties":{"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"cardExpirationYear":{"type":"string","pattern":"\\d{2}","description":"카드 만료 년도 (2 자리)."},"cardExpirationMonth":{"type":"string","pattern":"^(0[1-9]|1[012])$","description":"카드 만료 월 (2 자리)."},"cardPassword":{"type":"string","description":"카드 비밀번호."},"customerBirthday":{"type":"string","pattern":"^([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"고객의 생년월일.\n\n표기 형식 YYMMDD."},"consumerName":{"type":"string","description":"고객의 이름."},"customerEmail":{"type":"string","format":"email","description":"고객의 이메일."},"vbv":{"type":"object","properties":{"cavv":{"type":"string","description":"3D Secure 인증 세션에 대한 인증 값."},"xid":{"type":"string","description":"트랜잭션 ID."},"eci":{"type":"string","description":"3DS 인증 결과에 대한 코드 값."}},"nullable":false,"required":["cavv","xid","eci"],"description":"해외카드로 결제하는 경우 3DS 인증 적용을 위해 사용.\n\n3DS 인증 결과를 전송해야 하는 경우에만 필수."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["cardNumber","cardExpirationYear","cardExpirationMonth","cardPassword","customerBirthday","customerKey"],"description":"간편 결제 카드 등록 정보."},"ITossBilling":{"type":"object","properties":{"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"billingKey":{"type":"string","description":"{@link ITossBilling } 의 식별자 키."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"cardCompany":{"type":"string","description":"카드사 이름."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"authenticatedAt":{"type":"string","format":"date-time","description":"인증 일시."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["mId","billingKey","method","cardCompany","cardNumber","authenticatedAt","customerKey"],"description":"간편 결제 등록 수단 정보.\n\n`ITossBilling` 은 간편 결제 등록 수단을 형상화한 자료구조 인터페이스로써, 고객이 자신의\n신용 카드를 서버에 등록해두고, 매번 결제가 필요할 때마다 카드 정보를 반복 입려하는 일\n없이 간편하게 결제를 진행하고자 할 때 사용한다."},"ITossBilling.ICustomerKey":{"type":"object","properties":{"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["customerKey"],"description":"고객 식별자 정보."},"ITossBilling.IPaymentStore":{"type":"object","properties":{"method":{"type":"string","enum":["billing"],"description":"결제 수단이 간편 결제임을 의미함."},"billingKey":{"type":"string","description":"{@link IPaymentStore } 의 식별자 키."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."},"customerKey":{"type":"string","description":"고객 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."}},"nullable":false,"required":["method","billingKey","orderId","amount","customerKey"],"description":"간편 결제를 이용한 결제 신청 정보."},"ITossPayment":{"oneOf":[{"$ref":"#/components/schemas/ITossCardPayment"},{"$ref":"#/components/schemas/ITossGiftCertificatePayment"},{"$ref":"#/components/schemas/ITossMobilePhonePayment"},{"$ref":"#/components/schemas/ITossTransferPayment"},{"$ref":"#/components/schemas/ITossVirtualAccountPayment"}],"description":"결제 정보.\n\n`ITossPayment` 는 토스 페이먼츠의 결제 정보를 형상화한 자료구조이자 유니언 타입의\n인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로\n지정된다.\n\n```typescript\nif (payment.method === \"카드\")\n payment.card; // payment be ITossCardPayment\n```"},"ITossCardPayment":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/ITossCardPayment.ICard","description":"카드 정보."},"discount":{"$ref":"#/components/schemas/ITossCardPayment.IDiscount.Nullable","description":"카드사의 즉시 할인 프로모션 정보."},"easyPay":{"type":"string","enum":["토스결제","페이코","삼성페이"],"nullable":true,"description":"간편결제로 결제한 경우 간편결제 타입 정보."},"method":{"type":"string","enum":["카드"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL","BILLING"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["card","discount","easyPay","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"카드 결제 정보."},"ITossCardPayment.ICard":{"type":"object","properties":{"company":{"type":"string","description":"카드사 이름."},"number":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"installmentPlanMonths":{"type":"number","description":"할부 개월 수."},"isInterestFree":{"type":"boolean","description":"무이자 할부 적용 여부."},"approveNo":{"type":"string","description":"승인 번호."},"useCardPoint":{"type":"boolean","enum":[false],"description":"카드 포인트 사용 여부."},"cardType":{"type":"string","enum":["신용","체크","기프트"],"description":"카드 타입."},"ownerType":{"type":"string","enum":["개인","법인"],"description":"카드의 소유자 타입."},"acquireStatus":{"type":"string","enum":["READY","CANCELED","REQUESTED","COMPLETED","CANCEL_REQUESTED"],"description":"카드 결제의 매입 상태.\n\n - READY: 매입 대기\n - REQUESTED: 매입 요청됨\n - COMPLETED: 매입 완료\n - CANCEL_REQUESTED: 매입 취소 요청됨\n - CANCELD: 매입 취소됨"},"receiptUrl":{"type":"string","format":"url","description":"영수증 URL."}},"nullable":false,"required":["company","number","installmentPlanMonths","isInterestFree","approveNo","useCardPoint","cardType","ownerType","acquireStatus","receiptUrl"],"description":"카드 정보."},"ITossCardPayment.IDiscount.Nullable":{"type":"object","properties":{"amount":{"type":"number","description":"카드사의 즉시 할인 프로모션을 적용한 금액."}},"nullable":true,"required":["amount"],"description":"카드사의 즉시 할인 프로모션 정보."},"ITossPaymentCancel":{"type":"object","properties":{"cancelAmount":{"type":"number","description":"취소 총액."},"cancelReason":{"type":"string","description":"취소 사유."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"taxAmount":{"type":"number","description":"과세 처리된 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."},"canceledAt":{"type":"string","format":"date-time","description":"취소 일시."}},"nullable":false,"required":["cancelAmount","cancelReason","taxFreeAmount","taxAmount","refundableAmount","canceledAt"],"description":"결제 취소 정보."},"ITossCashReceipt.ISummary.Nullable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"amount":{"type":"number","description":"현금 영수증 처리된 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리된 금액."},"issueNumber":{"type":"string","description":"현금영수증 발급번호."},"receiptUrl":{"type":"string","description":"현금영수증 조회 페이지 주소."}},"nullable":true,"required":["type","amount","taxFreeAmount","issueNumber","receiptUrl"],"description":"현금 영수증 요약 정보."},"ITossCashReceipt.Type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"ITossGiftCertificatePayment":{"type":"object","properties":{"giftCertificate":{"$ref":"#/components/schemas/ITossGiftCertificatePayment.IGiftCertificate","description":"상품권 정보."},"method":{"type":"string","enum":["상품권"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["giftCertificate","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"상품권 결제 정보."},"ITossGiftCertificatePayment.IGiftCertificate":{"type":"object","properties":{"approveNo":{"type":"string","description":"승인 번호."},"settlementStatus":{"type":"string","enum":["COMPLETE","INCOMPLETE"],"description":"정산 상태."}},"nullable":false,"required":["approveNo","settlementStatus"],"description":"상품권 정보."},"ITossMobilePhonePayment":{"type":"object","properties":{"mobilePhone":{"$ref":"#/components/schemas/ITossMobilePhonePayment.IMobilePhone","description":"휴대폰 정보."},"method":{"type":"string","enum":["휴대폰"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["mobilePhone","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"휴대폰 결제 정보."},"ITossMobilePhonePayment.IMobilePhone":{"type":"object","properties":{"carrier":{"type":"string","description":"통신사."},"customerMobilePhone":{"type":"string","description":"고객 휴대폰 번호."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."}},"nullable":false,"required":["carrier","customerMobilePhone","settlementStatus"],"description":"휴대폰 정보."},"ITossTransferPayment":{"type":"object","properties":{"transfer":{"$ref":"#/components/schemas/ITossTransferPayment.ITransfer","description":"계좌 이체 정보."},"method":{"type":"string","enum":["계좌이체"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["transfer","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"계좌 이체 결제 정보."},"ITossTransferPayment.ITransfer":{"type":"object","properties":{"bank":{"type":"string","description":"은행명."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"이체 상태."}},"nullable":false,"required":["bank","settlementStatus"],"description":"계좌 이체 정보."},"ITossVirtualAccountPayment":{"type":"object","properties":{"secret":{"type":"string","description":"가상 계좌로 결제할 때 전달되는 입금 콜백을 검증하기 위한 값."},"virtualAccount":{"$ref":"#/components/schemas/ITossVirtualAccountPayment.IVirtualAccount","description":"가상 계좌 정보."},"method":{"type":"string","enum":["가상계좌"],"description":"결제 수단."},"type":{"type":"string","enum":["NORMAL"],"description":"결제 타입.\n\n - NORMAL: 일반 결제\n - BILLING: 미리 등록한 카드에 의한 간편 결제."},"status":{"type":"string","enum":["READY","IN_PROGRESS","WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED","ABORTED","EXPIRED"],"description":"결제 상태.\n\n - READY\n - IN_PROGRESS\n - WAITING_FOR_DEPOSIT\n - DONE\n - CANCELED\n - PARTIAL_CANCELED\n - ABORTED\n - EXPIRED"},"mId":{"type":"string","description":"가맹점 ID.\n\n현재 tosspayments 가 쓰임."},"version":{"type":"string","description":"사용 중인 토스 페이먼츠 API 의 버전."},"paymentKey":{"type":"string","description":"결제 내역의 식별자 번호."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"transactionKey":{"type":"string","description":"거래 건에 대한 고유한 키 값.\n\n{@link paymentKey } 와 달리, 이를 사용할 일은 없더라."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"currency":{"type":"string","description":"화폐 단위.\n\n현재 토스 페이먼츠는 KRW 만 사용 가능."},"totalAmount":{"type":"number","description":"총 결제 금액."},"balanceAmount":{"type":"number","description":"취소할 수 있는 금액."},"suppliedAmount":{"type":"number","description":"공급가액."},"taxFreeAmount":{"type":"number","description":"면세액."},"vat":{"type":"number","description":"부가세."},"useEscrow":{"type":"boolean","description":"에스크로 사용 여부."},"cultureExpense":{"type":"boolean","description":"문화비 지출 여부.\n\n도석입, 공연 티켓, 박물관/미술관 입장권 등."},"requestedAt":{"type":"string","format":"date-time","description":"결제 요청 일시."},"approvedAt":{"type":"string","format":"date-time","nullable":true,"description":"결제 승인 일시."},"cancels":{"type":"array","items":{"$ref":"#/components/schemas/ITossPaymentCancel"},"nullable":true,"description":"결제 취소 내역."},"cashReceipt":{"$ref":"#/components/schemas/ITossCashReceipt.ISummary.Nullable","description":"현금 영수증 정보."}},"nullable":false,"required":["secret","virtualAccount","method","type","status","mId","version","paymentKey","orderId","transactionKey","orderName","currency","totalAmount","balanceAmount","suppliedAmount","taxFreeAmount","vat","useEscrow","cultureExpense","requestedAt","approvedAt","cancels","cashReceipt"],"description":"가상 계좌 결제 정보."},"ITossVirtualAccountPayment.IVirtualAccount":{"type":"object","properties":{"accountNumber":{"type":"string","description":"계좌 번호."},"accountType":{"type":"string","enum":["일반","고정"],"description":"가상 계좌 타입."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"dueDate":{"type":"string","format":"date","description":"입금 기한."},"expired":{"type":"boolean","description":"가상 계좌 만료 여부."},"settlementStatus":{"type":"string","enum":["COMPLETED","INCOMPLETED"],"description":"정산 상태."},"refundStatus":{"type":"string","enum":["COMPLETED","NONE","FAILED","PENDING","PARTIAL_FAILED"],"description":"환불 처리 상태.\n\n - NONE: 해당 없음\n - FAILED: 환불 실패\n - PENDING: 환불 처리중\n - PARTIAL_FAILED: 부분 환불 실패\n - COMPLETED: 환불 완료"}},"nullable":false,"required":["accountNumber","accountType","bank","customerName","dueDate","expired","settlementStatus","refundStatus"],"description":"가상 계좌 정보."},"ITossCashReceipt.ICreate":{"type":"object","properties":{"type":{"type":"string","enum":["소득공제","지출증빙"],"description":"현금 영수증의 종류."},"paymentKey":{"type":"string","description":"귀속 결제의 {@link ITossPayment.paymentKey }."},"orderId":{"type":"string","description":"주문의 식별자 ID."},"orderName":{"type":"string","description":"주문 이름."},"registrationNumber":{"type":"string","description":"현금 영수증 발급을 위한 개인 식별 번호.\n\n현금 영수증의 종류에 따라 휴대폰 번호나 주민등록번호 또는 사업자등록번호 및\n카드 번호를 입력할 수 있다."},"amount":{"type":"number","description":"현금 영수증을 발행할 금액."},"taxFreeAmount":{"type":"number","description":"면세 금액."},"businessNumber":{"type":"string","description":"사업자 등록번호."}},"nullable":false,"required":["type","paymentKey","orderId","orderName","registrationNumber","amount"],"description":"현금 영수증 입력 정보."},"ITossCashReceipt":{"type":"object","properties":{"receiptKey":{"type":"string","description":"현금 영수증의 식별자 키."},"type":{"$ref":"#/components/schemas/ITossCashReceipt.Type","description":"현금 영수증의 종류."},"orderId":{"type":"string","description":"주문의 식별자 ID."},"orderName":{"type":"string","description":"주문 이름."},"approvalNumber":{"type":"string","description":"현금 영수증 승인 번호."},"approvedAt":{"type":"string","format":"date-time","description":"현금 영수증 승인 일시."},"canceledAt":{"type":"string","format":"date-time","nullable":true,"description":"현금 영수증 취소 일시."},"receiptUrl":{"type":"string","description":"영수증 URL."}},"nullable":false,"required":["receiptKey","type","orderId","orderName","approvalNumber","approvedAt","canceledAt","receiptUrl"],"description":"현금 영수증 정보."},"ITossCashReceipt.ICancel":{"type":"object","properties":{"amount":{"type":"number","description":"취소 금액.\n\n미 입력시 현금 영수증에 기재된 {@link ITossCashReceipt.amount 총액}이 취소됨."}},"nullable":false,"description":"현금 영수증 취소 입력 정보."},"ITossPaymentWebhook":{"type":"object","properties":{"eventType":{"type":"string","enum":["PAYMENT_STATUS_CHANGED"],"description":"이벤트 타입."},"data":{"$ref":"#/components/schemas/ITossPaymentWebhook.IData","description":"이벤트 데이터."}},"nullable":false,"required":["eventType","data"],"description":"웹훅 이벤트 정보."},"ITossPaymentWebhook.IData":{"type":"object","properties":{"paymentKey":{"type":"string","description":"{@link ITossPayment } 의 식별자 키."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"status":{"type":"string","enum":["WAITING_FOR_DEPOSIT","DONE","CANCELED","PARTIAL_CANCELED"],"description":"결제 상태.\n\n - DONE: 결제 완료\n - CANCELED: 결제가 취소됨\n - PARTIAL_CANCELED: 결제가 부분 취소됨\n - WAITING_FOR_DEPOSIT: 입금 대기 중"}},"nullable":false,"required":["paymentKey","orderId","status"],"description":"웹훅 이벤트 데이터."},"ITossCardPayment.ICreate":{"type":"object","properties":{"method":{"type":"string","enum":["card"],"description":"결제 수단이 신용 카드임을 의미."},"cardNumber":{"type":"string","pattern":"[0-9]{16}","description":"카드 번호."},"cardExpirationYear":{"type":"string","pattern":"\\d{2}","description":"카드 만료 년도 (2 자리)."},"cardExpirationMonth":{"type":"string","pattern":"^(0[1-9]|1[012])$","description":"카드 만료 월 (2 자리)."},"cardPassword":{"type":"string","description":"카드 비밀번호."},"cardInstallmentPlan":{"type":"number","description":"할부 개월 수."},"amount":{"type":"number","description":"지불 총액."},"taxFreeAmount":{"type":"number","description":"면세금 총액."},"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"customerBirthday":{"type":"string","pattern":"^([0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$","description":"고객의 생년월일.\n\n표기 형식 YYMMDD."},"customerEmail":{"type":"string","format":"email","description":"고객의 이메일."},"vbv":{"type":"object","properties":{"cavv":{"type":"string","description":"3D Secure 인증 세션에 대한 인증 값."},"xid":{"type":"string","description":"트랜잭션 ID."},"eci":{"type":"string","description":"3DS 인증 결과에 대한 코드 값."}},"nullable":false,"required":["cavv","xid","eci"],"description":"해외카드로 결제하는 경우 3DS 인증 적용을 위해 사용.\n\n3DS 인증 결과를 전송해야 하는 경우에만 필수."},"__approved":{"type":"boolean","description":"결제 승인 여부.\n\n오직 가짜 페이먼츠 서버 `fake-toss-payments-server` 에서만 사용되는 값으로써,\n결제 승인을 고의로 지연시키거나 할 때 사용된다. 이 값을 `false` 로 하면, 프론트\n어플리케이션이 토스 페이먼츠가 제공해주는 결제 창을 사용하여 결제를 진행하는\n상황을 시뮬레이션할 수 있다.\n\n본디 토스 페이먼츠 서버는 프론트 어플리케이션에서 백엔드 서버를 거치지 않고,\n토스 페이먼츠가 제공해주는 결제 창을 이용하여 직접 결제를 요청하는 경우,\n백엔드에서 이를 별도 {@link functional.payments.approve 승인} 처리해주기 전까지\n정식 결제로 인청치 아니한다.\n\n반면 백엔드 서버에서 토스 페이먼츠 서버의 API 를 호출하는 경우, 토스 페이먼츠는\n이를 그 즉시로 승인해주기, `fake-toss-payments-server` 에서 별도의 승인 처리가\n필요한 상황을 시뮬레이션하기 위해서는 이러한 속성이 필요한 것."}},"nullable":false,"required":["method","cardNumber","cardExpirationYear","cardExpirationMonth","amount","orderId"],"description":"신용 카드를 이용한 결제 신청 정보."},"ITossPayment.IApproval":{"type":"object","properties":{"orderId":{"type":"string","description":"주문 식별자 키.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"amount":{"type":"number","description":"결제 총액."}},"nullable":false,"required":["orderId","amount"],"description":"결제 승인 정보."},"ITossPaymentCancel.ICreate":{"type":"object","properties":{"paymentKey":{"type":"string","description":"{@link ITossPayment } 의 식별자 키."},"cancelReason":{"type":"string","description":"취소 사유."},"cancelAmount":{"type":"number","description":"취소 총액."},"refundReceiveAccount":{"type":"object","properties":{"bank":{"type":"string","description":"은행 정보."},"accountNumber":{"type":"string","pattern":"^[0-9]{0,20}$","description":"계좌 번호."},"holderName":{"type":"string","description":"예금주."}},"nullable":false,"required":["bank","accountNumber","holderName"],"description":"환불 계좌 정보.\n\n결제를 가상 계좌로 하였을 때에만 해당함."},"taxAmount":{"type":"number","description":"과세 처리 금액."},"taxFreeAmount":{"type":"number","description":"면세 처리 금액."},"refundableAmount":{"type":"number","description":"결제 취소 후 환불 가능 잔액."}},"nullable":false,"required":["paymentKey","cancelReason"],"description":"결제 취소 신청 정보."},"ITossVirtualAccountPayment.ICreate":{"type":"object","properties":{"method":{"type":"string","enum":["virtual-account"],"description":"결제 수단이 가상 계좌임을 의미."},"orderId":{"type":"string","description":"주문 식별자 번호.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 자체적으로 관리하는 식별자 키."},"orderName":{"type":"string","description":"주문 이름.\n\n토스 페이먼츠가 아닌, 이를 이용하는 서비스에서 발급한 주문명."},"bank":{"type":"string","description":"은행명."},"customerName":{"type":"string","description":"고객 이름."},"amount":{"type":"number","description":"결제 총액."},"__approved":{"type":"boolean","description":"결제 승인 여부.\n\n오직 가짜 페이먼츠 서버 `fake-toss-payments-server` 에서만 사용되는 값으로써,\n결제 승인을 고의로 지연시키거나 할 때 사용된다. 이 값을 `false` 로 하면, 프론트\n어플리케이션이 토스 페이먼츠가 제공해주는 결제 창을 사용하여 결제를 진행하는\n상황을 시뮬레이션할 수 있다.\n\n본디 토스 페이먼츠 서버는 프론트 어플리케이션에서 백엔드 서버를 거치지 않고,\n토스 페이먼츠가 제공해주는 결제 창을 이용하여 직접 결제를 요청하는 경우,\n백엔드에서 이를 별도 {@link functional.payments.approve 승인} 처리해주기 전까지\n정식 결제로 인청치 아니한다.\n\n반면 백엔드 서버에서 토스 페이먼츠 서버의 API 를 호출하는 경우, 토스 페이먼츠는\n이를 그 즉시로 승인해주기, `fake-toss-payments-server` 에서 별도의 승인 처리가\n필요한 상황을 시뮬레이션하기 위해서는 이러한 속성이 필요한 것."}},"nullable":false,"required":["method","orderId","orderName","bank","customerName","amount"],"description":"가상 계좌를 이용한 결제 신청 정보."}},"securitySchemes":{"basic":{"type":"apiKey","name":"Authorization","in":"header"}}}} \ No newline at end of file