connectbase-client 5.1.1 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +131 -1
- package/dist/index.d.ts +131 -1
- package/dist/index.js +46 -0
- package/dist/index.mjs +46 -0
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -5511,6 +5511,49 @@ interface PreparePaymentRequest {
|
|
|
5511
5511
|
* 상품별로 세금 카테고리를 달리 할 때만 지정한다. Paddle 은 무시한다.
|
|
5512
5512
|
*/
|
|
5513
5513
|
provider_price_ref?: string;
|
|
5514
|
+
/**
|
|
5515
|
+
* 이 결제에 미리 적용할 할인/쿠폰 코드(MoR 전용, 선택).
|
|
5516
|
+
*
|
|
5517
|
+
* 쿠폰은 PG 대시보드(Dodo Discounts / Paddle Discounts)에서 발행한다 — ConnectBase 는 코드를
|
|
5518
|
+
* 전달만 하고 발행/한도/유효기간은 PG 설정이 권위다. Paddle 은 API 가 코드 대신 내부 ID 를
|
|
5519
|
+
* 받으므로 서버가 코드를 조회해 해소한다.
|
|
5520
|
+
*
|
|
5521
|
+
* 실패는 조용히 정가로 넘어가지 않고 400 으로 거절된다:
|
|
5522
|
+
* - `discount_code_invalid` — 없거나 만료/비활성 코드
|
|
5523
|
+
* - `discount_code_unsupported` — 할인 코드를 지원하지 않는 프로바이더(toss/stripe/payapp/paypal)
|
|
5524
|
+
*
|
|
5525
|
+
* 할인이 적용되면 확정 응답의 `amount` 는 **실제 청구액**(할인 후)이고 차감분은
|
|
5526
|
+
* `discount_amount` 로 온다.
|
|
5527
|
+
*/
|
|
5528
|
+
discount_code?: string;
|
|
5529
|
+
/**
|
|
5530
|
+
* 호스티드 결제창에서 **고객이 직접** 쿠폰을 입력하도록 허용할지(선택).
|
|
5531
|
+
*
|
|
5532
|
+
* 미지정이면 프로바이더 기본값을 따른다. Dodo 는 결제창마다 켜고 끌 수 있다.
|
|
5533
|
+
* Paddle 오버레이는 입력칸을 항상 노출해 숨길 수 없으므로 `false` 는 400
|
|
5534
|
+
* `discount_code_entry_unsupported` 로 거절된다.
|
|
5535
|
+
*/
|
|
5536
|
+
allow_discount_code?: boolean;
|
|
5537
|
+
/**
|
|
5538
|
+
* 결제를 마친 고객이 돌아올 주소(선택).
|
|
5539
|
+
*
|
|
5540
|
+
* 미지정이면 콘솔 결제 설정의 success_url, 그것도 비어 있으면 **PG 대시보드의 브랜드 주소**로
|
|
5541
|
+
* 돌아갑니다. 그 페이지가 결제 복귀를 처리하지 않으면 "결제는 완료됐는데 권한이 지급되지 않는"
|
|
5542
|
+
* 상태가 됩니다.
|
|
5543
|
+
*
|
|
5544
|
+
* 요청 단위라 QA/프로덕션/미리보기 배포가 각자 자기 호스트로 복귀할 수 있습니다 — 앱 단위
|
|
5545
|
+
* success_url 하나로는 두 환경을 동시에 가리킬 수 없습니다.
|
|
5546
|
+
*
|
|
5547
|
+
* **앱이 소유한 origin 만 허용됩니다**: 웹 스토리지 호스트(production 과 `--qa` 미러),
|
|
5548
|
+
* 연결된 커스텀 도메인, 결제 설정의 success_url/fail_url origin, (로컬 개발을 켠 앱이면)
|
|
5549
|
+
* localhost. 그 외는 400 `return_url_not_allowed`, 형식 오류는 400 `return_url_invalid`.
|
|
5550
|
+
*/
|
|
5551
|
+
return_url?: string;
|
|
5552
|
+
/**
|
|
5553
|
+
* 결제 실패/취소 시 복귀 주소(선택). 검증 규칙과 폴백은 `return_url` 과 같습니다
|
|
5554
|
+
* (미지정 시 결제 설정의 fail_url).
|
|
5555
|
+
*/
|
|
5556
|
+
fail_url?: string;
|
|
5514
5557
|
amount: number;
|
|
5515
5558
|
order_name: string;
|
|
5516
5559
|
order_id?: string;
|
|
@@ -5573,7 +5616,10 @@ interface ConfirmPaymentRequest {
|
|
|
5573
5616
|
interface ConfirmPaymentResponse {
|
|
5574
5617
|
payment_id: string;
|
|
5575
5618
|
order_id: string;
|
|
5619
|
+
/** **실제 청구된** 금액. 할인이 적용되면 준비 금액보다 작다. */
|
|
5576
5620
|
amount: number;
|
|
5621
|
+
/** 할인으로 차감된 금액(준비 금액 − 실제 청구액). 할인이 없으면 생략된다. */
|
|
5622
|
+
discount_amount?: number;
|
|
5577
5623
|
status: PaymentStatus;
|
|
5578
5624
|
method: string;
|
|
5579
5625
|
receipt_url?: string;
|
|
@@ -5610,6 +5656,13 @@ interface PaymentDetail {
|
|
|
5610
5656
|
settlement_currency?: string;
|
|
5611
5657
|
/** 청구 국가 ISO 3166-1 alpha-2 (MoR 제공 시) */
|
|
5612
5658
|
country?: string;
|
|
5659
|
+
/** 적용된 할인 코드 (준비 시 지정한 경우). */
|
|
5660
|
+
discount_code?: string;
|
|
5661
|
+
/**
|
|
5662
|
+
* 할인으로 차감된 금액. `amount` 는 이미 할인이 반영된 실제 청구액이므로,
|
|
5663
|
+
* 정가를 표시하려면 `amount + discount_amount` 로 복원한다.
|
|
5664
|
+
*/
|
|
5665
|
+
discount_amount?: number;
|
|
5613
5666
|
status: PaymentStatus;
|
|
5614
5667
|
payment_provider?: PaymentProvider;
|
|
5615
5668
|
/** 이 결제가 사용한 자격증명 모드 (test | live). */
|
|
@@ -5719,10 +5772,36 @@ declare class PaymentAPI {
|
|
|
5719
5772
|
* if (result.payment_provider === 'payapp' && result.payapp_pay_url) {
|
|
5720
5773
|
* window.location.href = result.payapp_pay_url
|
|
5721
5774
|
* }
|
|
5775
|
+
*
|
|
5776
|
+
* // 할인 코드 (MoR: dodo/paddle) — PG 대시보드에서 발행한 코드를 그대로 넘긴다.
|
|
5777
|
+
* const discounted = await cb.payment.prepare({
|
|
5778
|
+
* amount: 10000,
|
|
5779
|
+
* order_name: '프리미엄 1개월',
|
|
5780
|
+
* discount_code: 'LAUNCH50', // 미리 적용
|
|
5781
|
+
* allow_discount_code: true, // 결제창에서 고객이 직접 입력하는 것도 허용 (Dodo)
|
|
5782
|
+
* })
|
|
5783
|
+
* // 확정 후 confirm 응답의 amount 는 할인이 반영된 실제 청구액,
|
|
5784
|
+
* // discount_amount 는 차감분이다.
|
|
5785
|
+
*
|
|
5786
|
+
* // 복귀 주소 — 배포마다 자기 호스트로 돌아오게 한다 (QA 가 라이브로 튕기지 않도록)
|
|
5787
|
+
* const withReturn = await cb.payment.prepare({
|
|
5788
|
+
* amount: 14900,
|
|
5789
|
+
* order_name: '프리미엄 1개월',
|
|
5790
|
+
* return_url: `${window.location.origin}/app/premium?paid=1`,
|
|
5791
|
+
* fail_url: `${window.location.origin}/app/premium?failed=1`,
|
|
5792
|
+
* })
|
|
5722
5793
|
* ```
|
|
5723
5794
|
*
|
|
5724
5795
|
* @remarks
|
|
5725
5796
|
* PayApp 은 `customer_phone` 이 필수입니다(결제요청 수신 번호). 미지정 시 서버가 거부합니다.
|
|
5797
|
+
*
|
|
5798
|
+
* 할인 코드는 MoR 프로바이더(dodo/paddle)에서만 지원됩니다. 그 외 프로바이더에 넘기면
|
|
5799
|
+
* 정가로 조용히 청구되지 않고 400 `discount_code_unsupported` 로 거절됩니다.
|
|
5800
|
+
*
|
|
5801
|
+
* `return_url`/`fail_url` 을 생략하면 콘솔 결제 설정의 success_url/fail_url 을 쓰고, 그것도
|
|
5802
|
+
* 비어 있으면 **PG 대시보드의 브랜드 주소**로 복귀합니다 — 그 페이지가 결제 복귀를 처리하지
|
|
5803
|
+
* 않으면 결제는 완료되지만 권한이 지급되지 않습니다. 앱이 소유한 origin 만 허용되며,
|
|
5804
|
+
* 그 외는 400 `return_url_not_allowed` 입니다.
|
|
5726
5805
|
*/
|
|
5727
5806
|
prepare(data: PreparePaymentRequest): Promise<PreparePaymentResponse>;
|
|
5728
5807
|
/**
|
|
@@ -7687,8 +7766,39 @@ interface CreateSubscriptionRequest {
|
|
|
7687
7766
|
billing_cycle: BillingCycle;
|
|
7688
7767
|
/** 결제일 (monthly: 1-28일, weekly: 0-6 요일) */
|
|
7689
7768
|
billing_day?: number;
|
|
7690
|
-
/**
|
|
7769
|
+
/**
|
|
7770
|
+
* 트라이얼(무료 체험) 기간 (일).
|
|
7771
|
+
*
|
|
7772
|
+
* 빌링키 모델(toss/stripe)에서는 ConnectBase 스케줄러가 체험 종료일에 첫 청구를 건다.
|
|
7773
|
+
* MoR 은 PG 가 정기청구를 소유하므로 결제창 생성 시 체험 일수를 함께 보낸다:
|
|
7774
|
+
* - **Dodo**: 구독마다 지정 가능(0~10000일)
|
|
7775
|
+
* - **Paddle**: 트라이얼이 요금제(price)에 붙는 속성이라 구독마다 지정할 수 없다 →
|
|
7776
|
+
* 400 `trial_days_unsupported`. 체험이 설정된 price 를 Paddle 대시보드에서 따로 만들어 쓴다.
|
|
7777
|
+
*/
|
|
7691
7778
|
trial_days?: number;
|
|
7779
|
+
/**
|
|
7780
|
+
* 첫 결제에 적용할 할인/쿠폰 코드(MoR 전용, 선택).
|
|
7781
|
+
*
|
|
7782
|
+
* 쿠폰은 PG 대시보드에서 발행하며, 몇 주기까지 할인할지도 그쪽 설정이 정한다
|
|
7783
|
+
* (예: Dodo `subscription_cycles` 로 "3개월간 50%"). ConnectBase 는 코드만 전달한다.
|
|
7784
|
+
*
|
|
7785
|
+
* 400 `discount_code_invalid`(없거나 만료) / `discount_code_unsupported`(미지원 프로바이더).
|
|
7786
|
+
*/
|
|
7787
|
+
discount_code?: string;
|
|
7788
|
+
/**
|
|
7789
|
+
* 호스티드 결제창에서 고객이 직접 쿠폰을 입력하도록 허용할지(선택).
|
|
7790
|
+
* Paddle 오버레이는 항상 노출해 숨길 수 없으므로 `false` 는 400
|
|
7791
|
+
* `discount_code_entry_unsupported` 로 거절된다.
|
|
7792
|
+
*/
|
|
7793
|
+
allow_discount_code?: boolean;
|
|
7794
|
+
/**
|
|
7795
|
+
* 결제창을 마친 고객이 돌아올 주소(선택, 리다이렉트형 MoR).
|
|
7796
|
+
*
|
|
7797
|
+
* 미지정이면 결제 설정의 success_url, 그것도 비면 PG 대시보드의 브랜드 주소로 갑니다.
|
|
7798
|
+
* 앱이 소유한 origin 만 허용되며(검증 규칙은 `payment.prepare()` 와 동일),
|
|
7799
|
+
* 그 외는 400 `return_url_not_allowed` 입니다.
|
|
7800
|
+
*/
|
|
7801
|
+
return_url?: string;
|
|
7692
7802
|
/** 고객 이메일 */
|
|
7693
7803
|
customer_email?: string;
|
|
7694
7804
|
/** 고객 이름 */
|
|
@@ -8124,7 +8234,27 @@ declare class SubscriptionAPI {
|
|
|
8124
8234
|
* billing_day: 15, // 매월 15일 결제
|
|
8125
8235
|
* trial_days: 7 // 7일 무료 체험
|
|
8126
8236
|
* })
|
|
8237
|
+
*
|
|
8238
|
+
* // MoR(dodo/paddle) 구독 + 할인 코드
|
|
8239
|
+
* const promo = await client.subscription.create({
|
|
8240
|
+
* plan_name: '프리미엄 플랜',
|
|
8241
|
+
* amount: 9900,
|
|
8242
|
+
* billing_cycle: 'monthly',
|
|
8243
|
+
* provider_price_ref: 'pdt_xxxxx', // PG 카탈로그의 recurring 상품
|
|
8244
|
+
* discount_code: 'LAUNCH50', // 첫 결제에 적용 (몇 주기까지인지는 PG 쿠폰 설정이 결정)
|
|
8245
|
+
* trial_days: 14, // Dodo 만 지원 — Paddle 은 400 trial_days_unsupported
|
|
8246
|
+
* })
|
|
8127
8247
|
* ```
|
|
8248
|
+
*
|
|
8249
|
+
* @remarks
|
|
8250
|
+
* 할인 코드(`discount_code`)와 `trial_days` 의 프로바이더 지원 범위가 다릅니다:
|
|
8251
|
+
* - **Dodo**: 할인 코드 O, 결제창 쿠폰 입력 토글 O, 구독별 체험 일수 O
|
|
8252
|
+
* - **Paddle**: 할인 코드 O(코드→내부 ID 자동 해소), 쿠폰 입력칸은 항상 노출(숨김 불가),
|
|
8253
|
+
* 체험은 요금제(price) 속성이라 구독별 지정 불가
|
|
8254
|
+
* - **toss/stripe/payapp/paypal**: 할인 코드 미지원(400), 체험은 ConnectBase 스케줄러가 처리
|
|
8255
|
+
*
|
|
8256
|
+
* 지원하지 않는 조합은 무시되지 않고 400 으로 거절됩니다 — "쿠폰을 넣었는데 정가 청구",
|
|
8257
|
+
* "체험을 줬는데 즉시 청구" 를 만들지 않기 위함입니다.
|
|
8128
8258
|
*/
|
|
8129
8259
|
create(data: CreateSubscriptionRequest): Promise<SubscriptionResponse>;
|
|
8130
8260
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -5511,6 +5511,49 @@ interface PreparePaymentRequest {
|
|
|
5511
5511
|
* 상품별로 세금 카테고리를 달리 할 때만 지정한다. Paddle 은 무시한다.
|
|
5512
5512
|
*/
|
|
5513
5513
|
provider_price_ref?: string;
|
|
5514
|
+
/**
|
|
5515
|
+
* 이 결제에 미리 적용할 할인/쿠폰 코드(MoR 전용, 선택).
|
|
5516
|
+
*
|
|
5517
|
+
* 쿠폰은 PG 대시보드(Dodo Discounts / Paddle Discounts)에서 발행한다 — ConnectBase 는 코드를
|
|
5518
|
+
* 전달만 하고 발행/한도/유효기간은 PG 설정이 권위다. Paddle 은 API 가 코드 대신 내부 ID 를
|
|
5519
|
+
* 받으므로 서버가 코드를 조회해 해소한다.
|
|
5520
|
+
*
|
|
5521
|
+
* 실패는 조용히 정가로 넘어가지 않고 400 으로 거절된다:
|
|
5522
|
+
* - `discount_code_invalid` — 없거나 만료/비활성 코드
|
|
5523
|
+
* - `discount_code_unsupported` — 할인 코드를 지원하지 않는 프로바이더(toss/stripe/payapp/paypal)
|
|
5524
|
+
*
|
|
5525
|
+
* 할인이 적용되면 확정 응답의 `amount` 는 **실제 청구액**(할인 후)이고 차감분은
|
|
5526
|
+
* `discount_amount` 로 온다.
|
|
5527
|
+
*/
|
|
5528
|
+
discount_code?: string;
|
|
5529
|
+
/**
|
|
5530
|
+
* 호스티드 결제창에서 **고객이 직접** 쿠폰을 입력하도록 허용할지(선택).
|
|
5531
|
+
*
|
|
5532
|
+
* 미지정이면 프로바이더 기본값을 따른다. Dodo 는 결제창마다 켜고 끌 수 있다.
|
|
5533
|
+
* Paddle 오버레이는 입력칸을 항상 노출해 숨길 수 없으므로 `false` 는 400
|
|
5534
|
+
* `discount_code_entry_unsupported` 로 거절된다.
|
|
5535
|
+
*/
|
|
5536
|
+
allow_discount_code?: boolean;
|
|
5537
|
+
/**
|
|
5538
|
+
* 결제를 마친 고객이 돌아올 주소(선택).
|
|
5539
|
+
*
|
|
5540
|
+
* 미지정이면 콘솔 결제 설정의 success_url, 그것도 비어 있으면 **PG 대시보드의 브랜드 주소**로
|
|
5541
|
+
* 돌아갑니다. 그 페이지가 결제 복귀를 처리하지 않으면 "결제는 완료됐는데 권한이 지급되지 않는"
|
|
5542
|
+
* 상태가 됩니다.
|
|
5543
|
+
*
|
|
5544
|
+
* 요청 단위라 QA/프로덕션/미리보기 배포가 각자 자기 호스트로 복귀할 수 있습니다 — 앱 단위
|
|
5545
|
+
* success_url 하나로는 두 환경을 동시에 가리킬 수 없습니다.
|
|
5546
|
+
*
|
|
5547
|
+
* **앱이 소유한 origin 만 허용됩니다**: 웹 스토리지 호스트(production 과 `--qa` 미러),
|
|
5548
|
+
* 연결된 커스텀 도메인, 결제 설정의 success_url/fail_url origin, (로컬 개발을 켠 앱이면)
|
|
5549
|
+
* localhost. 그 외는 400 `return_url_not_allowed`, 형식 오류는 400 `return_url_invalid`.
|
|
5550
|
+
*/
|
|
5551
|
+
return_url?: string;
|
|
5552
|
+
/**
|
|
5553
|
+
* 결제 실패/취소 시 복귀 주소(선택). 검증 규칙과 폴백은 `return_url` 과 같습니다
|
|
5554
|
+
* (미지정 시 결제 설정의 fail_url).
|
|
5555
|
+
*/
|
|
5556
|
+
fail_url?: string;
|
|
5514
5557
|
amount: number;
|
|
5515
5558
|
order_name: string;
|
|
5516
5559
|
order_id?: string;
|
|
@@ -5573,7 +5616,10 @@ interface ConfirmPaymentRequest {
|
|
|
5573
5616
|
interface ConfirmPaymentResponse {
|
|
5574
5617
|
payment_id: string;
|
|
5575
5618
|
order_id: string;
|
|
5619
|
+
/** **실제 청구된** 금액. 할인이 적용되면 준비 금액보다 작다. */
|
|
5576
5620
|
amount: number;
|
|
5621
|
+
/** 할인으로 차감된 금액(준비 금액 − 실제 청구액). 할인이 없으면 생략된다. */
|
|
5622
|
+
discount_amount?: number;
|
|
5577
5623
|
status: PaymentStatus;
|
|
5578
5624
|
method: string;
|
|
5579
5625
|
receipt_url?: string;
|
|
@@ -5610,6 +5656,13 @@ interface PaymentDetail {
|
|
|
5610
5656
|
settlement_currency?: string;
|
|
5611
5657
|
/** 청구 국가 ISO 3166-1 alpha-2 (MoR 제공 시) */
|
|
5612
5658
|
country?: string;
|
|
5659
|
+
/** 적용된 할인 코드 (준비 시 지정한 경우). */
|
|
5660
|
+
discount_code?: string;
|
|
5661
|
+
/**
|
|
5662
|
+
* 할인으로 차감된 금액. `amount` 는 이미 할인이 반영된 실제 청구액이므로,
|
|
5663
|
+
* 정가를 표시하려면 `amount + discount_amount` 로 복원한다.
|
|
5664
|
+
*/
|
|
5665
|
+
discount_amount?: number;
|
|
5613
5666
|
status: PaymentStatus;
|
|
5614
5667
|
payment_provider?: PaymentProvider;
|
|
5615
5668
|
/** 이 결제가 사용한 자격증명 모드 (test | live). */
|
|
@@ -5719,10 +5772,36 @@ declare class PaymentAPI {
|
|
|
5719
5772
|
* if (result.payment_provider === 'payapp' && result.payapp_pay_url) {
|
|
5720
5773
|
* window.location.href = result.payapp_pay_url
|
|
5721
5774
|
* }
|
|
5775
|
+
*
|
|
5776
|
+
* // 할인 코드 (MoR: dodo/paddle) — PG 대시보드에서 발행한 코드를 그대로 넘긴다.
|
|
5777
|
+
* const discounted = await cb.payment.prepare({
|
|
5778
|
+
* amount: 10000,
|
|
5779
|
+
* order_name: '프리미엄 1개월',
|
|
5780
|
+
* discount_code: 'LAUNCH50', // 미리 적용
|
|
5781
|
+
* allow_discount_code: true, // 결제창에서 고객이 직접 입력하는 것도 허용 (Dodo)
|
|
5782
|
+
* })
|
|
5783
|
+
* // 확정 후 confirm 응답의 amount 는 할인이 반영된 실제 청구액,
|
|
5784
|
+
* // discount_amount 는 차감분이다.
|
|
5785
|
+
*
|
|
5786
|
+
* // 복귀 주소 — 배포마다 자기 호스트로 돌아오게 한다 (QA 가 라이브로 튕기지 않도록)
|
|
5787
|
+
* const withReturn = await cb.payment.prepare({
|
|
5788
|
+
* amount: 14900,
|
|
5789
|
+
* order_name: '프리미엄 1개월',
|
|
5790
|
+
* return_url: `${window.location.origin}/app/premium?paid=1`,
|
|
5791
|
+
* fail_url: `${window.location.origin}/app/premium?failed=1`,
|
|
5792
|
+
* })
|
|
5722
5793
|
* ```
|
|
5723
5794
|
*
|
|
5724
5795
|
* @remarks
|
|
5725
5796
|
* PayApp 은 `customer_phone` 이 필수입니다(결제요청 수신 번호). 미지정 시 서버가 거부합니다.
|
|
5797
|
+
*
|
|
5798
|
+
* 할인 코드는 MoR 프로바이더(dodo/paddle)에서만 지원됩니다. 그 외 프로바이더에 넘기면
|
|
5799
|
+
* 정가로 조용히 청구되지 않고 400 `discount_code_unsupported` 로 거절됩니다.
|
|
5800
|
+
*
|
|
5801
|
+
* `return_url`/`fail_url` 을 생략하면 콘솔 결제 설정의 success_url/fail_url 을 쓰고, 그것도
|
|
5802
|
+
* 비어 있으면 **PG 대시보드의 브랜드 주소**로 복귀합니다 — 그 페이지가 결제 복귀를 처리하지
|
|
5803
|
+
* 않으면 결제는 완료되지만 권한이 지급되지 않습니다. 앱이 소유한 origin 만 허용되며,
|
|
5804
|
+
* 그 외는 400 `return_url_not_allowed` 입니다.
|
|
5726
5805
|
*/
|
|
5727
5806
|
prepare(data: PreparePaymentRequest): Promise<PreparePaymentResponse>;
|
|
5728
5807
|
/**
|
|
@@ -7687,8 +7766,39 @@ interface CreateSubscriptionRequest {
|
|
|
7687
7766
|
billing_cycle: BillingCycle;
|
|
7688
7767
|
/** 결제일 (monthly: 1-28일, weekly: 0-6 요일) */
|
|
7689
7768
|
billing_day?: number;
|
|
7690
|
-
/**
|
|
7769
|
+
/**
|
|
7770
|
+
* 트라이얼(무료 체험) 기간 (일).
|
|
7771
|
+
*
|
|
7772
|
+
* 빌링키 모델(toss/stripe)에서는 ConnectBase 스케줄러가 체험 종료일에 첫 청구를 건다.
|
|
7773
|
+
* MoR 은 PG 가 정기청구를 소유하므로 결제창 생성 시 체험 일수를 함께 보낸다:
|
|
7774
|
+
* - **Dodo**: 구독마다 지정 가능(0~10000일)
|
|
7775
|
+
* - **Paddle**: 트라이얼이 요금제(price)에 붙는 속성이라 구독마다 지정할 수 없다 →
|
|
7776
|
+
* 400 `trial_days_unsupported`. 체험이 설정된 price 를 Paddle 대시보드에서 따로 만들어 쓴다.
|
|
7777
|
+
*/
|
|
7691
7778
|
trial_days?: number;
|
|
7779
|
+
/**
|
|
7780
|
+
* 첫 결제에 적용할 할인/쿠폰 코드(MoR 전용, 선택).
|
|
7781
|
+
*
|
|
7782
|
+
* 쿠폰은 PG 대시보드에서 발행하며, 몇 주기까지 할인할지도 그쪽 설정이 정한다
|
|
7783
|
+
* (예: Dodo `subscription_cycles` 로 "3개월간 50%"). ConnectBase 는 코드만 전달한다.
|
|
7784
|
+
*
|
|
7785
|
+
* 400 `discount_code_invalid`(없거나 만료) / `discount_code_unsupported`(미지원 프로바이더).
|
|
7786
|
+
*/
|
|
7787
|
+
discount_code?: string;
|
|
7788
|
+
/**
|
|
7789
|
+
* 호스티드 결제창에서 고객이 직접 쿠폰을 입력하도록 허용할지(선택).
|
|
7790
|
+
* Paddle 오버레이는 항상 노출해 숨길 수 없으므로 `false` 는 400
|
|
7791
|
+
* `discount_code_entry_unsupported` 로 거절된다.
|
|
7792
|
+
*/
|
|
7793
|
+
allow_discount_code?: boolean;
|
|
7794
|
+
/**
|
|
7795
|
+
* 결제창을 마친 고객이 돌아올 주소(선택, 리다이렉트형 MoR).
|
|
7796
|
+
*
|
|
7797
|
+
* 미지정이면 결제 설정의 success_url, 그것도 비면 PG 대시보드의 브랜드 주소로 갑니다.
|
|
7798
|
+
* 앱이 소유한 origin 만 허용되며(검증 규칙은 `payment.prepare()` 와 동일),
|
|
7799
|
+
* 그 외는 400 `return_url_not_allowed` 입니다.
|
|
7800
|
+
*/
|
|
7801
|
+
return_url?: string;
|
|
7692
7802
|
/** 고객 이메일 */
|
|
7693
7803
|
customer_email?: string;
|
|
7694
7804
|
/** 고객 이름 */
|
|
@@ -8124,7 +8234,27 @@ declare class SubscriptionAPI {
|
|
|
8124
8234
|
* billing_day: 15, // 매월 15일 결제
|
|
8125
8235
|
* trial_days: 7 // 7일 무료 체험
|
|
8126
8236
|
* })
|
|
8237
|
+
*
|
|
8238
|
+
* // MoR(dodo/paddle) 구독 + 할인 코드
|
|
8239
|
+
* const promo = await client.subscription.create({
|
|
8240
|
+
* plan_name: '프리미엄 플랜',
|
|
8241
|
+
* amount: 9900,
|
|
8242
|
+
* billing_cycle: 'monthly',
|
|
8243
|
+
* provider_price_ref: 'pdt_xxxxx', // PG 카탈로그의 recurring 상품
|
|
8244
|
+
* discount_code: 'LAUNCH50', // 첫 결제에 적용 (몇 주기까지인지는 PG 쿠폰 설정이 결정)
|
|
8245
|
+
* trial_days: 14, // Dodo 만 지원 — Paddle 은 400 trial_days_unsupported
|
|
8246
|
+
* })
|
|
8127
8247
|
* ```
|
|
8248
|
+
*
|
|
8249
|
+
* @remarks
|
|
8250
|
+
* 할인 코드(`discount_code`)와 `trial_days` 의 프로바이더 지원 범위가 다릅니다:
|
|
8251
|
+
* - **Dodo**: 할인 코드 O, 결제창 쿠폰 입력 토글 O, 구독별 체험 일수 O
|
|
8252
|
+
* - **Paddle**: 할인 코드 O(코드→내부 ID 자동 해소), 쿠폰 입력칸은 항상 노출(숨김 불가),
|
|
8253
|
+
* 체험은 요금제(price) 속성이라 구독별 지정 불가
|
|
8254
|
+
* - **toss/stripe/payapp/paypal**: 할인 코드 미지원(400), 체험은 ConnectBase 스케줄러가 처리
|
|
8255
|
+
*
|
|
8256
|
+
* 지원하지 않는 조합은 무시되지 않고 400 으로 거절됩니다 — "쿠폰을 넣었는데 정가 청구",
|
|
8257
|
+
* "체험을 줬는데 즉시 청구" 를 만들지 않기 위함입니다.
|
|
8128
8258
|
*/
|
|
8129
8259
|
create(data: CreateSubscriptionRequest): Promise<SubscriptionResponse>;
|
|
8130
8260
|
/**
|
package/dist/index.js
CHANGED
|
@@ -6138,10 +6138,36 @@ var PaymentAPI = class {
|
|
|
6138
6138
|
* if (result.payment_provider === 'payapp' && result.payapp_pay_url) {
|
|
6139
6139
|
* window.location.href = result.payapp_pay_url
|
|
6140
6140
|
* }
|
|
6141
|
+
*
|
|
6142
|
+
* // 할인 코드 (MoR: dodo/paddle) — PG 대시보드에서 발행한 코드를 그대로 넘긴다.
|
|
6143
|
+
* const discounted = await cb.payment.prepare({
|
|
6144
|
+
* amount: 10000,
|
|
6145
|
+
* order_name: '프리미엄 1개월',
|
|
6146
|
+
* discount_code: 'LAUNCH50', // 미리 적용
|
|
6147
|
+
* allow_discount_code: true, // 결제창에서 고객이 직접 입력하는 것도 허용 (Dodo)
|
|
6148
|
+
* })
|
|
6149
|
+
* // 확정 후 confirm 응답의 amount 는 할인이 반영된 실제 청구액,
|
|
6150
|
+
* // discount_amount 는 차감분이다.
|
|
6151
|
+
*
|
|
6152
|
+
* // 복귀 주소 — 배포마다 자기 호스트로 돌아오게 한다 (QA 가 라이브로 튕기지 않도록)
|
|
6153
|
+
* const withReturn = await cb.payment.prepare({
|
|
6154
|
+
* amount: 14900,
|
|
6155
|
+
* order_name: '프리미엄 1개월',
|
|
6156
|
+
* return_url: `${window.location.origin}/app/premium?paid=1`,
|
|
6157
|
+
* fail_url: `${window.location.origin}/app/premium?failed=1`,
|
|
6158
|
+
* })
|
|
6141
6159
|
* ```
|
|
6142
6160
|
*
|
|
6143
6161
|
* @remarks
|
|
6144
6162
|
* PayApp 은 `customer_phone` 이 필수입니다(결제요청 수신 번호). 미지정 시 서버가 거부합니다.
|
|
6163
|
+
*
|
|
6164
|
+
* 할인 코드는 MoR 프로바이더(dodo/paddle)에서만 지원됩니다. 그 외 프로바이더에 넘기면
|
|
6165
|
+
* 정가로 조용히 청구되지 않고 400 `discount_code_unsupported` 로 거절됩니다.
|
|
6166
|
+
*
|
|
6167
|
+
* `return_url`/`fail_url` 을 생략하면 콘솔 결제 설정의 success_url/fail_url 을 쓰고, 그것도
|
|
6168
|
+
* 비어 있으면 **PG 대시보드의 브랜드 주소**로 복귀합니다 — 그 페이지가 결제 복귀를 처리하지
|
|
6169
|
+
* 않으면 결제는 완료되지만 권한이 지급되지 않습니다. 앱이 소유한 origin 만 허용되며,
|
|
6170
|
+
* 그 외는 400 `return_url_not_allowed` 입니다.
|
|
6145
6171
|
*/
|
|
6146
6172
|
async prepare(data) {
|
|
6147
6173
|
const prefix = this.getPublicPrefix();
|
|
@@ -9023,7 +9049,27 @@ var SubscriptionAPI = class {
|
|
|
9023
9049
|
* billing_day: 15, // 매월 15일 결제
|
|
9024
9050
|
* trial_days: 7 // 7일 무료 체험
|
|
9025
9051
|
* })
|
|
9052
|
+
*
|
|
9053
|
+
* // MoR(dodo/paddle) 구독 + 할인 코드
|
|
9054
|
+
* const promo = await client.subscription.create({
|
|
9055
|
+
* plan_name: '프리미엄 플랜',
|
|
9056
|
+
* amount: 9900,
|
|
9057
|
+
* billing_cycle: 'monthly',
|
|
9058
|
+
* provider_price_ref: 'pdt_xxxxx', // PG 카탈로그의 recurring 상품
|
|
9059
|
+
* discount_code: 'LAUNCH50', // 첫 결제에 적용 (몇 주기까지인지는 PG 쿠폰 설정이 결정)
|
|
9060
|
+
* trial_days: 14, // Dodo 만 지원 — Paddle 은 400 trial_days_unsupported
|
|
9061
|
+
* })
|
|
9026
9062
|
* ```
|
|
9063
|
+
*
|
|
9064
|
+
* @remarks
|
|
9065
|
+
* 할인 코드(`discount_code`)와 `trial_days` 의 프로바이더 지원 범위가 다릅니다:
|
|
9066
|
+
* - **Dodo**: 할인 코드 O, 결제창 쿠폰 입력 토글 O, 구독별 체험 일수 O
|
|
9067
|
+
* - **Paddle**: 할인 코드 O(코드→내부 ID 자동 해소), 쿠폰 입력칸은 항상 노출(숨김 불가),
|
|
9068
|
+
* 체험은 요금제(price) 속성이라 구독별 지정 불가
|
|
9069
|
+
* - **toss/stripe/payapp/paypal**: 할인 코드 미지원(400), 체험은 ConnectBase 스케줄러가 처리
|
|
9070
|
+
*
|
|
9071
|
+
* 지원하지 않는 조합은 무시되지 않고 400 으로 거절됩니다 — "쿠폰을 넣었는데 정가 청구",
|
|
9072
|
+
* "체험을 줬는데 즉시 청구" 를 만들지 않기 위함입니다.
|
|
9027
9073
|
*/
|
|
9028
9074
|
async create(data) {
|
|
9029
9075
|
const prefix = this.getPublicPrefix();
|
package/dist/index.mjs
CHANGED
|
@@ -6089,10 +6089,36 @@ var PaymentAPI = class {
|
|
|
6089
6089
|
* if (result.payment_provider === 'payapp' && result.payapp_pay_url) {
|
|
6090
6090
|
* window.location.href = result.payapp_pay_url
|
|
6091
6091
|
* }
|
|
6092
|
+
*
|
|
6093
|
+
* // 할인 코드 (MoR: dodo/paddle) — PG 대시보드에서 발행한 코드를 그대로 넘긴다.
|
|
6094
|
+
* const discounted = await cb.payment.prepare({
|
|
6095
|
+
* amount: 10000,
|
|
6096
|
+
* order_name: '프리미엄 1개월',
|
|
6097
|
+
* discount_code: 'LAUNCH50', // 미리 적용
|
|
6098
|
+
* allow_discount_code: true, // 결제창에서 고객이 직접 입력하는 것도 허용 (Dodo)
|
|
6099
|
+
* })
|
|
6100
|
+
* // 확정 후 confirm 응답의 amount 는 할인이 반영된 실제 청구액,
|
|
6101
|
+
* // discount_amount 는 차감분이다.
|
|
6102
|
+
*
|
|
6103
|
+
* // 복귀 주소 — 배포마다 자기 호스트로 돌아오게 한다 (QA 가 라이브로 튕기지 않도록)
|
|
6104
|
+
* const withReturn = await cb.payment.prepare({
|
|
6105
|
+
* amount: 14900,
|
|
6106
|
+
* order_name: '프리미엄 1개월',
|
|
6107
|
+
* return_url: `${window.location.origin}/app/premium?paid=1`,
|
|
6108
|
+
* fail_url: `${window.location.origin}/app/premium?failed=1`,
|
|
6109
|
+
* })
|
|
6092
6110
|
* ```
|
|
6093
6111
|
*
|
|
6094
6112
|
* @remarks
|
|
6095
6113
|
* PayApp 은 `customer_phone` 이 필수입니다(결제요청 수신 번호). 미지정 시 서버가 거부합니다.
|
|
6114
|
+
*
|
|
6115
|
+
* 할인 코드는 MoR 프로바이더(dodo/paddle)에서만 지원됩니다. 그 외 프로바이더에 넘기면
|
|
6116
|
+
* 정가로 조용히 청구되지 않고 400 `discount_code_unsupported` 로 거절됩니다.
|
|
6117
|
+
*
|
|
6118
|
+
* `return_url`/`fail_url` 을 생략하면 콘솔 결제 설정의 success_url/fail_url 을 쓰고, 그것도
|
|
6119
|
+
* 비어 있으면 **PG 대시보드의 브랜드 주소**로 복귀합니다 — 그 페이지가 결제 복귀를 처리하지
|
|
6120
|
+
* 않으면 결제는 완료되지만 권한이 지급되지 않습니다. 앱이 소유한 origin 만 허용되며,
|
|
6121
|
+
* 그 외는 400 `return_url_not_allowed` 입니다.
|
|
6096
6122
|
*/
|
|
6097
6123
|
async prepare(data) {
|
|
6098
6124
|
const prefix = this.getPublicPrefix();
|
|
@@ -8974,7 +9000,27 @@ var SubscriptionAPI = class {
|
|
|
8974
9000
|
* billing_day: 15, // 매월 15일 결제
|
|
8975
9001
|
* trial_days: 7 // 7일 무료 체험
|
|
8976
9002
|
* })
|
|
9003
|
+
*
|
|
9004
|
+
* // MoR(dodo/paddle) 구독 + 할인 코드
|
|
9005
|
+
* const promo = await client.subscription.create({
|
|
9006
|
+
* plan_name: '프리미엄 플랜',
|
|
9007
|
+
* amount: 9900,
|
|
9008
|
+
* billing_cycle: 'monthly',
|
|
9009
|
+
* provider_price_ref: 'pdt_xxxxx', // PG 카탈로그의 recurring 상품
|
|
9010
|
+
* discount_code: 'LAUNCH50', // 첫 결제에 적용 (몇 주기까지인지는 PG 쿠폰 설정이 결정)
|
|
9011
|
+
* trial_days: 14, // Dodo 만 지원 — Paddle 은 400 trial_days_unsupported
|
|
9012
|
+
* })
|
|
8977
9013
|
* ```
|
|
9014
|
+
*
|
|
9015
|
+
* @remarks
|
|
9016
|
+
* 할인 코드(`discount_code`)와 `trial_days` 의 프로바이더 지원 범위가 다릅니다:
|
|
9017
|
+
* - **Dodo**: 할인 코드 O, 결제창 쿠폰 입력 토글 O, 구독별 체험 일수 O
|
|
9018
|
+
* - **Paddle**: 할인 코드 O(코드→내부 ID 자동 해소), 쿠폰 입력칸은 항상 노출(숨김 불가),
|
|
9019
|
+
* 체험은 요금제(price) 속성이라 구독별 지정 불가
|
|
9020
|
+
* - **toss/stripe/payapp/paypal**: 할인 코드 미지원(400), 체험은 ConnectBase 스케줄러가 처리
|
|
9021
|
+
*
|
|
9022
|
+
* 지원하지 않는 조합은 무시되지 않고 400 으로 거절됩니다 — "쿠폰을 넣었는데 정가 청구",
|
|
9023
|
+
* "체험을 줬는데 즉시 청구" 를 만들지 않기 위함입니다.
|
|
8978
9024
|
*/
|
|
8979
9025
|
async create(data) {
|
|
8980
9026
|
const prefix = this.getPublicPrefix();
|