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