medusa-payment-tosspayments
Version:
TossPayments payment pluging for medusa
326 lines (325 loc) • 15.9 kB
TypeScript
type CardType = "신용" | "체크" | "기프트" | "미확인";
type OwnerType = "개인" | "법인" | "미확인";
/**
* 카드 결제의 매입 상태입니다. 아래와 같은 상태 값을 가질 수 있습니다.
*
* READY: 아직 매입 요청이 안 된 상태입니다.
* REQUEST: 매입이 요청된 상태입니다.
* COMPLETED: 요청된 매입이 완료된 상태입니다.
* CANCEL_REQUESTED: 매입 취소가 요청된 상태입니다.
* CANCELED: 요청된 매입 취소가 완료된 상태입니다.
*/
type AcquireStatus = "READY" | "REQUESTED" | "COMPLETED" | "CANCEL_REQUESTED" | "CANCELED";
/**
* 할부가 적용된 결제에서 할부 수수료를 부담하는 주체입니다. BUYER, CARD_COMPANY, MERCHANT 중 하나입니다.
*
* BUYER: 상품을 구매한 고객이 할부 수수료를 부담합니다. 일반적인 할부 결제입니다.
* CARD_COMPANY: 카드사에서 할부 수수료를 부담합니다. 무이자 할부 결제입니다.
* MERCHANT: 상점에서 할부 수수료를 부담합니다. 무이자 할부 결제입니다.
*/
type InterestPayer = "BUYER" | "CARD_COMPANY" | "MERCHANT";
/**
* 카드로 결제하면 제공되는 카드 관련 정보입니다.
*
* amount: 카드사에 결제 요청한 금액입니다. 즉시 할인 금액(discount.amount)이 포함됩니다.
* issuerCode: 카드 발급사 숫자 코드입니다. 카드사 코드를 참고하세요.
* acquirerCode: 카드 매입사 숫자 코드입니다. 카드사 코드를 참고하세요.
* number: 카드번호입니다. 번호의 일부는 마스킹 되어 있습니다. 최대 길이는 20자입니다.
* installmentPlanMonths: 할부 개월 수입니다. 일시불이면 0입니다.
* approveNo: 카드사 승인 번호입니다. 최대 길이는 8자입니다.
* useCardPoint: 카드사 포인트 사용 여부입니다. 일반 카드사 포인트가 아닌, 특수한 포인트나 바우처를 사용하면 할부 개월 수가 변경되어 응답이 돌아오니 유의해주세요.
* cardType: 카드 종류입니다.
* ownerType: 카드의 소유자 타입입니다.
* acquireStatus: 카드 결제의 매입 상태입니다.
* isInterestFree: 무이자 할부의 적용 여부입니다.
* interestPayer: 할부가 적용된 결제에서 할부 수수료를 부담하는 주체입니다.
*/
type Card = {
amount: number;
issuerCode: string;
acquirerCode?: string;
number: string;
installmentPlanMonths: number;
approveNo: string;
useCardPoint: boolean;
cardType: CardType;
ownerType: OwnerType;
acquireStatus: AcquireStatus;
isInterestFree: boolean;
interestPayer?: InterestPayer;
};
/**
* 환불 처리 상태입니다. 아래와 같은 상태 값을 가질 수 있습니다.
*
* NONE: 환불 요청이 없는 상태입니다.
* PENDING: 환불을 처리 중인 상태입니다.
* FAILED: 환불에 실패한 상태입니다.
* PARTIAL_FAILED: 부분 환불에 실패한 상태입니다.
* COMPLETED: 환불이 완료된 상태입니다.
*/
type RefundStatus = "NONE" | "PENDING" | "FAILED" | "PARTIAL_FAILED" | "COMPLETED";
type SettlementStatus = "INCOMPLETED" | "COMPLETED";
type RefundReceiveAccount = {
bankCode: string;
accountNumber: string;
holderName: string;
};
/**
* 가상계좌로 결제하면 제공되는 가상계좌 관련 정보입니다.
*
* accountType: 가상계좌 타입을 나타냅니다. 일반, 고정 중 하나입니다.
* accountNumber: 발급된 계좌번호입니다. 최대 길이는 20자입니다.
* bankCode: 가상계좌 은행 숫자 코드입니다. 은행 코드와 증권사 코드를 참고하세요.
* customerName: 가상계좌를 발급한 구매자명입니다. 최대 길이는 100자입니다.
* dueDate: 입금 기한입니다. yyyy-MM-dd'T'HH:mm:ss ISO 8601 형식을 사용합니다.
* refundStatus: 환불 처리 상태입니다.
* expired: 가상계좌의 만료 여부입니다.
* settlementStatus: 정산 상태입니다.
* refundReceiveAccount?: 결제위젯 가상계좌 환불 정보 입력 기능으로 받은 고객의 환불 계좌 정보입니다.
*/
type VirtualAccount = {
accountType: "일반" | "고정";
accountNumber: string;
bankCode: string;
customerName: string;
dueDate: string;
refundStatus: RefundStatus;
expired: boolean;
settlementStatus: SettlementStatus;
refundReceiveAccount?: RefundReceiveAccount;
};
/**
* 휴대폰으로 결제하면 제공되는 휴대폰 결제 관련 정보입니다.
*
* customerMobilePhone: 구매자가 결제에 사용한 휴대폰 번호입니다.
* settlementStatus: 정산 상태입니다.
* receiptUrl: 휴대폰 결제 내역 영수증을 확인할 수 있는 주소입니다.
*/
type MobilePhone = {
customerMobilePhone: string;
settlementStatus: SettlementStatus;
receiptUrl: string;
};
/**
* 상품권으로 결제하면 제공되는 상품권 결제 관련 정보입니다.
*
* approveNo: 결제 승인번호입니다. 최대 길이는 8자입니다.
* settlementStatus: 정산 상태입니다.
*/
type GiftCertificate = {
approveNo: string;
settlementStatus: SettlementStatus;
};
/**
* 계좌이체로 결제했을 때 이체 정보가 담기는 객체입니다.
*
* bankCode: 은행 숫자 코드입니다.
* settlementStatus: 정산 상태입니다.
*/
type Transfer = {
bankCode: string;
settlementStatus: SettlementStatus;
};
/**
* 발행된 영수증 정보입니다.
*
* url: 고객에게 제공할 수 있는 결제수단별 영수증입니다. 카드 결제는 매출전표, 가상계좌는 무통장 거래 명세서, 계좌이체・휴대폰・상품권 결제는 결제 거래 내역 확인서가 제공됩니다.
*/
type Receipt = {
url: string;
};
/**
* 결제창 정보입니다.
*
* url: 결제창이 열리는 주소입니다.
*/
type Checkout = {
url: string;
};
/**
* 간편결제 정보입니다. 고객이 선택한 결제수단에 따라 amount, discountAmount가 달라집니다. 간편결제 응답 확인 가이드를 참고하세요.
*
* provider: 선택한 간편결제사 코드입니다.
* amount: 간편결제 서비스에 등록된 계좌 혹은 현금성 포인트로 결제한 금액입니다.
* discountAmount: 간편결제 서비스의 적립 포인트나 쿠폰 등으로 즉시 할인된 금액입니다.
*/
type EasyPay = {
provider: string;
amount: number;
discountAmount: number;
};
/**
* 결제 승인에 실패하면 응답으로 받는 에러 객체입니다. 실패한 결제를 조회할 때 확인할 수 있습니다.
*
* code: 오류 타입을 보여주는 에러 코드입니다.
* message: 에러 메시지입니다. 에러 발생 이유를 알려줍니다. 최대 길이는 510자입니다.
*/
type Failure = {
code: string;
message: string;
};
/**
* 현금영수증 정보입니다.
*
* type: 현금영수증의 종류입니다. 소득공제, 지출증빙 중 하나입니다.
* receiptKey: 현금영수증의 키 값입니다. 최대 길이는 200자입니다.
* issuerNumber: 현금영수증 발급 번호입니다. 최대 길이는 9자입니다.
* receiptUrl: 발행된 현금영수증을 확인할 수 있는 주소입니다.
* amount: 현금영수증 처리된 금액입니다.
* taxFreeAmount: 면세 처리된 금액입니다.
*/
type CashReceipt = {
type: "소득공제" | "지출증빙" | "미발행";
receiptKey: string;
issuerNumber: string;
receiptUrl: string;
amount: number;
taxFreeAmount: number;
};
/**
* 현금영수증 발행 및 취소 이력이 담기는 배열입니다. 순서는 보장되지 않습니다. 예를 들어 결제 후 부분 취소가 여러 번 일어나면 모든 결제 및 부분 취소 건에 대한 현금영수증 정보를 담고 있습니다.
* 계좌이체는 결제 즉시 현금영수증 정보를 확인할 수 있습니다. 가상계좌는 고객이 입금을 완료하면 현금영수증 정보를 확인할 수 있습니다.
* 결제가 이미 승인된 후 현금영수증 발급 요청 API로 발급한 현금영수증은 먼저 처리된 결제 정보와 연결되지 않아 값이 null입니다. 현금영수증 조회 API로 조회해주세요.
* 현금영수증 가맹점이라면 결제했을 때 바로 발급됩니다. 발급을 원하지 않는다면 토스페이먼츠 고객센터(1544-7772, support@tosspayments.com)로 문의해주세요.
*
* receiptKey: 현금영수증의 키 값입니다. 최대 길이는 200자입니다.
* orderId: 주문번호입니다. 최소 길이는 6자, 최대 길이는 64자입니다. 주문한 결제를 식별하는 역할로, 결제를 요청할 때 가맹점에서 만들어서 사용합니다. 결제 데이터 관리를 위해 반드시 저장해야 합니다. 중복되지 않는 고유한 값을 발급해야 합니다. 결제 상태가 변해도 값이 유지됩니다.
* orderName: 구매상품입니다. 예를 들면 생수 외 1건 같은 형식입니다. 최대 길이는 100자입니다.
* type: 현금영수증의 종류입니다.
* issueNumber: 현금영수증 발급 번호입니다. 최대 길이는 9자입니다.
* receiptUrl: 발행된 현금영수증을 확인할 수 있는 주소입니다.
* businessNumber: 현금영수증을 발급한 사업자등록번호입니다. 길이는 10자입니다.
* transactionType: 현금영수증 발급 종류입니다. 현금영수증 발급(CONFIRM)·취소(CANCEL) 건을 구분합니다.
* amount: 현금영수증 처리된 금액입니다.
* taxFreeAmount: 면세 처리된 금액입니다.
* issueStatus: 현금영수증 발급 상태입니다.
* failure: 결제 실패 객체입니다.
* customerIdentityNumber: 현금영수증 발급에 필요한 소비자 인증수단입니다. 현금영수증을 발급한 주체를 식별합니다. 최대 길이는 30자입니다. 현금영수증 종류에 따라 휴대폰 번호, 사업자등록번호, 현금영수증 카드 번호 등을 입력할 수 있습니다.
* requestedAt: 현금영수증 발급 혹은 취소를 요청한 날짜와 시간 정보입니다. yyyy-MM-dd'T'HH:mm:ss±hh:mm ISO 8601 형식입니다. (e.g. 2022-01-01T00:00:00+09:00)
*/
type CashReceipts = {
receiptKey: string;
orderId: string;
orderName: string;
type: "소득공제" | "지출증빙" | "미발행";
issueNumber: string;
receiptUrl: string;
businessNumber: string;
transactionType: "CONFIRM" | "CANCEL";
amount: number;
taxFreeAmount: number;
issueStatus: "IN_PROGRESS" | "COMPLETED" | "FAILED";
failure: Failure;
customerIdentityNumber: string;
requestedAt: string;
};
/**
* 카드사의 즉시 할인 프로모션 정보입니다. 즉시 할인 프로모션이 적용됐을 때만 생성됩니다.
*
* amount: 카드사의 즉시 할인 프로모션을 적용한 금액입니다.
*/
type Discount = {
amount: number;
};
/**
* 결제 처리 상태입니다. 아래와 같은 상태 값을 가질 수 있습니다. 상태 변화 흐름이 궁금하다면 흐름도를 살펴보세요.
*
* READY: 결제를 생성하면 가지게 되는 초기 상태입니다. 인증 전까지는 READY 상태를 유지합니다.
* IN_PROGRESS: 결제수단 정보와 해당 결제수단의 소유자가 맞는지 인증을 마친 상태입니다. 결제 승인 API를 호출하면 결제가 완료됩니다.
* WAITING_FOR_DEPOSIT: 가상계좌 결제 흐름에만 있는 상태로, 결제 고객이 발급된 가상계좌에 입금하는 것을 기다리고 있는 상태입니다.
* DONE: 인증된 결제수단 정보, 고객 정보로 요청한 결제가 승인된 상태입니다.
* CANCELED: 승인된 결제가 취소된 상태입니다.
* PARTIAL_CANCELED: 승인된 결제가 부분 취소된 상태입니다.
* ABORTED: 결제 승인이 실패한 상태입니다.
* EXPIRED: 결제 유효 시간 30분이 지나 거래가 취소된 상태입니다. IN_PROGRESS 상태에서 결제 승인 API를 호출하지 않으면 EXPIRED가 됩니다.
*/
export type PaymentStatus = "READY" | "IN_PROGRESS" | "WAITING_FOR_DEPOSIT" | "DONE" | "CANCELED" | "PARTIAL_CANCELED" | "ABORTED" | "EXPIRED";
/**
* 결제수단입니다. 카드, 가상계좌, 간편결제, 휴대폰, 계좌이체, 문화상품권, 도서문화상품권, 게임문화상품권 중 하나입니다.
*/
type PaymentMethod = "카드" | "가상계좌" | "간편결제" | "휴대폰" | "계좌이체" | "문화상품권" | "도서문화상품권" | "게임문화상품권";
/**
* 결제 타입 정보입니다.
*
* NORMAL: 일반결제
* BILLING: 자동결제
* BRANDPAY: 브랜드페이
*/
type PaymentType = "NORMAL" | "BILLING" | "BRANDPAY";
/**
* 결제 취소 이력입니다.
*
* cancelAmount: 결제를 취소한 금액입니다.
* cancelReason: 결제를 취소한 이유입니다. 최대 길이는 200자입니다.
* taxFreeAmount: 취소된 금액 중 면세 금액입니다.
* taxExemptionAmount: 취소된 금액 중 과세 제외 금액(컵 보증금 등)입니다.
* refundableAmount: 결제 취소 후 환불 가능한 잔액입니다.
* easyPayDiscountAmount: 간편결제 서비스의 포인트, 쿠폰, 즉시할인과 같은 적립식 결제수단에서 취소된 금액입니다.
* canceledAt: 결제 취소가 일어난 날짜와 시간 정보입니다. yyyy-MM-dd'T'HH:mm:ss±hh:mm ISO 8601 형식입니다.(e.g. 2022-01-01T00:00:00+09:00)
* transactionKey: 취소 건의 키 값입니다. 여러 건의 취소 거래를 구분하는 데 사용됩니다. 최대 길이는 64자입니다.
* receiptKey?: 취소 건의 현금영수증 키 값입니다. 최대 길이는 200자입니다.
* cancelStatus: 취소 상태입니다. DONE이면 결제가 성공적으로 취소된 상태입니다.
* cancelRequestid?: 취소 요청 ID입니다. 비동기 결제에만 적용되는 특수 값입니다. 일반결제, 자동결제(빌링), 페이팔 해외결제에서는 항상 null입니다.
*/
type Cancels = {
cancelAmount: number;
cancelReason: string;
taxFreeAmount: number;
taxExemptionAmount: number;
refundableAmount: number;
easyPayDiscountAmount: number;
canceledAt: string;
transactionKey: string;
receiptKey?: string;
cancelStatus: string;
cancelRequestid?: string;
};
/**
* 결제 정보를 담고 있는 객체입니다. 결제 한 건의 결제 상태, 결제 취소 기록, 매출 전표, 현금영수증 정보 등을 자세히 알 수 있습니다.
* 결제가 승인됐을 때 응답은 Payment 객체로 항상 동일합니다. 객체의 구성은 결제수단(카드, 가상계좌, 간편결제 등)에 따라 조금씩 달라집니다.
*/
export interface Payment {
version: string;
paymentKey: string;
type: PaymentType;
orderId: string;
orderName: string;
mId: string;
currency: string;
method: PaymentMethod;
totalAmount: number;
balanceAmount: number;
status: PaymentStatus;
requestedAt: string;
approvedAt: string;
useEscrow: boolean;
lastTransactionKey?: string;
suppliedAmount: number;
vat: number;
cultureExpense: boolean;
taxFreeAmount: number;
taxExemptionAmount: number;
cancels?: Cancels;
isPartialCancelable: boolean;
card?: Card;
virtualAccount?: VirtualAccount;
secret?: string;
mobilePhone?: MobilePhone;
giftCertificate?: GiftCertificate;
transfer?: Transfer;
receipt?: Receipt;
checkout?: Checkout;
easyPay?: EasyPay;
country: string;
failure?: Failure;
cashReceipt?: CashReceipt;
cashReceipts?: CashReceipts[];
discount?: Discount;
}
export interface PaymentWithVirtualAccount extends Payment {
virtualAccount: VirtualAccount;
}
export interface PaymentWithCard extends Payment {
card: Card;
}
export {};