@downcity/services 0.1.98 → 0.1.103
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/bin/payment/index.d.ts +6 -6
- package/bin/payment/index.d.ts.map +1 -1
- package/bin/payment/index.js +6 -6
- package/bin/payment/index.js.map +1 -1
- package/bin/{payment-creem/creem.d.ts → payment/providers/creem/client.d.ts} +7 -12
- package/bin/payment/providers/creem/client.d.ts.map +1 -0
- package/bin/{payment-creem/creem.js → payment/providers/creem/client.js} +29 -37
- package/bin/payment/providers/creem/client.js.map +1 -0
- package/bin/payment/providers/creem/index.d.ts +13 -0
- package/bin/payment/providers/creem/index.d.ts.map +1 -0
- package/bin/payment/providers/creem/index.js +94 -0
- package/bin/payment/providers/creem/index.js.map +1 -0
- package/bin/payment/providers/creem/types.d.ts +49 -0
- package/bin/payment/providers/creem/types.d.ts.map +1 -0
- package/bin/payment/providers/creem/types.js +9 -0
- package/bin/payment/providers/creem/types.js.map +1 -0
- package/bin/payment/providers/dodo/client.d.ts +48 -0
- package/bin/payment/providers/dodo/client.d.ts.map +1 -0
- package/bin/{payment-dodo/dodo.js → payment/providers/dodo/client.js} +18 -33
- package/bin/payment/providers/dodo/client.js.map +1 -0
- package/bin/payment/providers/dodo/index.d.ts +13 -0
- package/bin/payment/providers/dodo/index.d.ts.map +1 -0
- package/bin/payment/providers/dodo/index.js +109 -0
- package/bin/payment/providers/dodo/index.js.map +1 -0
- package/bin/payment/providers/dodo/types.d.ts +58 -0
- package/bin/payment/providers/dodo/types.d.ts.map +1 -0
- package/bin/payment/providers/dodo/types.js +9 -0
- package/bin/payment/providers/dodo/types.js.map +1 -0
- package/bin/payment/providers/index.d.ts +12 -0
- package/bin/payment/providers/index.d.ts.map +1 -0
- package/bin/payment/providers/index.js +12 -0
- package/bin/payment/providers/index.js.map +1 -0
- package/bin/{payment-stripe/stripe.d.ts → payment/providers/stripe/client.d.ts} +4 -12
- package/bin/payment/providers/stripe/client.d.ts.map +1 -0
- package/bin/{payment-stripe/stripe.js → payment/providers/stripe/client.js} +22 -38
- package/bin/payment/providers/stripe/client.js.map +1 -0
- package/bin/payment/providers/stripe/index.d.ts +13 -0
- package/bin/payment/providers/stripe/index.d.ts.map +1 -0
- package/bin/payment/providers/stripe/index.js +97 -0
- package/bin/payment/providers/stripe/index.js.map +1 -0
- package/bin/payment/providers/stripe/types.d.ts +51 -0
- package/bin/payment/providers/stripe/types.d.ts.map +1 -0
- package/bin/payment/providers/stripe/types.js +9 -0
- package/bin/payment/providers/stripe/types.js.map +1 -0
- package/bin/payment/providers/waffo/client.d.ts +56 -0
- package/bin/payment/providers/waffo/client.d.ts.map +1 -0
- package/bin/{payment-waffo/waffo.js → payment/providers/waffo/client.js} +54 -31
- package/bin/payment/providers/waffo/client.js.map +1 -0
- package/bin/payment/providers/waffo/index.d.ts +13 -0
- package/bin/payment/providers/waffo/index.d.ts.map +1 -0
- package/bin/payment/providers/waffo/index.js +105 -0
- package/bin/payment/providers/waffo/index.js.map +1 -0
- package/bin/payment/providers/waffo/types.d.ts +63 -0
- package/bin/payment/providers/waffo/types.d.ts.map +1 -0
- package/bin/payment/providers/waffo/types.js +9 -0
- package/bin/payment/providers/waffo/types.js.map +1 -0
- package/package.json +3 -3
- package/bin/payment/providers.d.ts +0 -25
- package/bin/payment/providers.d.ts.map +0 -1
- package/bin/payment/providers.js +0 -415
- package/bin/payment/providers.js.map +0 -1
- package/bin/payment-creem/creem.d.ts.map +0 -1
- package/bin/payment-creem/creem.js.map +0 -1
- package/bin/payment-creem/index.d.ts +0 -17
- package/bin/payment-creem/index.d.ts.map +0 -1
- package/bin/payment-creem/index.js +0 -569
- package/bin/payment-creem/index.js.map +0 -1
- package/bin/payment-creem/schema.d.ts +0 -378
- package/bin/payment-creem/schema.d.ts.map +0 -1
- package/bin/payment-creem/schema.js +0 -47
- package/bin/payment-creem/schema.js.map +0 -1
- package/bin/payment-creem/types.d.ts +0 -293
- package/bin/payment-creem/types.d.ts.map +0 -1
- package/bin/payment-creem/types.js +0 -10
- package/bin/payment-creem/types.js.map +0 -1
- package/bin/payment-dodo/dodo.d.ts +0 -119
- package/bin/payment-dodo/dodo.d.ts.map +0 -1
- package/bin/payment-dodo/dodo.js.map +0 -1
- package/bin/payment-dodo/index.d.ts +0 -17
- package/bin/payment-dodo/index.d.ts.map +0 -1
- package/bin/payment-dodo/index.js +0 -548
- package/bin/payment-dodo/index.js.map +0 -1
- package/bin/payment-dodo/schema.d.ts +0 -378
- package/bin/payment-dodo/schema.d.ts.map +0 -1
- package/bin/payment-dodo/schema.js +0 -47
- package/bin/payment-dodo/schema.js.map +0 -1
- package/bin/payment-dodo/types.d.ts +0 -257
- package/bin/payment-dodo/types.d.ts.map +0 -1
- package/bin/payment-dodo/types.js +0 -10
- package/bin/payment-dodo/types.js.map +0 -1
- package/bin/payment-stripe/index.d.ts +0 -17
- package/bin/payment-stripe/index.d.ts.map +0 -1
- package/bin/payment-stripe/index.js +0 -555
- package/bin/payment-stripe/index.js.map +0 -1
- package/bin/payment-stripe/schema.d.ts +0 -378
- package/bin/payment-stripe/schema.d.ts.map +0 -1
- package/bin/payment-stripe/schema.js +0 -47
- package/bin/payment-stripe/schema.js.map +0 -1
- package/bin/payment-stripe/stripe.d.ts.map +0 -1
- package/bin/payment-stripe/stripe.js.map +0 -1
- package/bin/payment-stripe/types.d.ts +0 -303
- package/bin/payment-stripe/types.d.ts.map +0 -1
- package/bin/payment-stripe/types.js +0 -10
- package/bin/payment-stripe/types.js.map +0 -1
- package/bin/payment-waffo/index.d.ts +0 -17
- package/bin/payment-waffo/index.d.ts.map +0 -1
- package/bin/payment-waffo/index.js +0 -549
- package/bin/payment-waffo/index.js.map +0 -1
- package/bin/payment-waffo/schema.d.ts +0 -388
- package/bin/payment-waffo/schema.d.ts.map +0 -1
- package/bin/payment-waffo/schema.js +0 -39
- package/bin/payment-waffo/schema.js.map +0 -1
- package/bin/payment-waffo/types.d.ts +0 -285
- package/bin/payment-waffo/types.d.ts.map +0 -1
- package/bin/payment-waffo/types.js +0 -10
- package/bin/payment-waffo/types.js.map +0 -1
- package/bin/payment-waffo/waffo.d.ts +0 -111
- package/bin/payment-waffo/waffo.d.ts.map +0 -1
- package/bin/payment-waffo/waffo.js.map +0 -1
package/bin/payment/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Payment 子模块公共入口。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* - PaymentService
|
|
6
|
-
* -
|
|
7
|
-
* - provider
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - PaymentService 实现位于 service.ts
|
|
6
|
+
* - 路由注册逻辑位于 routes.ts
|
|
7
|
+
* - 各 provider 工厂位于 providers/ 目录下
|
|
8
8
|
*/
|
|
9
9
|
export { PaymentService } from "./service.js";
|
|
10
10
|
export type { PaymentServiceOptions } from "./types.js";
|
|
11
|
-
export {
|
|
12
|
-
export { creemPaymentProvider, dodoPaymentProvider, stripePaymentProvider, waffoPaymentProvider, } from "./providers.js";
|
|
11
|
+
export { paymentEvents, paymentPayments } from "./schema.js";
|
|
12
|
+
export { creemPaymentProvider, dodoPaymentProvider, stripePaymentProvider, waffoPaymentProvider, } from "./providers/index.js";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/payment/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/payment/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
|
package/bin/payment/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Payment 子模块公共入口。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* - PaymentService
|
|
6
|
-
* -
|
|
7
|
-
* - provider
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - PaymentService 实现位于 service.ts
|
|
6
|
+
* - 路由注册逻辑位于 routes.ts
|
|
7
|
+
* - 各 provider 工厂位于 providers/ 目录下
|
|
8
8
|
*/
|
|
9
9
|
export { PaymentService } from "./service.js";
|
|
10
|
-
export {
|
|
11
|
-
export { creemPaymentProvider, dodoPaymentProvider, stripePaymentProvider, waffoPaymentProvider, } from "./providers.js";
|
|
10
|
+
export { paymentEvents, paymentPayments } from "./schema.js";
|
|
11
|
+
export { creemPaymentProvider, dodoPaymentProvider, stripePaymentProvider, waffoPaymentProvider, } from "./providers/index.js";
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
package/bin/payment/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/payment/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/payment/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 关键说明(中文)
|
|
5
5
|
* - 不依赖 Creem SDK,统一走官方 HTTP API
|
|
6
|
-
* -
|
|
7
|
-
* - webhook 验签使用 Web Crypto API,便于 Cloudflare Workers 运行
|
|
6
|
+
* - webhook 验签使用 Web Crypto API,兼容 Cloudflare Workers
|
|
8
7
|
*/
|
|
9
8
|
import type { CreemCheckoutSessionResult, CreemCreateCheckoutSessionInput, CreemWebhookEvent } from "./types.js";
|
|
10
9
|
/**
|
|
@@ -14,7 +13,7 @@ export declare function normalizeCreemApiBaseURL(value: string | undefined): str
|
|
|
14
13
|
/**
|
|
15
14
|
* 创建 Creem Checkout Session。
|
|
16
15
|
*/
|
|
17
|
-
export declare function createCreemCheckoutSession(
|
|
16
|
+
export declare function createCreemCheckoutSession(api_key: string, api_base_url: string, input: CreemCreateCheckoutSessionInput): Promise<CreemCheckoutSessionResult>;
|
|
18
17
|
/**
|
|
19
18
|
* 解析 Creem webhook 事件。
|
|
20
19
|
*/
|
|
@@ -28,15 +27,11 @@ export declare function parseCreemWebhookEvent(raw: string): CreemWebhookEvent;
|
|
|
28
27
|
*/
|
|
29
28
|
export declare function verifyCreemSignature(raw: string, header: string | null, secret: string): Promise<boolean>;
|
|
30
29
|
/**
|
|
31
|
-
*
|
|
30
|
+
* 读取 metadata 对象。
|
|
32
31
|
*/
|
|
33
|
-
export declare function
|
|
34
|
-
/**
|
|
35
|
-
* 规范化可选字符串。
|
|
36
|
-
*/
|
|
37
|
-
export declare function normalizeOptionalText(value: unknown): string;
|
|
32
|
+
export declare function readMetadata(value: unknown): Record<string, unknown>;
|
|
38
33
|
/**
|
|
39
|
-
*
|
|
34
|
+
* 读取 Creem webhook 事件对象。
|
|
40
35
|
*/
|
|
41
|
-
export declare function
|
|
42
|
-
//# sourceMappingURL=
|
|
36
|
+
export declare function readCreemEventObject(event: Record<string, unknown>): Record<string, unknown>;
|
|
37
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/creem/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,0BAA0B,EAC1B,+BAA+B,EAC/B,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI1E;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,0BAA0B,CAAC,CAmCrC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAGrE;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIpE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI5F"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 关键说明(中文)
|
|
5
5
|
* - 不依赖 Creem SDK,统一走官方 HTTP API
|
|
6
|
-
* -
|
|
7
|
-
* - webhook 验签使用 Web Crypto API,便于 Cloudflare Workers 运行
|
|
6
|
+
* - webhook 验签使用 Web Crypto API,兼容 Cloudflare Workers
|
|
8
7
|
*/
|
|
8
|
+
import { normalizeOptionalText, normalizeRequired } from "../../helpers.js";
|
|
9
9
|
/**
|
|
10
10
|
* 规范化 Creem API 基础地址。
|
|
11
11
|
*/
|
|
@@ -18,12 +18,12 @@ export function normalizeCreemApiBaseURL(value) {
|
|
|
18
18
|
/**
|
|
19
19
|
* 创建 Creem Checkout Session。
|
|
20
20
|
*/
|
|
21
|
-
export async function createCreemCheckoutSession(
|
|
22
|
-
const response = await fetch(`${normalizeCreemApiBaseURL(
|
|
21
|
+
export async function createCreemCheckoutSession(api_key, api_base_url, input) {
|
|
22
|
+
const response = await fetch(`${normalizeCreemApiBaseURL(api_base_url)}/checkouts`, {
|
|
23
23
|
method: "POST",
|
|
24
24
|
headers: {
|
|
25
25
|
"content-type": "application/json",
|
|
26
|
-
"x-api-key": normalizeRequired(
|
|
26
|
+
"x-api-key": normalizeRequired(api_key, "Creem API key"),
|
|
27
27
|
},
|
|
28
28
|
body: JSON.stringify({
|
|
29
29
|
product_id: input.product_id,
|
|
@@ -45,26 +45,11 @@ export async function createCreemCheckoutSession(apiKey, apiBaseURL, input) {
|
|
|
45
45
|
"Creem checkout session creation failed").trim();
|
|
46
46
|
throw new Error(message || "Creem checkout session creation failed");
|
|
47
47
|
}
|
|
48
|
-
const checkoutId = normalizeRequired(payload.id ?? payload.checkout_id, "Creem checkout id");
|
|
49
|
-
const checkoutURL = normalizeRequired(payload.checkout_url ?? payload.url, "Creem checkout url");
|
|
50
48
|
return {
|
|
51
|
-
checkout_id:
|
|
52
|
-
checkout_url:
|
|
49
|
+
checkout_id: normalizeRequired(payload.id ?? payload.checkout_id, "Creem checkout id"),
|
|
50
|
+
checkout_url: normalizeRequired(payload.checkout_url ?? payload.url, "Creem checkout url"),
|
|
53
51
|
};
|
|
54
52
|
}
|
|
55
|
-
/**
|
|
56
|
-
* 读取支付 provider 需要的 USD cents 金额。
|
|
57
|
-
*/
|
|
58
|
-
function readTopupAmountUsdCents(topup) {
|
|
59
|
-
const direct = Number(topup.amount_usd_cents);
|
|
60
|
-
if (Number.isSafeInteger(direct) && direct > 0)
|
|
61
|
-
return direct;
|
|
62
|
-
const fallback = Math.round(Number(topup.amount) / 10_000);
|
|
63
|
-
if (!Number.isSafeInteger(fallback) || fallback <= 0) {
|
|
64
|
-
throw new TypeError("topup amount_usd_cents must be a positive integer");
|
|
65
|
-
}
|
|
66
|
-
return fallback;
|
|
67
|
-
}
|
|
68
53
|
/**
|
|
69
54
|
* 解析 Creem webhook 事件。
|
|
70
55
|
*/
|
|
@@ -92,27 +77,34 @@ export async function verifyCreemSignature(raw, header, secret) {
|
|
|
92
77
|
return timingSafeEqual(signature, expected);
|
|
93
78
|
}
|
|
94
79
|
/**
|
|
95
|
-
*
|
|
80
|
+
* 读取 metadata 对象。
|
|
96
81
|
*/
|
|
97
|
-
export function
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
return normalized;
|
|
82
|
+
export function readMetadata(value) {
|
|
83
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
84
|
+
? value
|
|
85
|
+
: {};
|
|
102
86
|
}
|
|
103
87
|
/**
|
|
104
|
-
*
|
|
88
|
+
* 读取 Creem webhook 事件对象。
|
|
105
89
|
*/
|
|
106
|
-
export function
|
|
107
|
-
|
|
90
|
+
export function readCreemEventObject(event) {
|
|
91
|
+
const direct = readMetadata(event.object);
|
|
92
|
+
if (Object.keys(direct).length > 0)
|
|
93
|
+
return direct;
|
|
94
|
+
return readMetadata(event.data?.object);
|
|
108
95
|
}
|
|
109
96
|
/**
|
|
110
|
-
*
|
|
97
|
+
* 读取支付 provider 需要的 USD cents 金额。
|
|
111
98
|
*/
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
99
|
+
function readTopupAmountUsdCents(topup) {
|
|
100
|
+
const direct = Number(topup.amount_usd_cents);
|
|
101
|
+
if (Number.isSafeInteger(direct) && direct > 0)
|
|
102
|
+
return direct;
|
|
103
|
+
const fallback = Math.round(Number(topup.amount) / 10_000);
|
|
104
|
+
if (!Number.isSafeInteger(fallback) || fallback <= 0) {
|
|
105
|
+
throw new TypeError("topup amount_usd_cents must be a positive integer");
|
|
106
|
+
}
|
|
107
|
+
return fallback;
|
|
116
108
|
}
|
|
117
109
|
/**
|
|
118
110
|
* 常量时间比较两个签名字符串。
|
|
@@ -139,4 +131,4 @@ async function readJSONRecord(response) {
|
|
|
139
131
|
return { message: text };
|
|
140
132
|
}
|
|
141
133
|
}
|
|
142
|
-
//# sourceMappingURL=
|
|
134
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/payment/providers/creem/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAO5E;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAyB;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IACzE,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAe,EACf,YAAoB,EACpB,KAAsC;IAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,wBAAwB,CAAC,YAAY,CAAC,YAAY,EAAE;QAClF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,iBAAiB,CAAC,OAAO,EAAE,eAAe,CAAC;SACzD;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE;gBACR,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ;gBAC9B,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;gBAC5B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;gBAC1B,gBAAgB,EAAE,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC;aACvD;SACF,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,CACpB,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,OAAO,CAAC,OAAO;YACf,wCAAwC,CACzC,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,wCAAwC,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,WAAW,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,mBAAmB,CAAC;QACtF,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,oBAAoB,CAAC;KAC3F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACvC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;AACjF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAW,EACX,MAAqB,EACrB,MAAc;IAEd,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACjD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC,CAAC,KAAgC;QAClC,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA8B;IACjE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAClD,OAAO,YAAY,CAAE,KAAK,CAAC,IAAyC,EAAE,MAAM,CAAC,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,KAAuD;IACtF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,KAAK,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,QAAkB;IAC9C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACxC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creem payment provider 工厂。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - Creem 只是 PaymentService 的一个 provider
|
|
6
|
+
* - 负责声明 env、生成支付方式、创建 Checkout、解析 webhook
|
|
7
|
+
*/
|
|
8
|
+
import type { CreemPaymentProviderOptions, PaymentProvider } from "../../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* 创建 Creem payment provider。
|
|
11
|
+
*/
|
|
12
|
+
export declare function creemPaymentProvider(options?: CreemPaymentProviderOptions): PaymentProvider;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/creem/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAUnF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,eAAe,CAuF/F"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creem payment provider 工厂。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - Creem 只是 PaymentService 的一个 provider
|
|
6
|
+
* - 负责声明 env、生成支付方式、创建 Checkout、解析 webhook
|
|
7
|
+
*/
|
|
8
|
+
import { normalizeCurrency, normalizeOptionalText, normalizeRequired, paymentMethodItem, readObjectId, } from "../../helpers.js";
|
|
9
|
+
import { createCreemCheckoutSession, normalizeCreemApiBaseURL, parseCreemWebhookEvent, readCreemEventObject, readMetadata, verifyCreemSignature, } from "./client.js";
|
|
10
|
+
/**
|
|
11
|
+
* 创建 Creem payment provider。
|
|
12
|
+
*/
|
|
13
|
+
export function creemPaymentProvider(options = {}) {
|
|
14
|
+
const label = options.label?.trim() || "Creem";
|
|
15
|
+
return {
|
|
16
|
+
id: "creem",
|
|
17
|
+
label,
|
|
18
|
+
env: [
|
|
19
|
+
{ key: "CREEM_API_KEY", description: "Creem API key,用于创建 Checkout Session", required: true },
|
|
20
|
+
{ key: "CREEM_PRODUCT_ID", description: "Creem product_id,用于创建 Checkout Session", required: true },
|
|
21
|
+
{ key: "CREEM_WEBHOOK_SECRET", description: "Creem webhook signing secret,用于校验 creem-signature", required: false },
|
|
22
|
+
{ key: "CREEM_CURRENCY", description: "默认结算币种,例如 usd;仅用于支付目录展示和本地记录", required: false },
|
|
23
|
+
{ key: "CREEM_API_BASE_URL", description: "可选的 Creem API 基础地址覆写,通常只用于测试环境", required: false },
|
|
24
|
+
],
|
|
25
|
+
method(ctx) {
|
|
26
|
+
const enabled = Boolean((options.api_key || ctx.env("CREEM_API_KEY"))
|
|
27
|
+
&& (options.product_id || ctx.env("CREEM_PRODUCT_ID")));
|
|
28
|
+
return paymentMethodItem({
|
|
29
|
+
id: "creem",
|
|
30
|
+
enabled,
|
|
31
|
+
label,
|
|
32
|
+
currency: normalizeCurrency(ctx.env("CREEM_CURRENCY")) || normalizeCurrency(options.currency) || "usd",
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
async createCheckout(input) {
|
|
36
|
+
const api_key = options.api_key ?? input.ctx.env("CREEM_API_KEY");
|
|
37
|
+
const product_id = options.product_id ?? input.ctx.env("CREEM_PRODUCT_ID");
|
|
38
|
+
if (!api_key)
|
|
39
|
+
throw new Error("Creem API key is not configured");
|
|
40
|
+
if (!product_id)
|
|
41
|
+
throw new Error("Creem product id is not configured");
|
|
42
|
+
const created = await createCreemCheckoutSession(api_key, normalizeCreemApiBaseURL(input.ctx.env("CREEM_API_BASE_URL") || options.api_base_url), {
|
|
43
|
+
payment_id: input.payment_id,
|
|
44
|
+
topup: input.topup,
|
|
45
|
+
product_id,
|
|
46
|
+
success_url: input.success_url,
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
provider_session_id: created.checkout_id,
|
|
50
|
+
checkout_url: created.checkout_url,
|
|
51
|
+
metadata: { product_id },
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
async parseWebhook(input) {
|
|
55
|
+
const webhook_secret = options.webhook_secret ?? input.ctx.env("CREEM_WEBHOOK_SECRET");
|
|
56
|
+
if (webhook_secret) {
|
|
57
|
+
const valid = await verifyCreemSignature(input.raw, input.request.headers.get("creem-signature"), webhook_secret);
|
|
58
|
+
if (!valid)
|
|
59
|
+
throw new Error("Invalid Creem signature");
|
|
60
|
+
}
|
|
61
|
+
const event = parseCreemWebhookEvent(input.raw);
|
|
62
|
+
const object = readCreemEventObject(event);
|
|
63
|
+
const metadata = readMetadata(object.metadata);
|
|
64
|
+
const type = normalizeOptionalText(event.eventType) || normalizeOptionalText(event.type) || "unknown";
|
|
65
|
+
const order = readMetadata(object.order);
|
|
66
|
+
const order_id = readObjectId(order) || normalizeOptionalText(object.order_id);
|
|
67
|
+
const checkout_id = readObjectId(object) || normalizeOptionalText(object.checkout_id);
|
|
68
|
+
return {
|
|
69
|
+
event_id: normalizeRequired(event.id, "creem event id"),
|
|
70
|
+
type,
|
|
71
|
+
payload: event,
|
|
72
|
+
status: type === "checkout.completed"
|
|
73
|
+
? "paid"
|
|
74
|
+
: type === "checkout.expired"
|
|
75
|
+
? "expired"
|
|
76
|
+
: type === "checkout.failed" || type === "payment.failed"
|
|
77
|
+
? "failed"
|
|
78
|
+
: "ignored",
|
|
79
|
+
payment_id: normalizeOptionalText(metadata.payment_id) || normalizeOptionalText(object.request_id),
|
|
80
|
+
topup_id: normalizeOptionalText(metadata.topup_id),
|
|
81
|
+
provider_session_id: checkout_id,
|
|
82
|
+
provider_order_id: order_id,
|
|
83
|
+
ref: order_id || checkout_id,
|
|
84
|
+
meta: {
|
|
85
|
+
provider: "creem",
|
|
86
|
+
creem_event_id: normalizeOptionalText(event.id),
|
|
87
|
+
creem_checkout_id: checkout_id,
|
|
88
|
+
creem_order_id: order_id,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/payment/providers/creem/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creem provider 内部类型。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - 仅供 creem provider 内部使用
|
|
6
|
+
* - 对外可见类型(如 CreemPaymentProviderOptions)放在 payment/types.ts
|
|
7
|
+
*/
|
|
8
|
+
import type { PaymentTopupRecord } from "../../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Creem Checkout API 创建参数。
|
|
11
|
+
*/
|
|
12
|
+
export interface CreemCreateCheckoutSessionInput {
|
|
13
|
+
/** 服务内部支付记录 ID。 */
|
|
14
|
+
payment_id: string;
|
|
15
|
+
/** 充值单信息。 */
|
|
16
|
+
topup: PaymentTopupRecord;
|
|
17
|
+
/** Creem product_id。 */
|
|
18
|
+
product_id: string;
|
|
19
|
+
/** 支付成功跳转地址。 */
|
|
20
|
+
success_url: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Creem Checkout API 创建结果。
|
|
24
|
+
*/
|
|
25
|
+
export interface CreemCheckoutSessionResult {
|
|
26
|
+
/** Creem Checkout ID。 */
|
|
27
|
+
checkout_id: string;
|
|
28
|
+
/** Creem Checkout 托管页面 URL。 */
|
|
29
|
+
checkout_url: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Creem webhook 事件。
|
|
33
|
+
*/
|
|
34
|
+
export interface CreemWebhookEvent extends Record<string, unknown> {
|
|
35
|
+
/** Creem 事件 ID。 */
|
|
36
|
+
id?: unknown;
|
|
37
|
+
/** Creem 事件类型(官方字段)。 */
|
|
38
|
+
eventType?: unknown;
|
|
39
|
+
/** 兼容代理转发后的事件类型字段。 */
|
|
40
|
+
type?: unknown;
|
|
41
|
+
/** Creem 事件主体对象。 */
|
|
42
|
+
object?: unknown;
|
|
43
|
+
/** 兼容 data.object 形式。 */
|
|
44
|
+
data?: {
|
|
45
|
+
/** 事件主体对象。 */
|
|
46
|
+
object?: unknown;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/creem/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,KAAK,EAAE,kBAAkB,CAAC;IAC1B,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAChE,mBAAmB;IACnB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,wBAAwB;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oBAAoB;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yBAAyB;IACzB,IAAI,CAAC,EAAE;QACL,cAAc;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/payment/providers/creem/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dodo Payments SDK 工具函数。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - 创建 Checkout 使用官方 `dodopayments` SDK
|
|
6
|
+
* - webhook 验签使用 SDK 自带 standardwebhooks unwrap
|
|
7
|
+
*/
|
|
8
|
+
import DodoPayments from "dodopayments";
|
|
9
|
+
import type { DodoCheckoutSessionResult, DodoCreateCheckoutSessionInput, DodoPaymentEnvironment, DodoWebhookEvent } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* 创建 Dodo SDK client。
|
|
12
|
+
*/
|
|
13
|
+
export declare function createDodoClient(input: {
|
|
14
|
+
/** Dodo API key。 */
|
|
15
|
+
api_key: string;
|
|
16
|
+
/** Webhook signing key。 */
|
|
17
|
+
webhook_key?: string;
|
|
18
|
+
/** SDK 运行环境。 */
|
|
19
|
+
environment: DodoPaymentEnvironment;
|
|
20
|
+
/** 可选 API 基础地址。 */
|
|
21
|
+
api_base_url?: string;
|
|
22
|
+
}): DodoPayments;
|
|
23
|
+
/**
|
|
24
|
+
* 创建 Dodo Checkout Session。
|
|
25
|
+
*/
|
|
26
|
+
export declare function createDodoCheckoutSession(client: DodoPayments, input: DodoCreateCheckoutSessionInput): Promise<DodoCheckoutSessionResult>;
|
|
27
|
+
/**
|
|
28
|
+
* 解析并可选校验 Dodo webhook。
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseDodoWebhookEvent(input: {
|
|
31
|
+
/** Dodo SDK client。 */
|
|
32
|
+
client: DodoPayments;
|
|
33
|
+
/** 原始请求 body。 */
|
|
34
|
+
raw: string;
|
|
35
|
+
/** 请求头。 */
|
|
36
|
+
headers: Headers;
|
|
37
|
+
/** 是否执行验签。 */
|
|
38
|
+
verify: boolean;
|
|
39
|
+
}): DodoWebhookEvent;
|
|
40
|
+
/**
|
|
41
|
+
* 读取 metadata 对象。
|
|
42
|
+
*/
|
|
43
|
+
export declare function readMetadata(value: unknown): Record<string, unknown>;
|
|
44
|
+
/**
|
|
45
|
+
* 规范化 Dodo 运行环境。
|
|
46
|
+
*/
|
|
47
|
+
export declare function normalizeDodoEnvironment(value: unknown): DodoPaymentEnvironment;
|
|
48
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/dodo/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,OAAO,KAAK,EACV,yBAAyB,EACzB,8BAA8B,EAC9B,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,WAAW,EAAE,sBAAsB,CAAC;IACpC,mBAAmB;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,YAAY,CAOf;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC,yBAAyB,CAAC,CAwBpC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,uBAAuB;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc;IACd,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,gBAAgB,CAKnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIpE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAM/E"}
|
|
@@ -4,18 +4,18 @@
|
|
|
4
4
|
* 关键说明(中文)
|
|
5
5
|
* - 创建 Checkout 使用官方 `dodopayments` SDK
|
|
6
6
|
* - webhook 验签使用 SDK 自带 standardwebhooks unwrap
|
|
7
|
-
* - 这里集中做字符串归一化和 SDK 响应裁剪
|
|
8
7
|
*/
|
|
9
8
|
import DodoPayments from "dodopayments";
|
|
9
|
+
import { normalizeOptionalText, normalizeRequired } from "../../helpers.js";
|
|
10
10
|
/**
|
|
11
11
|
* 创建 Dodo SDK client。
|
|
12
12
|
*/
|
|
13
13
|
export function createDodoClient(input) {
|
|
14
|
-
const
|
|
14
|
+
const api_base_url = normalizeOptionalText(input.api_base_url);
|
|
15
15
|
return new DodoPayments({
|
|
16
16
|
bearerToken: normalizeRequired(input.api_key, "Dodo API key"),
|
|
17
17
|
webhookKey: normalizeOptionalText(input.webhook_key) || null,
|
|
18
|
-
...(
|
|
18
|
+
...(api_base_url ? { baseURL: api_base_url } : { environment: input.environment }),
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
@@ -45,19 +45,6 @@ export async function createDodoCheckoutSession(client, input) {
|
|
|
45
45
|
checkout_url: normalizeRequired(response.checkout_url, "Dodo checkout url"),
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
-
/**
|
|
49
|
-
* 读取支付 provider 需要的 USD cents 金额。
|
|
50
|
-
*/
|
|
51
|
-
function readTopupAmountUsdCents(topup) {
|
|
52
|
-
const direct = Number(topup.amount_usd_cents);
|
|
53
|
-
if (Number.isSafeInteger(direct) && direct > 0)
|
|
54
|
-
return direct;
|
|
55
|
-
const fallback = Math.round(Number(topup.amount) / 10_000);
|
|
56
|
-
if (!Number.isSafeInteger(fallback) || fallback <= 0) {
|
|
57
|
-
throw new TypeError("topup amount_usd_cents must be a positive integer");
|
|
58
|
-
}
|
|
59
|
-
return fallback;
|
|
60
|
-
}
|
|
61
48
|
/**
|
|
62
49
|
* 解析并可选校验 Dodo webhook。
|
|
63
50
|
*/
|
|
@@ -68,22 +55,7 @@ export function parseDodoWebhookEvent(input) {
|
|
|
68
55
|
return event && typeof event === "object" ? event : {};
|
|
69
56
|
}
|
|
70
57
|
/**
|
|
71
|
-
*
|
|
72
|
-
*/
|
|
73
|
-
export function normalizeRequired(value, label) {
|
|
74
|
-
const normalized = String(value ?? "").trim();
|
|
75
|
-
if (!normalized)
|
|
76
|
-
throw new TypeError(`${label} is required`);
|
|
77
|
-
return normalized;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* 规范化可选字符串。
|
|
81
|
-
*/
|
|
82
|
-
export function normalizeOptionalText(value) {
|
|
83
|
-
return typeof value === "string" ? value.trim() : "";
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* 规范化 metadata 对象。
|
|
58
|
+
* 读取 metadata 对象。
|
|
87
59
|
*/
|
|
88
60
|
export function readMetadata(value) {
|
|
89
61
|
return value && typeof value === "object" && !Array.isArray(value)
|
|
@@ -103,4 +75,17 @@ export function normalizeDodoEnvironment(value) {
|
|
|
103
75
|
return "test_mode";
|
|
104
76
|
return "test_mode";
|
|
105
77
|
}
|
|
106
|
-
|
|
78
|
+
/**
|
|
79
|
+
* 读取支付 provider 需要的 USD cents 金额。
|
|
80
|
+
*/
|
|
81
|
+
function readTopupAmountUsdCents(topup) {
|
|
82
|
+
const direct = Number(topup.amount_usd_cents);
|
|
83
|
+
if (Number.isSafeInteger(direct) && direct > 0)
|
|
84
|
+
return direct;
|
|
85
|
+
const fallback = Math.round(Number(topup.amount) / 10_000);
|
|
86
|
+
if (!Number.isSafeInteger(fallback) || fallback <= 0) {
|
|
87
|
+
throw new TypeError("topup amount_usd_cents must be a positive integer");
|
|
88
|
+
}
|
|
89
|
+
return fallback;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/payment/providers/dodo/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dodo Payments payment provider 工厂。
|
|
3
|
+
*
|
|
4
|
+
* 关键说明(中文)
|
|
5
|
+
* - Dodo 只是 PaymentService 的一个 provider
|
|
6
|
+
* - 负责声明 env、生成支付方式、创建 Checkout、解析 webhook
|
|
7
|
+
*/
|
|
8
|
+
import type { DodoPaymentProviderOptions, PaymentProvider } from "../../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* 创建 Dodo Payments provider。
|
|
11
|
+
*/
|
|
12
|
+
export declare function dodoPaymentProvider(options?: DodoPaymentProviderOptions): PaymentProvider;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/dodo/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AASlF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,eAAe,CA+F7F"}
|