@downcity/services 0.1.98 → 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
@@ -1,10 +0,0 @@
1
- /**
2
- * Dodo Payments 一次性充值服务对外类型定义。
3
- *
4
- * 关键说明(中文)
5
- * - 当前能力只覆盖 Dodo Checkout 一次性充值
6
- * - 不覆盖 subscription / entitlement
7
- * - 支付成功后统一通过 balance.finishTopup() 完成到账
8
- */
9
- export {};
10
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/payment-dodo/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Downcity Stripe 一次性充值服务。
3
- *
4
- * 关键说明(中文)
5
- * - 当前版本只处理 Stripe 一次性充值
6
- * - 不处理 entitlement,也不处理 subscription
7
- * - 支付成功后统一调用 balance.finishTopup() 完成到账
8
- */
9
- import type { ServiceDefinition } from "@downcity/city";
10
- import type { StripePaymentServiceOptions } from "./types.js";
11
- export { stripeEvents, stripePayments } from "./schema.js";
12
- export type { StripeCheckoutCreateResult, StripePaymentServiceBalanceBridge, StripeCreateCheckoutInput, StripeEventRecord, StripeEventSyncStatus, StripePaymentServiceOptions, StripePaymentRecord, StripePaymentStatus, } from "./types.js";
13
- /**
14
- * 创建 Stripe 一次性充值服务。
15
- */
16
- export declare function stripePaymentService(options: StripePaymentServiceOptions): ServiceDefinition;
17
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/payment-stripe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,gBAAgB,CAAC;AAYxE,OAAO,KAAK,EAKV,2BAA2B,EAI5B,MAAM,YAAY,CAAC;AAsEpB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EACV,0BAA0B,EAC1B,iCAAiC,EACjC,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,iBAAiB,CAoN5F"}
@@ -1,555 +0,0 @@
1
- /**
2
- * Downcity Stripe 一次性充值服务。
3
- *
4
- * 关键说明(中文)
5
- * - 当前版本只处理 Stripe 一次性充值
6
- * - 不处理 entitlement,也不处理 subscription
7
- * - 支付成功后统一调用 balance.finishTopup() 完成到账
8
- */
9
- import { resolvePaymentRedirectURL } from "../payment/redirect.js";
10
- import { stripeEvents, stripePayments } from "./schema.js";
11
- import { createStripeCheckoutSession, normalizeOptionalText, normalizeRequired, normalizeStripeApiBaseURL, parseStripeWebhookEvent, readMetadata, verifyStripeSignature, } from "./stripe.js";
12
- /**
13
- * Stripe 服务对外暴露的运行时环境变量。
14
- *
15
- * 关键说明(中文)
16
- * - secret / webhook 是最常见的宿主注入配置
17
- * - 默认跳转页统一基于 DOWNCITY_CITY_BASE_URL 生成
18
- * - currency / item name / api server URL 提供可选默认值覆写
19
- */
20
- const stripePaymentEnv = [
21
- {
22
- key: "STRIPE_SECRET_KEY",
23
- description: "Stripe secret key,用于创建 Checkout Session",
24
- required: true,
25
- },
26
- {
27
- key: "STRIPE_WEBHOOK_SECRET",
28
- description: "Stripe webhook signing secret,用于校验 stripe-signature",
29
- required: false,
30
- },
31
- {
32
- key: "DOWNCITY_CITY_BASE_URL",
33
- description: "City 对外访问地址;用于自动生成 Stripe 默认跳转页地址",
34
- required: false,
35
- },
36
- {
37
- key: "STRIPE_CURRENCY",
38
- description: "默认结算币种,例如 usd",
39
- required: false,
40
- },
41
- {
42
- key: "STRIPE_ITEM_NAME",
43
- description: "Stripe Checkout 展示的默认商品名",
44
- required: false,
45
- },
46
- {
47
- key: "STRIPE_API_BASE_URL",
48
- description: "可选的 Stripe API 基础地址覆写,通常只用于测试环境",
49
- required: false,
50
- },
51
- ];
52
- export { stripeEvents, stripePayments } from "./schema.js";
53
- /**
54
- * 创建 Stripe 一次性充值服务。
55
- */
56
- export function stripePaymentService(options) {
57
- const normalized = normalizeOptions(options);
58
- return {
59
- id: "payment.stripe",
60
- name: "Stripe Payment",
61
- version: "0.2.0",
62
- env: stripePaymentEnv,
63
- schema: {
64
- payments: stripePayments,
65
- events: stripeEvents,
66
- },
67
- instruction: [
68
- "使用 Stripe 创建一次性充值 Checkout,并在 webhook 成功后完成 balance topup。",
69
- "这个服务不处理 entitlement,也不处理 subscription。",
70
- "当 options 未显式传入时,会回退读取 STRIPE_SECRET_KEY / STRIPE_WEBHOOK_SECRET。",
71
- "默认 success/cancel URL 统一基于 DOWNCITY_CITY_BASE_URL 自动生成。",
72
- `currency=${normalized.currency}。`,
73
- "支付成功后统一通过 balance.finishTopup() 完成到账。",
74
- ].join("\n"),
75
- install(ctx) {
76
- const payments = ctx.table("payments");
77
- const events = ctx.table("events");
78
- const balance = normalized.balance;
79
- ctx.route({
80
- method: "POST",
81
- path: "/checkout/create",
82
- auth: ["user"],
83
- async handler(requestCtx) {
84
- const body = await requestCtx.json();
85
- const userId = normalizeRequired(requestCtx.user?.user_id, "user_id");
86
- const topup = await balance.readTopup(normalizeRequired(body.topup_id, "topup_id"));
87
- if (topup.user_id !== userId) {
88
- return requestCtx.jsonResponse({ error: "Topup does not belong to current user" }, 403);
89
- }
90
- if (topup.status !== "pending") {
91
- return requestCtx.jsonResponse({ error: `Topup is already ${topup.status}` }, 409);
92
- }
93
- const existing = await findActivePaymentByTopup(payments, topup.topup_id);
94
- if (existing) {
95
- return requestCtx.jsonResponse(toCheckoutResult(existing));
96
- }
97
- const secretKey = normalized.secret_key ?? ctx.env("STRIPE_SECRET_KEY");
98
- if (!secretKey) {
99
- return requestCtx.jsonResponse({ error: "Stripe secret key is not configured" }, 500);
100
- }
101
- const paymentId = `pay_${randomId()}`;
102
- const currency = resolveCurrency(normalized, ctx);
103
- const created = await createStripeCheckoutSession(secretKey, resolveApiBaseURL(normalized, ctx), {
104
- payment_id: paymentId,
105
- topup,
106
- currency,
107
- success_url: resolvePaymentRedirectURL({
108
- path: "/v1/payment.stripe/redirect/success",
109
- ctx,
110
- request: requestCtx.request,
111
- }),
112
- cancel_url: resolvePaymentRedirectURL({
113
- path: "/v1/payment.stripe/redirect/cancel",
114
- ctx,
115
- request: requestCtx.request,
116
- }),
117
- item_name: resolveItemName(normalized, ctx),
118
- });
119
- const now = new Date().toISOString();
120
- const row = {
121
- payment_id: paymentId,
122
- topup_id: topup.topup_id,
123
- user_id: topup.user_id,
124
- stripe_checkout_session_id: created.session_id,
125
- stripe_payment_intent_id: created.payment_intent_id,
126
- amount: topup.amount,
127
- currency,
128
- status: "pending",
129
- checkout_url: created.checkout_url,
130
- metadata_json: JSON.stringify({
131
- note: topup.note,
132
- }),
133
- created_at: now,
134
- updated_at: now,
135
- };
136
- await payments.insert(row);
137
- return requestCtx.jsonResponse(toCheckoutResult(row));
138
- },
139
- });
140
- ctx.route({
141
- method: "GET",
142
- path: "/payments/me",
143
- auth: ["user"],
144
- async handler(requestCtx) {
145
- const userId = normalizeRequired(requestCtx.user?.user_id, "user_id");
146
- const rows = sortPayments(await payments.select({ user_id: userId }));
147
- return requestCtx.jsonResponse({ items: rows });
148
- },
149
- });
150
- ctx.route({
151
- method: "GET",
152
- path: "/payments",
153
- auth: ["admin"],
154
- async handler(requestCtx) {
155
- return requestCtx.jsonResponse({ items: sortPayments(await payments.select()) });
156
- },
157
- });
158
- ctx.route({
159
- method: "GET",
160
- path: "/events",
161
- auth: ["admin"],
162
- async handler(requestCtx) {
163
- return requestCtx.jsonResponse({ items: sortEvents(await events.select()) });
164
- },
165
- });
166
- ctx.route({
167
- method: "POST",
168
- path: "/webhook",
169
- auth: [],
170
- async handler(requestCtx) {
171
- const raw = await requestCtx.text();
172
- const webhookSecret = normalized.webhook_secret ?? ctx.env("STRIPE_WEBHOOK_SECRET");
173
- if (webhookSecret) {
174
- const signature = requestCtx.request.headers.get("stripe-signature");
175
- const valid = await verifyStripeSignature(raw, signature, webhookSecret);
176
- if (!valid)
177
- return requestCtx.jsonResponse({ error: "Invalid Stripe signature" }, 400);
178
- }
179
- const event = parseStripeWebhookEvent(raw);
180
- const eventId = normalizeRequired(event.id, "stripe event id");
181
- const eventType = String(event.type ?? "unknown");
182
- const existing = (await events.select({ event_id: eventId }))[0];
183
- if (existing) {
184
- return requestCtx.jsonResponse({
185
- received: true,
186
- event_id: eventId,
187
- sync_status: existing.sync_status,
188
- });
189
- }
190
- const eventRow = {
191
- event_id: eventId,
192
- type: eventType,
193
- payload_json: JSON.stringify(event),
194
- sync_status: "pending",
195
- sync_error: "",
196
- created_at: new Date().toISOString(),
197
- };
198
- await events.insert(eventRow);
199
- try {
200
- const syncStatus = await syncStripeEvent({
201
- event,
202
- payments,
203
- balance,
204
- });
205
- await updateEvent(events, eventId, syncStatus, "");
206
- return requestCtx.jsonResponse({
207
- received: true,
208
- event_id: eventId,
209
- sync_status: syncStatus,
210
- });
211
- }
212
- catch (error) {
213
- const message = error instanceof Error ? error.message : String(error);
214
- await updateEvent(events, eventId, "failed", message);
215
- return requestCtx.jsonResponse({
216
- received: true,
217
- event_id: eventId,
218
- sync_status: "failed",
219
- error: message,
220
- }, 500);
221
- }
222
- },
223
- });
224
- ctx.route({
225
- method: "GET",
226
- path: "/redirect/success",
227
- auth: [],
228
- handler(requestCtx) {
229
- return htmlResponse(renderRedirectPage({
230
- title: "Payment successful",
231
- heading: "Payment completed",
232
- description: "Your Stripe payment has been accepted. If the balance view has not refreshed yet, close this page and return to your app.",
233
- request: requestCtx.request,
234
- }));
235
- },
236
- });
237
- ctx.route({
238
- method: "GET",
239
- path: "/redirect/cancel",
240
- auth: [],
241
- handler(requestCtx) {
242
- return htmlResponse(renderRedirectPage({
243
- title: "Payment canceled",
244
- heading: "Payment canceled",
245
- description: "No charge was completed. You can close this page and return to your app to try again later.",
246
- request: requestCtx.request,
247
- }));
248
- },
249
- });
250
- },
251
- };
252
- }
253
- /**
254
- * 统一同步 Stripe webhook 事件。
255
- */
256
- async function syncStripeEvent(input) {
257
- const { event, payments, balance } = input;
258
- switch (String(event.type ?? "")) {
259
- case "checkout.session.completed":
260
- return await syncCheckoutCompleted(event, payments, balance);
261
- case "checkout.session.expired":
262
- return await syncCheckoutExpired(event, payments);
263
- case "payment_intent.payment_failed":
264
- return await syncPaymentIntentFailed(event, payments);
265
- default:
266
- return "ignored";
267
- }
268
- }
269
- /**
270
- * 同步 `checkout.session.completed`。
271
- */
272
- async function syncCheckoutCompleted(event, payments, balance) {
273
- const object = readMetadata(event.data?.object);
274
- const payment = await findPaymentByEventObject(payments, object, "stripe_checkout_session_id");
275
- if (!payment)
276
- return "ignored";
277
- if (payment.status === "paid")
278
- return "applied";
279
- const paymentIntentId = normalizeOptionalText(object.payment_intent);
280
- const topup = await balance.readTopup(payment.topup_id);
281
- if (topup.status === "pending") {
282
- await balance.finishTopup(payment.topup_id, {
283
- note: "stripe topup",
284
- ref: normalizeOptionalText(object.id) || payment.stripe_checkout_session_id,
285
- meta: {
286
- stripe_event_id: normalizeOptionalText(event.id),
287
- stripe_checkout_session_id: normalizeOptionalText(object.id),
288
- stripe_payment_intent_id: paymentIntentId,
289
- stripe_payment_id: payment.payment_id,
290
- },
291
- });
292
- }
293
- await updatePayment(payments, payment.payment_id, {
294
- status: "paid",
295
- stripe_payment_intent_id: paymentIntentId || payment.stripe_payment_intent_id,
296
- });
297
- return "applied";
298
- }
299
- /**
300
- * 同步 `checkout.session.expired`。
301
- */
302
- async function syncCheckoutExpired(event, payments) {
303
- const object = readMetadata(event.data?.object);
304
- const payment = await findPaymentByEventObject(payments, object, "stripe_checkout_session_id");
305
- if (!payment)
306
- return "ignored";
307
- if (payment.status !== "pending")
308
- return "ignored";
309
- await updatePayment(payments, payment.payment_id, { status: "expired" });
310
- return "applied";
311
- }
312
- /**
313
- * 同步 `payment_intent.payment_failed`。
314
- */
315
- async function syncPaymentIntentFailed(event, payments) {
316
- const object = readMetadata(event.data?.object);
317
- const payment = await findPaymentByEventObject(payments, object, "stripe_payment_intent_id");
318
- if (!payment)
319
- return "ignored";
320
- if (payment.status !== "pending")
321
- return "ignored";
322
- await updatePayment(payments, payment.payment_id, {
323
- status: "failed",
324
- stripe_payment_intent_id: normalizeOptionalText(object.id) || payment.stripe_payment_intent_id,
325
- });
326
- return "applied";
327
- }
328
- /**
329
- * 根据 webhook 对象寻找支付记录。
330
- */
331
- async function findPaymentByEventObject(payments, object, primaryField) {
332
- const metadata = readMetadata(object.metadata);
333
- const paymentId = normalizeOptionalText(metadata.payment_id);
334
- if (paymentId) {
335
- const record = (await payments.select({ payment_id: paymentId }))[0];
336
- if (record)
337
- return record;
338
- }
339
- const directId = normalizeOptionalText(object.id);
340
- if (directId) {
341
- const record = (await payments.select({ [primaryField]: directId }))[0];
342
- if (record)
343
- return record;
344
- }
345
- const topupId = normalizeOptionalText(metadata.topup_id) || normalizeOptionalText(object.client_reference_id);
346
- if (topupId) {
347
- return await findActivePaymentByTopup(payments, topupId);
348
- }
349
- return undefined;
350
- }
351
- /**
352
- * 查询某个 topup 当前的活跃支付记录。
353
- */
354
- async function findActivePaymentByTopup(payments, topupId) {
355
- const rows = sortPayments(await payments.select({ topup_id: topupId }));
356
- return rows.find((row) => row.status === "pending");
357
- }
358
- /**
359
- * 更新支付记录。
360
- */
361
- async function updatePayment(payments, paymentId, input) {
362
- await payments.update({
363
- where: { payment_id: paymentId },
364
- values: {
365
- status: input.status,
366
- stripe_payment_intent_id: normalizeOptionalText(input.stripe_payment_intent_id),
367
- updated_at: new Date().toISOString(),
368
- },
369
- });
370
- }
371
- /**
372
- * 更新 webhook 同步状态。
373
- */
374
- async function updateEvent(events, eventId, syncStatus, syncError) {
375
- await events.update({
376
- where: { event_id: eventId },
377
- values: {
378
- sync_status: syncStatus,
379
- sync_error: syncError.trim(),
380
- },
381
- });
382
- }
383
- /**
384
- * 将支付记录裁剪为创建 Checkout 的返回结构。
385
- */
386
- function toCheckoutResult(row) {
387
- return {
388
- payment_id: row.payment_id,
389
- topup_id: row.topup_id,
390
- stripe_checkout_session_id: row.stripe_checkout_session_id,
391
- checkout_url: row.checkout_url,
392
- status: row.status,
393
- };
394
- }
395
- /**
396
- * 统一排序支付记录。
397
- */
398
- function sortPayments(rows) {
399
- return [...rows].sort((left, right) => {
400
- if (left.updated_at === right.updated_at)
401
- return right.created_at.localeCompare(left.created_at);
402
- return right.updated_at.localeCompare(left.updated_at);
403
- });
404
- }
405
- /**
406
- * 统一排序 webhook 事件记录。
407
- */
408
- function sortEvents(rows) {
409
- return [...rows].sort((left, right) => right.created_at.localeCompare(left.created_at));
410
- }
411
- /**
412
- * 规范化服务配置。
413
- */
414
- function normalizeOptions(options) {
415
- if (!options?.balance)
416
- throw new TypeError("Stripe payment service requires a balance service instance");
417
- return {
418
- ...options,
419
- balance: options.balance,
420
- currency: normalizeCurrency(options.currency) || "usd",
421
- item_name: normalizeOptionalText(options.item_name) || "Downcity Topup",
422
- api_base_url: normalizeStripeApiBaseURL(options.api_base_url),
423
- };
424
- }
425
- /**
426
- * 规范化币种。
427
- */
428
- function normalizeCurrency(value) {
429
- return normalizeOptionalText(value).toLowerCase();
430
- }
431
- /**
432
- * 解析当前请求最终使用的币种。
433
- */
434
- function resolveCurrency(options, ctx) {
435
- return normalizeCurrency(ctx.env("STRIPE_CURRENCY")) || options.currency || "usd";
436
- }
437
- /**
438
- * 解析当前请求最终使用的 Checkout 商品名。
439
- */
440
- function resolveItemName(options, ctx) {
441
- return normalizeOptionalText(ctx.env("STRIPE_ITEM_NAME")) || options.item_name;
442
- }
443
- /**
444
- * 解析当前请求最终使用的 Stripe API 基础地址。
445
- */
446
- function resolveApiBaseURL(options, ctx) {
447
- return normalizeStripeApiBaseURL(ctx.env("STRIPE_API_BASE_URL") || options.api_base_url);
448
- }
449
- /**
450
- * 返回最小 HTML 页面,避免 Stripe 跳回后出现 404。
451
- */
452
- function htmlResponse(html) {
453
- return new Response(html, {
454
- status: 200,
455
- headers: { "content-type": "text/html; charset=utf-8" },
456
- });
457
- }
458
- /**
459
- * 渲染支付完成/取消结果页。
460
- */
461
- function renderRedirectPage(input) {
462
- const homeURL = escapeHTML(new URL("/", input.request.url).toString());
463
- const title = escapeHTML(input.title);
464
- const heading = escapeHTML(input.heading);
465
- const description = escapeHTML(input.description);
466
- return `<!doctype html>
467
- <html lang="en">
468
- <head>
469
- <meta charset="utf-8" />
470
- <meta name="viewport" content="width=device-width, initial-scale=1" />
471
- <title>${title}</title>
472
- <style>
473
- :root {
474
- color-scheme: light;
475
- --bg: #f5f7fb;
476
- --card: #ffffff;
477
- --text: #142033;
478
- --muted: #5a6a85;
479
- --border: #d9e2f1;
480
- --accent: #1f6feb;
481
- }
482
- * { box-sizing: border-box; }
483
- body {
484
- margin: 0;
485
- min-height: 100vh;
486
- display: grid;
487
- place-items: center;
488
- padding: 24px;
489
- background:
490
- radial-gradient(circle at top, #e9f1ff 0, rgba(233, 241, 255, 0) 42%),
491
- linear-gradient(180deg, #f8fbff 0%, var(--bg) 100%);
492
- color: var(--text);
493
- font: 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
494
- }
495
- main {
496
- width: min(100%, 560px);
497
- padding: 32px;
498
- border: 1px solid var(--border);
499
- border-radius: 20px;
500
- background: var(--card);
501
- box-shadow: 0 18px 60px rgba(16, 24, 40, 0.08);
502
- }
503
- h1 {
504
- margin: 0 0 12px;
505
- font-size: 28px;
506
- line-height: 1.2;
507
- }
508
- p {
509
- margin: 0;
510
- color: var(--muted);
511
- }
512
- a {
513
- display: inline-block;
514
- margin-top: 24px;
515
- color: #fff;
516
- background: var(--accent);
517
- text-decoration: none;
518
- padding: 12px 16px;
519
- border-radius: 999px;
520
- font-weight: 600;
521
- }
522
- </style>
523
- </head>
524
- <body>
525
- <main>
526
- <h1>${heading}</h1>
527
- <p>${description}</p>
528
- <a href="${homeURL}">Return to Downcity</a>
529
- </main>
530
- </body>
531
- </html>`;
532
- }
533
- /**
534
- * 最小 HTML 转义,避免文本直接拼进页面时破坏结构。
535
- */
536
- function escapeHTML(value) {
537
- return value
538
- .replaceAll("&", "&amp;")
539
- .replaceAll("<", "&lt;")
540
- .replaceAll(">", "&gt;")
541
- .replaceAll('"', "&quot;")
542
- .replaceAll("'", "&#39;");
543
- }
544
- /**
545
- * 生成随机 ID。
546
- */
547
- function randomId() {
548
- const buffer = new Uint8Array(12);
549
- crypto.getRandomValues(buffer);
550
- return btoa(String.fromCharCode(...buffer))
551
- .replace(/\+/g, "-")
552
- .replace(/\//g, "_")
553
- .replace(/=+$/, "");
554
- }
555
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/payment-stripe/index.ts"],"names":[],"mappings":"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"}