@vobs/payment 0.3.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +182 -0
- package/dist/alipay/client.cjs +112 -0
- package/dist/alipay/client.cjs.map +1 -0
- package/dist/alipay/client.d.cts +36 -0
- package/dist/alipay/client.d.ts +36 -0
- package/dist/alipay/client.js +110 -0
- package/dist/alipay/client.js.map +1 -0
- package/dist/alipay/config.cjs +67 -0
- package/dist/alipay/config.cjs.map +1 -0
- package/dist/alipay/config.d.cts +30 -0
- package/dist/alipay/config.d.ts +30 -0
- package/dist/alipay/config.js +65 -0
- package/dist/alipay/config.js.map +1 -0
- package/dist/alipay/index.cjs +592 -0
- package/dist/alipay/index.cjs.map +1 -0
- package/dist/alipay/index.d.cts +12 -0
- package/dist/alipay/index.d.ts +12 -0
- package/dist/alipay/index.js +580 -0
- package/dist/alipay/index.js.map +1 -0
- package/dist/alipay/notify.cjs +70 -0
- package/dist/alipay/notify.cjs.map +1 -0
- package/dist/alipay/notify.d.cts +52 -0
- package/dist/alipay/notify.d.ts +52 -0
- package/dist/alipay/notify.js +68 -0
- package/dist/alipay/notify.js.map +1 -0
- package/dist/alipay/payment.cjs +49 -0
- package/dist/alipay/payment.cjs.map +1 -0
- package/dist/alipay/payment.d.cts +24 -0
- package/dist/alipay/payment.d.ts +24 -0
- package/dist/alipay/payment.js +47 -0
- package/dist/alipay/payment.js.map +1 -0
- package/dist/alipay/plugin.cjs +300 -0
- package/dist/alipay/plugin.cjs.map +1 -0
- package/dist/alipay/plugin.d.cts +43 -0
- package/dist/alipay/plugin.d.ts +43 -0
- package/dist/alipay/plugin.js +296 -0
- package/dist/alipay/plugin.js.map +1 -0
- package/dist/alipay/query.cjs +80 -0
- package/dist/alipay/query.cjs.map +1 -0
- package/dist/alipay/query.d.cts +26 -0
- package/dist/alipay/query.d.ts +26 -0
- package/dist/alipay/query.js +78 -0
- package/dist/alipay/query.js.map +1 -0
- package/dist/alipay/refund.cjs +104 -0
- package/dist/alipay/refund.cjs.map +1 -0
- package/dist/alipay/refund.d.cts +32 -0
- package/dist/alipay/refund.d.ts +32 -0
- package/dist/alipay/refund.js +102 -0
- package/dist/alipay/refund.js.map +1 -0
- package/dist/alipay/response.cjs +38 -0
- package/dist/alipay/response.cjs.map +1 -0
- package/dist/alipay/response.d.cts +19 -0
- package/dist/alipay/response.d.ts +19 -0
- package/dist/alipay/response.js +35 -0
- package/dist/alipay/response.js.map +1 -0
- package/dist/alipay/types.cjs +4 -0
- package/dist/alipay/types.cjs.map +1 -0
- package/dist/alipay/types.d.cts +242 -0
- package/dist/alipay/types.d.ts +242 -0
- package/dist/alipay/types.js +3 -0
- package/dist/alipay/types.js.map +1 -0
- package/dist/alipay/wap.cjs +50 -0
- package/dist/alipay/wap.cjs.map +1 -0
- package/dist/alipay/wap.d.cts +24 -0
- package/dist/alipay/wap.d.ts +24 -0
- package/dist/alipay/wap.js +48 -0
- package/dist/alipay/wap.js.map +1 -0
- package/dist/index-B1aUR7Vt.d.ts +49 -0
- package/dist/index-B8pzZxGq.d.cts +44 -0
- package/dist/index-BWnIrwRi.d.ts +44 -0
- package/dist/index-Dyrkl86r.d.cts +49 -0
- package/dist/index.cjs +1071 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +23 -0
- package/dist/index.d.ts +23 -37
- package/dist/index.js +1052 -37
- package/dist/index.js.map +1 -0
- package/dist/wechat/client.cjs +119 -0
- package/dist/wechat/client.cjs.map +1 -0
- package/dist/wechat/client.d.cts +39 -0
- package/dist/wechat/client.d.ts +39 -0
- package/dist/wechat/client.js +117 -0
- package/dist/wechat/client.js.map +1 -0
- package/dist/wechat/config.cjs +76 -0
- package/dist/wechat/config.cjs.map +1 -0
- package/dist/wechat/config.d.cts +29 -0
- package/dist/wechat/config.d.ts +29 -0
- package/dist/wechat/config.js +74 -0
- package/dist/wechat/config.js.map +1 -0
- package/dist/wechat/index.cjs +612 -0
- package/dist/wechat/index.cjs.map +1 -0
- package/dist/wechat/index.d.cts +10 -0
- package/dist/wechat/index.d.ts +10 -0
- package/dist/wechat/index.js +602 -0
- package/dist/wechat/index.js.map +1 -0
- package/dist/wechat/notify.cjs +73 -0
- package/dist/wechat/notify.cjs.map +1 -0
- package/dist/wechat/notify.d.cts +53 -0
- package/dist/wechat/notify.d.ts +53 -0
- package/dist/wechat/notify.js +71 -0
- package/dist/wechat/notify.js.map +1 -0
- package/dist/wechat/payment.cjs +186 -0
- package/dist/wechat/payment.cjs.map +1 -0
- package/dist/wechat/payment.d.cts +50 -0
- package/dist/wechat/payment.d.ts +50 -0
- package/dist/wechat/payment.js +184 -0
- package/dist/wechat/payment.js.map +1 -0
- package/dist/wechat/plugin.cjs +305 -0
- package/dist/wechat/plugin.cjs.map +1 -0
- package/dist/wechat/plugin.d.cts +40 -0
- package/dist/wechat/plugin.d.ts +40 -0
- package/dist/wechat/plugin.js +301 -0
- package/dist/wechat/plugin.js.map +1 -0
- package/dist/wechat/refund.cjs +112 -0
- package/dist/wechat/refund.cjs.map +1 -0
- package/dist/wechat/refund.d.cts +26 -0
- package/dist/wechat/refund.d.ts +26 -0
- package/dist/wechat/refund.js +110 -0
- package/dist/wechat/refund.js.map +1 -0
- package/dist/wechat/response.cjs +50 -0
- package/dist/wechat/response.cjs.map +1 -0
- package/dist/wechat/response.d.cts +20 -0
- package/dist/wechat/response.d.ts +20 -0
- package/dist/wechat/response.js +46 -0
- package/dist/wechat/response.js.map +1 -0
- package/dist/wechat/types.cjs +4 -0
- package/dist/wechat/types.cjs.map +1 -0
- package/dist/wechat/types.d.cts +200 -0
- package/dist/wechat/types.d.ts +200 -0
- package/dist/wechat/types.js +3 -0
- package/dist/wechat/types.js.map +1 -0
- package/package.json +37 -28
- package/src/alipay/alipay.test.ts +231 -0
- package/src/alipay/client.ts +67 -0
- package/src/alipay/config.ts +72 -0
- package/src/alipay/index.ts +32 -0
- package/src/alipay/notify.ts +92 -0
- package/src/alipay/payment.ts +60 -0
- package/src/alipay/plugin.ts +64 -0
- package/src/alipay/query.ts +52 -0
- package/src/alipay/refund.ts +85 -0
- package/src/alipay/response.ts +40 -0
- package/src/alipay/types.ts +271 -0
- package/src/alipay/wap.ts +55 -0
- package/src/index.ts +78 -0
- package/src/wechat/client.ts +68 -0
- package/src/wechat/config.ts +81 -0
- package/src/wechat/index.ts +30 -0
- package/src/wechat/notify.ts +93 -0
- package/src/wechat/payment.ts +177 -0
- package/src/wechat/plugin.ts +59 -0
- package/src/wechat/refund.ts +80 -0
- package/src/wechat/response.ts +54 -0
- package/src/wechat/types.ts +223 -0
- package/src/wechat/wechat.test.ts +393 -0
- package/dist/alipay-official.d.ts +0 -34
- package/dist/alipay-official.js +0 -206
- package/dist/handlers.d.ts +0 -45
- package/dist/handlers.js +0 -105
- package/dist/jeepay.d.ts +0 -39
- package/dist/jeepay.js +0 -206
- package/dist/lakala.d.ts +0 -41
- package/dist/lakala.js +0 -243
- package/dist/manager.d.ts +0 -67
- package/dist/manager.js +0 -538
- package/dist/mock-driver.d.ts +0 -22
- package/dist/mock-driver.js +0 -59
- package/dist/state-machine.d.ts +0 -41
- package/dist/state-machine.js +0 -60
- package/dist/store.d.ts +0 -33
- package/dist/store.js +0 -76
- package/dist/types.d.ts +0 -168
- package/dist/types.js +0 -11
- package/dist/verify.d.ts +0 -34
- package/dist/verify.js +0 -55
- package/dist/wechat-official.d.ts +0 -40
- package/dist/wechat-official.js +0 -208
package/LICENSE
CHANGED
package/README.md
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# @vobs/payment
|
|
2
|
+
|
|
3
|
+
Payment integration SDK for the vobs framework: Alipay and WeChat payment adapters built on top of the official SDKs (alipay-sdk, wechatpay-axios-plugin), with vobs plugin registration support.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @vobs/payment alipay-sdk wechatpay-axios-plugin
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Exports
|
|
12
|
+
|
|
13
|
+
- `@vobs/payment/alipay` / `@vobs/payment/wechat`: provider-scoped imports (recommended).
|
|
14
|
+
- `@vobs/payment` root: flat exports of provider-unique symbols (`AlipayClient`, `wechatPlugin`, `WechatApiError`, ...) plus `alipay` / `wechat` namespaces for the shared factories (`createRefund`, `createNotifyHandler`, ...) whose names collide across providers.
|
|
15
|
+
|
|
16
|
+
## Quick start
|
|
17
|
+
|
|
18
|
+
### Standalone usage (without vobs framework)
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { AlipayClient, createPagePay } from '@vobs/payment/alipay'
|
|
22
|
+
|
|
23
|
+
const client = new AlipayClient({
|
|
24
|
+
appId: '202100...',
|
|
25
|
+
privateKey: '-----BEGIN PRIVATE KEY-----\n...',
|
|
26
|
+
alipayPublicKey: '-----BEGIN PUBLIC KEY-----\n...',
|
|
27
|
+
notifyUrl: 'https://your-domain.com/alipay/notify',
|
|
28
|
+
returnUrl: 'https://your-domain.com/order/123'
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const pagePay = createPagePay(client)
|
|
32
|
+
|
|
33
|
+
const { formHtml } = await pagePay.pay({
|
|
34
|
+
outTradeNo: 'ORDER2026090812345678',
|
|
35
|
+
totalAmount: '99.00',
|
|
36
|
+
subject: 'Premium Subscription'
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### With vobs plugin
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { createVobs } from '@vobs/vobs'
|
|
44
|
+
import { alipayPlugin, useAlipay } from '@vobs/payment'
|
|
45
|
+
|
|
46
|
+
const app = createVobs({
|
|
47
|
+
render: App,
|
|
48
|
+
plugins: [
|
|
49
|
+
alipayPlugin({
|
|
50
|
+
config: {
|
|
51
|
+
appId: '202100...',
|
|
52
|
+
privateKey: '...',
|
|
53
|
+
alipayPublicKey: '...',
|
|
54
|
+
notifyUrl: 'https://your-domain.com/alipay/notify'
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// In your component:
|
|
61
|
+
function CheckoutButton() {
|
|
62
|
+
const alipay = useAlipay()
|
|
63
|
+
const handlePay = async () => {
|
|
64
|
+
const { formHtml } = await alipay.pay({
|
|
65
|
+
outTradeNo: 'ORDER...',
|
|
66
|
+
totalAmount: '99.00',
|
|
67
|
+
subject: 'Premium Subscription'
|
|
68
|
+
})
|
|
69
|
+
// Render formHtml to redirect to Alipay
|
|
70
|
+
}
|
|
71
|
+
return <button onClick={handlePay}>Pay with Alipay</button>
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## API
|
|
76
|
+
|
|
77
|
+
### Alipay
|
|
78
|
+
|
|
79
|
+
| Signature | Description |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
| `AlipayClient(options)` | Wraps the official `AlipaySdk` instance with config validation and disposal. `client.sdk` exposes the underlying SDK. |
|
|
82
|
+
| `AlipayConfig` | Validated configuration: `appId`, `privateKey`, `alipayPublicKey`, `gateway`, `notifyUrl`, `returnUrl`, `keyType`, `timeout`. `AlipayConfig.forSandbox()` presets the sandbox gateway. |
|
|
83
|
+
| `createPagePay(client)` | Computer website payment (`alipay.trade.page.pay`). Returns the POST form HTML via `pageExecute()`. |
|
|
84
|
+
| `createQuery(client)` | Trade query (`alipay.trade.query`) with `isSuccessful()` helper. |
|
|
85
|
+
| `createRefund(client)` | Refund lifecycle: `refund()` (`alipay.trade.refund`), `queryRefund()` (`alipay.trade.fastpay.refund.query`), `close()` (`alipay.trade.close`). |
|
|
86
|
+
| `createNotifyHandler(client)` | Async notification helpers: `verify(params, raw?)` signature check, `validate(params, expected?)` business-field check, `successResponse()` / `failResponse()`. |
|
|
87
|
+
| `alipayPlugin(options)` | Vobs plugin that registers the Alipay client in the plugin context. Disposes only self-created clients on uninstall. |
|
|
88
|
+
| `useAlipay()` | Returns the Alipay client from the vobs plugin context. |
|
|
89
|
+
|
|
90
|
+
### Error handling
|
|
91
|
+
|
|
92
|
+
All gateway calls (`query`, `refund`, `queryRefund`, `close`) throw `AlipayApiError` when Alipay responds with a non-`10000` business code (e.g. `ACQ.TRADE_NOT_EXIST`):
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
import { AlipayApiError } from '@vobs/payment/alipay'
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
const result = await query.query({ outTradeNo: 'ORDER...' })
|
|
99
|
+
} catch (error) {
|
|
100
|
+
if (error instanceof AlipayApiError) {
|
|
101
|
+
error.code // e.g. '40004'
|
|
102
|
+
error.subCode // e.g. 'ACQ.TRADE_NOT_EXIST'
|
|
103
|
+
error.subMsg // human-readable reason
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
For async notifications, signature verification only proves the notification came from Alipay — always validate it against your own order records:
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
const notify = createNotifyHandler(client)
|
|
112
|
+
|
|
113
|
+
if (!notify.verify(params, true) /* raw mode recommended */) {
|
|
114
|
+
return notify.failResponse()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const check = notify.validate(params, {
|
|
118
|
+
outTradeNo: 'ORDER...', // from your order store
|
|
119
|
+
totalAmount: '99.00'
|
|
120
|
+
})
|
|
121
|
+
if (!check.valid) {
|
|
122
|
+
return notify.failResponse()
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Idempotent business handling is the caller's responsibility (dedupe by notifyId).
|
|
126
|
+
return notify.successResponse() // exactly "success"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### WeChat
|
|
130
|
+
|
|
131
|
+
| Signature | Description |
|
|
132
|
+
| --- | --- |
|
|
133
|
+
| `WechatClient(options)` | Wraps the official `wechatpay-axios-plugin` `Wechatpay` instance (`mchid`, `serial`, `privateKey`, `certs`, `appid`, `apiv3Key`, `notifyUrl`). `client.sdk` exposes the chained API. |
|
|
134
|
+
| `WechatConfig` | Validated configuration; `apiv3Key` must be a 32-byte string. |
|
|
135
|
+
| `createPayment(client)` | `jsapiPay()` (JSAPI / mini-program, returns signed `wx.requestPayment` params), `appPay()` (APP SDK params), `nativePay()` (returns `codeUrl` QR link), `h5Pay()` (returns `h5Url`, requires `payerClientIp`), `query()` by `outTradeNo` or `transactionId`. |
|
|
136
|
+
| `createRefund(client)` | `refund()` (`POST /v3/refund/domestic/refunds`), `queryRefund()` by `outRefundNo` or `refundId`. |
|
|
137
|
+
| `createNotifyHandler(client)` | `verify(headers, body)` (platform-cert / public-key signature check on the RAW body), `decrypt(resource)` (AES-256-GCM with `apiv3Key`), `validate(payload, expected)`, `successResponse()` / `failResponse()`. |
|
|
138
|
+
| `wechatPlugin(options)` / `useWechat()` | Vobs plugin registering the WeChat client; disposes only self-created clients. |
|
|
139
|
+
|
|
140
|
+
#### Error handling
|
|
141
|
+
|
|
142
|
+
Gateway failures throw `WechatApiError` with `status` (HTTP code) and `code` (e.g. `PARAM_ERROR`, `RESOURCE_NOT_EXISTS`):
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
import { WechatApiError } from '@vobs/payment'
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
const result = await payment.jsapiPay({ outTradeNo: 'ORDER...', description: '...', amount: { total: 9900 }, openid: '...' })
|
|
149
|
+
} catch (error) {
|
|
150
|
+
if (error instanceof WechatApiError) {
|
|
151
|
+
error.status // e.g. 400
|
|
152
|
+
error.code // e.g. 'PARAM_ERROR'
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Notifications require signature verification on the **raw** body plus merchant-side order matching:
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
import { createNotifyHandler } from '@vobs/payment/wechat'
|
|
161
|
+
|
|
162
|
+
const notify = createNotifyHandler(wechatClient)
|
|
163
|
+
|
|
164
|
+
if (!notify.verify(headers, rawBody)) {
|
|
165
|
+
return notify.failResponse('签名校验失败')
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const payload = notify.decrypt(resource)
|
|
169
|
+
const check = notify.validate(payload, { outTradeNo: 'ORDER...', total: 9900 })
|
|
170
|
+
if (!check.valid) {
|
|
171
|
+
return notify.failResponse(check.errors.join('; '))
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Idempotent business handling is the caller's responsibility (dedupe by notification id).
|
|
175
|
+
return notify.successResponse() // {"code":"SUCCESS"}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Amounts in the WeChat v3 API are integers in **fen** (分).
|
|
179
|
+
|
|
180
|
+
## Types
|
|
181
|
+
|
|
182
|
+
AlipayClientOptions, AlipayKeyType, TradeStatus, AlipayPagePayConfig, AlipayPagePayParams, AlipayPagePayResult, AlipayQueryParams, AlipayQueryResult, AlipayRefundParams, AlipayRefundResult, AlipayRefundQueryParams, AlipayRefundQueryResult, AlipayCloseParams, AlipayCloseResult, AlipayNotifyParams, AlipayPluginOptions
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var alipaySdk = require('alipay-sdk');
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
|
|
8
|
+
// packages/payment/src/alipay/config.ts
|
|
9
|
+
var _AlipayConfig = class _AlipayConfig {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.validate(options);
|
|
12
|
+
this._options = { ...options };
|
|
13
|
+
}
|
|
14
|
+
/** 获取完整配置 */
|
|
15
|
+
get options() {
|
|
16
|
+
return this._options;
|
|
17
|
+
}
|
|
18
|
+
/** 应用 ID */
|
|
19
|
+
get appId() {
|
|
20
|
+
return this._options.appId;
|
|
21
|
+
}
|
|
22
|
+
/** 网关地址 */
|
|
23
|
+
get gateway() {
|
|
24
|
+
return this._options.gateway ?? "https://openapi.alipay.com/gateway.do";
|
|
25
|
+
}
|
|
26
|
+
/** 异步通知地址 */
|
|
27
|
+
get notifyUrl() {
|
|
28
|
+
return this._options.notifyUrl;
|
|
29
|
+
}
|
|
30
|
+
/** 同步跳转地址 */
|
|
31
|
+
get returnUrl() {
|
|
32
|
+
return this._options.returnUrl;
|
|
33
|
+
}
|
|
34
|
+
/** 更新配置(部分更新) */
|
|
35
|
+
update(patch) {
|
|
36
|
+
const merged = { ...this._options, ...patch };
|
|
37
|
+
this.validate(merged);
|
|
38
|
+
this._options = merged;
|
|
39
|
+
}
|
|
40
|
+
/** 替换配置 */
|
|
41
|
+
replace(options) {
|
|
42
|
+
this.validate(options);
|
|
43
|
+
this._options = { ...options };
|
|
44
|
+
}
|
|
45
|
+
/** 创建沙箱配置的快捷方法 */
|
|
46
|
+
static forSandbox(options) {
|
|
47
|
+
return new _AlipayConfig({
|
|
48
|
+
...options,
|
|
49
|
+
gateway: "https://openapi-sandbox.dl.alipaydev.com/gateway.do"
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
validate(options) {
|
|
53
|
+
if (!options.appId) {
|
|
54
|
+
throw new Error("AlipayConfig: appId \u4E0D\u80FD\u4E3A\u7A7A");
|
|
55
|
+
}
|
|
56
|
+
if (!options.privateKey) {
|
|
57
|
+
throw new Error("AlipayConfig: privateKey \u4E0D\u80FD\u4E3A\u7A7A");
|
|
58
|
+
}
|
|
59
|
+
if (!options.alipayPublicKey) {
|
|
60
|
+
throw new Error("AlipayConfig: alipayPublicKey \u4E0D\u80FD\u4E3A\u7A7A");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
__name(_AlipayConfig, "AlipayConfig");
|
|
65
|
+
var AlipayConfig = _AlipayConfig;
|
|
66
|
+
|
|
67
|
+
// packages/payment/src/alipay/client.ts
|
|
68
|
+
var _AlipayClient = class _AlipayClient {
|
|
69
|
+
constructor(options) {
|
|
70
|
+
this._disposed = false;
|
|
71
|
+
this.config = new AlipayConfig(options);
|
|
72
|
+
this._sdk = this.createSdk(options);
|
|
73
|
+
}
|
|
74
|
+
/** 获取底层 AlipaySdk 实例 */
|
|
75
|
+
get sdk() {
|
|
76
|
+
this.ensureActive();
|
|
77
|
+
return this._sdk;
|
|
78
|
+
}
|
|
79
|
+
/** 更新配置并重建 SDK 实例 */
|
|
80
|
+
updateConfig(patch) {
|
|
81
|
+
this.ensureActive();
|
|
82
|
+
this.config.update(patch);
|
|
83
|
+
this._sdk = this.createSdk(this.config.options);
|
|
84
|
+
}
|
|
85
|
+
/** 销毁客户端 */
|
|
86
|
+
dispose() {
|
|
87
|
+
this._disposed = true;
|
|
88
|
+
this._sdk = null;
|
|
89
|
+
}
|
|
90
|
+
createSdk(options) {
|
|
91
|
+
return new alipaySdk.AlipaySdk({
|
|
92
|
+
appId: options.appId,
|
|
93
|
+
privateKey: options.privateKey,
|
|
94
|
+
alipayPublicKey: options.alipayPublicKey,
|
|
95
|
+
signType: options.signType ?? "RSA2",
|
|
96
|
+
gateway: options.gateway,
|
|
97
|
+
timeout: options.timeout ?? 5e3,
|
|
98
|
+
keyType: options.keyType ?? "PKCS1"
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
ensureActive() {
|
|
102
|
+
if (this._disposed) {
|
|
103
|
+
throw new Error("AlipayClient: \u5BA2\u6237\u7AEF\u5DF2\u9500\u6BC1");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
__name(_AlipayClient, "AlipayClient");
|
|
108
|
+
var AlipayClient = _AlipayClient;
|
|
109
|
+
|
|
110
|
+
exports.AlipayClient = AlipayClient;
|
|
111
|
+
//# sourceMappingURL=client.cjs.map
|
|
112
|
+
//# sourceMappingURL=client.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/alipay/config.ts","../../src/alipay/client.ts"],"names":["AlipaySdk"],"mappings":"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","file":"client.cjs","sourcesContent":["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}"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AlipaySdk } from 'alipay-sdk';
|
|
2
|
+
import { AlipayConfig } from './config.cjs';
|
|
3
|
+
import { AlipayClientOptions } from './types.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 支付宝客户端封装
|
|
7
|
+
*
|
|
8
|
+
* 封装 alipay-sdk 的 AlipaySdk 实例,提供统一的生命周期管理。
|
|
9
|
+
* 可独立使用,也可通过 alipayPlugin 注册到 vobs 框架。
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const client = new AlipayClient({
|
|
14
|
+
* appId: '202100...',
|
|
15
|
+
* privateKey: '...',
|
|
16
|
+
* alipayPublicKey: '...',
|
|
17
|
+
* gateway: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do'
|
|
18
|
+
* })
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare class AlipayClient {
|
|
22
|
+
readonly config: AlipayConfig;
|
|
23
|
+
private _sdk;
|
|
24
|
+
private _disposed;
|
|
25
|
+
constructor(options: AlipayClientOptions);
|
|
26
|
+
/** 获取底层 AlipaySdk 实例 */
|
|
27
|
+
get sdk(): AlipaySdk;
|
|
28
|
+
/** 更新配置并重建 SDK 实例 */
|
|
29
|
+
updateConfig(patch: Partial<AlipayClientOptions>): void;
|
|
30
|
+
/** 销毁客户端 */
|
|
31
|
+
dispose(): void;
|
|
32
|
+
private createSdk;
|
|
33
|
+
private ensureActive;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { AlipayClient };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AlipaySdk } from 'alipay-sdk';
|
|
2
|
+
import { AlipayConfig } from './config.js';
|
|
3
|
+
import { AlipayClientOptions } from './types.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 支付宝客户端封装
|
|
7
|
+
*
|
|
8
|
+
* 封装 alipay-sdk 的 AlipaySdk 实例,提供统一的生命周期管理。
|
|
9
|
+
* 可独立使用,也可通过 alipayPlugin 注册到 vobs 框架。
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const client = new AlipayClient({
|
|
14
|
+
* appId: '202100...',
|
|
15
|
+
* privateKey: '...',
|
|
16
|
+
* alipayPublicKey: '...',
|
|
17
|
+
* gateway: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do'
|
|
18
|
+
* })
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare class AlipayClient {
|
|
22
|
+
readonly config: AlipayConfig;
|
|
23
|
+
private _sdk;
|
|
24
|
+
private _disposed;
|
|
25
|
+
constructor(options: AlipayClientOptions);
|
|
26
|
+
/** 获取底层 AlipaySdk 实例 */
|
|
27
|
+
get sdk(): AlipaySdk;
|
|
28
|
+
/** 更新配置并重建 SDK 实例 */
|
|
29
|
+
updateConfig(patch: Partial<AlipayClientOptions>): void;
|
|
30
|
+
/** 销毁客户端 */
|
|
31
|
+
dispose(): void;
|
|
32
|
+
private createSdk;
|
|
33
|
+
private ensureActive;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { AlipayClient };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { AlipaySdk } from 'alipay-sdk';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
|
|
6
|
+
// packages/payment/src/alipay/config.ts
|
|
7
|
+
var _AlipayConfig = class _AlipayConfig {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.validate(options);
|
|
10
|
+
this._options = { ...options };
|
|
11
|
+
}
|
|
12
|
+
/** 获取完整配置 */
|
|
13
|
+
get options() {
|
|
14
|
+
return this._options;
|
|
15
|
+
}
|
|
16
|
+
/** 应用 ID */
|
|
17
|
+
get appId() {
|
|
18
|
+
return this._options.appId;
|
|
19
|
+
}
|
|
20
|
+
/** 网关地址 */
|
|
21
|
+
get gateway() {
|
|
22
|
+
return this._options.gateway ?? "https://openapi.alipay.com/gateway.do";
|
|
23
|
+
}
|
|
24
|
+
/** 异步通知地址 */
|
|
25
|
+
get notifyUrl() {
|
|
26
|
+
return this._options.notifyUrl;
|
|
27
|
+
}
|
|
28
|
+
/** 同步跳转地址 */
|
|
29
|
+
get returnUrl() {
|
|
30
|
+
return this._options.returnUrl;
|
|
31
|
+
}
|
|
32
|
+
/** 更新配置(部分更新) */
|
|
33
|
+
update(patch) {
|
|
34
|
+
const merged = { ...this._options, ...patch };
|
|
35
|
+
this.validate(merged);
|
|
36
|
+
this._options = merged;
|
|
37
|
+
}
|
|
38
|
+
/** 替换配置 */
|
|
39
|
+
replace(options) {
|
|
40
|
+
this.validate(options);
|
|
41
|
+
this._options = { ...options };
|
|
42
|
+
}
|
|
43
|
+
/** 创建沙箱配置的快捷方法 */
|
|
44
|
+
static forSandbox(options) {
|
|
45
|
+
return new _AlipayConfig({
|
|
46
|
+
...options,
|
|
47
|
+
gateway: "https://openapi-sandbox.dl.alipaydev.com/gateway.do"
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
validate(options) {
|
|
51
|
+
if (!options.appId) {
|
|
52
|
+
throw new Error("AlipayConfig: appId \u4E0D\u80FD\u4E3A\u7A7A");
|
|
53
|
+
}
|
|
54
|
+
if (!options.privateKey) {
|
|
55
|
+
throw new Error("AlipayConfig: privateKey \u4E0D\u80FD\u4E3A\u7A7A");
|
|
56
|
+
}
|
|
57
|
+
if (!options.alipayPublicKey) {
|
|
58
|
+
throw new Error("AlipayConfig: alipayPublicKey \u4E0D\u80FD\u4E3A\u7A7A");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
__name(_AlipayConfig, "AlipayConfig");
|
|
63
|
+
var AlipayConfig = _AlipayConfig;
|
|
64
|
+
|
|
65
|
+
// packages/payment/src/alipay/client.ts
|
|
66
|
+
var _AlipayClient = class _AlipayClient {
|
|
67
|
+
constructor(options) {
|
|
68
|
+
this._disposed = false;
|
|
69
|
+
this.config = new AlipayConfig(options);
|
|
70
|
+
this._sdk = this.createSdk(options);
|
|
71
|
+
}
|
|
72
|
+
/** 获取底层 AlipaySdk 实例 */
|
|
73
|
+
get sdk() {
|
|
74
|
+
this.ensureActive();
|
|
75
|
+
return this._sdk;
|
|
76
|
+
}
|
|
77
|
+
/** 更新配置并重建 SDK 实例 */
|
|
78
|
+
updateConfig(patch) {
|
|
79
|
+
this.ensureActive();
|
|
80
|
+
this.config.update(patch);
|
|
81
|
+
this._sdk = this.createSdk(this.config.options);
|
|
82
|
+
}
|
|
83
|
+
/** 销毁客户端 */
|
|
84
|
+
dispose() {
|
|
85
|
+
this._disposed = true;
|
|
86
|
+
this._sdk = null;
|
|
87
|
+
}
|
|
88
|
+
createSdk(options) {
|
|
89
|
+
return new AlipaySdk({
|
|
90
|
+
appId: options.appId,
|
|
91
|
+
privateKey: options.privateKey,
|
|
92
|
+
alipayPublicKey: options.alipayPublicKey,
|
|
93
|
+
signType: options.signType ?? "RSA2",
|
|
94
|
+
gateway: options.gateway,
|
|
95
|
+
timeout: options.timeout ?? 5e3,
|
|
96
|
+
keyType: options.keyType ?? "PKCS1"
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
ensureActive() {
|
|
100
|
+
if (this._disposed) {
|
|
101
|
+
throw new Error("AlipayClient: \u5BA2\u6237\u7AEF\u5DF2\u9500\u6BC1");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
__name(_AlipayClient, "AlipayClient");
|
|
106
|
+
var AlipayClient = _AlipayClient;
|
|
107
|
+
|
|
108
|
+
export { AlipayClient };
|
|
109
|
+
//# sourceMappingURL=client.js.map
|
|
110
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/alipay/config.ts","../../src/alipay/client.ts"],"names":[],"mappings":"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","file":"client.js","sourcesContent":["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}"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
|
|
6
|
+
// packages/payment/src/alipay/config.ts
|
|
7
|
+
var _AlipayConfig = class _AlipayConfig {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.validate(options);
|
|
10
|
+
this._options = { ...options };
|
|
11
|
+
}
|
|
12
|
+
/** 获取完整配置 */
|
|
13
|
+
get options() {
|
|
14
|
+
return this._options;
|
|
15
|
+
}
|
|
16
|
+
/** 应用 ID */
|
|
17
|
+
get appId() {
|
|
18
|
+
return this._options.appId;
|
|
19
|
+
}
|
|
20
|
+
/** 网关地址 */
|
|
21
|
+
get gateway() {
|
|
22
|
+
return this._options.gateway ?? "https://openapi.alipay.com/gateway.do";
|
|
23
|
+
}
|
|
24
|
+
/** 异步通知地址 */
|
|
25
|
+
get notifyUrl() {
|
|
26
|
+
return this._options.notifyUrl;
|
|
27
|
+
}
|
|
28
|
+
/** 同步跳转地址 */
|
|
29
|
+
get returnUrl() {
|
|
30
|
+
return this._options.returnUrl;
|
|
31
|
+
}
|
|
32
|
+
/** 更新配置(部分更新) */
|
|
33
|
+
update(patch) {
|
|
34
|
+
const merged = { ...this._options, ...patch };
|
|
35
|
+
this.validate(merged);
|
|
36
|
+
this._options = merged;
|
|
37
|
+
}
|
|
38
|
+
/** 替换配置 */
|
|
39
|
+
replace(options) {
|
|
40
|
+
this.validate(options);
|
|
41
|
+
this._options = { ...options };
|
|
42
|
+
}
|
|
43
|
+
/** 创建沙箱配置的快捷方法 */
|
|
44
|
+
static forSandbox(options) {
|
|
45
|
+
return new _AlipayConfig({
|
|
46
|
+
...options,
|
|
47
|
+
gateway: "https://openapi-sandbox.dl.alipaydev.com/gateway.do"
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
validate(options) {
|
|
51
|
+
if (!options.appId) {
|
|
52
|
+
throw new Error("AlipayConfig: appId \u4E0D\u80FD\u4E3A\u7A7A");
|
|
53
|
+
}
|
|
54
|
+
if (!options.privateKey) {
|
|
55
|
+
throw new Error("AlipayConfig: privateKey \u4E0D\u80FD\u4E3A\u7A7A");
|
|
56
|
+
}
|
|
57
|
+
if (!options.alipayPublicKey) {
|
|
58
|
+
throw new Error("AlipayConfig: alipayPublicKey \u4E0D\u80FD\u4E3A\u7A7A");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
__name(_AlipayConfig, "AlipayConfig");
|
|
63
|
+
var AlipayConfig = _AlipayConfig;
|
|
64
|
+
|
|
65
|
+
exports.AlipayConfig = AlipayConfig;
|
|
66
|
+
//# sourceMappingURL=config.cjs.map
|
|
67
|
+
//# sourceMappingURL=config.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/alipay/config.ts"],"names":[],"mappings":";;;;;;AAMO,IAAM,aAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAGxB,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,OAAA,EAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAI,OAAA,GAAyC;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,KAAA,GAAgB;AAClB,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,SAAS,OAAA,IAAW,uCAAA;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,SAAA,GAAgC;AAClC,IAAA,OAAO,KAAK,QAAA,CAAS,SAAA;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,SAAA,GAAgC;AAClC,IAAA,OAAO,KAAK,QAAA,CAAS,SAAA;AAAA,EACvB;AAAA;AAAA,EAGA,OAAO,KAAA,EAA2C;AAChD,IAAA,MAAM,SAAS,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,KAAA,EAAM;AAC5C,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAAA,EAClB;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAoC;AAC1C,IAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,OAAA,EAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,OAAO,WAAW,OAAA,EAA6D;AAC7E,IAAA,OAAO,IAAI,aAAA,CAAa;AAAA,MACtB,GAAG,OAAA;AAAA,MACH,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA,EAEQ,SAAS,OAAA,EAAoC;AACnD,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,MAAM,IAAI,MAAM,8CAA0B,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,MAAA,MAAM,IAAI,MAAM,mDAA+B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,MAAA,MAAM,IAAI,MAAM,wDAAoC,CAAA;AAAA,IACtD;AAAA,EACF;AACF,CAAA;AAjE0B,MAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAnB,IAAM,YAAA,GAAN","file":"config.cjs","sourcesContent":["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}"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AlipayClientOptions } from './types.cjs';
|
|
2
|
+
import 'alipay-sdk';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 支付宝配置管理
|
|
6
|
+
* 遵循 vobs 生命周期管理:可创建、可销毁、可替换
|
|
7
|
+
*/
|
|
8
|
+
declare class AlipayConfig {
|
|
9
|
+
private _options;
|
|
10
|
+
constructor(options: AlipayClientOptions);
|
|
11
|
+
/** 获取完整配置 */
|
|
12
|
+
get options(): Readonly<AlipayClientOptions>;
|
|
13
|
+
/** 应用 ID */
|
|
14
|
+
get appId(): string;
|
|
15
|
+
/** 网关地址 */
|
|
16
|
+
get gateway(): string;
|
|
17
|
+
/** 异步通知地址 */
|
|
18
|
+
get notifyUrl(): string | undefined;
|
|
19
|
+
/** 同步跳转地址 */
|
|
20
|
+
get returnUrl(): string | undefined;
|
|
21
|
+
/** 更新配置(部分更新) */
|
|
22
|
+
update(patch: Partial<AlipayClientOptions>): void;
|
|
23
|
+
/** 替换配置 */
|
|
24
|
+
replace(options: AlipayClientOptions): void;
|
|
25
|
+
/** 创建沙箱配置的快捷方法 */
|
|
26
|
+
static forSandbox(options: Omit<AlipayClientOptions, 'gateway'>): AlipayConfig;
|
|
27
|
+
private validate;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { AlipayConfig };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AlipayClientOptions } from './types.js';
|
|
2
|
+
import 'alipay-sdk';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 支付宝配置管理
|
|
6
|
+
* 遵循 vobs 生命周期管理:可创建、可销毁、可替换
|
|
7
|
+
*/
|
|
8
|
+
declare class AlipayConfig {
|
|
9
|
+
private _options;
|
|
10
|
+
constructor(options: AlipayClientOptions);
|
|
11
|
+
/** 获取完整配置 */
|
|
12
|
+
get options(): Readonly<AlipayClientOptions>;
|
|
13
|
+
/** 应用 ID */
|
|
14
|
+
get appId(): string;
|
|
15
|
+
/** 网关地址 */
|
|
16
|
+
get gateway(): string;
|
|
17
|
+
/** 异步通知地址 */
|
|
18
|
+
get notifyUrl(): string | undefined;
|
|
19
|
+
/** 同步跳转地址 */
|
|
20
|
+
get returnUrl(): string | undefined;
|
|
21
|
+
/** 更新配置(部分更新) */
|
|
22
|
+
update(patch: Partial<AlipayClientOptions>): void;
|
|
23
|
+
/** 替换配置 */
|
|
24
|
+
replace(options: AlipayClientOptions): void;
|
|
25
|
+
/** 创建沙箱配置的快捷方法 */
|
|
26
|
+
static forSandbox(options: Omit<AlipayClientOptions, 'gateway'>): AlipayConfig;
|
|
27
|
+
private validate;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { AlipayConfig };
|