@nvwa-app/sdk-functions 6.46.0 → 6.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { drizzle } from 'drizzle-orm/postgres-js';
2
2
  import { CreatePaymentOrderRequest, ProjectPlatformType, PaymentOrderResult } from '@nvwa-app/sdk-shared';
3
- export { CreatePaymentOrderRequest, PaymentClientContext, PaymentOrderResult, ProjectPlatformType, toPaymentOrderResultFromGateway } from '@nvwa-app/sdk-shared';
3
+ export { CreatePaymentOrderRequest, ParseCreatePaymentOrderRequestResult, PaymentClientContext, PaymentOrderResult, ProjectPlatformType, parseCreatePaymentOrderRequest, toPaymentOrderResultFromGateway } from '@nvwa-app/sdk-shared';
4
4
 
5
5
  declare function getDb(): ReturnType<typeof drizzle>;
6
6
 
@@ -20,6 +20,8 @@ interface AuthUser {
20
20
  */
21
21
  declare function getRequestUser(req: Request, baseUrlOverride?: string): Promise<AuthUser | null>;
22
22
 
23
+ /** 解析失败时抛出 `Error(message)`,便于 `try/catch` 后直接 `buildCreateOrderParams`。 */
24
+ declare function assertCreatePaymentOrderRequest(input: unknown): CreatePaymentOrderRequest;
23
25
  /** 支付端类型:与 integrations/payment 中的 supportedPlatforms 一致,用于按端过滤可用 provider。 */
24
26
  type PaymentPlatform = "web" | "uniapp" | "wechat-miniprogram" | "alipay-miniprogram";
25
27
  interface PaymentGatewayClientOptions {
@@ -62,6 +64,10 @@ interface GetOrderResult {
62
64
  raw: Record<string, unknown>;
63
65
  }
64
66
  declare const PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER = "X-Payment-Gateway-Signature";
67
+ /** 与 `Request.headers` / `Headers` 兼容,仅需 `get(name)`。 */
68
+ type PaymentNotifyHeaderSource = {
69
+ get(name: string): string | null | undefined;
70
+ };
65
71
  interface PaymentSuccessNotifyPayload {
66
72
  platformOrderId: string;
67
73
  bizOrderId: string;
@@ -73,7 +79,18 @@ interface PaymentSuccessNotifyPayload {
73
79
  timestamp: string;
74
80
  paidAt: string;
75
81
  }
82
+ /**
83
+ * 底层验签:对原始 UTF-8 body 做 HMAC-SHA256,与 Base64 签名做常量时间比较。
84
+ * 业务侧优先使用 {@link verifyPaymentNotifySignature}(从请求头取 `X-Payment-Gateway-Signature`)。
85
+ */
76
86
  declare function verifySuccessNotifySignature(rawBody: string, signature: string | null | undefined, secret: string): Promise<boolean>;
87
+ /** 读取 Payment Gateway 回调签名头(去空白;缺失或空串返回 `null`)。 */
88
+ declare function getPaymentGatewayNotifySignature(headers: PaymentNotifyHeaderSource): string | null;
89
+ /**
90
+ * Payment Gateway 成功回调验签:与建单时 `successNotifySecret` 一致;
91
+ * 网关对 **原始 JSON 字符串** 计算 HMAC-SHA256,再以 Base64 写入 `X-Payment-Gateway-Signature`。
92
+ */
93
+ declare function verifyPaymentNotifySignature(rawBody: string, headers: PaymentNotifyHeaderSource, secret: string): Promise<boolean>;
77
94
  declare function parseSuccessNotifyPayload(rawBody: string): PaymentSuccessNotifyPayload;
78
95
  declare function verifyAndParseSuccessNotifyRequest(request: Request, secret: string): Promise<PaymentSuccessNotifyPayload>;
79
96
  interface PaymentGatewayClient {
@@ -129,4 +146,4 @@ interface CapabilityExecuteResponse<Data = unknown> {
129
146
  */
130
147
  declare function executeCapability<Result = unknown>(capabilityName: string, param?: unknown, options?: ExecuteCapabilityOptions): Promise<Result | undefined>;
131
148
 
132
- export { type AuthUser, type CapabilityExecuteResponse, type CreateOrderParams, type CreateOrderResult, type CreatePaymentOrderServerOptions, type ExecuteCapabilityOptions, type GetAvailableProvidersOptions, type GetOrderResult, PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER, type PaymentGatewayClient, type PaymentGatewayClientOptions, type PaymentPlatform, type PaymentSuccessNotifyPayload, buildCreateOrderParams, createPaymentClient, createPaymentOrderForBusiness, executeCapability, filterProvidersByPlatform, getAvailableProviders, getConfiguredProviders, getDb, getPayment, getRequestUser, parseSuccessNotifyPayload, providerSupportedPlatforms, verifyAndParseSuccessNotifyRequest, verifySuccessNotifySignature };
149
+ export { type AuthUser, type CapabilityExecuteResponse, type CreateOrderParams, type CreateOrderResult, type CreatePaymentOrderServerOptions, type ExecuteCapabilityOptions, type GetAvailableProvidersOptions, type GetOrderResult, PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER, type PaymentGatewayClient, type PaymentGatewayClientOptions, type PaymentNotifyHeaderSource, type PaymentPlatform, type PaymentSuccessNotifyPayload, assertCreatePaymentOrderRequest, buildCreateOrderParams, createPaymentClient, createPaymentOrderForBusiness, executeCapability, filterProvidersByPlatform, getAvailableProviders, getConfiguredProviders, getDb, getPayment, getPaymentGatewayNotifySignature, getRequestUser, parseSuccessNotifyPayload, providerSupportedPlatforms, verifyAndParseSuccessNotifyRequest, verifyPaymentNotifySignature, verifySuccessNotifySignature };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { drizzle } from 'drizzle-orm/postgres-js';
2
2
  import { CreatePaymentOrderRequest, ProjectPlatformType, PaymentOrderResult } from '@nvwa-app/sdk-shared';
3
- export { CreatePaymentOrderRequest, PaymentClientContext, PaymentOrderResult, ProjectPlatformType, toPaymentOrderResultFromGateway } from '@nvwa-app/sdk-shared';
3
+ export { CreatePaymentOrderRequest, ParseCreatePaymentOrderRequestResult, PaymentClientContext, PaymentOrderResult, ProjectPlatformType, parseCreatePaymentOrderRequest, toPaymentOrderResultFromGateway } from '@nvwa-app/sdk-shared';
4
4
 
5
5
  declare function getDb(): ReturnType<typeof drizzle>;
6
6
 
@@ -20,6 +20,8 @@ interface AuthUser {
20
20
  */
21
21
  declare function getRequestUser(req: Request, baseUrlOverride?: string): Promise<AuthUser | null>;
22
22
 
23
+ /** 解析失败时抛出 `Error(message)`,便于 `try/catch` 后直接 `buildCreateOrderParams`。 */
24
+ declare function assertCreatePaymentOrderRequest(input: unknown): CreatePaymentOrderRequest;
23
25
  /** 支付端类型:与 integrations/payment 中的 supportedPlatforms 一致,用于按端过滤可用 provider。 */
24
26
  type PaymentPlatform = "web" | "uniapp" | "wechat-miniprogram" | "alipay-miniprogram";
25
27
  interface PaymentGatewayClientOptions {
@@ -62,6 +64,10 @@ interface GetOrderResult {
62
64
  raw: Record<string, unknown>;
63
65
  }
64
66
  declare const PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER = "X-Payment-Gateway-Signature";
67
+ /** 与 `Request.headers` / `Headers` 兼容,仅需 `get(name)`。 */
68
+ type PaymentNotifyHeaderSource = {
69
+ get(name: string): string | null | undefined;
70
+ };
65
71
  interface PaymentSuccessNotifyPayload {
66
72
  platformOrderId: string;
67
73
  bizOrderId: string;
@@ -73,7 +79,18 @@ interface PaymentSuccessNotifyPayload {
73
79
  timestamp: string;
74
80
  paidAt: string;
75
81
  }
82
+ /**
83
+ * 底层验签:对原始 UTF-8 body 做 HMAC-SHA256,与 Base64 签名做常量时间比较。
84
+ * 业务侧优先使用 {@link verifyPaymentNotifySignature}(从请求头取 `X-Payment-Gateway-Signature`)。
85
+ */
76
86
  declare function verifySuccessNotifySignature(rawBody: string, signature: string | null | undefined, secret: string): Promise<boolean>;
87
+ /** 读取 Payment Gateway 回调签名头(去空白;缺失或空串返回 `null`)。 */
88
+ declare function getPaymentGatewayNotifySignature(headers: PaymentNotifyHeaderSource): string | null;
89
+ /**
90
+ * Payment Gateway 成功回调验签:与建单时 `successNotifySecret` 一致;
91
+ * 网关对 **原始 JSON 字符串** 计算 HMAC-SHA256,再以 Base64 写入 `X-Payment-Gateway-Signature`。
92
+ */
93
+ declare function verifyPaymentNotifySignature(rawBody: string, headers: PaymentNotifyHeaderSource, secret: string): Promise<boolean>;
77
94
  declare function parseSuccessNotifyPayload(rawBody: string): PaymentSuccessNotifyPayload;
78
95
  declare function verifyAndParseSuccessNotifyRequest(request: Request, secret: string): Promise<PaymentSuccessNotifyPayload>;
79
96
  interface PaymentGatewayClient {
@@ -129,4 +146,4 @@ interface CapabilityExecuteResponse<Data = unknown> {
129
146
  */
130
147
  declare function executeCapability<Result = unknown>(capabilityName: string, param?: unknown, options?: ExecuteCapabilityOptions): Promise<Result | undefined>;
131
148
 
132
- export { type AuthUser, type CapabilityExecuteResponse, type CreateOrderParams, type CreateOrderResult, type CreatePaymentOrderServerOptions, type ExecuteCapabilityOptions, type GetAvailableProvidersOptions, type GetOrderResult, PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER, type PaymentGatewayClient, type PaymentGatewayClientOptions, type PaymentPlatform, type PaymentSuccessNotifyPayload, buildCreateOrderParams, createPaymentClient, createPaymentOrderForBusiness, executeCapability, filterProvidersByPlatform, getAvailableProviders, getConfiguredProviders, getDb, getPayment, getRequestUser, parseSuccessNotifyPayload, providerSupportedPlatforms, verifyAndParseSuccessNotifyRequest, verifySuccessNotifySignature };
149
+ export { type AuthUser, type CapabilityExecuteResponse, type CreateOrderParams, type CreateOrderResult, type CreatePaymentOrderServerOptions, type ExecuteCapabilityOptions, type GetAvailableProvidersOptions, type GetOrderResult, PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER, type PaymentGatewayClient, type PaymentGatewayClientOptions, type PaymentNotifyHeaderSource, type PaymentPlatform, type PaymentSuccessNotifyPayload, assertCreatePaymentOrderRequest, buildCreateOrderParams, createPaymentClient, createPaymentOrderForBusiness, executeCapability, filterProvidersByPlatform, getAvailableProviders, getConfiguredProviders, getDb, getPayment, getPaymentGatewayNotifySignature, getRequestUser, parseSuccessNotifyPayload, providerSupportedPlatforms, verifyAndParseSuccessNotifyRequest, verifyPaymentNotifySignature, verifySuccessNotifySignature };
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER: () => PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER,
34
+ assertCreatePaymentOrderRequest: () => assertCreatePaymentOrderRequest,
34
35
  buildCreateOrderParams: () => buildCreateOrderParams,
35
36
  createPaymentClient: () => createPaymentClient,
36
37
  createPaymentOrderForBusiness: () => createPaymentOrderForBusiness,
@@ -40,11 +41,14 @@ __export(index_exports, {
40
41
  getConfiguredProviders: () => getConfiguredProviders,
41
42
  getDb: () => getDb,
42
43
  getPayment: () => getPayment,
44
+ getPaymentGatewayNotifySignature: () => getPaymentGatewayNotifySignature,
43
45
  getRequestUser: () => getRequestUser,
46
+ parseCreatePaymentOrderRequest: () => import_sdk_shared2.parseCreatePaymentOrderRequest,
44
47
  parseSuccessNotifyPayload: () => parseSuccessNotifyPayload,
45
48
  providerSupportedPlatforms: () => providerSupportedPlatforms,
46
49
  toPaymentOrderResultFromGateway: () => import_sdk_shared2.toPaymentOrderResultFromGateway,
47
50
  verifyAndParseSuccessNotifyRequest: () => verifyAndParseSuccessNotifyRequest,
51
+ verifyPaymentNotifySignature: () => verifyPaymentNotifySignature,
48
52
  verifySuccessNotifySignature: () => verifySuccessNotifySignature
49
53
  });
50
54
  module.exports = __toCommonJS(index_exports);
@@ -106,6 +110,11 @@ async function getRequestUser(req, baseUrlOverride) {
106
110
  // src/payment.ts
107
111
  var import_sdk_shared = require("@nvwa-app/sdk-shared");
108
112
  var import_sdk_shared2 = require("@nvwa-app/sdk-shared");
113
+ function assertCreatePaymentOrderRequest(input) {
114
+ const r = (0, import_sdk_shared.parseCreatePaymentOrderRequest)(input);
115
+ if (!r.ok) throw new Error(r.error);
116
+ return r.request;
117
+ }
109
118
  var PROVIDER_SUPPORTED_PLATFORMS = {
110
119
  "wechat-pay": ["web", "uniapp", "wechat-miniprogram"],
111
120
  "alipay-web": ["web", "uniapp"],
@@ -155,6 +164,18 @@ async function verifySuccessNotifySignature(rawBody, signature, secret) {
155
164
  const actual = decodeBase64ToBytes(signature);
156
165
  return timingSafeEqualBytes(expected, actual);
157
166
  }
167
+ function getPaymentGatewayNotifySignature(headers) {
168
+ const v = headers.get(PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER);
169
+ const t = typeof v === "string" ? v.trim() : "";
170
+ return t.length > 0 ? t : null;
171
+ }
172
+ async function verifyPaymentNotifySignature(rawBody, headers, secret) {
173
+ return verifySuccessNotifySignature(
174
+ rawBody,
175
+ getPaymentGatewayNotifySignature(headers),
176
+ secret
177
+ );
178
+ }
158
179
  function parseSuccessNotifyPayload(rawBody) {
159
180
  let parsed;
160
181
  try {
@@ -169,8 +190,7 @@ function parseSuccessNotifyPayload(rawBody) {
169
190
  }
170
191
  async function verifyAndParseSuccessNotifyRequest(request, secret) {
171
192
  const rawBody = await request.text();
172
- const signature = request.headers.get(PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER);
173
- const verified = await verifySuccessNotifySignature(rawBody, signature, secret);
193
+ const verified = await verifyPaymentNotifySignature(rawBody, request.headers, secret);
174
194
  if (!verified) {
175
195
  throw new Error("Invalid payment notify signature");
176
196
  }
@@ -409,6 +429,7 @@ ${projectCode}`;
409
429
  // Annotate the CommonJS export names for ESM import in node:
410
430
  0 && (module.exports = {
411
431
  PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER,
432
+ assertCreatePaymentOrderRequest,
412
433
  buildCreateOrderParams,
413
434
  createPaymentClient,
414
435
  createPaymentOrderForBusiness,
@@ -418,10 +439,13 @@ ${projectCode}`;
418
439
  getConfiguredProviders,
419
440
  getDb,
420
441
  getPayment,
442
+ getPaymentGatewayNotifySignature,
421
443
  getRequestUser,
444
+ parseCreatePaymentOrderRequest,
422
445
  parseSuccessNotifyPayload,
423
446
  providerSupportedPlatforms,
424
447
  toPaymentOrderResultFromGateway,
425
448
  verifyAndParseSuccessNotifyRequest,
449
+ verifyPaymentNotifySignature,
426
450
  verifySuccessNotifySignature
427
451
  });
package/dist/index.mjs CHANGED
@@ -53,8 +53,19 @@ async function getRequestUser(req, baseUrlOverride) {
53
53
  }
54
54
 
55
55
  // src/payment.ts
56
- import { toPaymentOrderResultFromGateway } from "@nvwa-app/sdk-shared";
57
- import { toPaymentOrderResultFromGateway as toPaymentOrderResultFromGateway2 } from "@nvwa-app/sdk-shared";
56
+ import {
57
+ parseCreatePaymentOrderRequest,
58
+ toPaymentOrderResultFromGateway
59
+ } from "@nvwa-app/sdk-shared";
60
+ import {
61
+ parseCreatePaymentOrderRequest as parseCreatePaymentOrderRequest2,
62
+ toPaymentOrderResultFromGateway as toPaymentOrderResultFromGateway2
63
+ } from "@nvwa-app/sdk-shared";
64
+ function assertCreatePaymentOrderRequest(input) {
65
+ const r = parseCreatePaymentOrderRequest(input);
66
+ if (!r.ok) throw new Error(r.error);
67
+ return r.request;
68
+ }
58
69
  var PROVIDER_SUPPORTED_PLATFORMS = {
59
70
  "wechat-pay": ["web", "uniapp", "wechat-miniprogram"],
60
71
  "alipay-web": ["web", "uniapp"],
@@ -104,6 +115,18 @@ async function verifySuccessNotifySignature(rawBody, signature, secret) {
104
115
  const actual = decodeBase64ToBytes(signature);
105
116
  return timingSafeEqualBytes(expected, actual);
106
117
  }
118
+ function getPaymentGatewayNotifySignature(headers) {
119
+ const v = headers.get(PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER);
120
+ const t = typeof v === "string" ? v.trim() : "";
121
+ return t.length > 0 ? t : null;
122
+ }
123
+ async function verifyPaymentNotifySignature(rawBody, headers, secret) {
124
+ return verifySuccessNotifySignature(
125
+ rawBody,
126
+ getPaymentGatewayNotifySignature(headers),
127
+ secret
128
+ );
129
+ }
107
130
  function parseSuccessNotifyPayload(rawBody) {
108
131
  let parsed;
109
132
  try {
@@ -118,8 +141,7 @@ function parseSuccessNotifyPayload(rawBody) {
118
141
  }
119
142
  async function verifyAndParseSuccessNotifyRequest(request, secret) {
120
143
  const rawBody = await request.text();
121
- const signature = request.headers.get(PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER);
122
- const verified = await verifySuccessNotifySignature(rawBody, signature, secret);
144
+ const verified = await verifyPaymentNotifySignature(rawBody, request.headers, secret);
123
145
  if (!verified) {
124
146
  throw new Error("Invalid payment notify signature");
125
147
  }
@@ -357,6 +379,7 @@ ${projectCode}`;
357
379
  }
358
380
  export {
359
381
  PAYMENT_SUCCESS_NOTIFY_SIGNATURE_HEADER,
382
+ assertCreatePaymentOrderRequest,
360
383
  buildCreateOrderParams,
361
384
  createPaymentClient,
362
385
  createPaymentOrderForBusiness,
@@ -366,10 +389,13 @@ export {
366
389
  getConfiguredProviders,
367
390
  getDb,
368
391
  getPayment,
392
+ getPaymentGatewayNotifySignature,
369
393
  getRequestUser,
394
+ parseCreatePaymentOrderRequest2 as parseCreatePaymentOrderRequest,
370
395
  parseSuccessNotifyPayload,
371
396
  providerSupportedPlatforms,
372
397
  toPaymentOrderResultFromGateway2 as toPaymentOrderResultFromGateway,
373
398
  verifyAndParseSuccessNotifyRequest,
399
+ verifyPaymentNotifySignature,
374
400
  verifySuccessNotifySignature
375
401
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nvwa-app/sdk-functions",
3
- "version": "6.46.0",
3
+ "version": "6.48.0",
4
4
  "description": "NVWA Edge Functions SDK: db, payment gateway, auth, provider list. Use in Deno: import from 'npm:@nvwa-app/sdk-functions'.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -24,7 +24,7 @@
24
24
  "access": "public"
25
25
  },
26
26
  "dependencies": {
27
- "@nvwa-app/sdk-shared": "^6.46.0",
27
+ "@nvwa-app/sdk-shared": "^6.48.0",
28
28
  "drizzle-orm": "^0.44.7",
29
29
  "postgres": "^3.4.8"
30
30
  },