@vobs/payment 1.2.1 → 1.2.2
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/alipay/client.cjs +31 -8
- package/dist/alipay/client.cjs.map +1 -1
- package/dist/alipay/client.js +6 -5
- package/dist/alipay/client.js.map +1 -1
- package/dist/alipay/config.cjs +27 -5
- package/dist/alipay/config.cjs.map +1 -1
- package/dist/alipay/config.js +3 -3
- package/dist/alipay/config.js.map +1 -1
- package/dist/alipay/index.cjs +56 -177
- package/dist/alipay/index.cjs.map +1 -1
- package/dist/alipay/index.js +17 -162
- package/dist/alipay/index.js.map +1 -1
- package/dist/alipay/notify.cjs +27 -5
- package/dist/alipay/notify.cjs.map +1 -1
- package/dist/alipay/notify.js +3 -3
- package/dist/alipay/notify.js.map +1 -1
- package/dist/alipay/payment.cjs +27 -5
- package/dist/alipay/payment.cjs.map +1 -1
- package/dist/alipay/payment.js +3 -3
- package/dist/alipay/payment.js.map +1 -1
- package/dist/alipay/plugin.cjs +36 -165
- package/dist/alipay/plugin.cjs.map +1 -1
- package/dist/alipay/plugin.js +9 -160
- package/dist/alipay/plugin.js.map +1 -1
- package/dist/alipay/query.cjs +29 -5
- package/dist/alipay/query.cjs.map +1 -1
- package/dist/alipay/query.js +3 -3
- package/dist/alipay/query.js.map +1 -1
- package/dist/alipay/refund.cjs +29 -5
- package/dist/alipay/refund.cjs.map +1 -1
- package/dist/alipay/refund.js +3 -3
- package/dist/alipay/refund.js.map +1 -1
- package/dist/alipay/response.cjs +29 -6
- package/dist/alipay/response.cjs.map +1 -1
- package/dist/alipay/response.js +4 -3
- package/dist/alipay/response.js.map +1 -1
- package/dist/alipay/types.cjs +18 -2
- package/dist/alipay/types.cjs.map +1 -1
- package/dist/alipay/types.js +0 -2
- package/dist/alipay/types.js.map +1 -1
- package/dist/alipay/wap.cjs +27 -5
- package/dist/alipay/wap.cjs.map +1 -1
- package/dist/alipay/wap.js +3 -3
- package/dist/alipay/wap.js.map +1 -1
- package/dist/index.cjs +85 -194
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -167
- package/dist/index.js.map +1 -1
- package/dist/wechat/client.cjs +31 -8
- package/dist/wechat/client.cjs.map +1 -1
- package/dist/wechat/client.js +6 -5
- package/dist/wechat/client.js.map +1 -1
- package/dist/wechat/config.cjs +27 -5
- package/dist/wechat/config.cjs.map +1 -1
- package/dist/wechat/config.js +3 -3
- package/dist/wechat/config.js.map +1 -1
- package/dist/wechat/index.cjs +64 -181
- package/dist/wechat/index.cjs.map +1 -1
- package/dist/wechat/index.js +23 -164
- package/dist/wechat/index.js.map +1 -1
- package/dist/wechat/notify.cjs +33 -10
- package/dist/wechat/notify.cjs.map +1 -1
- package/dist/wechat/notify.js +6 -5
- package/dist/wechat/notify.js.map +1 -1
- package/dist/wechat/payment.cjs +33 -10
- package/dist/wechat/payment.cjs.map +1 -1
- package/dist/wechat/payment.js +6 -5
- package/dist/wechat/payment.js.map +1 -1
- package/dist/wechat/plugin.cjs +36 -165
- package/dist/wechat/plugin.cjs.map +1 -1
- package/dist/wechat/plugin.js +9 -160
- package/dist/wechat/plugin.js.map +1 -1
- package/dist/wechat/refund.cjs +29 -5
- package/dist/wechat/refund.cjs.map +1 -1
- package/dist/wechat/refund.js +3 -3
- package/dist/wechat/refund.js.map +1 -1
- package/dist/wechat/response.cjs +31 -7
- package/dist/wechat/response.cjs.map +1 -1
- package/dist/wechat/response.js +5 -3
- package/dist/wechat/response.js.map +1 -1
- package/dist/wechat/types.cjs +18 -2
- package/dist/wechat/types.cjs.map +1 -1
- package/dist/wechat/types.js +0 -2
- package/dist/wechat/types.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { AlipaySdk } from 'alipay-sdk';
|
|
2
|
-
import { Wechatpay, Formatter, Rsa, Aes } from 'wechatpay-axios-plugin';
|
|
3
|
-
|
|
4
1
|
var __defProp = Object.defineProperty;
|
|
5
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
3
|
var __export = (target, all) => {
|
|
@@ -24,6 +21,9 @@ __export(alipay_exports, {
|
|
|
24
21
|
useAlipay: () => useAlipay
|
|
25
22
|
});
|
|
26
23
|
|
|
24
|
+
// packages/payment/src/alipay/client.ts
|
|
25
|
+
import { AlipaySdk } from "alipay-sdk";
|
|
26
|
+
|
|
27
27
|
// packages/payment/src/alipay/config.ts
|
|
28
28
|
var _AlipayConfig = class _AlipayConfig {
|
|
29
29
|
constructor(options) {
|
|
@@ -410,164 +410,8 @@ function createNotifyHandler(client) {
|
|
|
410
410
|
}
|
|
411
411
|
__name(createNotifyHandler, "createNotifyHandler");
|
|
412
412
|
|
|
413
|
-
// packages/reactivity/src/debug.ts
|
|
414
|
-
var activeDebugHooks = null;
|
|
415
|
-
function hasDebugHooks() {
|
|
416
|
-
return activeDebugHooks !== null;
|
|
417
|
-
}
|
|
418
|
-
__name(hasDebugHooks, "hasDebugHooks");
|
|
419
|
-
function invokeDebug(name, ...args) {
|
|
420
|
-
return;
|
|
421
|
-
}
|
|
422
|
-
__name(invokeDebug, "invokeDebug");
|
|
423
|
-
|
|
424
|
-
// packages/reactivity/src/owner.ts
|
|
425
|
-
var currentOwner = null;
|
|
426
|
-
function getCurrentOwner() {
|
|
427
|
-
return currentOwner;
|
|
428
|
-
}
|
|
429
|
-
__name(getCurrentOwner, "getCurrentOwner");
|
|
430
|
-
|
|
431
|
-
// packages/reactivity/src/scheduler.ts
|
|
432
|
-
var _Scheduler = class _Scheduler {
|
|
433
|
-
constructor() {
|
|
434
|
-
this.dirtyEffects = /* @__PURE__ */ new Set();
|
|
435
|
-
this.lowPriorityEffects = /* @__PURE__ */ new Set();
|
|
436
|
-
// flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
|
|
437
|
-
this.normalBuffer = [];
|
|
438
|
-
this.lowBuffer = [];
|
|
439
|
-
this.flushing = false;
|
|
440
|
-
this.scheduled = false;
|
|
441
|
-
this.batchDepth = 0;
|
|
442
|
-
}
|
|
443
|
-
schedule(effect2) {
|
|
444
|
-
if (effect2.disposed) return;
|
|
445
|
-
this.dirtyEffects.add(effect2);
|
|
446
|
-
this.lowPriorityEffects.delete(effect2);
|
|
447
|
-
this.ensureScheduled();
|
|
448
|
-
}
|
|
449
|
-
/** Queue an effect behind normal updates while preserving deterministic order. */
|
|
450
|
-
scheduleLow(effect2) {
|
|
451
|
-
if (effect2.disposed) return;
|
|
452
|
-
if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
|
|
453
|
-
this.ensureScheduled();
|
|
454
|
-
}
|
|
455
|
-
ensureScheduled() {
|
|
456
|
-
if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
|
|
457
|
-
this.scheduled = true;
|
|
458
|
-
queueMicrotask(() => {
|
|
459
|
-
this.scheduled = false;
|
|
460
|
-
this.flush();
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
remove(effect2) {
|
|
465
|
-
this.dirtyEffects.delete(effect2);
|
|
466
|
-
this.lowPriorityEffects.delete(effect2);
|
|
467
|
-
}
|
|
468
|
-
batch(fn) {
|
|
469
|
-
this.batchDepth++;
|
|
470
|
-
try {
|
|
471
|
-
return fn();
|
|
472
|
-
} finally {
|
|
473
|
-
this.batchDepth--;
|
|
474
|
-
if (this.batchDepth === 0) this.flush();
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
flush() {
|
|
478
|
-
if (this.flushing || this.batchDepth > 0) return;
|
|
479
|
-
this.flushing = true;
|
|
480
|
-
let rounds = 0;
|
|
481
|
-
let firstError;
|
|
482
|
-
let hasError = false;
|
|
483
|
-
try {
|
|
484
|
-
while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
|
|
485
|
-
if (++rounds > 100) {
|
|
486
|
-
this.dirtyEffects.clear();
|
|
487
|
-
this.lowPriorityEffects.clear();
|
|
488
|
-
throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
|
|
489
|
-
}
|
|
490
|
-
this.collectRunnable(this.dirtyEffects, this.normalBuffer);
|
|
491
|
-
this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
|
|
492
|
-
sortEffects(this.normalBuffer);
|
|
493
|
-
sortEffects(this.lowBuffer);
|
|
494
|
-
for (const effect2 of this.normalBuffer) {
|
|
495
|
-
try {
|
|
496
|
-
effect2.run();
|
|
497
|
-
} catch (error) {
|
|
498
|
-
if (!hasError) {
|
|
499
|
-
firstError = error;
|
|
500
|
-
hasError = true;
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
for (const effect2 of this.lowBuffer) {
|
|
505
|
-
try {
|
|
506
|
-
effect2.run();
|
|
507
|
-
} catch (error) {
|
|
508
|
-
if (!hasError) {
|
|
509
|
-
firstError = error;
|
|
510
|
-
hasError = true;
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
this.normalBuffer.length = 0;
|
|
515
|
-
this.lowBuffer.length = 0;
|
|
516
|
-
}
|
|
517
|
-
} finally {
|
|
518
|
-
this.normalBuffer.length = 0;
|
|
519
|
-
this.lowBuffer.length = 0;
|
|
520
|
-
this.flushing = false;
|
|
521
|
-
}
|
|
522
|
-
if (hasError) throw firstError;
|
|
523
|
-
}
|
|
524
|
-
/** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
|
|
525
|
-
collectRunnable(source, target) {
|
|
526
|
-
for (const effect2 of source) {
|
|
527
|
-
if (!effect2.disposed) target.push(effect2);
|
|
528
|
-
}
|
|
529
|
-
source.clear();
|
|
530
|
-
}
|
|
531
|
-
};
|
|
532
|
-
__name(_Scheduler, "Scheduler");
|
|
533
|
-
function sortEffects(effects) {
|
|
534
|
-
if (effects.length > 1) {
|
|
535
|
-
effects.sort((a, b) => b.depth - a.depth || a.order - b.order);
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
__name(sortEffects, "sortEffects");
|
|
539
|
-
|
|
540
|
-
// packages/runtime/src/hmr.ts
|
|
541
|
-
var globalTarget = globalThis;
|
|
542
|
-
var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
|
|
543
|
-
globalTarget.__VOBS_HMR__ = hmrGlobal;
|
|
544
|
-
|
|
545
|
-
// packages/vobs/src/context.ts
|
|
546
|
-
var ownerProviders = /* @__PURE__ */ new WeakMap();
|
|
547
|
-
function inject(key, fallback) {
|
|
548
|
-
const owner = getCurrentOwner();
|
|
549
|
-
const value = owner ? injectFromOwner(owner, key) : void 0;
|
|
550
|
-
return value === void 0 ? fallback : value;
|
|
551
|
-
}
|
|
552
|
-
__name(inject, "inject");
|
|
553
|
-
function injectFromOwner(owner, key) {
|
|
554
|
-
let current = owner;
|
|
555
|
-
while (current) {
|
|
556
|
-
const providers = ownerProviders.get(current);
|
|
557
|
-
if (providers?.has(key)) return providers.get(key);
|
|
558
|
-
current = current.parent;
|
|
559
|
-
}
|
|
560
|
-
return void 0;
|
|
561
|
-
}
|
|
562
|
-
__name(injectFromOwner, "injectFromOwner");
|
|
563
|
-
|
|
564
|
-
// packages/vobs/src/app.ts
|
|
565
|
-
function createInjectionKey(description) {
|
|
566
|
-
return Symbol(description);
|
|
567
|
-
}
|
|
568
|
-
__name(createInjectionKey, "createInjectionKey");
|
|
569
|
-
|
|
570
413
|
// packages/payment/src/alipay/plugin.ts
|
|
414
|
+
import { createInjectionKey, inject } from "@vobs/vobs";
|
|
571
415
|
var ALIPAY_KEY = createInjectionKey("vobs.payment.alipay");
|
|
572
416
|
function alipayPlugin(options) {
|
|
573
417
|
return {
|
|
@@ -610,6 +454,9 @@ __export(wechat_exports, {
|
|
|
610
454
|
wechatPlugin: () => wechatPlugin
|
|
611
455
|
});
|
|
612
456
|
|
|
457
|
+
// packages/payment/src/wechat/client.ts
|
|
458
|
+
import { Wechatpay } from "wechatpay-axios-plugin";
|
|
459
|
+
|
|
613
460
|
// packages/payment/src/wechat/config.ts
|
|
614
461
|
var _WechatConfig = class _WechatConfig {
|
|
615
462
|
constructor(options) {
|
|
@@ -758,6 +605,9 @@ async function unwrapV3(promise) {
|
|
|
758
605
|
}
|
|
759
606
|
}
|
|
760
607
|
__name(unwrapV3, "unwrapV3");
|
|
608
|
+
|
|
609
|
+
// packages/payment/src/wechat/payment.ts
|
|
610
|
+
import { Formatter, Rsa } from "wechatpay-axios-plugin";
|
|
761
611
|
function createPayment(client) {
|
|
762
612
|
return {
|
|
763
613
|
/**
|
|
@@ -892,6 +742,9 @@ function mapTransaction(data) {
|
|
|
892
742
|
};
|
|
893
743
|
}
|
|
894
744
|
__name(mapTransaction, "mapTransaction");
|
|
745
|
+
|
|
746
|
+
// packages/payment/src/wechat/notify.ts
|
|
747
|
+
import { Aes, Formatter as Formatter2, Rsa as Rsa2 } from "wechatpay-axios-plugin";
|
|
895
748
|
function createNotifyHandler2(client) {
|
|
896
749
|
return {
|
|
897
750
|
/**
|
|
@@ -906,8 +759,8 @@ function createNotifyHandler2(client) {
|
|
|
906
759
|
return false;
|
|
907
760
|
}
|
|
908
761
|
try {
|
|
909
|
-
const message =
|
|
910
|
-
return
|
|
762
|
+
const message = Formatter2.response(headers.timestamp, headers.nonce, body);
|
|
763
|
+
return Rsa2.verify(message, headers.signature, publicKey);
|
|
911
764
|
} catch {
|
|
912
765
|
return false;
|
|
913
766
|
}
|
|
@@ -1021,9 +874,10 @@ function mapRefund(data) {
|
|
|
1021
874
|
__name(mapRefund, "mapRefund");
|
|
1022
875
|
|
|
1023
876
|
// packages/payment/src/wechat/plugin.ts
|
|
1024
|
-
|
|
877
|
+
import { createInjectionKey as createInjectionKey2, inject as inject2 } from "@vobs/vobs";
|
|
878
|
+
var WECHAT_KEY = createInjectionKey2("vobs.payment.wechat");
|
|
1025
879
|
function useWechat() {
|
|
1026
|
-
const client =
|
|
880
|
+
const client = inject2(WECHAT_KEY);
|
|
1027
881
|
if (!client) {
|
|
1028
882
|
throw new Error("Vobs Payment: \u627E\u4E0D\u5230 WechatClient\uFF0C\u8BF7\u5B89\u88C5 wechatPlugin");
|
|
1029
883
|
}
|
|
@@ -1046,7 +900,24 @@ function wechatPlugin(options) {
|
|
|
1046
900
|
};
|
|
1047
901
|
}
|
|
1048
902
|
__name(wechatPlugin, "wechatPlugin");
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
903
|
+
export {
|
|
904
|
+
ALIPAY_KEY,
|
|
905
|
+
AlipayApiError,
|
|
906
|
+
AlipayClient,
|
|
907
|
+
AlipayConfig,
|
|
908
|
+
WECHAT_KEY,
|
|
909
|
+
WechatApiError,
|
|
910
|
+
WechatClient,
|
|
911
|
+
WechatConfig,
|
|
912
|
+
alipay_exports as alipay,
|
|
913
|
+
alipayPlugin,
|
|
914
|
+
createPagePay,
|
|
915
|
+
createPayment,
|
|
916
|
+
createQuery,
|
|
917
|
+
createWapPay,
|
|
918
|
+
useAlipay,
|
|
919
|
+
useWechat,
|
|
920
|
+
wechat_exports as wechat,
|
|
921
|
+
wechatPlugin
|
|
922
|
+
};
|
|
1052
923
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/alipay/index.ts","../src/alipay/config.ts","../src/alipay/client.ts","../src/alipay/response.ts","../src/alipay/payment.ts","../src/alipay/wap.ts","../src/alipay/query.ts","../src/alipay/refund.ts","../src/alipay/notify.ts","../../reactivity/src/debug.ts","../../reactivity/src/owner.ts","../../reactivity/src/scheduler.ts","../../runtime/src/hmr.ts","../../vobs/src/context.ts","../../vobs/src/app.ts","../src/alipay/plugin.ts","../src/wechat/index.ts","../src/wechat/config.ts","../src/wechat/client.ts","../src/wechat/response.ts","../src/wechat/payment.ts","../src/wechat/notify.ts","../src/wechat/refund.ts","../src/wechat/plugin.ts"],"names":["sanitizeParams","effect","createNotifyHandler","createRefund","Formatter","Rsa"],"mappings":"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","file":"index.js","sourcesContent":["export { AlipayClient } from './client'\nexport { AlipayConfig } from './config'\nexport { AlipayApiError } from './response'\nexport { createPagePay } from './payment'\nexport { createWapPay } from './wap'\nexport { createQuery } from './query'\nexport { createRefund } from './refund'\nexport { createNotifyHandler } from './notify'\nexport { alipayPlugin, useAlipay, ALIPAY_KEY } from './plugin'\nexport type { AlipayPluginOptions } from './plugin'\nexport type {\n AlipayClientOptions,\n AlipayKeyType,\n AlipaySdkConfig,\n AlipaySdkSignType,\n AlipayPagePayConfig,\n AlipayPagePayParams,\n AlipayPagePayResult,\n AlipayWapPayConfig,\n AlipayWapPayParams,\n AlipayWapPayResult,\n AlipayQueryParams,\n AlipayQueryResult,\n AlipayRefundParams,\n AlipayRefundResult,\n AlipayRefundQueryParams,\n AlipayRefundQueryResult,\n AlipayCloseParams,\n AlipayCloseResult,\n AlipayNotifyParams,\n TradeStatus\n} from './types'\n","import type { AlipayClientOptions } from './types'\n\n/**\n * 支付宝配置管理\n * 遵循 vobs 生命周期管理:可创建、可销毁、可替换\n */\nexport class AlipayConfig {\n private _options: AlipayClientOptions\n\n constructor(options: AlipayClientOptions) {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 获取完整配置 */\n get options(): Readonly<AlipayClientOptions> {\n return this._options\n }\n\n /** 应用 ID */\n get appId(): string {\n return this._options.appId\n }\n\n /** 网关地址 */\n get gateway(): string {\n return this._options.gateway ?? 'https://openapi.alipay.com/gateway.do'\n }\n\n /** 异步通知地址 */\n get notifyUrl(): string | undefined {\n return this._options.notifyUrl\n }\n\n /** 同步跳转地址 */\n get returnUrl(): string | undefined {\n return this._options.returnUrl\n }\n\n /** 更新配置(部分更新) */\n update(patch: Partial<AlipayClientOptions>): void {\n const merged = { ...this._options, ...patch }\n this.validate(merged)\n this._options = merged\n }\n\n /** 替换配置 */\n replace(options: AlipayClientOptions): void {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 创建沙箱配置的快捷方法 */\n static forSandbox(options: Omit<AlipayClientOptions, 'gateway'>): AlipayConfig {\n return new AlipayConfig({\n ...options,\n gateway: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do'\n })\n }\n\n private validate(options: AlipayClientOptions): void {\n if (!options.appId) {\n throw new Error('AlipayConfig: appId 不能为空')\n }\n if (!options.privateKey) {\n throw new Error('AlipayConfig: privateKey 不能为空')\n }\n if (!options.alipayPublicKey) {\n throw new Error('AlipayConfig: alipayPublicKey 不能为空')\n }\n }\n}","import { AlipaySdk } from 'alipay-sdk'\nimport { AlipayConfig } from './config'\nimport type { AlipayClientOptions, AlipayKeyType } from './types'\n\n/**\n * 支付宝客户端封装\n *\n * 封装 alipay-sdk 的 AlipaySdk 实例,提供统一的生命周期管理。\n * 可独立使用,也可通过 alipayPlugin 注册到 vobs 框架。\n *\n * @example\n * ```ts\n * const client = new AlipayClient({\n * appId: '202100...',\n * privateKey: '...',\n * alipayPublicKey: '...',\n * gateway: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do'\n * })\n * ```\n */\nexport class AlipayClient {\n readonly config: AlipayConfig\n private _sdk: AlipaySdk\n private _disposed = false\n\n constructor(options: AlipayClientOptions) {\n this.config = new AlipayConfig(options)\n this._sdk = this.createSdk(options)\n }\n\n /** 获取底层 AlipaySdk 实例 */\n get sdk(): AlipaySdk {\n this.ensureActive()\n return this._sdk\n }\n\n /** 更新配置并重建 SDK 实例 */\n updateConfig(patch: Partial<AlipayClientOptions>): void {\n this.ensureActive()\n this.config.update(patch)\n this._sdk = this.createSdk(this.config.options as AlipayClientOptions)\n }\n\n /** 销毁客户端 */\n dispose(): void {\n this._disposed = true\n ;(this._sdk as any) = null\n }\n\n private createSdk(options: AlipayClientOptions): AlipaySdk {\n return new AlipaySdk({\n appId: options.appId,\n privateKey: options.privateKey,\n alipayPublicKey: options.alipayPublicKey,\n signType: options.signType ?? 'RSA2',\n gateway: options.gateway,\n timeout: options.timeout ?? 5000,\n keyType: (options.keyType ?? 'PKCS1') as AlipayKeyType\n })\n }\n\n private ensureActive(): void {\n if (this._disposed) {\n throw new Error('AlipayClient: 客户端已销毁')\n }\n }\n}","/**\n * 支付宝开放接口响应解包与业务错误检查。\n *\n * 网关应答(HTTP 200)不代表业务成功:业务失败时响应体内\n * code != '10000' 并携带 sub_code/sub_msg,必须显式检查,\n * 否则会把失败结果当成功映射(字段全部 undefined)。\n */\nexport class AlipayApiError extends Error {\n readonly code: string\n readonly subCode?: string\n readonly subMsg?: string\n\n constructor(apiName: string, code: string, subCode: string | undefined, subMsg: string | undefined, msg: string | undefined) {\n super(`支付宝接口 ${apiName} 调用失败: ${subMsg ?? msg ?? '未知错误'} (code=${code}${subCode ? `, sub_code=${subCode}` : ''})`)\n this.name = 'AlipayApiError'\n this.code = code\n this.subCode = subCode\n this.subMsg = subMsg\n }\n}\n\n/** alipay.trade.page.pay -> alipay_trade_page_pay_response */\nfunction toResponseKey(apiName: string): string {\n return `${apiName.replace(/\\./g, '_')}_response`\n}\n\n/**\n * 从网关应答中取出业务响应体,code !== '10000' 时抛出 AlipayApiError。\n */\nexport function unwrapResponse(raw: unknown, apiName: string): Record<string, any> {\n const outer = raw as Record<string, any> | null | undefined\n const body = (outer && outer[toResponseKey(apiName)]) ?? outer\n if (!body || typeof body !== 'object') {\n throw new AlipayApiError(apiName, 'INVALID_RESPONSE', undefined, undefined, '响应体格式异常')\n }\n if (body.code !== '10000') {\n throw new AlipayApiError(apiName, body.code, body.sub_code, body.sub_msg, body.msg)\n }\n return body\n}\n","import type { AlipayClient } from './client'\nimport type {\n AlipayPagePayConfig,\n AlipayPagePayParams,\n AlipayPagePayResult\n} from './types'\n\n/**\n * 电脑网站支付 (alipay.trade.page.pay)\n *\n * 生成支付宝支付表单 HTML,前端渲染后自动提交表单跳转至支付宝收银台。\n *\n * ⚠️ 必须使用 pageExecute() 方法,禁止使用 exec()。\n * ⚠️ 返回值为 HTML 表单字符串,不是 URL,前端必须渲染 form 并自动提交。\n * ⚠️ 支付结果以异步通知或查询接口为准,不可依赖同步跳转。\n */\nexport function createPagePay(client: AlipayClient) {\n return {\n /**\n * 发起电脑网站支付\n * @param config 支付配置\n * @returns 支付表单 HTML\n */\n async pay(config: AlipayPagePayConfig): Promise<AlipayPagePayResult> {\n const { outTradeNo, totalAmount, subject, body, passbackParams } = config\n\n const bizParams: AlipayPagePayParams = {\n outTradeNo,\n totalAmount,\n subject,\n productCode: 'FAST_INSTANT_TRADE_PAY',\n body,\n passbackParams,\n returnUrl: client.config.returnUrl,\n notifyUrl: client.config.notifyUrl\n }\n\n // 使用 pageExecute() 生成 POST 表单 HTML\n // 注意:必须使用 pageExecute,不能使用 exec()\n const formHtml = client.sdk.pageExecute(\n 'alipay.trade.page.pay',\n 'POST',\n { bizContent: sanitizeParams(bizParams) }\n )\n\n return { formHtml }\n }\n }\n}\n\n/** 移除 undefined 字段 */\nfunction sanitizeParams<T extends Record<string, any>>(params: T): Record<string, any> {\n const result: Record<string, any> = {}\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n result[key] = value\n }\n }\n return result\n}","import type { AlipayClient } from './client'\nimport type { AlipayWapPayConfig, AlipayWapPayParams, AlipayWapPayResult } from './types'\n\n/**\n * 手机网站支付 (alipay.trade.wap.pay)\n *\n * 移动端浏览器内拉起支付宝收银台,生成表单 HTML 由前端提交跳转。\n *\n * ⚠️ 必须使用 pageExecute() 方法,禁止使用 exec()。\n * ⚠️ 返回值为 HTML 表单字符串,前端必须渲染 form 并自动提交。\n * ⚠️ 支付结果以异步通知或查询接口为准,不可依赖同步跳转。\n */\nexport function createWapPay(client: AlipayClient) {\n return {\n /**\n * 发起手机网站支付\n * @param config 支付配置\n * @returns 支付表单 HTML\n */\n async pay(config: AlipayWapPayConfig): Promise<AlipayWapPayResult> {\n const { outTradeNo, totalAmount, subject, body, passbackParams, quitUrl } = config\n\n const bizParams: AlipayWapPayParams = {\n outTradeNo,\n totalAmount,\n subject,\n productCode: 'QUICK_WAP_WAY',\n body,\n passbackParams,\n quitUrl,\n returnUrl: client.config.returnUrl,\n notifyUrl: client.config.notifyUrl\n }\n\n const formHtml = client.sdk.pageExecute(\n 'alipay.trade.wap.pay',\n 'POST',\n { bizContent: sanitizeParams(bizParams) }\n )\n\n return { formHtml }\n }\n }\n}\n\n/** 移除 undefined 字段 */\nfunction sanitizeParams<T extends Record<string, any>>(params: T): Record<string, any> {\n const result: Record<string, any> = {}\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n result[key] = value\n }\n }\n return result\n}\n","import type { AlipayClient } from './client'\nimport { unwrapResponse } from './response'\nimport type { AlipayQueryParams, AlipayQueryResult, TradeStatus } from './types'\n\n/**\n * 交易查询 (alipay.trade.query)\n *\n * 查询支付宝交易状态,用于确认支付结果。\n * 当异步通知未收到时,应主动调用此接口兜底。\n */\nexport function createQuery(client: AlipayClient) {\n return {\n /**\n * 查询交易状态\n * @param params 查询参数(outTradeNo 和 tradeNo 至少传一个)\n * @throws {AlipayApiError} 业务失败(如 ACQ.TRADE_NOT_EXIST)时抛出\n */\n async query(params: AlipayQueryParams): Promise<AlipayQueryResult> {\n const alipayResponse = unwrapResponse(\n await client.sdk.exec('alipay.trade.query', {\n bizContent: params\n }),\n 'alipay.trade.query'\n )\n\n return {\n tradeNo: alipayResponse.trade_no,\n outTradeNo: alipayResponse.out_trade_no,\n buyerLogonId: alipayResponse.buyer_logon_id,\n tradeStatus: alipayResponse.trade_status as TradeStatus,\n totalAmount: alipayResponse.total_amount,\n receiptAmount: alipayResponse.receipt_amount ?? '0.00',\n buyerPayAmount: alipayResponse.buyer_pay_amount ?? '0.00',\n sendPayDate: alipayResponse.send_pay_date ?? '',\n gmtPayment: alipayResponse.gmt_payment ?? null,\n gmtClose: alipayResponse.gmt_close ?? null,\n refundAmount: alipayResponse.refund_amount ?? '0.00',\n subject: alipayResponse.subject ?? '',\n passbackParams: alipayResponse.passback_params ?? null,\n fundChannel: alipayResponse.fund_channel ?? null\n }\n },\n\n /**\n * 判断交易是否支付成功\n * 只有 TRADE_SUCCESS 或 TRADE_FINISHED 才表示支付成功\n */\n isSuccessful(status: TradeStatus): boolean {\n return status === 'TRADE_SUCCESS' || status === 'TRADE_FINISHED'\n }\n }\n}","import type { AlipayClient } from './client'\nimport { unwrapResponse } from './response'\nimport type {\n AlipayRefundParams,\n AlipayRefundResult,\n AlipayRefundQueryParams,\n AlipayRefundQueryResult,\n AlipayCloseParams,\n AlipayCloseResult\n} from './types'\n\n/**\n * 退款与交易关闭\n *\n * 包含退款、退款查询、交易关闭的完整退款生命周期管理。\n */\nexport function createRefund(client: AlipayClient) {\n return {\n /**\n * 交易退款 (alipay.trade.refund)\n * 交易发生后 12 个月内可退款,退款资金原路返回。\n * @throws {AlipayApiError} 业务失败时抛出\n */\n async refund(params: AlipayRefundParams): Promise<AlipayRefundResult> {\n const alipayResponse = unwrapResponse(\n await client.sdk.exec('alipay.trade.refund', {\n bizContent: params\n }),\n 'alipay.trade.refund'\n )\n\n return {\n tradeNo: alipayResponse.trade_no,\n outTradeNo: alipayResponse.out_trade_no,\n buyerLogonId: alipayResponse.buyer_logon_id,\n refundAmount: alipayResponse.refund_fee,\n fundChange: alipayResponse.fund_change ?? 'N',\n gmtRefundPay: alipayResponse.gmt_refund_pay ?? '',\n refundDetailItemList: alipayResponse.refund_detail_item_list ?? null\n }\n },\n\n /**\n * 退款查询 (alipay.trade.fastpay.refund.query)\n * 查询退款状态,确认退款是否成功。\n * @throws {AlipayApiError} 业务失败时抛出\n */\n async queryRefund(params: AlipayRefundQueryParams): Promise<AlipayRefundQueryResult> {\n const alipayResponse = unwrapResponse(\n await client.sdk.exec('alipay.trade.fastpay.refund.query', {\n bizContent: params\n }),\n 'alipay.trade.fastpay.refund.query'\n )\n\n return {\n tradeNo: alipayResponse.trade_no,\n outTradeNo: alipayResponse.out_trade_no,\n refundAmount: alipayResponse.refund_amount,\n refundStatus: alipayResponse.refund_status,\n outRequestNo: alipayResponse.out_request_no,\n refundReason: alipayResponse.refund_reason ?? ''\n }\n },\n\n /**\n * 关闭交易 (alipay.trade.close)\n * 关闭未支付的订单。\n * @throws {AlipayApiError} 业务失败时抛出\n */\n async close(params: AlipayCloseParams): Promise<AlipayCloseResult> {\n const alipayResponse = unwrapResponse(\n await client.sdk.exec('alipay.trade.close', {\n bizContent: params\n }),\n 'alipay.trade.close'\n )\n\n return {\n tradeNo: alipayResponse.trade_no,\n outTradeNo: alipayResponse.out_trade_no\n }\n }\n }\n}","import type { AlipayClient } from './client'\nimport type { AlipayNotifyParams, TradeStatus } from './types'\n\n/**\n * 异步通知处理\n *\n * 支付宝在交易状态变更时,通过 POST 请求 notify_url 发送异步通知。\n * 处理要点:\n * 1. 收到通知后必须先验签\n * 2. 验签后校验关键业务字段(app_id、out_trade_no、total_amount)\n * 3. 处理成功后返回字符串 \"success\"(仅此 7 个字符)\n * 4. 需做幂等处理,过滤重复通知\n */\nexport function createNotifyHandler(client: AlipayClient) {\n return {\n /**\n * 验签异步通知\n * @param params 异步通知参数(支付宝 POST 过来的原始参数)\n * @param raw 使用原始报文验签(推荐:v4.15+ 支持,规避 encodeURIComponent 差异导致的验签失败)\n * @returns 验签是否通过\n */\n verify(params: Record<string, any>, raw = false): boolean {\n try {\n return client.sdk.checkNotifySign(params, raw)\n } catch {\n return false\n }\n },\n\n /**\n * 校验异步通知的业务字段\n *\n * 验签只保证通知确实来自支付宝,不保证通知与你系统中的订单一致;\n * 因此除了 app_id,还应传入商户侧的期望值(outTradeNo / totalAmount)进行比对。\n * @param params 异步通知参数\n * @param expected 商户侧期望值:outTradeNo 订单号、totalAmount 订单金额(单位元)\n */\n validate(\n params: AlipayNotifyParams,\n expected?: { outTradeNo?: string; totalAmount?: string }\n ): NotifyValidationResult {\n const errors: string[] = []\n\n // 校验 app_id\n if (params.appId !== client.config.appId) {\n errors.push(`app_id 不匹配: 期望 ${client.config.appId},收到 ${params.appId}`)\n }\n\n // 校验 out_trade_no 与商户订单一致\n if (expected?.outTradeNo && params.outTradeNo !== expected.outTradeNo) {\n errors.push(`out_trade_no 不匹配: 期望 ${expected.outTradeNo},收到 ${params.outTradeNo}`)\n }\n\n // 校验 total_amount 与订单金额一致(金额为两位小数的服务端字符串,按数值比较)\n if (expected?.totalAmount && Number(params.totalAmount) !== Number(expected.totalAmount)) {\n errors.push(`total_amount 不匹配: 期望 ${expected.totalAmount},收到 ${params.totalAmount}`)\n }\n\n // 校验 trade_status\n const validStatuses: TradeStatus[] = ['TRADE_SUCCESS', 'TRADE_FINISHED']\n if (!validStatuses.includes(params.tradeStatus as TradeStatus)) {\n errors.push(`trade_status 非终态: ${params.tradeStatus}`)\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n },\n\n /**\n * 生成支付宝异步通知的成功响应\n * 处理完成后必须返回字符串 \"success\"\n */\n successResponse(): string {\n return 'success'\n },\n\n /**\n * 生成支付宝异步通知的失败响应\n * 返回空字符串或非 success 内容,支付宝会重试通知\n */\n failResponse(): string {\n return 'fail'\n }\n }\n}\n\nexport interface NotifyValidationResult {\n valid: boolean\n errors: string[]\n}","import type { Effect } from './effect'\nimport type { Owner } from './owner'\nimport type { Dependency, ReadableSignal, Subscriber } from './signal'\n\nexport interface ReactivityDebugHooks {\n ownerCreated?(owner: Owner): void\n ownerNamed?(owner: Owner, name: string): void\n ownerDisposed?(owner: Owner): void\n signalCreated?(signal: ReadableSignal<unknown>, owner: Owner | null): void\n signalNamed?(signal: ReadableSignal<unknown>, name: string): void\n signalRead?(signal: ReadableSignal<unknown>, subscriber: Subscriber): void\n signalChanged?(signal: ReadableSignal<unknown>, previousValue: unknown, nextValue: unknown): void\n signalDisposed?(signal: ReadableSignal<unknown>): void\n dependencyTracked?(dependency: Dependency, subscriber: Subscriber): void\n dependencyUntracked?(dependency: Dependency, subscriber: Subscriber): void\n effectCreated?(effect: Effect, owner: Owner | null): void\n effectInvalidated?(effect: Effect): void\n effectRunStart?(effect: Effect): void\n effectRunEnd?(effect: Effect, error?: unknown, handled?: boolean): void\n effectDisposed?(effect: Effect): void\n memoCreated?(signal: ReadableSignal<unknown>, subscriber: Subscriber, owner: Owner | null): void\n memoInvalidated?(signal: ReadableSignal<unknown>): void\n flushStart?(): void\n flushEnd?(): void\n}\n\nlet activeDebugHooks: ReactivityDebugHooks | null = null\nconst signalNames = new WeakMap<object, string>()\n\nexport function setDebugHooks(hooks: ReactivityDebugHooks | null): ReactivityDebugHooks | null {\n const previous = activeDebugHooks\n activeDebugHooks = hooks\n return previous\n}\n\nexport function getDebugHooks(): ReactivityDebugHooks | null {\n return activeDebugHooks\n}\n\n/** 热路径守卫:无 hooks 时跳过 invokeDebug 调用,避免 rest 参数数组分配。 */\nexport function hasDebugHooks(): boolean {\n return activeDebugHooks !== null\n}\n\nexport function setSignalDebugName(signal: ReadableSignal<unknown>, name: string): void {\n signalNames.set(signal, name)\n invokeDebug('signalNamed', signal, name)\n}\n\nexport function getSignalDebugName(signal: ReadableSignal<unknown>): string | undefined {\n return signalNames.get(signal)\n}\n\nexport function invokeDebug<K extends keyof ReactivityDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<ReactivityDebugHooks[K]>>\n): void {\n const callback = activeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change application behavior.\n }\n}\n","import { invokeDebug, hasDebugHooks } from './debug'\n\nexport interface Owner {\n readonly id: string\n readonly parent: Owner | null\n readonly children: readonly Owner[]\n readonly depth: number\n readonly disposed: boolean\n run<T>(fn: () => T): T\n addCleanup(cleanup: () => void): void\n onDispose(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n handleError(error: unknown): boolean\n dispose(): void\n}\n\nlet currentOwner: Owner | null = null\nlet nextOwnerId = 1\nconst ownerNames = new WeakMap<Owner, string>()\n\nexport function createOwner(): Owner {\n const parent = currentOwner\n let disposed = parent?.disposed ?? false\n const children: Owner[] = []\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n\n const owner: Owner = {\n id: `owner-${nextOwnerId++}`,\n parent,\n children,\n depth: (parent?.depth ?? -1) + 1,\n\n get disposed(): boolean {\n return disposed\n },\n\n run<T>(fn: () => T): T {\n if (disposed) throw new Error('Vobs: 已销毁的 Owner 不能继续运行')\n const previous = currentOwner\n currentOwner = owner\n try {\n return fn()\n } finally {\n currentOwner = previous\n }\n },\n\n addCleanup(cleanup: () => void): void {\n if (disposed) {\n cleanup()\n return\n }\n cleanups.push(cleanup)\n },\n\n onDispose(cleanup: () => void): void {\n owner.addCleanup(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n owner.addCleanup(remove)\n return remove\n },\n\n handleError(error: unknown): boolean {\n for (const handler of [...errorHandlers].reverse()) {\n try {\n handler(error)\n return true\n } catch (handlerError) {\n return parent?.handleError(handlerError) ?? false\n }\n }\n return parent?.handleError(error) ?? false\n },\n\n dispose(): void {\n if (disposed) return\n disposed = true\n for (const child of [...children]) child.dispose()\n children.length = 0\n\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n if (parent) {\n const index = parent.children.indexOf(owner)\n if (index >= 0) (parent.children as Owner[]).splice(index, 1)\n }\n if (hasDebugHooks()) invokeDebug('ownerDisposed', owner)\n if (firstError) throw firstError\n }\n }\n\n if (parent && !parent.disposed) (parent.children as Owner[]).push(owner)\n if (hasDebugHooks()) invokeDebug('ownerCreated', owner)\n return owner\n}\n\nexport function setOwnerDebugName(owner: Owner, name: string): void {\n ownerNames.set(owner, name)\n if (hasDebugHooks()) invokeDebug('ownerNamed', owner, name)\n}\n\nexport function getOwnerDebugName(owner: Owner): string | undefined {\n return ownerNames.get(owner)\n}\n\nexport function getCurrentOwner(): Owner | null {\n return currentOwner\n}\n\n/** Re-enter an Owner for an explicitly captured asynchronous continuation. */\nexport function runWithOwner<T>(owner: Owner, fn: () => T): T {\n return owner.run(fn)\n}\n\nexport function onDispose(cleanup: () => void): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: onDispose 必须在 Owner 作用域内调用')\n owner.onDispose(cleanup)\n}\n","import type { Effect } from './effect'\nimport { hasDebugHooks, invokeDebug } from './debug'\n\nexport class Scheduler {\n private readonly dirtyEffects = new Set<Effect>()\n private readonly lowPriorityEffects = new Set<Effect>()\n // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。\n private readonly normalBuffer: Effect[] = []\n private readonly lowBuffer: Effect[] = []\n private flushing = false\n private scheduled = false\n private batchDepth = 0\n\n schedule(effect: Effect): void {\n if (effect.disposed) return\n this.dirtyEffects.add(effect)\n this.lowPriorityEffects.delete(effect)\n this.ensureScheduled()\n }\n\n /** Queue an effect behind normal updates while preserving deterministic order. */\n scheduleLow(effect: Effect): void {\n if (effect.disposed) return\n if (!this.dirtyEffects.has(effect)) this.lowPriorityEffects.add(effect)\n this.ensureScheduled()\n }\n\n private ensureScheduled(): void {\n if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {\n this.scheduled = true\n queueMicrotask(() => {\n this.scheduled = false\n this.flush()\n })\n }\n }\n\n remove(effect: Effect): void {\n this.dirtyEffects.delete(effect)\n this.lowPriorityEffects.delete(effect)\n }\n\n batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) this.flush()\n }\n }\n\n flush(): void {\n if (this.flushing || this.batchDepth > 0) return\n this.flushing = true\n const debugEnabled = hasDebugHooks()\n if (debugEnabled) invokeDebug('flushStart')\n let rounds = 0\n let firstError: unknown\n let hasError = false\n try {\n while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {\n if (++rounds > 100) {\n this.dirtyEffects.clear()\n this.lowPriorityEffects.clear()\n throw new Error('Vobs: 响应式更新超过 100 轮,可能存在循环依赖')\n }\n\n // normal 先、low 后,两组分别排序:与旧的合并排序语义一致\n // (旧比较器里 low 优先级本就高于 depth),但消除了比较器内的 Set 查找。\n this.collectRunnable(this.dirtyEffects, this.normalBuffer)\n this.collectRunnable(this.lowPriorityEffects, this.lowBuffer)\n sortEffects(this.normalBuffer)\n sortEffects(this.lowBuffer)\n for (const effect of this.normalBuffer) {\n try {\n effect.run()\n } catch (error) {\n // Isolate one failed effect from the rest of the flush. Re-throw\n // the first error after all runnable effects have had a chance.\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n for (const effect of this.lowBuffer) {\n try {\n effect.run()\n } catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n }\n } finally {\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n this.flushing = false\n if (debugEnabled) invokeDebug('flushEnd')\n }\n if (hasError) throw firstError\n }\n\n /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */\n private collectRunnable(source: Set<Effect>, target: Effect[]): void {\n for (const effect of source) {\n if (!effect.disposed) target.push(effect)\n }\n source.clear()\n }\n}\n\n/** depth 深的先跑(子 effect 先于父),同深度按创建顺序。 */\nfunction sortEffects(effects: Effect[]): void {\n if (effects.length > 1) {\n effects.sort((a, b) => b.depth - a.depth || a.order - b.order)\n }\n}\n\nexport const scheduler = new Scheduler()\n\nexport function batch<T>(fn: () => T): T {\n return scheduler.batch(fn)\n}\n\n/** Schedule a low-priority effect explicitly. */\nexport function scheduleLow(effect: Effect): void {\n effect.scheduleLow()\n}\n","import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","import { getCurrentOwner, type Owner } from '@vobs/reactivity'\nimport type { InjectionKey, ProvideOptions } from './app'\n\nconst ownerProviders = new WeakMap<Owner, Map<InjectionKey<unknown>, unknown>>()\n\nexport function provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: provide 必须在组件或 Owner 作用域内调用')\n provideToOwner(owner, key, value, options)\n}\n\nexport function inject<T>(key: InjectionKey<T>): T | undefined\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const owner = getCurrentOwner()\n const value = owner ? injectFromOwner(owner, key) : undefined\n return value === undefined ? fallback : value\n}\n\nexport function injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = inject(key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n}\n\nexport function provideToOwner<T>(\n owner: Owner,\n key: InjectionKey<T>,\n value: T,\n options: ProvideOptions = {}\n): void {\n let providers = ownerProviders.get(owner)\n if (!providers) {\n providers = new Map<InjectionKey<unknown>, unknown>()\n ownerProviders.set(owner, providers)\n owner.onDispose(() => ownerProviders.delete(owner))\n }\n if (providers.has(key) && !options.override) {\n throw new Error(`Vobs: 注入项 ${String(key)} 已存在;如需覆盖请传入 override: true`)\n }\n providers.set(key, value)\n}\n\nexport function injectFromOwner<T>(owner: Owner, key: InjectionKey<T>): T | undefined {\n let current: Owner | null = owner\n while (current) {\n const providers = ownerProviders.get(current)\n if (providers?.has(key)) return providers.get(key) as T\n current = current.parent\n }\n return undefined\n}\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","import { createInjectionKey, inject, type VobsPlugin, type VobsContext } from '@vobs/vobs'\nimport { AlipayClient } from './client'\nimport type { AlipayClientOptions } from './types'\n\nexport const ALIPAY_KEY = createInjectionKey<AlipayClient>('vobs.payment.alipay')\n\nexport interface AlipayPluginOptions {\n /** 支付宝客户端配置(未传入 client 时必填) */\n config?: AlipayClientOptions\n /** 可选的已有客户端实例(指定后忽略 config) */\n client?: AlipayClient\n}\n\n/**\n * 支付宝支付插件\n *\n * 将 AlipayClient 注入到 vobs 框架中,可通过 useAlipay() 获取。\n *\n * @example\n * ```ts\n * createVobs({\n * render: App,\n * plugins: [\n * alipayPlugin({\n * config: {\n * appId: '202100...',\n * privateKey: '...',\n * alipayPublicKey: '...',\n * }\n * })\n * ]\n * })\n * ```\n */\nexport function alipayPlugin(options: AlipayPluginOptions): VobsPlugin {\n return {\n name: '@vobs/payment/alipay',\n version: '0.1.0',\n install(context: VobsContext) {\n if (!options.client && !options.config) {\n throw new Error('Vobs Payment: alipayPlugin 需要提供 config 或 client 之一')\n }\n // 仅销毁插件自建的客户端;外部传入的实例由其所有者负责生命周期。\n const ownClient = !options.client\n const client = options.client ?? new AlipayClient(options.config!)\n context.provide(ALIPAY_KEY, client)\n return ownClient ? () => client.dispose() : undefined\n }\n }\n}\n\n/**\n * 获取支付宝客户端实例\n * 必须在已安装 alipayPlugin 的组件或上下文中调用\n */\nexport function useAlipay(): AlipayClient {\n const client = inject(ALIPAY_KEY)\n if (!client) {\n throw new Error(\n 'Vobs Payment: 找不到 AlipayClient,请安装 alipayPlugin'\n )\n }\n return client\n}","export { WechatClient } from './client'\nexport { WechatConfig } from './config'\nexport { WechatApiError } from './response'\nexport { createPayment } from './payment'\nexport { createNotifyHandler } from './notify'\nexport { createRefund } from './refund'\nexport { wechatPlugin, useWechat, WECHAT_KEY } from './plugin'\nexport type { WechatPluginOptions } from './plugin'\nexport type {\n WechatClientOptions,\n WechatPayParams,\n WechatH5PayParams,\n WechatJsapiPayResult,\n WechatAppPayResult,\n WechatNativePayResult,\n WechatH5PayResult,\n WechatQueryParams,\n WechatQueryResult,\n WechatRefundParams,\n WechatRefundResult,\n WechatRefundQueryParams,\n WechatRefundAmount,\n WechatOrderAmount,\n WechatTradeState,\n WechatRefundStatus,\n WechatNotifyResource,\n WechatNotifyHeaders,\n WechatNotifyTransaction,\n WechatNotifyRefund\n} from './types'\n","import type { WechatClientOptions } from './types'\n\n/**\n * 微信支付配置管理\n * 遵循 vobs 生命周期管理:可创建、可校验、可更新、可替换\n */\nexport class WechatConfig {\n private _options: WechatClientOptions\n\n constructor(options: WechatClientOptions) {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 获取完整配置 */\n get options(): Readonly<WechatClientOptions> {\n return this._options\n }\n\n /** 商户号 */\n get mchid(): string {\n return this._options.mchid\n }\n\n /** 应用 ID(公众号 / 小程序 / APP) */\n get appid(): string {\n return this._options.appid\n }\n\n /** 商户 API 证书序列号 */\n get serial(): string {\n return this._options.serial\n }\n\n /** APIv3 密钥(回调解密用) */\n get apiv3Key(): string {\n return this._options.apiv3Key\n }\n\n /** 异步通知地址 */\n get notifyUrl(): string | undefined {\n return this._options.notifyUrl\n }\n\n /** 更新配置(部分更新) */\n update(patch: Partial<WechatClientOptions>): void {\n const merged = { ...this._options, ...patch }\n this.validate(merged)\n this._options = merged\n }\n\n /** 替换配置 */\n replace(options: WechatClientOptions): void {\n this.validate(options)\n this._options = { ...options }\n }\n\n private validate(options: WechatClientOptions): void {\n if (!options.mchid) {\n throw new Error('WechatConfig: mchid 不能为空')\n }\n if (!options.serial) {\n throw new Error('WechatConfig: serial(商户 API 证书序列号)不能为空')\n }\n if (!options.privateKey) {\n throw new Error('WechatConfig: privateKey(商户 API 私钥 PEM)不能为空')\n }\n if (!options.certs || Object.keys(options.certs).length === 0) {\n throw new Error('WechatConfig: certs(平台证书/微信支付公钥 {序列号: PEM})不能为空')\n }\n if (!options.appid) {\n throw new Error('WechatConfig: appid 不能为空')\n }\n if (!options.apiv3Key) {\n throw new Error('WechatConfig: apiv3Key 不能为空')\n }\n if (options.apiv3Key.length !== 32) {\n throw new Error('WechatConfig: apiv3Key 必须为 32 字节字符串')\n }\n }\n}\n","import { Wechatpay } from 'wechatpay-axios-plugin'\nimport { WechatConfig } from './config'\nimport type { WechatClientOptions } from './types'\n\n/**\n * 微信支付客户端封装\n *\n * 封装官方 wechatpay-axios-plugin 的 Wechatpay 实例,提供统一的生命周期管理。\n * 可独立使用,也可通过 wechatPlugin 注册到 vobs 框架。\n *\n * @example\n * ```ts\n * const client = new WechatClient({\n * mchid: '1900000000',\n * serial: '商户API证书序列号',\n * privateKey: '-----BEGIN PRIVATE KEY-----...',\n * certs: { 'PUB_KEY_ID_xxx': '-----BEGIN PUBLIC KEY-----...' },\n * appid: 'wx1234567890',\n * apiv3Key: '32字节APIv3密钥',\n * notifyUrl: 'https://your-domain.com/wechat/notify'\n * })\n * ```\n */\nexport class WechatClient {\n readonly config: WechatConfig\n private _sdk: Wechatpay\n private _disposed = false\n\n constructor(options: WechatClientOptions) {\n this.config = new WechatConfig(options)\n this._sdk = this.createSdk(options)\n }\n\n /** 获取底层 Wechatpay 实例(链式 API:client.sdk.v3.pay.transactions.jsapi.post(...)) */\n get sdk(): Wechatpay {\n this.ensureActive()\n return this._sdk\n }\n\n /** 更新配置并重建 SDK 实例 */\n updateConfig(patch: Partial<WechatClientOptions>): void {\n this.ensureActive()\n this.config.update(patch)\n this._sdk = this.createSdk(this.config.options as WechatClientOptions)\n }\n\n /** 销毁客户端 */\n dispose(): void {\n this._disposed = true\n ;(this._sdk as any) = null\n }\n\n private createSdk(options: WechatClientOptions): Wechatpay {\n return new Wechatpay({\n mchid: options.mchid,\n serial: options.serial,\n privateKey: options.privateKey,\n certs: options.certs,\n timeout: options.timeout ?? 5000\n })\n }\n\n private ensureActive(): void {\n if (this._disposed) {\n throw new Error('WechatClient: 客户端已销毁')\n }\n }\n}\n","/**\n * 微信支付 APIv3 错误归一化。\n *\n * v3 接口没有\"业务体 code\"约定:HTTP 2xx 即成功,失败以\n * 非 2xx 状态码 + JSON body {code, message} 表达(axios 会抛错)。\n * 本模块把 axios 错误统一转换为 WechatApiError。\n */\nexport class WechatApiError extends Error {\n /** HTTP 状态码(网络层错误时为 undefined) */\n readonly status?: number\n /** 错误码,如 PARAM_ERROR / RESOURCE_NOT_EXISTS / NETWORK_ERROR */\n readonly code: string\n\n constructor(message: string, status: number | undefined, code: string) {\n super(message)\n this.name = 'WechatApiError'\n this.status = status\n this.code = code\n }\n}\n\n/** 将任意请求异常归一化为 WechatApiError */\nexport function toWechatApiError(error: unknown): WechatApiError {\n if (error instanceof WechatApiError) return error\n const axiosError = error as {\n response?: { status?: number; data?: { code?: string; message?: string } }\n code?: string\n message?: string\n }\n const status = axiosError?.response?.status\n const bizCode = axiosError?.response?.data?.code\n const bizMessage = axiosError?.response?.data?.message\n if (status !== undefined) {\n return new WechatApiError(\n `微信支付接口调用失败: ${bizMessage ?? axiosError?.message ?? '未知错误'} (${status}${bizCode ? `, ${bizCode}` : ''})`,\n status,\n bizCode ?? String(status)\n )\n }\n return new WechatApiError(\n `微信支付请求失败: ${axiosError?.message ?? '未知错误'}${axiosError?.code ? ` (${axiosError.code})` : ''}`,\n undefined,\n axiosError?.code ?? 'NETWORK_ERROR'\n )\n}\n\n/** 包装请求 promise:失败时抛出 WechatApiError */\nexport async function unwrapV3<T>(promise: PromiseLike<T>): Promise<T> {\n try {\n return await promise\n } catch (error) {\n throw toWechatApiError(error)\n }\n}\n","import { Formatter, Rsa } from 'wechatpay-axios-plugin'\nimport type { WechatClient } from './client'\nimport { unwrapV3 } from './response'\nimport type {\n WechatAppPayResult,\n WechatH5PayParams,\n WechatH5PayResult,\n WechatJsapiPayResult,\n WechatNativePayResult,\n WechatPayParams,\n WechatQueryParams,\n WechatQueryResult,\n WechatTradeState\n} from './types'\n\n/**\n * 微信支付下单(APIv3)\n *\n * 覆盖四种收款场景:\n * - jsapiPay:公众号网页 / 小程序(wx.requestPayment)\n * - appPay:APP 拉起微信支付\n * - nativePay:PC 扫码支付(返回二维码链接)\n * - h5Pay:微信外浏览器 H5 支付(返回收银台跳转链接)\n *\n * ⚠️ 支付结果以异步通知或 query() 为准。\n */\nexport function createPayment(client: WechatClient) {\n return {\n /**\n * 公众号 / 小程序支付下单(POST /v3/pay/transactions/jsapi)\n * @param params 下单参数,openid 必填\n * @returns 调起 wx.requestPayment 所需的签名参数\n */\n async jsapiPay(params: WechatPayParams & { openid: string }): Promise<WechatJsapiPayResult> {\n const { data } = await postTransaction(client, 'jsapi', params)\n return buildInvokeParams(client, data.prepay_id ?? '')\n },\n\n /**\n * APP 支付下单(POST /v3/pay/transactions/app)\n * @param params 下单参数\n * @returns 传给客户端 SDK 调起微信支付的签名参数\n */\n async appPay(params: WechatPayParams): Promise<WechatAppPayResult> {\n const { data } = await postTransaction(client, 'app', params)\n return buildInvokeParams(client, data.prepay_id ?? '')\n },\n\n /**\n * Native 扫码支付下单(POST /v3/pay/transactions/native)\n * @returns 二维码链接(前端渲染二维码,用户扫码支付)\n */\n async nativePay(params: WechatPayParams): Promise<WechatNativePayResult> {\n const { data } = await postTransaction(client, 'native', params)\n if (!data.code_url) {\n throw new Error('WechatClient: 下单响应缺少 code_url')\n }\n return { codeUrl: data.code_url }\n },\n\n /**\n * H5 支付下单(POST /v3/pay/transactions/h5)\n * @param params 下单参数,payerClientIp 必填\n * @returns 收银台跳转链接(302 重定向即可拉起微信支付)\n */\n async h5Pay(params: WechatH5PayParams): Promise<WechatH5PayResult> {\n const body = buildTransactionBody(client, params)\n body.scene_info = {\n payer_client_ip: params.payerClientIp,\n ...(params.sceneInfo?.deviceType ? { device_type: params.sceneInfo.deviceType } : {})\n }\n const { data } = await unwrapV3(client.sdk.v3.pay.transactions.h5.post(body))\n return { h5Url: data.h5_url }\n },\n\n /**\n * 交易查询(GET /v3/pay/transactions/out-trade-no/{no} 或 .../id/{id})\n * @throws {WechatApiError} 订单不存在等失败(RESOURCE_NOT_EXISTS)\n */\n async query(params: WechatQueryParams): Promise<WechatQueryResult> {\n const mchid = client.config.mchid\n const response = params.transactionId\n ? await unwrapV3(\n client.sdk.client.request(\n `/v3/pay/transactions/id/${encodeURIComponent(params.transactionId)}`,\n 'GET',\n undefined,\n { params: { mchid } }\n )\n )\n : await unwrapV3(\n client.sdk.client.request(\n `/v3/pay/transactions/out-trade-no/${encodeURIComponent(params.outTradeNo ?? '')}`,\n 'GET',\n undefined,\n { params: { mchid } }\n )\n )\n return mapTransaction((response as { data: Record<string, any> }).data)\n }\n }\n}\n\ntype TransactionChain = 'jsapi' | 'app' | 'native'\n\nasync function postTransaction(\n client: WechatClient,\n chain: TransactionChain,\n params: WechatPayParams\n): Promise<{ data: { prepay_id?: string; code_url?: string } }> {\n const body = buildTransactionBody(client, params)\n return unwrapV3(client.sdk.v3.pay.transactions[chain].post(body))\n}\n\n/** 构造下单请求体(camelCase -> snake_case,注入 appid/mchid/notify_url) */\nfunction buildTransactionBody(\n client: WechatClient,\n params: WechatPayParams\n): Record<string, any> {\n const body: Record<string, any> = {\n appid: client.config.appid,\n mchid: client.config.mchid,\n description: params.description,\n out_trade_no: params.outTradeNo,\n time_expire: params.timeExpire,\n attach: params.attach,\n goods_tag: params.goodsTag,\n notify_url: client.config.notifyUrl,\n amount: {\n total: params.amount.total,\n currency: params.amount.currency ?? 'CNY'\n }\n }\n if (params.openid) {\n body.payer = { openid: params.openid }\n }\n // 移除 undefined 字段\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key]\n }\n return body\n}\n\n/**\n * 生成拉起支付的签名参数。\n * 签名串:appid\\ntimeStamp\\nnonceStr\\nprepay_id=xxx\\n(SHA256withRSA,商户 API 私钥)\n */\nfunction buildInvokeParams(client: WechatClient, prepayId: string): WechatJsapiPayResult {\n if (!prepayId) {\n throw new Error('WechatClient: 下单响应缺少 prepay_id')\n }\n const appId = client.config.appid\n const timeStamp = `${Formatter.timestamp()}`\n const nonceStr = Formatter.nonce(32)\n const pkg = `prepay_id=${prepayId}`\n const message = `${appId}\\n${timeStamp}\\n${nonceStr}\\n${pkg}\\n`\n const paySign = Rsa.sign(message, client.config.options.privateKey)\n return { appId, timeStamp, nonceStr, package: pkg, signType: 'RSA', paySign }\n}\n\n/** snake_case 响应映射 */\nfunction mapTransaction(data: Record<string, any>): WechatQueryResult {\n return {\n appid: data.appid,\n mchid: data.mchid,\n outTradeNo: data.out_trade_no,\n transactionId: data.transaction_id,\n tradeType: data.trade_type,\n tradeState: data.trade_state as WechatTradeState,\n tradeStateDesc: data.trade_state_desc,\n bankType: data.bank_type,\n attach: data.attach,\n successTime: data.success_time,\n total: data.amount?.total,\n payerTotal: data.amount?.payer_total\n }\n}\n","import { Aes, Formatter, Rsa } from 'wechatpay-axios-plugin'\nimport type { WechatClient } from './client'\nimport type {\n WechatNotifyHeaders,\n WechatNotifyRefund,\n WechatNotifyResource,\n WechatNotifyTransaction\n} from './types'\n\n/**\n * 微信支付异步通知处理(APIv3)\n *\n * 完整流程:\n * 1. verify() — 用 certs(按 Wechatpay-Serial 查找平台证书/微信支付公钥)验证报文签名\n * 2. decrypt() — 用 apiv3Key 做 AES-256-GCM 解密 resource 得到业务数据\n * 3. validate() — 比对商户侧期望值(订单号 / 金额),防错配\n * 4. 处理业务后用 successResponse()/failResponse() 应答微信\n */\nexport function createNotifyHandler(client: WechatClient) {\n return {\n /**\n * 验签异步通知\n * @param headers 微信支付回调的 Wechatpay-* 系列 HTTP 头\n * @param body 原始请求体字符串(必须是未解析的原文,不可先 JSON.parse 再序列化)\n * @returns 验签是否通过\n */\n verify(headers: WechatNotifyHeaders, body: string): boolean {\n const publicKey = client.config.options.certs[headers.serial]\n if (!publicKey) {\n return false\n }\n try {\n const message = Formatter.response(headers.timestamp, headers.nonce, body)\n return Rsa.verify(message, headers.signature, publicKey)\n } catch {\n return false\n }\n },\n\n /**\n * 解密通知 resource 字段(AES-256-GCM,apiv3Key)\n * @param resource 回调 JSON 中的 resource 字段\n */\n decrypt<T extends WechatNotifyTransaction | WechatNotifyRefund = WechatNotifyTransaction>(\n resource: WechatNotifyResource\n ): T {\n const plaintext = Aes.AesGcm.decrypt(\n resource.ciphertext,\n client.config.apiv3Key,\n resource.nonce,\n resource.associatedData ?? ''\n )\n return JSON.parse(plaintext) as T\n },\n\n /**\n * 校验解密后的通知与商户侧订单是否一致。\n * 验签只保证通知来自微信支付,不保证与你的订单一致。\n * @param payload 解密后的通知数据\n * @param expected 商户侧期望值:outTradeNo 订单号、total 订单金额(分)\n */\n validate(\n payload: WechatNotifyTransaction | WechatNotifyRefund,\n expected?: { outTradeNo?: string; total?: number }\n ): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n if (payload.mchid !== client.config.mchid) {\n errors.push(`mchid 不匹配: 期望 ${client.config.mchid},收到 ${payload.mchid}`)\n }\n\n if (expected?.outTradeNo && payload.outTradeNo !== expected.outTradeNo) {\n errors.push(`out_trade_no 不匹配: 期望 ${expected.outTradeNo},收到 ${payload.outTradeNo}`)\n }\n\n if (expected?.total !== undefined && payload.amount?.total !== expected.total) {\n errors.push(`amount.total 不匹配: 期望 ${expected.total},收到 ${payload.amount?.total}`)\n }\n\n return { valid: errors.length === 0, errors }\n },\n\n /** 通知处理成功应答(HTTP 200/201,body 恰为 {\"code\":\"SUCCESS\"}) */\n successResponse(): { code: 'SUCCESS'; message?: undefined } {\n return { code: 'SUCCESS' }\n },\n\n /** 通知处理失败应答(微信会按衰减频率重发通知) */\n failResponse(message?: string): { code: 'FAIL'; message: string } {\n return { code: 'FAIL', message: message ?? '处理失败' }\n }\n }\n}\n","import type { WechatClient } from './client'\nimport { unwrapV3 } from './response'\nimport type {\n WechatRefundParams,\n WechatRefundQueryParams,\n WechatRefundResult,\n WechatRefundStatus\n} from './types'\n\n/**\n * 微信退款(APIv3)\n *\n * 覆盖申请退款与退款状态查询。\n * ⚠️ 退款结果以异步通知(refund.irqevent)或 queryRefund 为准。\n */\nexport function createRefund(client: WechatClient) {\n return {\n /**\n * 申请退款(POST /v3/refund/domestic/refunds)\n * @param params 退款参数(outTradeNo 与 transactionId 二选一)\n * @throws {WechatApiError} 参数错误、余额不足、订单不可退等失败\n */\n async refund(params: WechatRefundParams): Promise<WechatRefundResult> {\n const body: Record<string, any> = {\n out_trade_no: params.outTradeNo,\n transaction_id: params.transactionId,\n out_refund_no: params.outRefundNo,\n reason: params.reason,\n notify_url: params.notifyUrl ?? client.config.notifyUrl,\n funds_account: params.fundsAccount,\n amount: {\n refund: params.amount.refund,\n total: params.amount.total,\n currency: params.amount.currency ?? 'CNY'\n }\n }\n // 移除 undefined 字段\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key]\n }\n for (const key of Object.keys(body.amount)) {\n if ((body.amount as any)[key] === undefined) delete (body.amount as any)[key]\n }\n\n const { data } = await unwrapV3(client.sdk.v3.refund.domestic.refunds.post(body))\n return mapRefund(data)\n },\n\n /**\n * 查询退款(GET /v3/refund/domestic/refunds/{out_refund_no | refund_id})\n * @throws {WechatApiError} 退款单不存在等失败\n */\n async queryRefund(params: WechatRefundQueryParams): Promise<WechatRefundResult> {\n const id = params.refundId ?? params.outRefundNo\n if (!id) {\n throw new Error('WechatClient: queryRefund 需要 outRefundNo 或 refundId')\n }\n const { data } = await unwrapV3(\n client.sdk.client.request(`/v3/refund/domestic/refunds/${encodeURIComponent(id)}`, 'GET')\n )\n return mapRefund(data)\n }\n }\n}\n\n/** snake_case 响应映射 */\nfunction mapRefund(data: Record<string, any>): WechatRefundResult {\n return {\n refundId: data.refund_id,\n outRefundNo: data.out_refund_no,\n outTradeNo: data.out_trade_no,\n transactionId: data.transaction_id,\n status: data.status as WechatRefundStatus,\n refundAmount: data.amount?.refund,\n total: data.amount?.total,\n userReceivedAmount: data.amount?.user_received_amount,\n successTime: data.success_time,\n reason: data.reason\n }\n}\n","import { createInjectionKey, inject, type VobsContext, type VobsPlugin } from '@vobs/vobs'\r\nimport { WechatClient } from './client'\r\nimport type { WechatClientOptions } from './types'\r\n\r\nexport const WECHAT_KEY = createInjectionKey<WechatClient>('vobs.payment.wechat')\r\n\r\nexport interface WechatPluginOptions {\r\n /** 微信支付客户端配置(未传入 client 时必填) */\r\n config?: WechatClientOptions\r\n /** 可选的已有客户端实例(指定后忽略 config) */\r\n client?: WechatClient\r\n}\r\n\r\n/** 从 vobs 插件上下文获取微信支付客户端 */\r\nexport function useWechat(): WechatClient {\r\n const client = inject(WECHAT_KEY)\r\n if (!client) {\r\n throw new Error('Vobs Payment: 找不到 WechatClient,请安装 wechatPlugin')\r\n }\r\n return client\r\n}\r\n\r\n/**\r\n * 微信支付插件\r\n *\r\n * @example\r\n * ```ts\r\n * createVobs({\r\n * plugins: [\r\n * wechatPlugin({\r\n * config: {\r\n * mchid: '1900000000',\r\n * serial: '...',\r\n * privateKey: '...',\r\n * certs: { 'PUB_KEY_ID_xxx': '...' },\r\n * appid: 'wx1234567890',\r\n * apiv3Key: '...'\r\n * }\r\n * })\r\n * ]\r\n * })\r\n * ```\r\n */\r\nexport function wechatPlugin(options: WechatPluginOptions): VobsPlugin {\r\n return {\r\n name: '@vobs/payment/wechat',\r\n version: '0.1.0',\r\n install(context: VobsContext) {\r\n if (!options.client && !options.config) {\r\n throw new Error('Vobs Payment: wechatPlugin 需要提供 config 或 client 之一')\r\n }\r\n // 仅销毁插件自建的客户端;外部传入的实例由其所有者负责生命周期。\r\n const ownClient = !options.client\r\n const client = options.client ?? new WechatClient(options.config!)\r\n context.provide(WECHAT_KEY, client)\r\n return ownClient ? () => client.dispose() : undefined\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/alipay/index.ts","../src/alipay/client.ts","../src/alipay/config.ts","../src/alipay/response.ts","../src/alipay/payment.ts","../src/alipay/wap.ts","../src/alipay/query.ts","../src/alipay/refund.ts","../src/alipay/notify.ts","../src/alipay/plugin.ts","../src/wechat/index.ts","../src/wechat/client.ts","../src/wechat/config.ts","../src/wechat/response.ts","../src/wechat/payment.ts","../src/wechat/notify.ts","../src/wechat/refund.ts","../src/wechat/plugin.ts"],"sourcesContent":["export { AlipayClient } from './client'\nexport { AlipayConfig } from './config'\nexport { AlipayApiError } from './response'\nexport { createPagePay } from './payment'\nexport { createWapPay } from './wap'\nexport { createQuery } from './query'\nexport { createRefund } from './refund'\nexport { createNotifyHandler } from './notify'\nexport { alipayPlugin, useAlipay, ALIPAY_KEY } from './plugin'\nexport type { AlipayPluginOptions } from './plugin'\nexport type {\n AlipayClientOptions,\n AlipayKeyType,\n AlipaySdkConfig,\n AlipaySdkSignType,\n AlipayPagePayConfig,\n AlipayPagePayParams,\n AlipayPagePayResult,\n AlipayWapPayConfig,\n AlipayWapPayParams,\n AlipayWapPayResult,\n AlipayQueryParams,\n AlipayQueryResult,\n AlipayRefundParams,\n AlipayRefundResult,\n AlipayRefundQueryParams,\n AlipayRefundQueryResult,\n AlipayCloseParams,\n AlipayCloseResult,\n AlipayNotifyParams,\n TradeStatus\n} from './types'\n","import { AlipaySdk } from 'alipay-sdk'\nimport { AlipayConfig } from './config'\nimport type { AlipayClientOptions, AlipayKeyType } from './types'\n\n/**\n * 支付宝客户端封装\n *\n * 封装 alipay-sdk 的 AlipaySdk 实例,提供统一的生命周期管理。\n * 可独立使用,也可通过 alipayPlugin 注册到 vobs 框架。\n *\n * @example\n * ```ts\n * const client = new AlipayClient({\n * appId: '202100...',\n * privateKey: '...',\n * alipayPublicKey: '...',\n * gateway: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do'\n * })\n * ```\n */\nexport class AlipayClient {\n readonly config: AlipayConfig\n private _sdk: AlipaySdk\n private _disposed = false\n\n constructor(options: AlipayClientOptions) {\n this.config = new AlipayConfig(options)\n this._sdk = this.createSdk(options)\n }\n\n /** 获取底层 AlipaySdk 实例 */\n get sdk(): AlipaySdk {\n this.ensureActive()\n return this._sdk\n }\n\n /** 更新配置并重建 SDK 实例 */\n updateConfig(patch: Partial<AlipayClientOptions>): void {\n this.ensureActive()\n this.config.update(patch)\n this._sdk = this.createSdk(this.config.options as AlipayClientOptions)\n }\n\n /** 销毁客户端 */\n dispose(): void {\n this._disposed = true\n ;(this._sdk as any) = null\n }\n\n private createSdk(options: AlipayClientOptions): AlipaySdk {\n return new AlipaySdk({\n appId: options.appId,\n privateKey: options.privateKey,\n alipayPublicKey: options.alipayPublicKey,\n signType: options.signType ?? 'RSA2',\n gateway: options.gateway,\n timeout: options.timeout ?? 5000,\n keyType: (options.keyType ?? 'PKCS1') as AlipayKeyType\n })\n }\n\n private ensureActive(): void {\n if (this._disposed) {\n throw new Error('AlipayClient: 客户端已销毁')\n }\n }\n}","import type { AlipayClientOptions } from './types'\n\n/**\n * 支付宝配置管理\n * 遵循 vobs 生命周期管理:可创建、可销毁、可替换\n */\nexport class AlipayConfig {\n private _options: AlipayClientOptions\n\n constructor(options: AlipayClientOptions) {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 获取完整配置 */\n get options(): Readonly<AlipayClientOptions> {\n return this._options\n }\n\n /** 应用 ID */\n get appId(): string {\n return this._options.appId\n }\n\n /** 网关地址 */\n get gateway(): string {\n return this._options.gateway ?? 'https://openapi.alipay.com/gateway.do'\n }\n\n /** 异步通知地址 */\n get notifyUrl(): string | undefined {\n return this._options.notifyUrl\n }\n\n /** 同步跳转地址 */\n get returnUrl(): string | undefined {\n return this._options.returnUrl\n }\n\n /** 更新配置(部分更新) */\n update(patch: Partial<AlipayClientOptions>): void {\n const merged = { ...this._options, ...patch }\n this.validate(merged)\n this._options = merged\n }\n\n /** 替换配置 */\n replace(options: AlipayClientOptions): void {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 创建沙箱配置的快捷方法 */\n static forSandbox(options: Omit<AlipayClientOptions, 'gateway'>): AlipayConfig {\n return new AlipayConfig({\n ...options,\n gateway: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do'\n })\n }\n\n private validate(options: AlipayClientOptions): void {\n if (!options.appId) {\n throw new Error('AlipayConfig: appId 不能为空')\n }\n if (!options.privateKey) {\n throw new Error('AlipayConfig: privateKey 不能为空')\n }\n if (!options.alipayPublicKey) {\n throw new Error('AlipayConfig: alipayPublicKey 不能为空')\n }\n }\n}","/**\n * 支付宝开放接口响应解包与业务错误检查。\n *\n * 网关应答(HTTP 200)不代表业务成功:业务失败时响应体内\n * code != '10000' 并携带 sub_code/sub_msg,必须显式检查,\n * 否则会把失败结果当成功映射(字段全部 undefined)。\n */\nexport class AlipayApiError extends Error {\n readonly code: string\n readonly subCode?: string\n readonly subMsg?: string\n\n constructor(apiName: string, code: string, subCode: string | undefined, subMsg: string | undefined, msg: string | undefined) {\n super(`支付宝接口 ${apiName} 调用失败: ${subMsg ?? msg ?? '未知错误'} (code=${code}${subCode ? `, sub_code=${subCode}` : ''})`)\n this.name = 'AlipayApiError'\n this.code = code\n this.subCode = subCode\n this.subMsg = subMsg\n }\n}\n\n/** alipay.trade.page.pay -> alipay_trade_page_pay_response */\nfunction toResponseKey(apiName: string): string {\n return `${apiName.replace(/\\./g, '_')}_response`\n}\n\n/**\n * 从网关应答中取出业务响应体,code !== '10000' 时抛出 AlipayApiError。\n */\nexport function unwrapResponse(raw: unknown, apiName: string): Record<string, any> {\n const outer = raw as Record<string, any> | null | undefined\n const body = (outer && outer[toResponseKey(apiName)]) ?? outer\n if (!body || typeof body !== 'object') {\n throw new AlipayApiError(apiName, 'INVALID_RESPONSE', undefined, undefined, '响应体格式异常')\n }\n if (body.code !== '10000') {\n throw new AlipayApiError(apiName, body.code, body.sub_code, body.sub_msg, body.msg)\n }\n return body\n}\n","import type { AlipayClient } from './client'\nimport type {\n AlipayPagePayConfig,\n AlipayPagePayParams,\n AlipayPagePayResult\n} from './types'\n\n/**\n * 电脑网站支付 (alipay.trade.page.pay)\n *\n * 生成支付宝支付表单 HTML,前端渲染后自动提交表单跳转至支付宝收银台。\n *\n * ⚠️ 必须使用 pageExecute() 方法,禁止使用 exec()。\n * ⚠️ 返回值为 HTML 表单字符串,不是 URL,前端必须渲染 form 并自动提交。\n * ⚠️ 支付结果以异步通知或查询接口为准,不可依赖同步跳转。\n */\nexport function createPagePay(client: AlipayClient) {\n return {\n /**\n * 发起电脑网站支付\n * @param config 支付配置\n * @returns 支付表单 HTML\n */\n async pay(config: AlipayPagePayConfig): Promise<AlipayPagePayResult> {\n const { outTradeNo, totalAmount, subject, body, passbackParams } = config\n\n const bizParams: AlipayPagePayParams = {\n outTradeNo,\n totalAmount,\n subject,\n productCode: 'FAST_INSTANT_TRADE_PAY',\n body,\n passbackParams,\n returnUrl: client.config.returnUrl,\n notifyUrl: client.config.notifyUrl\n }\n\n // 使用 pageExecute() 生成 POST 表单 HTML\n // 注意:必须使用 pageExecute,不能使用 exec()\n const formHtml = client.sdk.pageExecute(\n 'alipay.trade.page.pay',\n 'POST',\n { bizContent: sanitizeParams(bizParams) }\n )\n\n return { formHtml }\n }\n }\n}\n\n/** 移除 undefined 字段 */\nfunction sanitizeParams<T extends Record<string, any>>(params: T): Record<string, any> {\n const result: Record<string, any> = {}\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n result[key] = value\n }\n }\n return result\n}","import type { AlipayClient } from './client'\nimport type { AlipayWapPayConfig, AlipayWapPayParams, AlipayWapPayResult } from './types'\n\n/**\n * 手机网站支付 (alipay.trade.wap.pay)\n *\n * 移动端浏览器内拉起支付宝收银台,生成表单 HTML 由前端提交跳转。\n *\n * ⚠️ 必须使用 pageExecute() 方法,禁止使用 exec()。\n * ⚠️ 返回值为 HTML 表单字符串,前端必须渲染 form 并自动提交。\n * ⚠️ 支付结果以异步通知或查询接口为准,不可依赖同步跳转。\n */\nexport function createWapPay(client: AlipayClient) {\n return {\n /**\n * 发起手机网站支付\n * @param config 支付配置\n * @returns 支付表单 HTML\n */\n async pay(config: AlipayWapPayConfig): Promise<AlipayWapPayResult> {\n const { outTradeNo, totalAmount, subject, body, passbackParams, quitUrl } = config\n\n const bizParams: AlipayWapPayParams = {\n outTradeNo,\n totalAmount,\n subject,\n productCode: 'QUICK_WAP_WAY',\n body,\n passbackParams,\n quitUrl,\n returnUrl: client.config.returnUrl,\n notifyUrl: client.config.notifyUrl\n }\n\n const formHtml = client.sdk.pageExecute(\n 'alipay.trade.wap.pay',\n 'POST',\n { bizContent: sanitizeParams(bizParams) }\n )\n\n return { formHtml }\n }\n }\n}\n\n/** 移除 undefined 字段 */\nfunction sanitizeParams<T extends Record<string, any>>(params: T): Record<string, any> {\n const result: Record<string, any> = {}\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n result[key] = value\n }\n }\n return result\n}\n","import type { AlipayClient } from './client'\nimport { unwrapResponse } from './response'\nimport type { AlipayQueryParams, AlipayQueryResult, TradeStatus } from './types'\n\n/**\n * 交易查询 (alipay.trade.query)\n *\n * 查询支付宝交易状态,用于确认支付结果。\n * 当异步通知未收到时,应主动调用此接口兜底。\n */\nexport function createQuery(client: AlipayClient) {\n return {\n /**\n * 查询交易状态\n * @param params 查询参数(outTradeNo 和 tradeNo 至少传一个)\n * @throws {AlipayApiError} 业务失败(如 ACQ.TRADE_NOT_EXIST)时抛出\n */\n async query(params: AlipayQueryParams): Promise<AlipayQueryResult> {\n const alipayResponse = unwrapResponse(\n await client.sdk.exec('alipay.trade.query', {\n bizContent: params\n }),\n 'alipay.trade.query'\n )\n\n return {\n tradeNo: alipayResponse.trade_no,\n outTradeNo: alipayResponse.out_trade_no,\n buyerLogonId: alipayResponse.buyer_logon_id,\n tradeStatus: alipayResponse.trade_status as TradeStatus,\n totalAmount: alipayResponse.total_amount,\n receiptAmount: alipayResponse.receipt_amount ?? '0.00',\n buyerPayAmount: alipayResponse.buyer_pay_amount ?? '0.00',\n sendPayDate: alipayResponse.send_pay_date ?? '',\n gmtPayment: alipayResponse.gmt_payment ?? null,\n gmtClose: alipayResponse.gmt_close ?? null,\n refundAmount: alipayResponse.refund_amount ?? '0.00',\n subject: alipayResponse.subject ?? '',\n passbackParams: alipayResponse.passback_params ?? null,\n fundChannel: alipayResponse.fund_channel ?? null\n }\n },\n\n /**\n * 判断交易是否支付成功\n * 只有 TRADE_SUCCESS 或 TRADE_FINISHED 才表示支付成功\n */\n isSuccessful(status: TradeStatus): boolean {\n return status === 'TRADE_SUCCESS' || status === 'TRADE_FINISHED'\n }\n }\n}","import type { AlipayClient } from './client'\nimport { unwrapResponse } from './response'\nimport type {\n AlipayRefundParams,\n AlipayRefundResult,\n AlipayRefundQueryParams,\n AlipayRefundQueryResult,\n AlipayCloseParams,\n AlipayCloseResult\n} from './types'\n\n/**\n * 退款与交易关闭\n *\n * 包含退款、退款查询、交易关闭的完整退款生命周期管理。\n */\nexport function createRefund(client: AlipayClient) {\n return {\n /**\n * 交易退款 (alipay.trade.refund)\n * 交易发生后 12 个月内可退款,退款资金原路返回。\n * @throws {AlipayApiError} 业务失败时抛出\n */\n async refund(params: AlipayRefundParams): Promise<AlipayRefundResult> {\n const alipayResponse = unwrapResponse(\n await client.sdk.exec('alipay.trade.refund', {\n bizContent: params\n }),\n 'alipay.trade.refund'\n )\n\n return {\n tradeNo: alipayResponse.trade_no,\n outTradeNo: alipayResponse.out_trade_no,\n buyerLogonId: alipayResponse.buyer_logon_id,\n refundAmount: alipayResponse.refund_fee,\n fundChange: alipayResponse.fund_change ?? 'N',\n gmtRefundPay: alipayResponse.gmt_refund_pay ?? '',\n refundDetailItemList: alipayResponse.refund_detail_item_list ?? null\n }\n },\n\n /**\n * 退款查询 (alipay.trade.fastpay.refund.query)\n * 查询退款状态,确认退款是否成功。\n * @throws {AlipayApiError} 业务失败时抛出\n */\n async queryRefund(params: AlipayRefundQueryParams): Promise<AlipayRefundQueryResult> {\n const alipayResponse = unwrapResponse(\n await client.sdk.exec('alipay.trade.fastpay.refund.query', {\n bizContent: params\n }),\n 'alipay.trade.fastpay.refund.query'\n )\n\n return {\n tradeNo: alipayResponse.trade_no,\n outTradeNo: alipayResponse.out_trade_no,\n refundAmount: alipayResponse.refund_amount,\n refundStatus: alipayResponse.refund_status,\n outRequestNo: alipayResponse.out_request_no,\n refundReason: alipayResponse.refund_reason ?? ''\n }\n },\n\n /**\n * 关闭交易 (alipay.trade.close)\n * 关闭未支付的订单。\n * @throws {AlipayApiError} 业务失败时抛出\n */\n async close(params: AlipayCloseParams): Promise<AlipayCloseResult> {\n const alipayResponse = unwrapResponse(\n await client.sdk.exec('alipay.trade.close', {\n bizContent: params\n }),\n 'alipay.trade.close'\n )\n\n return {\n tradeNo: alipayResponse.trade_no,\n outTradeNo: alipayResponse.out_trade_no\n }\n }\n }\n}","import type { AlipayClient } from './client'\nimport type { AlipayNotifyParams, TradeStatus } from './types'\n\n/**\n * 异步通知处理\n *\n * 支付宝在交易状态变更时,通过 POST 请求 notify_url 发送异步通知。\n * 处理要点:\n * 1. 收到通知后必须先验签\n * 2. 验签后校验关键业务字段(app_id、out_trade_no、total_amount)\n * 3. 处理成功后返回字符串 \"success\"(仅此 7 个字符)\n * 4. 需做幂等处理,过滤重复通知\n */\nexport function createNotifyHandler(client: AlipayClient) {\n return {\n /**\n * 验签异步通知\n * @param params 异步通知参数(支付宝 POST 过来的原始参数)\n * @param raw 使用原始报文验签(推荐:v4.15+ 支持,规避 encodeURIComponent 差异导致的验签失败)\n * @returns 验签是否通过\n */\n verify(params: Record<string, any>, raw = false): boolean {\n try {\n return client.sdk.checkNotifySign(params, raw)\n } catch {\n return false\n }\n },\n\n /**\n * 校验异步通知的业务字段\n *\n * 验签只保证通知确实来自支付宝,不保证通知与你系统中的订单一致;\n * 因此除了 app_id,还应传入商户侧的期望值(outTradeNo / totalAmount)进行比对。\n * @param params 异步通知参数\n * @param expected 商户侧期望值:outTradeNo 订单号、totalAmount 订单金额(单位元)\n */\n validate(\n params: AlipayNotifyParams,\n expected?: { outTradeNo?: string; totalAmount?: string }\n ): NotifyValidationResult {\n const errors: string[] = []\n\n // 校验 app_id\n if (params.appId !== client.config.appId) {\n errors.push(`app_id 不匹配: 期望 ${client.config.appId},收到 ${params.appId}`)\n }\n\n // 校验 out_trade_no 与商户订单一致\n if (expected?.outTradeNo && params.outTradeNo !== expected.outTradeNo) {\n errors.push(`out_trade_no 不匹配: 期望 ${expected.outTradeNo},收到 ${params.outTradeNo}`)\n }\n\n // 校验 total_amount 与订单金额一致(金额为两位小数的服务端字符串,按数值比较)\n if (expected?.totalAmount && Number(params.totalAmount) !== Number(expected.totalAmount)) {\n errors.push(`total_amount 不匹配: 期望 ${expected.totalAmount},收到 ${params.totalAmount}`)\n }\n\n // 校验 trade_status\n const validStatuses: TradeStatus[] = ['TRADE_SUCCESS', 'TRADE_FINISHED']\n if (!validStatuses.includes(params.tradeStatus as TradeStatus)) {\n errors.push(`trade_status 非终态: ${params.tradeStatus}`)\n }\n\n return {\n valid: errors.length === 0,\n errors\n }\n },\n\n /**\n * 生成支付宝异步通知的成功响应\n * 处理完成后必须返回字符串 \"success\"\n */\n successResponse(): string {\n return 'success'\n },\n\n /**\n * 生成支付宝异步通知的失败响应\n * 返回空字符串或非 success 内容,支付宝会重试通知\n */\n failResponse(): string {\n return 'fail'\n }\n }\n}\n\nexport interface NotifyValidationResult {\n valid: boolean\n errors: string[]\n}","import { createInjectionKey, inject, type VobsPlugin, type VobsContext } from '@vobs/vobs'\nimport { AlipayClient } from './client'\nimport type { AlipayClientOptions } from './types'\n\nexport const ALIPAY_KEY = createInjectionKey<AlipayClient>('vobs.payment.alipay')\n\nexport interface AlipayPluginOptions {\n /** 支付宝客户端配置(未传入 client 时必填) */\n config?: AlipayClientOptions\n /** 可选的已有客户端实例(指定后忽略 config) */\n client?: AlipayClient\n}\n\n/**\n * 支付宝支付插件\n *\n * 将 AlipayClient 注入到 vobs 框架中,可通过 useAlipay() 获取。\n *\n * @example\n * ```ts\n * createVobs({\n * render: App,\n * plugins: [\n * alipayPlugin({\n * config: {\n * appId: '202100...',\n * privateKey: '...',\n * alipayPublicKey: '...',\n * }\n * })\n * ]\n * })\n * ```\n */\nexport function alipayPlugin(options: AlipayPluginOptions): VobsPlugin {\n return {\n name: '@vobs/payment/alipay',\n version: '0.1.0',\n install(context: VobsContext) {\n if (!options.client && !options.config) {\n throw new Error('Vobs Payment: alipayPlugin 需要提供 config 或 client 之一')\n }\n // 仅销毁插件自建的客户端;外部传入的实例由其所有者负责生命周期。\n const ownClient = !options.client\n const client = options.client ?? new AlipayClient(options.config!)\n context.provide(ALIPAY_KEY, client)\n return ownClient ? () => client.dispose() : undefined\n }\n }\n}\n\n/**\n * 获取支付宝客户端实例\n * 必须在已安装 alipayPlugin 的组件或上下文中调用\n */\nexport function useAlipay(): AlipayClient {\n const client = inject(ALIPAY_KEY)\n if (!client) {\n throw new Error(\n 'Vobs Payment: 找不到 AlipayClient,请安装 alipayPlugin'\n )\n }\n return client\n}","export { WechatClient } from './client'\nexport { WechatConfig } from './config'\nexport { WechatApiError } from './response'\nexport { createPayment } from './payment'\nexport { createNotifyHandler } from './notify'\nexport { createRefund } from './refund'\nexport { wechatPlugin, useWechat, WECHAT_KEY } from './plugin'\nexport type { WechatPluginOptions } from './plugin'\nexport type {\n WechatClientOptions,\n WechatPayParams,\n WechatH5PayParams,\n WechatJsapiPayResult,\n WechatAppPayResult,\n WechatNativePayResult,\n WechatH5PayResult,\n WechatQueryParams,\n WechatQueryResult,\n WechatRefundParams,\n WechatRefundResult,\n WechatRefundQueryParams,\n WechatRefundAmount,\n WechatOrderAmount,\n WechatTradeState,\n WechatRefundStatus,\n WechatNotifyResource,\n WechatNotifyHeaders,\n WechatNotifyTransaction,\n WechatNotifyRefund\n} from './types'\n","import { Wechatpay } from 'wechatpay-axios-plugin'\nimport { WechatConfig } from './config'\nimport type { WechatClientOptions } from './types'\n\n/**\n * 微信支付客户端封装\n *\n * 封装官方 wechatpay-axios-plugin 的 Wechatpay 实例,提供统一的生命周期管理。\n * 可独立使用,也可通过 wechatPlugin 注册到 vobs 框架。\n *\n * @example\n * ```ts\n * const client = new WechatClient({\n * mchid: '1900000000',\n * serial: '商户API证书序列号',\n * privateKey: '-----BEGIN PRIVATE KEY-----...',\n * certs: { 'PUB_KEY_ID_xxx': '-----BEGIN PUBLIC KEY-----...' },\n * appid: 'wx1234567890',\n * apiv3Key: '32字节APIv3密钥',\n * notifyUrl: 'https://your-domain.com/wechat/notify'\n * })\n * ```\n */\nexport class WechatClient {\n readonly config: WechatConfig\n private _sdk: Wechatpay\n private _disposed = false\n\n constructor(options: WechatClientOptions) {\n this.config = new WechatConfig(options)\n this._sdk = this.createSdk(options)\n }\n\n /** 获取底层 Wechatpay 实例(链式 API:client.sdk.v3.pay.transactions.jsapi.post(...)) */\n get sdk(): Wechatpay {\n this.ensureActive()\n return this._sdk\n }\n\n /** 更新配置并重建 SDK 实例 */\n updateConfig(patch: Partial<WechatClientOptions>): void {\n this.ensureActive()\n this.config.update(patch)\n this._sdk = this.createSdk(this.config.options as WechatClientOptions)\n }\n\n /** 销毁客户端 */\n dispose(): void {\n this._disposed = true\n ;(this._sdk as any) = null\n }\n\n private createSdk(options: WechatClientOptions): Wechatpay {\n return new Wechatpay({\n mchid: options.mchid,\n serial: options.serial,\n privateKey: options.privateKey,\n certs: options.certs,\n timeout: options.timeout ?? 5000\n })\n }\n\n private ensureActive(): void {\n if (this._disposed) {\n throw new Error('WechatClient: 客户端已销毁')\n }\n }\n}\n","import type { WechatClientOptions } from './types'\n\n/**\n * 微信支付配置管理\n * 遵循 vobs 生命周期管理:可创建、可校验、可更新、可替换\n */\nexport class WechatConfig {\n private _options: WechatClientOptions\n\n constructor(options: WechatClientOptions) {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 获取完整配置 */\n get options(): Readonly<WechatClientOptions> {\n return this._options\n }\n\n /** 商户号 */\n get mchid(): string {\n return this._options.mchid\n }\n\n /** 应用 ID(公众号 / 小程序 / APP) */\n get appid(): string {\n return this._options.appid\n }\n\n /** 商户 API 证书序列号 */\n get serial(): string {\n return this._options.serial\n }\n\n /** APIv3 密钥(回调解密用) */\n get apiv3Key(): string {\n return this._options.apiv3Key\n }\n\n /** 异步通知地址 */\n get notifyUrl(): string | undefined {\n return this._options.notifyUrl\n }\n\n /** 更新配置(部分更新) */\n update(patch: Partial<WechatClientOptions>): void {\n const merged = { ...this._options, ...patch }\n this.validate(merged)\n this._options = merged\n }\n\n /** 替换配置 */\n replace(options: WechatClientOptions): void {\n this.validate(options)\n this._options = { ...options }\n }\n\n private validate(options: WechatClientOptions): void {\n if (!options.mchid) {\n throw new Error('WechatConfig: mchid 不能为空')\n }\n if (!options.serial) {\n throw new Error('WechatConfig: serial(商户 API 证书序列号)不能为空')\n }\n if (!options.privateKey) {\n throw new Error('WechatConfig: privateKey(商户 API 私钥 PEM)不能为空')\n }\n if (!options.certs || Object.keys(options.certs).length === 0) {\n throw new Error('WechatConfig: certs(平台证书/微信支付公钥 {序列号: PEM})不能为空')\n }\n if (!options.appid) {\n throw new Error('WechatConfig: appid 不能为空')\n }\n if (!options.apiv3Key) {\n throw new Error('WechatConfig: apiv3Key 不能为空')\n }\n if (options.apiv3Key.length !== 32) {\n throw new Error('WechatConfig: apiv3Key 必须为 32 字节字符串')\n }\n }\n}\n","/**\n * 微信支付 APIv3 错误归一化。\n *\n * v3 接口没有\"业务体 code\"约定:HTTP 2xx 即成功,失败以\n * 非 2xx 状态码 + JSON body {code, message} 表达(axios 会抛错)。\n * 本模块把 axios 错误统一转换为 WechatApiError。\n */\nexport class WechatApiError extends Error {\n /** HTTP 状态码(网络层错误时为 undefined) */\n readonly status?: number\n /** 错误码,如 PARAM_ERROR / RESOURCE_NOT_EXISTS / NETWORK_ERROR */\n readonly code: string\n\n constructor(message: string, status: number | undefined, code: string) {\n super(message)\n this.name = 'WechatApiError'\n this.status = status\n this.code = code\n }\n}\n\n/** 将任意请求异常归一化为 WechatApiError */\nexport function toWechatApiError(error: unknown): WechatApiError {\n if (error instanceof WechatApiError) return error\n const axiosError = error as {\n response?: { status?: number; data?: { code?: string; message?: string } }\n code?: string\n message?: string\n }\n const status = axiosError?.response?.status\n const bizCode = axiosError?.response?.data?.code\n const bizMessage = axiosError?.response?.data?.message\n if (status !== undefined) {\n return new WechatApiError(\n `微信支付接口调用失败: ${bizMessage ?? axiosError?.message ?? '未知错误'} (${status}${bizCode ? `, ${bizCode}` : ''})`,\n status,\n bizCode ?? String(status)\n )\n }\n return new WechatApiError(\n `微信支付请求失败: ${axiosError?.message ?? '未知错误'}${axiosError?.code ? ` (${axiosError.code})` : ''}`,\n undefined,\n axiosError?.code ?? 'NETWORK_ERROR'\n )\n}\n\n/** 包装请求 promise:失败时抛出 WechatApiError */\nexport async function unwrapV3<T>(promise: PromiseLike<T>): Promise<T> {\n try {\n return await promise\n } catch (error) {\n throw toWechatApiError(error)\n }\n}\n","import { Formatter, Rsa } from 'wechatpay-axios-plugin'\nimport type { WechatClient } from './client'\nimport { unwrapV3 } from './response'\nimport type {\n WechatAppPayResult,\n WechatH5PayParams,\n WechatH5PayResult,\n WechatJsapiPayResult,\n WechatNativePayResult,\n WechatPayParams,\n WechatQueryParams,\n WechatQueryResult,\n WechatTradeState\n} from './types'\n\n/**\n * 微信支付下单(APIv3)\n *\n * 覆盖四种收款场景:\n * - jsapiPay:公众号网页 / 小程序(wx.requestPayment)\n * - appPay:APP 拉起微信支付\n * - nativePay:PC 扫码支付(返回二维码链接)\n * - h5Pay:微信外浏览器 H5 支付(返回收银台跳转链接)\n *\n * ⚠️ 支付结果以异步通知或 query() 为准。\n */\nexport function createPayment(client: WechatClient) {\n return {\n /**\n * 公众号 / 小程序支付下单(POST /v3/pay/transactions/jsapi)\n * @param params 下单参数,openid 必填\n * @returns 调起 wx.requestPayment 所需的签名参数\n */\n async jsapiPay(params: WechatPayParams & { openid: string }): Promise<WechatJsapiPayResult> {\n const { data } = await postTransaction(client, 'jsapi', params)\n return buildInvokeParams(client, data.prepay_id ?? '')\n },\n\n /**\n * APP 支付下单(POST /v3/pay/transactions/app)\n * @param params 下单参数\n * @returns 传给客户端 SDK 调起微信支付的签名参数\n */\n async appPay(params: WechatPayParams): Promise<WechatAppPayResult> {\n const { data } = await postTransaction(client, 'app', params)\n return buildInvokeParams(client, data.prepay_id ?? '')\n },\n\n /**\n * Native 扫码支付下单(POST /v3/pay/transactions/native)\n * @returns 二维码链接(前端渲染二维码,用户扫码支付)\n */\n async nativePay(params: WechatPayParams): Promise<WechatNativePayResult> {\n const { data } = await postTransaction(client, 'native', params)\n if (!data.code_url) {\n throw new Error('WechatClient: 下单响应缺少 code_url')\n }\n return { codeUrl: data.code_url }\n },\n\n /**\n * H5 支付下单(POST /v3/pay/transactions/h5)\n * @param params 下单参数,payerClientIp 必填\n * @returns 收银台跳转链接(302 重定向即可拉起微信支付)\n */\n async h5Pay(params: WechatH5PayParams): Promise<WechatH5PayResult> {\n const body = buildTransactionBody(client, params)\n body.scene_info = {\n payer_client_ip: params.payerClientIp,\n ...(params.sceneInfo?.deviceType ? { device_type: params.sceneInfo.deviceType } : {})\n }\n const { data } = await unwrapV3(client.sdk.v3.pay.transactions.h5.post(body))\n return { h5Url: data.h5_url }\n },\n\n /**\n * 交易查询(GET /v3/pay/transactions/out-trade-no/{no} 或 .../id/{id})\n * @throws {WechatApiError} 订单不存在等失败(RESOURCE_NOT_EXISTS)\n */\n async query(params: WechatQueryParams): Promise<WechatQueryResult> {\n const mchid = client.config.mchid\n const response = params.transactionId\n ? await unwrapV3(\n client.sdk.client.request(\n `/v3/pay/transactions/id/${encodeURIComponent(params.transactionId)}`,\n 'GET',\n undefined,\n { params: { mchid } }\n )\n )\n : await unwrapV3(\n client.sdk.client.request(\n `/v3/pay/transactions/out-trade-no/${encodeURIComponent(params.outTradeNo ?? '')}`,\n 'GET',\n undefined,\n { params: { mchid } }\n )\n )\n return mapTransaction((response as { data: Record<string, any> }).data)\n }\n }\n}\n\ntype TransactionChain = 'jsapi' | 'app' | 'native'\n\nasync function postTransaction(\n client: WechatClient,\n chain: TransactionChain,\n params: WechatPayParams\n): Promise<{ data: { prepay_id?: string; code_url?: string } }> {\n const body = buildTransactionBody(client, params)\n return unwrapV3(client.sdk.v3.pay.transactions[chain].post(body))\n}\n\n/** 构造下单请求体(camelCase -> snake_case,注入 appid/mchid/notify_url) */\nfunction buildTransactionBody(\n client: WechatClient,\n params: WechatPayParams\n): Record<string, any> {\n const body: Record<string, any> = {\n appid: client.config.appid,\n mchid: client.config.mchid,\n description: params.description,\n out_trade_no: params.outTradeNo,\n time_expire: params.timeExpire,\n attach: params.attach,\n goods_tag: params.goodsTag,\n notify_url: client.config.notifyUrl,\n amount: {\n total: params.amount.total,\n currency: params.amount.currency ?? 'CNY'\n }\n }\n if (params.openid) {\n body.payer = { openid: params.openid }\n }\n // 移除 undefined 字段\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key]\n }\n return body\n}\n\n/**\n * 生成拉起支付的签名参数。\n * 签名串:appid\\ntimeStamp\\nnonceStr\\nprepay_id=xxx\\n(SHA256withRSA,商户 API 私钥)\n */\nfunction buildInvokeParams(client: WechatClient, prepayId: string): WechatJsapiPayResult {\n if (!prepayId) {\n throw new Error('WechatClient: 下单响应缺少 prepay_id')\n }\n const appId = client.config.appid\n const timeStamp = `${Formatter.timestamp()}`\n const nonceStr = Formatter.nonce(32)\n const pkg = `prepay_id=${prepayId}`\n const message = `${appId}\\n${timeStamp}\\n${nonceStr}\\n${pkg}\\n`\n const paySign = Rsa.sign(message, client.config.options.privateKey)\n return { appId, timeStamp, nonceStr, package: pkg, signType: 'RSA', paySign }\n}\n\n/** snake_case 响应映射 */\nfunction mapTransaction(data: Record<string, any>): WechatQueryResult {\n return {\n appid: data.appid,\n mchid: data.mchid,\n outTradeNo: data.out_trade_no,\n transactionId: data.transaction_id,\n tradeType: data.trade_type,\n tradeState: data.trade_state as WechatTradeState,\n tradeStateDesc: data.trade_state_desc,\n bankType: data.bank_type,\n attach: data.attach,\n successTime: data.success_time,\n total: data.amount?.total,\n payerTotal: data.amount?.payer_total\n }\n}\n","import { Aes, Formatter, Rsa } from 'wechatpay-axios-plugin'\nimport type { WechatClient } from './client'\nimport type {\n WechatNotifyHeaders,\n WechatNotifyRefund,\n WechatNotifyResource,\n WechatNotifyTransaction\n} from './types'\n\n/**\n * 微信支付异步通知处理(APIv3)\n *\n * 完整流程:\n * 1. verify() — 用 certs(按 Wechatpay-Serial 查找平台证书/微信支付公钥)验证报文签名\n * 2. decrypt() — 用 apiv3Key 做 AES-256-GCM 解密 resource 得到业务数据\n * 3. validate() — 比对商户侧期望值(订单号 / 金额),防错配\n * 4. 处理业务后用 successResponse()/failResponse() 应答微信\n */\nexport function createNotifyHandler(client: WechatClient) {\n return {\n /**\n * 验签异步通知\n * @param headers 微信支付回调的 Wechatpay-* 系列 HTTP 头\n * @param body 原始请求体字符串(必须是未解析的原文,不可先 JSON.parse 再序列化)\n * @returns 验签是否通过\n */\n verify(headers: WechatNotifyHeaders, body: string): boolean {\n const publicKey = client.config.options.certs[headers.serial]\n if (!publicKey) {\n return false\n }\n try {\n const message = Formatter.response(headers.timestamp, headers.nonce, body)\n return Rsa.verify(message, headers.signature, publicKey)\n } catch {\n return false\n }\n },\n\n /**\n * 解密通知 resource 字段(AES-256-GCM,apiv3Key)\n * @param resource 回调 JSON 中的 resource 字段\n */\n decrypt<T extends WechatNotifyTransaction | WechatNotifyRefund = WechatNotifyTransaction>(\n resource: WechatNotifyResource\n ): T {\n const plaintext = Aes.AesGcm.decrypt(\n resource.ciphertext,\n client.config.apiv3Key,\n resource.nonce,\n resource.associatedData ?? ''\n )\n return JSON.parse(plaintext) as T\n },\n\n /**\n * 校验解密后的通知与商户侧订单是否一致。\n * 验签只保证通知来自微信支付,不保证与你的订单一致。\n * @param payload 解密后的通知数据\n * @param expected 商户侧期望值:outTradeNo 订单号、total 订单金额(分)\n */\n validate(\n payload: WechatNotifyTransaction | WechatNotifyRefund,\n expected?: { outTradeNo?: string; total?: number }\n ): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n if (payload.mchid !== client.config.mchid) {\n errors.push(`mchid 不匹配: 期望 ${client.config.mchid},收到 ${payload.mchid}`)\n }\n\n if (expected?.outTradeNo && payload.outTradeNo !== expected.outTradeNo) {\n errors.push(`out_trade_no 不匹配: 期望 ${expected.outTradeNo},收到 ${payload.outTradeNo}`)\n }\n\n if (expected?.total !== undefined && payload.amount?.total !== expected.total) {\n errors.push(`amount.total 不匹配: 期望 ${expected.total},收到 ${payload.amount?.total}`)\n }\n\n return { valid: errors.length === 0, errors }\n },\n\n /** 通知处理成功应答(HTTP 200/201,body 恰为 {\"code\":\"SUCCESS\"}) */\n successResponse(): { code: 'SUCCESS'; message?: undefined } {\n return { code: 'SUCCESS' }\n },\n\n /** 通知处理失败应答(微信会按衰减频率重发通知) */\n failResponse(message?: string): { code: 'FAIL'; message: string } {\n return { code: 'FAIL', message: message ?? '处理失败' }\n }\n }\n}\n","import type { WechatClient } from './client'\nimport { unwrapV3 } from './response'\nimport type {\n WechatRefundParams,\n WechatRefundQueryParams,\n WechatRefundResult,\n WechatRefundStatus\n} from './types'\n\n/**\n * 微信退款(APIv3)\n *\n * 覆盖申请退款与退款状态查询。\n * ⚠️ 退款结果以异步通知(refund.irqevent)或 queryRefund 为准。\n */\nexport function createRefund(client: WechatClient) {\n return {\n /**\n * 申请退款(POST /v3/refund/domestic/refunds)\n * @param params 退款参数(outTradeNo 与 transactionId 二选一)\n * @throws {WechatApiError} 参数错误、余额不足、订单不可退等失败\n */\n async refund(params: WechatRefundParams): Promise<WechatRefundResult> {\n const body: Record<string, any> = {\n out_trade_no: params.outTradeNo,\n transaction_id: params.transactionId,\n out_refund_no: params.outRefundNo,\n reason: params.reason,\n notify_url: params.notifyUrl ?? client.config.notifyUrl,\n funds_account: params.fundsAccount,\n amount: {\n refund: params.amount.refund,\n total: params.amount.total,\n currency: params.amount.currency ?? 'CNY'\n }\n }\n // 移除 undefined 字段\n for (const key of Object.keys(body)) {\n if (body[key] === undefined) delete body[key]\n }\n for (const key of Object.keys(body.amount)) {\n if ((body.amount as any)[key] === undefined) delete (body.amount as any)[key]\n }\n\n const { data } = await unwrapV3(client.sdk.v3.refund.domestic.refunds.post(body))\n return mapRefund(data)\n },\n\n /**\n * 查询退款(GET /v3/refund/domestic/refunds/{out_refund_no | refund_id})\n * @throws {WechatApiError} 退款单不存在等失败\n */\n async queryRefund(params: WechatRefundQueryParams): Promise<WechatRefundResult> {\n const id = params.refundId ?? params.outRefundNo\n if (!id) {\n throw new Error('WechatClient: queryRefund 需要 outRefundNo 或 refundId')\n }\n const { data } = await unwrapV3(\n client.sdk.client.request(`/v3/refund/domestic/refunds/${encodeURIComponent(id)}`, 'GET')\n )\n return mapRefund(data)\n }\n }\n}\n\n/** snake_case 响应映射 */\nfunction mapRefund(data: Record<string, any>): WechatRefundResult {\n return {\n refundId: data.refund_id,\n outRefundNo: data.out_refund_no,\n outTradeNo: data.out_trade_no,\n transactionId: data.transaction_id,\n status: data.status as WechatRefundStatus,\n refundAmount: data.amount?.refund,\n total: data.amount?.total,\n userReceivedAmount: data.amount?.user_received_amount,\n successTime: data.success_time,\n reason: data.reason\n }\n}\n","import { createInjectionKey, inject, type VobsContext, type VobsPlugin } from '@vobs/vobs'\r\nimport { WechatClient } from './client'\r\nimport type { WechatClientOptions } from './types'\r\n\r\nexport const WECHAT_KEY = createInjectionKey<WechatClient>('vobs.payment.wechat')\r\n\r\nexport interface WechatPluginOptions {\r\n /** 微信支付客户端配置(未传入 client 时必填) */\r\n config?: WechatClientOptions\r\n /** 可选的已有客户端实例(指定后忽略 config) */\r\n client?: WechatClient\r\n}\r\n\r\n/** 从 vobs 插件上下文获取微信支付客户端 */\r\nexport function useWechat(): WechatClient {\r\n const client = inject(WECHAT_KEY)\r\n if (!client) {\r\n throw new Error('Vobs Payment: 找不到 WechatClient,请安装 wechatPlugin')\r\n }\r\n return client\r\n}\r\n\r\n/**\r\n * 微信支付插件\r\n *\r\n * @example\r\n * ```ts\r\n * createVobs({\r\n * plugins: [\r\n * wechatPlugin({\r\n * config: {\r\n * mchid: '1900000000',\r\n * serial: '...',\r\n * privateKey: '...',\r\n * certs: { 'PUB_KEY_ID_xxx': '...' },\r\n * appid: 'wx1234567890',\r\n * apiv3Key: '...'\r\n * }\r\n * })\r\n * ]\r\n * })\r\n * ```\r\n */\r\nexport function wechatPlugin(options: WechatPluginOptions): VobsPlugin {\r\n return {\r\n name: '@vobs/payment/wechat',\r\n version: '0.1.0',\r\n install(context: VobsContext) {\r\n if (!options.client && !options.config) {\r\n throw new Error('Vobs Payment: wechatPlugin 需要提供 config 或 client 之一')\r\n }\r\n // 仅销毁插件自建的客户端;外部传入的实例由其所有者负责生命周期。\r\n const ownClient = !options.client\r\n const client = options.client ?? new WechatClient(options.config!)\r\n context.provide(WECHAT_KEY, client)\r\n return ownClient ? () => client.dispose() : undefined\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["sanitizeParams","createNotifyHandler","createRefund","Formatter","Rsa","createNotifyHandler","Formatter","Rsa","createRefund","createInjectionKey","inject","createInjectionKey","inject"]}
|