@sunbay/checkout-sdk-js 0.0.0-stage → 0.0.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/index.cjs +1149 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +467 -0
- package/dist/index.d.ts +467 -0
- package/dist/index.global.js +1246 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.mjs +1133 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +32 -3
- package/README.md +0 -3
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { ElementType, CommandName, EventName, ElementOptions, Appearance, ElementStatus, AvailableWallets, PublicSessionView, ConfirmReq, PaymentOutcome, GetPaymentStatusResp, PaymentMethodFilter } from '@sunbay/checkout-sdk-protocol';
|
|
2
|
+
export { AddressElementOptions, AddressInfo, Appearance, CardElementOptions, CardFieldElementOptions, CheckoutError, CheckoutErrorCategory, ElementOptions, ElementStatus, ElementType, ErrorCode, ErrorCodeValue, ExpressCheckoutElementOptions, PaymentMethod, PaymentMethodFilter, PaymentOutcome, PublicPaymentMethod, PublicProductLine, PublicSessionView, TxnStatus } from '@sunbay/checkout-sdk-protocol';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* CheckoutElement —— 商户侧 Element 句柄(spec 6)。
|
|
6
|
+
*
|
|
7
|
+
* 职责:
|
|
8
|
+
* - 由 `CheckoutInstance.create` 构造(单测时以 mock transport + 构造参注入)。
|
|
9
|
+
* - 在商户 DOM 目标挂载**可见** iframe,并通过 transport 转发 Element 命令。
|
|
10
|
+
* - 维护状态机 `created → loading → ready → destroyed`(`loadError` 为旁支)。
|
|
11
|
+
* - 订阅 transport 的 `elementReady` / `loadError` 事件,按**自身 elementId** 过滤,
|
|
12
|
+
* 驱动 `mount()` 的 resolve / reject。
|
|
13
|
+
*
|
|
14
|
+
* 安全约束(AGENTS/spec):本层只做 DOM 挂载与协议命令转发,**绝不触碰卡值**。
|
|
15
|
+
* 卡数据仅存在于托管 iframe 内,不经由本句柄或 transport 传输。
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* transport 依赖的最小接口(由 MainFrameTransport 满足)。
|
|
20
|
+
*
|
|
21
|
+
* 仅声明 Element 句柄需要的方法,便于单测注入 mock。
|
|
22
|
+
*/
|
|
23
|
+
interface ElementTransport {
|
|
24
|
+
request(name: CommandName, payload: unknown): Promise<unknown>;
|
|
25
|
+
on(event: EventName, handler: (payload: unknown) => void): void;
|
|
26
|
+
off(event: EventName, handler: (payload: unknown) => void): void;
|
|
27
|
+
}
|
|
28
|
+
/** CheckoutElement 构造参数(由 CheckoutInstance.create 组装)。 */
|
|
29
|
+
interface CheckoutElementOptions {
|
|
30
|
+
/** Element 唯一 id(由实例生成,用于命令/事件配对)。 */
|
|
31
|
+
elementId: string;
|
|
32
|
+
/** Element 类型(决定 iframe 路径与可用动作)。 */
|
|
33
|
+
type: ElementType;
|
|
34
|
+
/** 托管页面 origin(不带尾部斜杠)。 */
|
|
35
|
+
hostOrigin: string;
|
|
36
|
+
/**
|
|
37
|
+
* 当前 checkout 会话 id。随 iframe src 以 `?checkoutId=` 下发,供托管字段/element
|
|
38
|
+
* iframe 加入正确的同源信令频道(`sunbay-checkout:<checkoutId>`)与 main 配对;
|
|
39
|
+
* 缺失会导致字段频道名不匹配、永不就绪。
|
|
40
|
+
*/
|
|
41
|
+
checkoutId: string;
|
|
42
|
+
/** 传输层。 */
|
|
43
|
+
transport: ElementTransport;
|
|
44
|
+
/** 初始 Element 配置(随 createElement 下发)。 */
|
|
45
|
+
initialOptions?: ElementOptions;
|
|
46
|
+
/**
|
|
47
|
+
* 句柄销毁回调(由 CheckoutInstance 注入)。`destroy()` 成功销毁时以本 elementId 调用,
|
|
48
|
+
* 使实例从互斥注册表(elements Map)移除自身,从而允许销毁后重建同类互斥 Element
|
|
49
|
+
* (如切换 expressCheckout 的 buttonType/buttonHeight 需重建 iframe)。`unmount()` 不调用
|
|
50
|
+
* (保留句柄、仍占名额、可 remount)。
|
|
51
|
+
*/
|
|
52
|
+
onDestroy?: (elementId: string) => void;
|
|
53
|
+
/**
|
|
54
|
+
* 初始配色方案(来自 createCheckout 的 appearance.colorScheme)。
|
|
55
|
+
* 仅当提供时拼进 iframe src 的 `&colorScheme=<值>`,使托管 iframe 在首帧即按该
|
|
56
|
+
* 配色渲染(无闪)。缺省时不拼接,由托管侧按默认(light)处理。运行时切换走
|
|
57
|
+
* updateCheckout 命令,不走此处。
|
|
58
|
+
*/
|
|
59
|
+
colorScheme?: 'light' | 'dark' | 'auto';
|
|
60
|
+
/**
|
|
61
|
+
* 初始外观定制(来自 createCheckout 的 appearance)。
|
|
62
|
+
* 仅当含 `variables` 或 `rules` 时序列化进 iframe src 的
|
|
63
|
+
* `&appearance=<encodeURIComponent(JSON)>`,使托管 iframe 在首帧即按该外观渲染(无闪)。
|
|
64
|
+
* 仅含 `colorScheme`(无 variables/rules)时不拼接,避免空外观字符串;colorScheme 走独立
|
|
65
|
+
* `&colorScheme=`。运行时切换走 updateCheckout 命令,不走此处。
|
|
66
|
+
*/
|
|
67
|
+
appearance?: Appearance;
|
|
68
|
+
}
|
|
69
|
+
declare class CheckoutElement {
|
|
70
|
+
/** Element 唯一 id。 */
|
|
71
|
+
readonly elementId: string;
|
|
72
|
+
/** Element 类型。 */
|
|
73
|
+
readonly type: ElementType;
|
|
74
|
+
/** 地址 Element 的 mode(billing/shipping;仅 address 有意义),供实例按 mode 判互斥。 */
|
|
75
|
+
readonly mode: string | undefined;
|
|
76
|
+
private readonly hostOrigin;
|
|
77
|
+
private readonly checkoutId;
|
|
78
|
+
private readonly transport;
|
|
79
|
+
private options;
|
|
80
|
+
/** 初始配色方案(拼进 iframe src;缺省不拼)。 */
|
|
81
|
+
private readonly colorScheme;
|
|
82
|
+
/** 初始外观定制(含 variables/rules 时拼进 iframe src;缺省或仅 colorScheme 不拼)。 */
|
|
83
|
+
private readonly appearance;
|
|
84
|
+
/** 销毁回调(实例注入):destroy() 末尾调用,使实例从互斥注册表移除自身以释放名额。 */
|
|
85
|
+
private readonly onDestroy;
|
|
86
|
+
private status;
|
|
87
|
+
private container;
|
|
88
|
+
private iframe;
|
|
89
|
+
/** mount 期间临时订阅的事件 handler(resolve/reject 后解绑)。 */
|
|
90
|
+
private readyHandler;
|
|
91
|
+
private loadErrorHandler;
|
|
92
|
+
/**
|
|
93
|
+
* 仅 expressCheckout:各钱包可用性快照。
|
|
94
|
+
* 初次来自 elementReady.availableWallets,之后随 expressAvailabilityChange 更新。
|
|
95
|
+
*/
|
|
96
|
+
private availableWallets;
|
|
97
|
+
/** 仅 expressCheckout:常驻订阅的 expressAvailabilityChange handler(destroy 时解绑)。 */
|
|
98
|
+
private availabilityHandler;
|
|
99
|
+
/**
|
|
100
|
+
* iframe 自适应高度:挂载期间常驻的 window 'message' 监听器(iframe 消失/销毁时解绑)。
|
|
101
|
+
* 存引用以便 removeEventListener;null 表示未监听。
|
|
102
|
+
*/
|
|
103
|
+
private resizeHandler;
|
|
104
|
+
/** 最近一次已应用的 iframe 高度(px),用于去重,避免冗余 style 写入;null 表示尚未设置。 */
|
|
105
|
+
private lastHeight;
|
|
106
|
+
constructor(opts: CheckoutElementOptions);
|
|
107
|
+
/** 当前状态(只读快照,供外部/测试观测)。 */
|
|
108
|
+
getStatus(): ElementStatus;
|
|
109
|
+
/**
|
|
110
|
+
* 仅 expressCheckout:返回当前各钱包可用性快照(其他类型恒为 undefined)。
|
|
111
|
+
*
|
|
112
|
+
* 初值来自 elementReady 的 availableWallets,之后由 expressAvailabilityChange 更新。
|
|
113
|
+
*
|
|
114
|
+
* @returns 可用性快照;尚未就绪或非 express 时为 undefined。
|
|
115
|
+
*/
|
|
116
|
+
getAvailableWallets(): AvailableWallets | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* 挂载到商户 DOM 目标:插入可见 iframe、发 createElement、等 elementReady。
|
|
119
|
+
*
|
|
120
|
+
* @param selectorOrEl - CSS 选择器或 HTMLElement 容器;容器须唯一且为空。
|
|
121
|
+
* @returns elementReady 后 resolve;失败移除节点并 reject(loadError / INVALID_OPTIONS)。
|
|
122
|
+
* @throws 已销毁时抛 INSTANCE_DESTROYED。
|
|
123
|
+
* @example
|
|
124
|
+
* await element.mount('#card-field');
|
|
125
|
+
*/
|
|
126
|
+
mount(selectorOrEl: string | HTMLElement): Promise<void>;
|
|
127
|
+
/**
|
|
128
|
+
* 卸载:发 destroyElement、移除 iframe;幂等;保留句柄与配置。
|
|
129
|
+
*
|
|
130
|
+
* @returns 完成后 resolve(未挂载时直接 resolve)。
|
|
131
|
+
* @throws 已销毁时抛 INSTANCE_DESTROYED。
|
|
132
|
+
*/
|
|
133
|
+
unmount(): Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* 销毁句柄:幂等;移除 iframe;此后非 destroy/off 调用抛 INSTANCE_DESTROYED。
|
|
136
|
+
*/
|
|
137
|
+
destroy(): void;
|
|
138
|
+
/**
|
|
139
|
+
* 更新 Element 配置:发 updateElement;非法字段由托管侧整次拒绝。
|
|
140
|
+
*
|
|
141
|
+
* @param patch - 配置增量。
|
|
142
|
+
* @returns 成功写回本地 options 后 resolve。
|
|
143
|
+
* @throws 已销毁时抛 INSTANCE_DESTROYED。
|
|
144
|
+
*/
|
|
145
|
+
update(patch: Partial<ElementOptions>): Promise<void>;
|
|
146
|
+
/**
|
|
147
|
+
* 注册事件 handler(透传到 transport,按事件名分发)。
|
|
148
|
+
*
|
|
149
|
+
* @param event - 事件名。
|
|
150
|
+
* @param handler - 回调。
|
|
151
|
+
* @throws 已销毁时抛 INSTANCE_DESTROYED。
|
|
152
|
+
*/
|
|
153
|
+
on(event: EventName, handler: (payload: unknown) => void): void;
|
|
154
|
+
/**
|
|
155
|
+
* 注销事件 handler(销毁后仍可安全调用)。
|
|
156
|
+
*
|
|
157
|
+
* @param event - 事件名。
|
|
158
|
+
* @param handler - 先前注册的回调。
|
|
159
|
+
*/
|
|
160
|
+
off(event: EventName, handler: (payload: unknown) => void): void;
|
|
161
|
+
/** 聚焦(仅输入类,expressCheckout 不提供)。 */
|
|
162
|
+
focus?: () => Promise<void>;
|
|
163
|
+
/** 失焦(仅输入类,expressCheckout 不提供)。 */
|
|
164
|
+
blur?: () => Promise<void>;
|
|
165
|
+
/** 清空(仅输入类,expressCheckout 不提供)。 */
|
|
166
|
+
clear?: () => Promise<void>;
|
|
167
|
+
/** 已挂载后安装输入类动作方法(由构造后自动调用)。 */
|
|
168
|
+
private installInputActions;
|
|
169
|
+
/**
|
|
170
|
+
* 仅 expressCheckout:常驻订阅 expressAvailabilityChange,更新本地可用性快照。
|
|
171
|
+
*
|
|
172
|
+
* 该事件载荷不含 elementId;express 为单例(由 CheckoutInstance 保证),
|
|
173
|
+
* 故无需按 elementId 过滤。非 express 类型不订阅。
|
|
174
|
+
*/
|
|
175
|
+
private installExpressAvailability;
|
|
176
|
+
/** 发送一条输入类动作命令(销毁后同步抛 INSTANCE_DESTROYED)。 */
|
|
177
|
+
private sendAction;
|
|
178
|
+
/** 若已销毁则抛 INSTANCE_DESTROYED。 */
|
|
179
|
+
private assertAlive;
|
|
180
|
+
/** 解析挂载容器(选择器须唯一命中一个元素)。 */
|
|
181
|
+
private resolveContainer;
|
|
182
|
+
/**
|
|
183
|
+
* 解析 iframe src:拆分字段走 /sdk/field/,其余走 /sdk/element/,带 checkoutId 与 elementId;
|
|
184
|
+
* 若提供了初始 colorScheme,则追加 `&colorScheme=<值>`(首帧无闪);
|
|
185
|
+
* 若初始 appearance 含 variables 或 rules,则追加
|
|
186
|
+
* `&appearance=<encodeURIComponent(JSON.stringify(appearance))>`(首帧即生效,无闪)。
|
|
187
|
+
* 仅含 colorScheme(无 variables/rules)的 appearance 不拼接,避免空外观串。
|
|
188
|
+
* 对 expressCheckout,另追加钱包开关 / 每钱包 buttonType / 全局 buttonHeight
|
|
189
|
+
* (见 {@link resolveExpressQuery})。
|
|
190
|
+
*
|
|
191
|
+
* elementId 随 src 下发,供托管 child 在 iframe-resize 消息中原样回传,父窗口据此在
|
|
192
|
+
* 同页多个 iframe 间按句柄分发高度。
|
|
193
|
+
*/
|
|
194
|
+
private resolveSrc;
|
|
195
|
+
/**
|
|
196
|
+
* 构造 expressCheckout 专属 query 片段(仅 expressCheckout 调用):
|
|
197
|
+
* - 钱包显式置为 `false` → `&applePay=false` / `&googlePay=false`(强制隐藏,保持
|
|
198
|
+
* 既有开关语义;`true` / 缺省 → 自动,不拼开关);
|
|
199
|
+
* - 钱包以对象形态配置且含 `buttonType` → `&applePayButtonType=<v>` /
|
|
200
|
+
* `&googlePayButtonType=<v>`(布尔开关 / 缺省 → 不拼);
|
|
201
|
+
* - 全局 `buttonHeight`(有限数)→ `&buttonHeight=<n>`。
|
|
202
|
+
*
|
|
203
|
+
* 仅在有值时拼接;不拼空串。本片段不触碰卡值,仅承载展示配置。
|
|
204
|
+
*
|
|
205
|
+
* @returns 以 `&` 起始的 query 片段(无可拼项时返回空串)。
|
|
206
|
+
*/
|
|
207
|
+
private resolveExpressQuery;
|
|
208
|
+
/**
|
|
209
|
+
* 安装 iframe 自适应高度监听:订阅 window 'message',仅采信来自本 iframe
|
|
210
|
+
* `contentWindow` 且 origin === hostOrigin 的合法 {@link IframeResizeMessage},
|
|
211
|
+
* 且 elementId 与本句柄匹配时,将外层 iframe 高度调整为内容真实高度(宽度保持 100%)。
|
|
212
|
+
*
|
|
213
|
+
* 安全:先校验 `event.source === iframe.contentWindow`(关键来源校验),
|
|
214
|
+
* 再校验 `event.origin === hostOrigin`(更严格的同源校验),防跨源伪造。
|
|
215
|
+
* 高度去重:与上次相同则跳过,避免冗余 style 写入。
|
|
216
|
+
*/
|
|
217
|
+
private installResizeListener;
|
|
218
|
+
/** 解绑 iframe 自适应高度监听并重置去重状态(幂等)。 */
|
|
219
|
+
private teardownResizeListener;
|
|
220
|
+
/** 移除 iframe DOM 节点(若存在),并解绑自适应高度监听。 */
|
|
221
|
+
private removeIframe;
|
|
222
|
+
/** 工厂:等价于 `new CheckoutElement(opts)`(供 CheckoutInstance 统一入口)。 */
|
|
223
|
+
static create(opts: CheckoutElementOptions): CheckoutElement;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* CheckoutInstance —— 商户侧结账实例句柄(spec 4 / 7 / 8)。
|
|
228
|
+
*
|
|
229
|
+
* 职责:
|
|
230
|
+
* - 由 `createCheckout` 在握手 + initialize 成功后构造(持有已就绪 transport、
|
|
231
|
+
* runtimeId、capabilities、初始 PublicSessionView)。
|
|
232
|
+
* - `create` 组装并返回 {@link CheckoutElement},维护**互斥注册表**(card 与拆分
|
|
233
|
+
* 字段互斥、同 mode 地址互斥、expressCheckout 单例 → `ELEMENT_CONFLICT`)。
|
|
234
|
+
* - `confirm` 生成 operationId、发 confirm 命令拿 accepted,Promise 由后续同
|
|
235
|
+
* operationId 的 `paymentResult` 事件兑现;进行中再 confirm → `CHECKOUT_BUSY`。
|
|
236
|
+
* - `getSession/refresh/getPaymentStatus/updateCheckout` 透传对应命令。
|
|
237
|
+
* - `destroy` 幂等:释放 Element、解绑监听、以 INSTANCE_DESTROYED reject 未决 confirm、
|
|
238
|
+
* 发 destroy 命令并销毁 transport;此后迟到的 `paymentResult` 一律忽略。
|
|
239
|
+
*
|
|
240
|
+
* 安全约束(AGENTS/spec):本层只搬运协议命令/事件,**绝不触碰卡值**。
|
|
241
|
+
*/
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* CheckoutInstance 依赖的最小 transport 接口(由 MainFrameTransport 满足)。
|
|
245
|
+
*
|
|
246
|
+
* 比 ElementTransport 多出 `onHello/createHiddenIframe/destroy`,供 createCheckout
|
|
247
|
+
* 握手接线与实例销毁使用。单测可注入 mock。
|
|
248
|
+
*/
|
|
249
|
+
interface InstanceTransport {
|
|
250
|
+
request(name: CommandName, payload: unknown): Promise<unknown>;
|
|
251
|
+
on(event: EventName, handler: (payload: unknown) => void): void;
|
|
252
|
+
off(event: EventName, handler: (payload: unknown) => void): void;
|
|
253
|
+
onHello(handler: (hello: unknown) => void): void;
|
|
254
|
+
setRuntimeId(runtimeId: string): void;
|
|
255
|
+
createHiddenIframe(): unknown;
|
|
256
|
+
destroy(): void;
|
|
257
|
+
}
|
|
258
|
+
/** CheckoutInstance 构造参数(由 createCheckout 组装)。 */
|
|
259
|
+
interface CheckoutInstanceOptions {
|
|
260
|
+
/** 结账唯一 id。 */
|
|
261
|
+
checkoutId: string;
|
|
262
|
+
/** 协商后的运行时 id(来自 RuntimeHello)。 */
|
|
263
|
+
runtimeId: string;
|
|
264
|
+
/** 托管页面 origin(不带尾部斜杠)。 */
|
|
265
|
+
hostOrigin: string;
|
|
266
|
+
/** 已就绪 transport。 */
|
|
267
|
+
transport: InstanceTransport;
|
|
268
|
+
/** initialize 返回的 capabilities。 */
|
|
269
|
+
capabilities: string[];
|
|
270
|
+
/** initialize 返回的初始会话视图。 */
|
|
271
|
+
session: PublicSessionView;
|
|
272
|
+
/**
|
|
273
|
+
* 初始外观定制(来自 createCheckout 的 appearance)。
|
|
274
|
+
* 透传给每个 create 出的 Element,序列化进其 iframe src(首帧无闪):
|
|
275
|
+
* - colorScheme 拼 `&colorScheme=`;
|
|
276
|
+
* - variables/rules 拼 `&appearance=`(仅当非空)。
|
|
277
|
+
* 缺省不拼接。运行时切换走 updateCheckout 命令。
|
|
278
|
+
*/
|
|
279
|
+
appearance?: Appearance;
|
|
280
|
+
}
|
|
281
|
+
/** confirm 可选参数(对齐 ConfirmReq,去掉由实例生成的 operationId)。 */
|
|
282
|
+
type ConfirmOptions = Omit<ConfirmReq, 'operationId'>;
|
|
283
|
+
declare class CheckoutInstance {
|
|
284
|
+
/** 结账唯一 id。 */
|
|
285
|
+
readonly checkoutId: string;
|
|
286
|
+
/** 协商后的运行时 id。 */
|
|
287
|
+
readonly runtimeId: string;
|
|
288
|
+
/** 协商后的能力集合。 */
|
|
289
|
+
readonly capabilities: readonly string[];
|
|
290
|
+
private readonly hostOrigin;
|
|
291
|
+
private readonly transport;
|
|
292
|
+
private session;
|
|
293
|
+
/** 初始外观定制(透传给 create 出的每个 Element 的 iframe src)。 */
|
|
294
|
+
private readonly appearance;
|
|
295
|
+
/** 已创建的 Element(按 elementId 索引)。 */
|
|
296
|
+
/**
|
|
297
|
+
* 互斥注册表的**单一数据源**:elementId → 已创建的 CheckoutElement。
|
|
298
|
+
* 互斥判定由本 Map 实时推导(见 {@link assertNoConflict}),元素 `destroy()` 经
|
|
299
|
+
* {@link releaseElement} 从本 Map 移除以释放名额(允许销毁后重建同类互斥 Element)。
|
|
300
|
+
*/
|
|
301
|
+
private readonly elements;
|
|
302
|
+
/** 当前未决 confirm(同一时刻至多一个)。 */
|
|
303
|
+
private pendingConfirm;
|
|
304
|
+
/** paymentResult 事件订阅 handler(destroy 时解绑)。 */
|
|
305
|
+
private readonly paymentResultHandler;
|
|
306
|
+
private destroyed;
|
|
307
|
+
constructor(opts: CheckoutInstanceOptions);
|
|
308
|
+
/**
|
|
309
|
+
* 创建一个 Element 句柄(不自动挂载;互斥冲突抛 ELEMENT_CONFLICT)。
|
|
310
|
+
*
|
|
311
|
+
* 互斥规则(spec 6):
|
|
312
|
+
* - 聚合 `card` 与任一拆分字段(cardNumber/cardExpiry/cardCvc)互斥。
|
|
313
|
+
* - 同 `mode`(billing/shipping)的 address 不可重复。
|
|
314
|
+
* - `expressCheckout` 单例。
|
|
315
|
+
*
|
|
316
|
+
* @param type - Element 类型。
|
|
317
|
+
* @param options - 初始 Element 配置。
|
|
318
|
+
* @returns 新建的 CheckoutElement。
|
|
319
|
+
* @throws 已销毁时抛 INSTANCE_DESTROYED;互斥冲突抛 ELEMENT_CONFLICT。
|
|
320
|
+
*/
|
|
321
|
+
create(type: ElementType, options?: ElementOptions): CheckoutElement;
|
|
322
|
+
/**
|
|
323
|
+
* 发起支付确认。生成 operationId,发 confirm 命令拿 accepted,返回的 Promise
|
|
324
|
+
* 由后续同 operationId 的 paymentResult 事件兑现。进行中再次调用 → CHECKOUT_BUSY。
|
|
325
|
+
*
|
|
326
|
+
* @param opts - 账单/配送地址、姓名、邮箱、returnUrl 等可选参数。
|
|
327
|
+
* @returns 支付终态结果 PaymentOutcome。
|
|
328
|
+
* @throws 已销毁时 reject INSTANCE_DESTROYED;进行中 reject CHECKOUT_BUSY。
|
|
329
|
+
*/
|
|
330
|
+
confirm(opts?: ConfirmOptions): Promise<PaymentOutcome>;
|
|
331
|
+
/**
|
|
332
|
+
* 获取最新会话视图(透传 getSession 命令并写回本地快照)。
|
|
333
|
+
*
|
|
334
|
+
* @returns 最新 PublicSessionView。
|
|
335
|
+
* @throws 已销毁时 reject INSTANCE_DESTROYED。
|
|
336
|
+
*/
|
|
337
|
+
getSession(): Promise<PublicSessionView>;
|
|
338
|
+
/**
|
|
339
|
+
* 刷新会话(透传 refresh 命令并写回本地快照)。
|
|
340
|
+
*
|
|
341
|
+
* @returns 刷新后的 PublicSessionView。
|
|
342
|
+
* @throws 已销毁时 reject INSTANCE_DESTROYED。
|
|
343
|
+
*/
|
|
344
|
+
refresh(): Promise<PublicSessionView>;
|
|
345
|
+
/**
|
|
346
|
+
* 查询支付状态(原样返回 TxnStatus,不转义)。
|
|
347
|
+
*
|
|
348
|
+
* @returns txnStatus(可能含 txnId)。
|
|
349
|
+
* @throws 已销毁时 reject INSTANCE_DESTROYED。
|
|
350
|
+
*/
|
|
351
|
+
getPaymentStatus(): Promise<GetPaymentStatusResp>;
|
|
352
|
+
/**
|
|
353
|
+
* 更新结账外观/语言(不改会话或金额)。
|
|
354
|
+
*
|
|
355
|
+
* @param patch - locale / appearance 增量。
|
|
356
|
+
* @throws 已销毁时 reject INSTANCE_DESTROYED。
|
|
357
|
+
*/
|
|
358
|
+
updateCheckout(patch: {
|
|
359
|
+
locale?: string;
|
|
360
|
+
appearance?: Appearance;
|
|
361
|
+
}): Promise<void>;
|
|
362
|
+
/**
|
|
363
|
+
* 注册 Checkout 级事件 handler(透传 transport)。
|
|
364
|
+
*
|
|
365
|
+
* @param event - 事件名。
|
|
366
|
+
* @param handler - 回调。
|
|
367
|
+
* @throws 已销毁时抛 INSTANCE_DESTROYED。
|
|
368
|
+
*/
|
|
369
|
+
on(event: EventName, handler: (payload: unknown) => void): void;
|
|
370
|
+
/**
|
|
371
|
+
* 注销事件 handler(销毁后仍可安全调用)。
|
|
372
|
+
*
|
|
373
|
+
* @param event - 事件名。
|
|
374
|
+
* @param handler - 先前注册的回调。
|
|
375
|
+
*/
|
|
376
|
+
off(event: EventName, handler: (payload: unknown) => void): void;
|
|
377
|
+
/**
|
|
378
|
+
* 销毁实例:幂等。释放全部 Element、解绑 paymentResult 监听、以
|
|
379
|
+
* INSTANCE_DESTROYED reject 未决 confirm、发 destroy 命令并销毁 transport。
|
|
380
|
+
* 此后迟到的 paymentResult 一律忽略,不改写已结束的 Promise。
|
|
381
|
+
*/
|
|
382
|
+
destroy(): void;
|
|
383
|
+
/** 若已销毁则抛 INSTANCE_DESTROYED。 */
|
|
384
|
+
private assertAlive;
|
|
385
|
+
/** 互斥检查:冲突时抛 ELEMENT_CONFLICT(由 elements Map 实时推导,不改变注册表)。 */
|
|
386
|
+
private assertNoConflict;
|
|
387
|
+
/**
|
|
388
|
+
* 元素 `destroy()` 回调:从互斥注册表(elements Map)移除该 elementId,释放名额。
|
|
389
|
+
* 幂等;实例整体 destroy 时(已置 destroyed)走统一 `elements.clear()` 路径,此处 no-op,
|
|
390
|
+
* 避免遍历 elements 调 element.destroy() 时的并发修改。
|
|
391
|
+
*/
|
|
392
|
+
private releaseElement;
|
|
393
|
+
/** 处理 paymentResult 事件:按 operationId 兑现未决 confirm;迟到/不匹配忽略。 */
|
|
394
|
+
private handlePaymentResult;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* 运行环境标识。
|
|
399
|
+
* - `dev`:开发/测试托管页面。
|
|
400
|
+
* - `prod`:生产托管页面。
|
|
401
|
+
*/
|
|
402
|
+
type Env = 'dev' | 'prod';
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* createCheckout —— 商户 SDK 的唯一异步入口(spec 4)。
|
|
406
|
+
*
|
|
407
|
+
* 流程:
|
|
408
|
+
* 1. 生成 `checkoutId`,`resolveHostOrigin(env, hostOrigin)` 得托管 origin。
|
|
409
|
+
* 2. 建 transport、`createHiddenIframe()` 加载托管 main iframe。
|
|
410
|
+
* 3. 注册 onHello;等 RuntimeHello(超时 15s → reject RUNTIME_LOAD_FAILED)。
|
|
411
|
+
* 4. 选共同主版本(无交集 → reject PROTOCOL_UNSUPPORTED)。
|
|
412
|
+
* 5. 发 `initialize`(sessionId/locale/appearance/paymentMethods),拿
|
|
413
|
+
* capabilities + PublicSessionView;任一步失败 reject 并销毁 transport。
|
|
414
|
+
* 6. 用握手 runtimeId 注入 transport,构造并 resolve {@link CheckoutInstance}。
|
|
415
|
+
*
|
|
416
|
+
* 安全约束(AGENTS/spec):本层只做握手/初始化编排,**绝不触碰卡值**。
|
|
417
|
+
*/
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* 创建 CheckoutInstance 时可注入的内部 transport 工厂(仅供测试/高级定制)。
|
|
421
|
+
*
|
|
422
|
+
* 真实场景使用内置 MainFrameTransport;测试可注入 mock 以驱动 hello/事件。
|
|
423
|
+
*/
|
|
424
|
+
type TransportFactory = (args: {
|
|
425
|
+
checkoutId: string;
|
|
426
|
+
hostOrigin: string;
|
|
427
|
+
}) => InstanceTransport;
|
|
428
|
+
/** createCheckout 参数。 */
|
|
429
|
+
interface CreateCheckoutOptions {
|
|
430
|
+
/** 后端创建的结账会话 id(必填)。 */
|
|
431
|
+
sessionId: string;
|
|
432
|
+
/** 运行环境(dev/prod),默认 dev。 */
|
|
433
|
+
env?: Env;
|
|
434
|
+
/** 覆盖托管 origin(优先于 env)。 */
|
|
435
|
+
hostOrigin?: string;
|
|
436
|
+
/** 语言。 */
|
|
437
|
+
locale?: string;
|
|
438
|
+
/** 外观定制。 */
|
|
439
|
+
appearance?: Appearance;
|
|
440
|
+
/** 支付方式过滤(只做减法/排序)。 */
|
|
441
|
+
paymentMethods?: PaymentMethodFilter;
|
|
442
|
+
/** 内部注入点:自定义 transport 工厂(测试用,不属于公开 API 契约)。 */
|
|
443
|
+
__transportFactory?: TransportFactory;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* 创建一个结账实例:握手 + 初始化成功后 resolve。
|
|
447
|
+
*
|
|
448
|
+
* @param opts - 结账参数。
|
|
449
|
+
* @returns 就绪的 CheckoutInstance。
|
|
450
|
+
* @throws reject RUNTIME_LOAD_FAILED(握手超时)/ PROTOCOL_UNSUPPORTED(无共同主版本)
|
|
451
|
+
* / 或 initialize 的业务错误。
|
|
452
|
+
* @example
|
|
453
|
+
* const checkout = await createCheckout({ sessionId: 'sess_x', env: 'prod' });
|
|
454
|
+
*/
|
|
455
|
+
declare function createCheckout(opts: CreateCheckoutOptions): Promise<CheckoutInstance>;
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* @sunbay/checkout-js 公共入口(真源)。
|
|
459
|
+
*
|
|
460
|
+
* 导出 `createCheckout` 入口、`CheckoutInstance` / `CheckoutElement` 句柄类型,
|
|
461
|
+
* 以及协议公开类型(供 TS 使用者消费)。
|
|
462
|
+
* IIFE 产物下,额外在 `window.SunbayCheckout` 暴露 `{ createCheckout }`。
|
|
463
|
+
*/
|
|
464
|
+
|
|
465
|
+
declare const version: string;
|
|
466
|
+
|
|
467
|
+
export { CheckoutElement, type CheckoutElementOptions, CheckoutInstance, type CheckoutInstanceOptions, type ConfirmOptions, type CreateCheckoutOptions, type ElementTransport, type Env, type InstanceTransport, type TransportFactory, createCheckout, version };
|