@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.
Files changed (119) hide show
  1. package/bin/payment/index.d.ts +6 -6
  2. package/bin/payment/index.d.ts.map +1 -1
  3. package/bin/payment/index.js +6 -6
  4. package/bin/payment/index.js.map +1 -1
  5. package/bin/{payment-creem/creem.d.ts → payment/providers/creem/client.d.ts} +7 -12
  6. package/bin/payment/providers/creem/client.d.ts.map +1 -0
  7. package/bin/{payment-creem/creem.js → payment/providers/creem/client.js} +29 -37
  8. package/bin/payment/providers/creem/client.js.map +1 -0
  9. package/bin/payment/providers/creem/index.d.ts +13 -0
  10. package/bin/payment/providers/creem/index.d.ts.map +1 -0
  11. package/bin/payment/providers/creem/index.js +94 -0
  12. package/bin/payment/providers/creem/index.js.map +1 -0
  13. package/bin/payment/providers/creem/types.d.ts +49 -0
  14. package/bin/payment/providers/creem/types.d.ts.map +1 -0
  15. package/bin/payment/providers/creem/types.js +9 -0
  16. package/bin/payment/providers/creem/types.js.map +1 -0
  17. package/bin/payment/providers/dodo/client.d.ts +48 -0
  18. package/bin/payment/providers/dodo/client.d.ts.map +1 -0
  19. package/bin/{payment-dodo/dodo.js → payment/providers/dodo/client.js} +18 -33
  20. package/bin/payment/providers/dodo/client.js.map +1 -0
  21. package/bin/payment/providers/dodo/index.d.ts +13 -0
  22. package/bin/payment/providers/dodo/index.d.ts.map +1 -0
  23. package/bin/payment/providers/dodo/index.js +109 -0
  24. package/bin/payment/providers/dodo/index.js.map +1 -0
  25. package/bin/payment/providers/dodo/types.d.ts +58 -0
  26. package/bin/payment/providers/dodo/types.d.ts.map +1 -0
  27. package/bin/payment/providers/dodo/types.js +9 -0
  28. package/bin/payment/providers/dodo/types.js.map +1 -0
  29. package/bin/payment/providers/index.d.ts +12 -0
  30. package/bin/payment/providers/index.d.ts.map +1 -0
  31. package/bin/payment/providers/index.js +12 -0
  32. package/bin/payment/providers/index.js.map +1 -0
  33. package/bin/{payment-stripe/stripe.d.ts → payment/providers/stripe/client.d.ts} +4 -12
  34. package/bin/payment/providers/stripe/client.d.ts.map +1 -0
  35. package/bin/{payment-stripe/stripe.js → payment/providers/stripe/client.js} +22 -38
  36. package/bin/payment/providers/stripe/client.js.map +1 -0
  37. package/bin/payment/providers/stripe/index.d.ts +13 -0
  38. package/bin/payment/providers/stripe/index.d.ts.map +1 -0
  39. package/bin/payment/providers/stripe/index.js +97 -0
  40. package/bin/payment/providers/stripe/index.js.map +1 -0
  41. package/bin/payment/providers/stripe/types.d.ts +51 -0
  42. package/bin/payment/providers/stripe/types.d.ts.map +1 -0
  43. package/bin/payment/providers/stripe/types.js +9 -0
  44. package/bin/payment/providers/stripe/types.js.map +1 -0
  45. package/bin/payment/providers/waffo/client.d.ts +56 -0
  46. package/bin/payment/providers/waffo/client.d.ts.map +1 -0
  47. package/bin/{payment-waffo/waffo.js → payment/providers/waffo/client.js} +54 -31
  48. package/bin/payment/providers/waffo/client.js.map +1 -0
  49. package/bin/payment/providers/waffo/index.d.ts +13 -0
  50. package/bin/payment/providers/waffo/index.d.ts.map +1 -0
  51. package/bin/payment/providers/waffo/index.js +105 -0
  52. package/bin/payment/providers/waffo/index.js.map +1 -0
  53. package/bin/payment/providers/waffo/types.d.ts +63 -0
  54. package/bin/payment/providers/waffo/types.d.ts.map +1 -0
  55. package/bin/payment/providers/waffo/types.js +9 -0
  56. package/bin/payment/providers/waffo/types.js.map +1 -0
  57. package/package.json +3 -3
  58. package/bin/payment/providers.d.ts +0 -25
  59. package/bin/payment/providers.d.ts.map +0 -1
  60. package/bin/payment/providers.js +0 -415
  61. package/bin/payment/providers.js.map +0 -1
  62. package/bin/payment-creem/creem.d.ts.map +0 -1
  63. package/bin/payment-creem/creem.js.map +0 -1
  64. package/bin/payment-creem/index.d.ts +0 -17
  65. package/bin/payment-creem/index.d.ts.map +0 -1
  66. package/bin/payment-creem/index.js +0 -569
  67. package/bin/payment-creem/index.js.map +0 -1
  68. package/bin/payment-creem/schema.d.ts +0 -378
  69. package/bin/payment-creem/schema.d.ts.map +0 -1
  70. package/bin/payment-creem/schema.js +0 -47
  71. package/bin/payment-creem/schema.js.map +0 -1
  72. package/bin/payment-creem/types.d.ts +0 -293
  73. package/bin/payment-creem/types.d.ts.map +0 -1
  74. package/bin/payment-creem/types.js +0 -10
  75. package/bin/payment-creem/types.js.map +0 -1
  76. package/bin/payment-dodo/dodo.d.ts +0 -119
  77. package/bin/payment-dodo/dodo.d.ts.map +0 -1
  78. package/bin/payment-dodo/dodo.js.map +0 -1
  79. package/bin/payment-dodo/index.d.ts +0 -17
  80. package/bin/payment-dodo/index.d.ts.map +0 -1
  81. package/bin/payment-dodo/index.js +0 -548
  82. package/bin/payment-dodo/index.js.map +0 -1
  83. package/bin/payment-dodo/schema.d.ts +0 -378
  84. package/bin/payment-dodo/schema.d.ts.map +0 -1
  85. package/bin/payment-dodo/schema.js +0 -47
  86. package/bin/payment-dodo/schema.js.map +0 -1
  87. package/bin/payment-dodo/types.d.ts +0 -257
  88. package/bin/payment-dodo/types.d.ts.map +0 -1
  89. package/bin/payment-dodo/types.js +0 -10
  90. package/bin/payment-dodo/types.js.map +0 -1
  91. package/bin/payment-stripe/index.d.ts +0 -17
  92. package/bin/payment-stripe/index.d.ts.map +0 -1
  93. package/bin/payment-stripe/index.js +0 -555
  94. package/bin/payment-stripe/index.js.map +0 -1
  95. package/bin/payment-stripe/schema.d.ts +0 -378
  96. package/bin/payment-stripe/schema.d.ts.map +0 -1
  97. package/bin/payment-stripe/schema.js +0 -47
  98. package/bin/payment-stripe/schema.js.map +0 -1
  99. package/bin/payment-stripe/stripe.d.ts.map +0 -1
  100. package/bin/payment-stripe/stripe.js.map +0 -1
  101. package/bin/payment-stripe/types.d.ts +0 -303
  102. package/bin/payment-stripe/types.d.ts.map +0 -1
  103. package/bin/payment-stripe/types.js +0 -10
  104. package/bin/payment-stripe/types.js.map +0 -1
  105. package/bin/payment-waffo/index.d.ts +0 -17
  106. package/bin/payment-waffo/index.d.ts.map +0 -1
  107. package/bin/payment-waffo/index.js +0 -549
  108. package/bin/payment-waffo/index.js.map +0 -1
  109. package/bin/payment-waffo/schema.d.ts +0 -388
  110. package/bin/payment-waffo/schema.d.ts.map +0 -1
  111. package/bin/payment-waffo/schema.js +0 -39
  112. package/bin/payment-waffo/schema.js.map +0 -1
  113. package/bin/payment-waffo/types.d.ts +0 -285
  114. package/bin/payment-waffo/types.d.ts.map +0 -1
  115. package/bin/payment-waffo/types.js +0 -10
  116. package/bin/payment-waffo/types.js.map +0 -1
  117. package/bin/payment-waffo/waffo.d.ts +0 -111
  118. package/bin/payment-waffo/waffo.d.ts.map +0 -1
  119. package/bin/payment-waffo/waffo.js.map +0 -1
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Payment 子模块公共入口。
3
3
  *
4
- * 关键点(中文)
5
- * - PaymentService class service.ts
6
- * - 路由注册逻辑在 routes.ts
7
- * - provider 工厂函数在 providers.ts
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 { paymentPayments, paymentEvents } from "./schema.js";
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,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
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"}
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Payment 子模块公共入口。
3
3
  *
4
- * 关键点(中文)
5
- * - PaymentService class service.ts
6
- * - 路由注册逻辑在 routes.ts
7
- * - provider 工厂函数在 providers.ts
4
+ * 关键说明(中文)
5
+ * - PaymentService 实现位于 service.ts
6
+ * - 路由注册逻辑位于 routes.ts
7
+ * - provider 工厂位于 providers/ 目录下
8
8
  */
9
9
  export { PaymentService } from "./service.js";
10
- export { paymentPayments, paymentEvents } from "./schema.js";
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
@@ -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,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
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
- * - 创建 Checkout 使用 JSON body,兼容 Node 与 Worker
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(apiKey: string, apiBaseURL: string, input: CreemCreateCheckoutSessionInput): Promise<CreemCheckoutSessionResult>;
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 normalizeRequired(value: unknown, label: string): string;
34
- /**
35
- * 规范化可选字符串。
36
- */
37
- export declare function normalizeOptionalText(value: unknown): string;
32
+ export declare function readMetadata(value: unknown): Record<string, unknown>;
38
33
  /**
39
- * 规范化 metadata 对象。
34
+ * 读取 Creem webhook 事件对象。
40
35
  */
41
- export declare function readMetadata(value: unknown): Record<string, unknown>;
42
- //# sourceMappingURL=creem.d.ts.map
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
- * - 创建 Checkout 使用 JSON body,兼容 Node 与 Worker
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(apiKey, apiBaseURL, input) {
22
- const response = await fetch(`${normalizeCreemApiBaseURL(apiBaseURL)}/checkouts`, {
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(apiKey, "Creem API key"),
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: checkoutId,
52
- checkout_url: checkoutURL,
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 normalizeRequired(value, label) {
98
- const normalized = String(value ?? "").trim();
99
- if (!normalized)
100
- throw new TypeError(`${label} is required`);
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 normalizeOptionalText(value) {
107
- return typeof value === "string" ? value.trim() : "";
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
- * 规范化 metadata 对象。
97
+ * 读取支付 provider 需要的 USD cents 金额。
111
98
  */
112
- export function readMetadata(value) {
113
- return value && typeof value === "object" && !Array.isArray(value)
114
- ? value
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=creem.js.map
134
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/payment/providers/creem/client.ts"],"names":[],"mappings":"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"}
@@ -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,9 @@
1
+ /**
2
+ * Creem provider 内部类型。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 仅供 creem provider 内部使用
6
+ * - 对外可见类型(如 CreemPaymentProviderOptions)放在 payment/types.ts
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -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 apiBaseURL = normalizeOptionalText(input.api_base_url);
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
- ...(apiBaseURL ? { baseURL: apiBaseURL } : { environment: input.environment }),
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
- //# sourceMappingURL=dodo.js.map
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"}