@downcity/services 0.1.94 → 0.1.101

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
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Dodo Payments payment provider 工厂。
3
+ *
4
+ * 关键说明(中文)
5
+ * - Dodo 只是 PaymentService 的一个 provider
6
+ * - 负责声明 env、生成支付方式、创建 Checkout、解析 webhook
7
+ */
8
+ import { normalizeCurrency, normalizeOptionalText, normalizeRequired, paymentMethodItem, randomId, } from "../../helpers.js";
9
+ import { createDodoCheckoutSession, createDodoClient, normalizeDodoEnvironment, parseDodoWebhookEvent, readMetadata, } from "./client.js";
10
+ /**
11
+ * 创建 Dodo Payments provider。
12
+ */
13
+ export function dodoPaymentProvider(options = {}) {
14
+ const label = options.label?.trim() || "Dodo Payments";
15
+ return {
16
+ id: "dodo",
17
+ label,
18
+ env: [
19
+ { key: "DODO_PAYMENTS_API_KEY", description: "Dodo Payments API key,用于创建 Checkout Session", required: true },
20
+ { key: "DODO_PRODUCT_ID", description: "Dodo product_id,用于创建 Checkout Session", required: true },
21
+ { key: "DODO_WEBHOOK_KEY", description: "Dodo webhook signing key,用于校验 webhook", required: false },
22
+ { key: "DODO_ENVIRONMENT", description: "Dodo SDK 环境:test_mode 或 live_mode;默认 test_mode", required: false },
23
+ { key: "DODO_CURRENCY", description: "默认结算币种,例如 usd", required: false },
24
+ { key: "DODO_API_BASE_URL", description: "可选的 Dodo API 基础地址覆写,通常只用于测试环境", required: false },
25
+ ],
26
+ method(ctx) {
27
+ const enabled = Boolean((options.api_key || ctx.env("DODO_PAYMENTS_API_KEY"))
28
+ && (options.product_id || ctx.env("DODO_PRODUCT_ID")));
29
+ return paymentMethodItem({
30
+ id: "dodo",
31
+ enabled,
32
+ label,
33
+ currency: normalizeCurrency(ctx.env("DODO_CURRENCY")) || normalizeCurrency(options.currency) || "usd",
34
+ });
35
+ },
36
+ async createCheckout(input) {
37
+ const api_key = options.api_key ?? input.ctx.env("DODO_PAYMENTS_API_KEY");
38
+ const product_id = options.product_id ?? input.ctx.env("DODO_PRODUCT_ID");
39
+ if (!api_key)
40
+ throw new Error("Dodo API key is not configured");
41
+ if (!product_id)
42
+ throw new Error("Dodo product id is not configured");
43
+ const client = createDodoClient({
44
+ api_key,
45
+ webhook_key: options.webhook_key ?? input.ctx.env("DODO_WEBHOOK_KEY"),
46
+ environment: normalizeDodoEnvironment(input.ctx.env("DODO_ENVIRONMENT") || options.environment),
47
+ api_base_url: options.api_base_url ?? input.ctx.env("DODO_API_BASE_URL"),
48
+ });
49
+ const created = await createDodoCheckoutSession(client, {
50
+ payment_id: input.payment_id,
51
+ topup: input.topup,
52
+ product_id,
53
+ currency: normalizeCurrency(input.ctx.env("DODO_CURRENCY")) || normalizeCurrency(options.currency) || "usd",
54
+ return_url: input.success_url,
55
+ cancel_url: input.cancel_url,
56
+ });
57
+ return {
58
+ provider_session_id: created.checkout_session_id,
59
+ provider_payment_id: created.dodo_payment_id,
60
+ checkout_url: created.checkout_url,
61
+ metadata: { product_id },
62
+ };
63
+ },
64
+ async parseWebhook(input) {
65
+ const webhook_key = options.webhook_key ?? input.ctx.env("DODO_WEBHOOK_KEY");
66
+ const client = createDodoClient({
67
+ api_key: options.api_key ?? input.ctx.env("DODO_PAYMENTS_API_KEY") ?? "webhook_only",
68
+ webhook_key,
69
+ environment: normalizeDodoEnvironment(input.ctx.env("DODO_ENVIRONMENT") || options.environment),
70
+ api_base_url: options.api_base_url ?? input.ctx.env("DODO_API_BASE_URL"),
71
+ });
72
+ const event = parseDodoWebhookEvent({
73
+ client,
74
+ raw: input.raw,
75
+ headers: input.request.headers,
76
+ verify: Boolean(webhook_key),
77
+ });
78
+ const object = readMetadata(event.data || event.object);
79
+ const metadata = readMetadata(object.metadata);
80
+ const type = normalizeOptionalText(event.type) || normalizeOptionalText(event.eventType) || "unknown";
81
+ const provider_payment_id = normalizeOptionalText(object.payment_id) || normalizeOptionalText(object.id);
82
+ const checkout_session_id = normalizeOptionalText(object.checkout_session_id);
83
+ return {
84
+ event_id: normalizeRequired(event.id || event.event_id || provider_payment_id || `evt_${randomId()}`, "dodo event id"),
85
+ type,
86
+ payload: event,
87
+ status: type === "payment.succeeded"
88
+ ? "paid"
89
+ : type === "payment.failed"
90
+ ? "failed"
91
+ : type === "payment.cancelled" || type === "payment.canceled"
92
+ ? "canceled"
93
+ : "ignored",
94
+ payment_id: normalizeOptionalText(metadata.payment_id),
95
+ topup_id: normalizeOptionalText(metadata.topup_id),
96
+ provider_session_id: checkout_session_id,
97
+ provider_payment_id,
98
+ ref: provider_payment_id || checkout_session_id,
99
+ meta: {
100
+ provider: "dodo",
101
+ dodo_event_id: normalizeOptionalText(event.id || event.event_id),
102
+ dodo_checkout_session_id: checkout_session_id,
103
+ dodo_payment_id: provider_payment_id,
104
+ },
105
+ };
106
+ },
107
+ };
108
+ }
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/payment/providers/dodo/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Dodo provider 内部类型。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 仅供 dodo provider 内部使用
6
+ * - 对外可见类型(如 DodoPaymentProviderOptions)放在 payment/types.ts
7
+ */
8
+ import type { PaymentTopupRecord } from "../../types.js";
9
+ /**
10
+ * Dodo SDK 运行环境。
11
+ */
12
+ export type DodoPaymentEnvironment = "test_mode" | "live_mode";
13
+ /**
14
+ * Dodo Checkout API 创建参数。
15
+ */
16
+ export interface DodoCreateCheckoutSessionInput {
17
+ /** 服务内部支付记录 ID。 */
18
+ payment_id: string;
19
+ /** 充值单信息。 */
20
+ topup: PaymentTopupRecord;
21
+ /** Dodo product_id。 */
22
+ product_id: string;
23
+ /** 结算币种。 */
24
+ currency: string;
25
+ /** 支付完成跳转地址。 */
26
+ return_url: string;
27
+ /** 支付取消跳转地址。 */
28
+ cancel_url: string;
29
+ }
30
+ /**
31
+ * Dodo Checkout API 创建结果。
32
+ */
33
+ export interface DodoCheckoutSessionResult {
34
+ /** Dodo Checkout Session ID。 */
35
+ checkout_session_id: string;
36
+ /** Dodo Payment ID。 */
37
+ dodo_payment_id: string;
38
+ /** Dodo Checkout 托管页面 URL。 */
39
+ checkout_url: string;
40
+ }
41
+ /**
42
+ * Dodo webhook 事件。
43
+ */
44
+ export interface DodoWebhookEvent extends Record<string, unknown> {
45
+ /** Dodo 事件 ID。 */
46
+ id?: unknown;
47
+ /** Dodo 事件 ID 备用字段。 */
48
+ event_id?: unknown;
49
+ /** Dodo 事件类型。 */
50
+ type?: unknown;
51
+ /** Dodo 事件类型备用字段。 */
52
+ eventType?: unknown;
53
+ /** Dodo 事件数据。 */
54
+ data?: unknown;
55
+ /** Dodo 事件主体备用字段。 */
56
+ object?: unknown;
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/dodo/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,WAAW,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,KAAK,EAAE,kBAAkB,CAAC;IAC1B,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,gCAAgC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/D,kBAAkB;IAClB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qBAAqB;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qBAAqB;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Dodo provider 内部类型。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 仅供 dodo provider 内部使用
6
+ * - 对外可见类型(如 DodoPaymentProviderOptions)放在 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/dodo/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Payment provider 工厂统一入口。
3
+ *
4
+ * 关键说明(中文)
5
+ * - Stripe / Creem / Dodo / Waffo 都只是 PaymentService 的 provider
6
+ * - 每个 provider 单独放在自己的子目录里,便于扩展和维护
7
+ */
8
+ export { creemPaymentProvider } from "./creem/index.js";
9
+ export { dodoPaymentProvider } from "./dodo/index.js";
10
+ export { stripePaymentProvider } from "./stripe/index.js";
11
+ export { waffoPaymentProvider } from "./waffo/index.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/payment/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Payment provider 工厂统一入口。
3
+ *
4
+ * 关键说明(中文)
5
+ * - Stripe / Creem / Dodo / Waffo 都只是 PaymentService 的 provider
6
+ * - 每个 provider 单独放在自己的子目录里,便于扩展和维护
7
+ */
8
+ export { creemPaymentProvider } from "./creem/index.js";
9
+ export { dodoPaymentProvider } from "./dodo/index.js";
10
+ export { stripePaymentProvider } from "./stripe/index.js";
11
+ export { waffoPaymentProvider } from "./waffo/index.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/payment/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * 关键说明(中文)
5
5
  * - 不直接依赖 Stripe SDK,统一走官方 HTTP API
6
6
  * - 创建 Checkout 使用 form-urlencoded,兼容 Node 与 Worker
7
- * - webhook 验签继续使用 Web Crypto API
7
+ * - webhook 验签使用 Web Crypto API,支持 Cloudflare Workers
8
8
  */
9
9
  import type { StripeCheckoutSessionResult, StripeCreateCheckoutSessionInput, StripeWebhookEvent } from "./types.js";
10
10
  /**
@@ -14,7 +14,7 @@ export declare function normalizeStripeApiBaseURL(value: string | undefined): st
14
14
  /**
15
15
  * 创建 Stripe Checkout Session。
16
16
  */
17
- export declare function createStripeCheckoutSession(secretKey: string, apiBaseURL: string, input: StripeCreateCheckoutSessionInput): Promise<StripeCheckoutSessionResult>;
17
+ export declare function createStripeCheckoutSession(secret_key: string, api_base_url: string, input: StripeCreateCheckoutSessionInput): Promise<StripeCheckoutSessionResult>;
18
18
  /**
19
19
  * 解析 Stripe webhook 事件。
20
20
  */
@@ -24,15 +24,7 @@ export declare function parseStripeWebhookEvent(raw: string): StripeWebhookEvent
24
24
  */
25
25
  export declare function verifyStripeSignature(raw: string, header: string | null, secret: string): Promise<boolean>;
26
26
  /**
27
- * 规范化非空字符串。
28
- */
29
- export declare function normalizeRequired(value: unknown, label: string): string;
30
- /**
31
- * 规范化可选字符串。
32
- */
33
- export declare function normalizeOptionalText(value: unknown): string;
34
- /**
35
- * 规范化 metadata 对象。
27
+ * 读取 metadata 对象。
36
28
  */
37
29
  export declare function readMetadata(value: unknown): Record<string, unknown>;
38
- //# sourceMappingURL=stripe.d.ts.map
30
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/stripe/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,2BAA2B,EAC3B,gCAAgC,EAChC,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI3E;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,2BAA2B,CAAC,CAyCtC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAGvE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CA4BlB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIpE"}
@@ -4,8 +4,9 @@
4
4
  * 关键说明(中文)
5
5
  * - 不直接依赖 Stripe SDK,统一走官方 HTTP API
6
6
  * - 创建 Checkout 使用 form-urlencoded,兼容 Node 与 Worker
7
- * - webhook 验签继续使用 Web Crypto API
7
+ * - webhook 验签使用 Web Crypto API,支持 Cloudflare Workers
8
8
  */
9
+ import { normalizeOptionalText, normalizeRequired } from "../../helpers.js";
9
10
  /**
10
11
  * 规范化 Stripe API 基础地址。
11
12
  */
@@ -18,7 +19,7 @@ export function normalizeStripeApiBaseURL(value) {
18
19
  /**
19
20
  * 创建 Stripe Checkout Session。
20
21
  */
21
- export async function createStripeCheckoutSession(secretKey, apiBaseURL, input) {
22
+ export async function createStripeCheckoutSession(secret_key, api_base_url, input) {
22
23
  const body = new URLSearchParams();
23
24
  body.set("mode", "payment");
24
25
  body.set("success_url", input.success_url);
@@ -34,10 +35,10 @@ export async function createStripeCheckoutSession(secretKey, apiBaseURL, input)
34
35
  body.set("payment_intent_data[metadata][payment_id]", input.payment_id);
35
36
  body.set("payment_intent_data[metadata][topup_id]", input.topup.topup_id);
36
37
  body.set("payment_intent_data[metadata][user_id]", input.topup.user_id);
37
- const response = await fetch(`${normalizeStripeApiBaseURL(apiBaseURL)}/checkout/sessions`, {
38
+ const response = await fetch(`${normalizeStripeApiBaseURL(api_base_url)}/checkout/sessions`, {
38
39
  method: "POST",
39
40
  headers: {
40
- authorization: `Bearer ${normalizeRequired(secretKey, "Stripe secret key")}`,
41
+ authorization: `Bearer ${normalizeRequired(secret_key, "Stripe secret key")}`,
41
42
  "content-type": "application/x-www-form-urlencoded",
42
43
  },
43
44
  body,
@@ -49,27 +50,12 @@ export async function createStripeCheckoutSession(secretKey, apiBaseURL, input)
49
50
  "Stripe checkout session creation failed").trim();
50
51
  throw new Error(message || "Stripe checkout session creation failed");
51
52
  }
52
- const sessionId = normalizeRequired(payload.id, "Stripe checkout session id");
53
- const checkoutURL = normalizeRequired(payload.url, "Stripe checkout session url");
54
53
  return {
55
- session_id: sessionId,
56
- checkout_url: checkoutURL,
54
+ session_id: normalizeRequired(payload.id, "Stripe checkout session id"),
55
+ checkout_url: normalizeRequired(payload.url, "Stripe checkout session url"),
57
56
  payment_intent_id: normalizeOptionalText(payload.payment_intent),
58
57
  };
59
58
  }
60
- /**
61
- * 读取支付 provider 需要的 USD cents 金额。
62
- */
63
- function readTopupAmountUsdCents(topup) {
64
- const direct = Number(topup.amount_usd_cents);
65
- if (Number.isSafeInteger(direct) && direct > 0)
66
- return direct;
67
- const fallback = Math.round(Number(topup.amount) / 10_000);
68
- if (!Number.isSafeInteger(fallback) || fallback <= 0) {
69
- throw new TypeError("topup amount_usd_cents must be a positive integer");
70
- }
71
- return fallback;
72
- }
73
59
  /**
74
60
  * 解析 Stripe webhook 事件。
75
61
  */
@@ -104,28 +90,26 @@ export async function verifyStripeSignature(raw, header, secret) {
104
90
  return result === 0;
105
91
  }
106
92
  /**
107
- * 规范化非空字符串。
108
- */
109
- export function normalizeRequired(value, label) {
110
- const normalized = String(value ?? "").trim();
111
- if (!normalized)
112
- throw new TypeError(`${label} is required`);
113
- return normalized;
114
- }
115
- /**
116
- * 规范化可选字符串。
117
- */
118
- export function normalizeOptionalText(value) {
119
- return typeof value === "string" ? value.trim() : "";
120
- }
121
- /**
122
- * 规范化 metadata 对象。
93
+ * 读取 metadata 对象。
123
94
  */
124
95
  export function readMetadata(value) {
125
96
  return value && typeof value === "object" && !Array.isArray(value)
126
97
  ? value
127
98
  : {};
128
99
  }
100
+ /**
101
+ * 读取支付 provider 需要的 USD cents 金额。
102
+ */
103
+ function readTopupAmountUsdCents(topup) {
104
+ const direct = Number(topup.amount_usd_cents);
105
+ if (Number.isSafeInteger(direct) && direct > 0)
106
+ return direct;
107
+ const fallback = Math.round(Number(topup.amount) / 10_000);
108
+ if (!Number.isSafeInteger(fallback) || fallback <= 0) {
109
+ throw new TypeError("topup amount_usd_cents must be a positive integer");
110
+ }
111
+ return fallback;
112
+ }
129
113
  /**
130
114
  * 读取 JSON 响应并兜底为空对象。
131
115
  */
@@ -139,4 +123,4 @@ async function readJSONRecord(response) {
139
123
  return { message: text };
140
124
  }
141
125
  }
142
- //# sourceMappingURL=stripe.js.map
126
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/payment/providers/stripe/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAO5E;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAyB;IACjE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,2BAA2B,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC1E,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,UAAkB,EAClB,YAAoB,EACpB,KAAuC;IAEvC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,qCAAqC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,+CAA+C,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3E,IAAI,CAAC,GAAG,CAAC,wCAAwC,EAAE,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,2CAA2C,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,CAAC,yCAAyC,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1E,IAAI,CAAC,GAAG,CAAC,wCAAwC,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAExE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,yBAAyB,CAAC,YAAY,CAAC,oBAAoB,EAAE;QAC3F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAE;YAC7E,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI;KACL,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,yCAAyC,CAC1C,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,yCAAyC,CAAC,CAAC;IACxE,CAAC;IAED,OAAO;QACL,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,4BAA4B,CAAC;QACvE,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,6BAA6B,CAAC;QAC3E,iBAAiB,EAAE,qBAAqB,CAAC,OAAO,CAAC,cAAc,CAAC;KACjE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACvC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAW,EACX,MAAqB,EACrB,MAAc;IAEd,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5E,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC,CAAC;IACJ,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;IAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC;IAC3B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE3C,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,SAAS,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5F,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,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,KAAK,CAAC,CAAC;AACtB,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,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,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
+ * Stripe payment provider 工厂。
3
+ *
4
+ * 关键说明(中文)
5
+ * - Stripe 只是 PaymentService 的一个 provider
6
+ * - 负责声明 env、生成支付方式、创建 Checkout、解析 webhook
7
+ */
8
+ import type { PaymentProvider, StripePaymentProviderOptions } from "../../types.js";
9
+ /**
10
+ * 创建 Stripe payment provider。
11
+ */
12
+ export declare function stripePaymentProvider(options?: StripePaymentProviderOptions): PaymentProvider;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/stripe/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AASpF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,eAAe,CAyFjG"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Stripe payment provider 工厂。
3
+ *
4
+ * 关键说明(中文)
5
+ * - Stripe 只是 PaymentService 的一个 provider
6
+ * - 负责声明 env、生成支付方式、创建 Checkout、解析 webhook
7
+ */
8
+ import { normalizeCurrency, normalizeOptionalText, normalizeRequired, paymentMethodItem, } from "../../helpers.js";
9
+ import { createStripeCheckoutSession, normalizeStripeApiBaseURL, parseStripeWebhookEvent, readMetadata, verifyStripeSignature, } from "./client.js";
10
+ /**
11
+ * 创建 Stripe payment provider。
12
+ */
13
+ export function stripePaymentProvider(options = {}) {
14
+ const label = options.label?.trim() || "Stripe";
15
+ return {
16
+ id: "stripe",
17
+ label,
18
+ env: [
19
+ { key: "STRIPE_SECRET_KEY", description: "Stripe secret key,用于创建 Checkout Session", required: true },
20
+ { key: "STRIPE_WEBHOOK_SECRET", description: "Stripe webhook signing secret,用于校验 stripe-signature", required: false },
21
+ { key: "STRIPE_CURRENCY", description: "默认结算币种,例如 usd", required: false },
22
+ { key: "STRIPE_ITEM_NAME", description: "Stripe Checkout 展示的默认商品名", required: false },
23
+ { key: "STRIPE_API_BASE_URL", description: "可选的 Stripe API 基础地址覆写,通常只用于测试环境", required: false },
24
+ ],
25
+ method(ctx) {
26
+ const enabled = Boolean(options.secret_key || ctx.env("STRIPE_SECRET_KEY"));
27
+ return paymentMethodItem({
28
+ id: "stripe",
29
+ enabled,
30
+ label,
31
+ currency: normalizeCurrency(ctx.env("STRIPE_CURRENCY")) || normalizeCurrency(options.currency) || "usd",
32
+ });
33
+ },
34
+ async createCheckout(input) {
35
+ const secret_key = options.secret_key ?? input.ctx.env("STRIPE_SECRET_KEY");
36
+ if (!secret_key)
37
+ throw new Error("Stripe secret key is not configured");
38
+ const created = await createStripeCheckoutSession(secret_key, normalizeStripeApiBaseURL(input.ctx.env("STRIPE_API_BASE_URL") || options.api_base_url), {
39
+ payment_id: input.payment_id,
40
+ topup: input.topup,
41
+ currency: normalizeCurrency(input.ctx.env("STRIPE_CURRENCY")) || normalizeCurrency(options.currency) || "usd",
42
+ success_url: input.success_url,
43
+ cancel_url: input.cancel_url,
44
+ item_name: normalizeOptionalText(input.ctx.env("STRIPE_ITEM_NAME"))
45
+ || normalizeOptionalText(options.item_name)
46
+ || "Downcity Topup",
47
+ });
48
+ return {
49
+ provider_session_id: created.session_id,
50
+ provider_payment_id: created.payment_intent_id,
51
+ checkout_url: created.checkout_url,
52
+ };
53
+ },
54
+ async parseWebhook(input) {
55
+ const webhook_secret = options.webhook_secret ?? input.ctx.env("STRIPE_WEBHOOK_SECRET");
56
+ if (webhook_secret) {
57
+ const valid = await verifyStripeSignature(input.raw, input.request.headers.get("stripe-signature"), webhook_secret);
58
+ if (!valid)
59
+ throw new Error("Invalid Stripe signature");
60
+ }
61
+ const event = parseStripeWebhookEvent(input.raw);
62
+ const object = readMetadata(event.data?.object);
63
+ const metadata = readMetadata(object.metadata);
64
+ const type = normalizeOptionalText(event.type) || "unknown";
65
+ const status = type === "checkout.session.completed"
66
+ ? "paid"
67
+ : type === "checkout.session.expired"
68
+ ? "expired"
69
+ : type === "payment_intent.payment_failed"
70
+ ? "failed"
71
+ : "ignored";
72
+ const is_payment_intent = type === "payment_intent.payment_failed";
73
+ return {
74
+ event_id: normalizeRequired(event.id, "stripe event id"),
75
+ type,
76
+ payload: event,
77
+ status,
78
+ payment_id: normalizeOptionalText(metadata.payment_id),
79
+ topup_id: normalizeOptionalText(metadata.topup_id) || normalizeOptionalText(object.client_reference_id),
80
+ provider_session_id: is_payment_intent ? undefined : normalizeOptionalText(object.id),
81
+ provider_payment_id: is_payment_intent
82
+ ? normalizeOptionalText(object.id)
83
+ : normalizeOptionalText(object.payment_intent),
84
+ ref: normalizeOptionalText(object.id),
85
+ meta: {
86
+ provider: "stripe",
87
+ stripe_event_id: normalizeOptionalText(event.id),
88
+ stripe_checkout_session_id: is_payment_intent ? undefined : normalizeOptionalText(object.id),
89
+ stripe_payment_intent_id: is_payment_intent
90
+ ? normalizeOptionalText(object.id)
91
+ : normalizeOptionalText(object.payment_intent),
92
+ },
93
+ };
94
+ },
95
+ };
96
+ }
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/payment/providers/stripe/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Stripe provider 内部类型。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 仅供 stripe provider 内部使用
6
+ * - 对外可见类型(如 StripePaymentProviderOptions)放在 payment/types.ts
7
+ */
8
+ import type { PaymentTopupRecord } from "../../types.js";
9
+ /**
10
+ * Stripe Checkout API 创建参数。
11
+ */
12
+ export interface StripeCreateCheckoutSessionInput {
13
+ /** 服务内部支付记录 ID。 */
14
+ payment_id: string;
15
+ /** 充值单信息。 */
16
+ topup: PaymentTopupRecord;
17
+ /** 结算币种。 */
18
+ currency: string;
19
+ /** 支付成功跳转地址。 */
20
+ success_url: string;
21
+ /** 支付取消跳转地址。 */
22
+ cancel_url: string;
23
+ /** Stripe Checkout 展示的商品名称。 */
24
+ item_name: string;
25
+ }
26
+ /**
27
+ * Stripe Checkout API 创建结果。
28
+ */
29
+ export interface StripeCheckoutSessionResult {
30
+ /** Stripe Checkout Session ID。 */
31
+ session_id: string;
32
+ /** Stripe Checkout 托管页面 URL。 */
33
+ checkout_url: string;
34
+ /** 关联的 Payment Intent ID(创建时可能为空)。 */
35
+ payment_intent_id: string;
36
+ }
37
+ /**
38
+ * Stripe webhook 事件。
39
+ */
40
+ export interface StripeWebhookEvent extends Record<string, unknown> {
41
+ /** Stripe 事件 ID。 */
42
+ id?: unknown;
43
+ /** Stripe 事件类型。 */
44
+ type?: unknown;
45
+ /** Stripe 事件 data。 */
46
+ data?: {
47
+ /** 事件主体对象。 */
48
+ object?: unknown;
49
+ };
50
+ }
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/payment/providers/stripe/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,KAAK,EAAE,kBAAkB,CAAC;IAC1B,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,oBAAoB;IACpB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,mBAAmB;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sBAAsB;IACtB,IAAI,CAAC,EAAE;QACL,cAAc;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Stripe provider 内部类型。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 仅供 stripe provider 内部使用
6
+ * - 对外可见类型(如 StripePaymentProviderOptions)放在 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/stripe/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Waffo Pancake SDK 工具函数。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 创建 Checkout 使用官方 `@waffo/pancake-ts` SDK
6
+ * - webhook 验签使用 SDK 自带 RSA-SHA256 verify
7
+ */
8
+ import { WaffoPancake } from "@waffo/pancake-ts";
9
+ import type { WaffoCheckoutSessionResult, WaffoCreateCheckoutSessionInput, WaffoPaymentEnvironment, WaffoWebhookEvent } from "./types.js";
10
+ /**
11
+ * 创建 Waffo SDK client。
12
+ */
13
+ export declare function createWaffoClient(input: {
14
+ /** Waffo Merchant ID。 */
15
+ merchant_id: string;
16
+ /** Waffo private key。 */
17
+ private_key: string;
18
+ /** 可选 webhook public key。 */
19
+ webhook_public_key?: string;
20
+ /** 可选 API 基础地址。 */
21
+ api_base_url?: string;
22
+ }): WaffoPancake;
23
+ /**
24
+ * 创建 Waffo Checkout Session。
25
+ */
26
+ export declare function createWaffoCheckoutSession(client: WaffoPancake, input: WaffoCreateCheckoutSessionInput): Promise<WaffoCheckoutSessionResult>;
27
+ /**
28
+ * 解析并校验 Waffo webhook。
29
+ */
30
+ export declare function parseWaffoWebhookEvent(input: {
31
+ /** Waffo SDK client。 */
32
+ client: WaffoPancake;
33
+ /** 原始请求 body。 */
34
+ raw: string;
35
+ /** 签名请求头。 */
36
+ signature: string | null;
37
+ /** 事件环境。 */
38
+ environment: WaffoPaymentEnvironment;
39
+ }): WaffoWebhookEvent;
40
+ /**
41
+ * 读取 metadata 对象。
42
+ */
43
+ export declare function readMetadata(value: unknown): Record<string, unknown>;
44
+ /**
45
+ * 规范化 Waffo 运行环境。
46
+ */
47
+ export declare function normalizeWaffoEnvironment(value: unknown): WaffoPaymentEnvironment;
48
+ /**
49
+ * Waffo webhook-only fallback 私钥。
50
+ *
51
+ * 关键说明(中文)
52
+ * - 仅用于 webhook-only 场景,让 SDK 能完成签名验证流程
53
+ * - 不会用于任何真实请求,真实请求必须配置 WAFFO_PRIVATE_KEY
54
+ */
55
+ export declare function fallbackWaffoPrivateKey(): string;
56
+ //# sourceMappingURL=client.d.ts.map