@thenextgateway / cashier.sdk
浏览器SDK,用于嵌入和与TNG出纳通信。
开始使用
安装
npm install @thenextgateway/cashier.sdk @thenextgateway/core
使用
的新实例来使用收银员 TNGCashier 并传递应该呈现出纳员iframe的容器元素的ID、出纳员参数和一个配置对象。
保持对已创建实例的引用。收银员仍然需要手动初始化,并且实例充当跨帧通信的入口点。
import { TNGCashier } from "@thenextgateway/cashier.sdk";
import { TNG_TRANSACTION_TYPES, type CashierConfig } from "@thenextgateway/core";
const config: Partial<CashierConfig> = {
iframeOrigin: "https://cashier.example.com",
transactionType: TNG_TRANSACTION_TYPES.deposit,
transactionId: "example-transaction-id",
paymentMethodId: 1,
amount: "10",
currency: "EUR",
};
const cashier = new TNGCashier(
"iframe-container-id",
{
instance: "example-instance",
applicationId: "example-application-id",
},
config,
);
await cashier.initialize();
iframeOrigin 在构造时是必需的 TNGCashier. 对于参数, instance 总是必需的。提供至少一个 application 或者 applicationId.
跨帧消息类型
SDK通过浏览器与出纳通信 postMessage 事件。消息类型值的前缀为 tng_ 因此可以将它们与页面上的其他框架消息区分开来。
如果您的应用程序直接侦听出纳消息或向外部发送消息 TNGCashier,使用 CASHIER_MESSAGE_TYPES 和 CROSSFRAME_MESSAGE_TYPES 出口 @thenextgateway/core 而不是硬编码字符串。
设置
收银员参数
| 场 | 类型 | 描述 |
|---|---|---|
instance | string | 实例标识符。 |
application | string (可选) | 应用程序标识符。如果需要 applicationId 不见了。 |
applicationId | string (可选) | 应用程序ID。如果需要 application 不见了。 |
配置字段
SDK构造函数接受 Partial<CashierConfig>. iframeOrigin 由SDK立即检查。其他必需的字段在初始化期间由收银员验证,可以在构造函数配置中提供,也可以稍后使用 updateConfig.
| 场 | 类型 | 描述 |
|---|---|---|
iframeOrigin | string | iframe的URL。必须与部署的出纳来源匹配。 |
transactionId | string | 事务ID。只有在需要时才需要 method 步骤已关闭。 |
paymentMethodId | number | 付款方式ID。只有在需要时才需要 method 步骤已关闭。 |
transactionType | TNGTransactionType (deposit / withdrawal) | 事务类型。使用 TNG_TRANSACTION_TYPES 对于提供的值。 |
amount | string | 例如,字符串格式的交易金额 10 或者 9.99. 如果配置了可选的数量步骤,则不需要,但可以设置默认值。 |
currency | string | 例如,交易货币 EUR. 如果配置了可选的数量步骤,则不需要,但可以设置默认值。 |
redirectUrl | string (可选) | 事务完成后要重定向到的URL。当没有提供时,收银员使用自己的“进程结束”静态页面。 |
attributes | TransactionAttribute[] —包含键/值的对象数组 { key: "example", value: "example" } | 处理时传递给服务器的自定义属性。 |
languageCode | string (可选) | 在出纳中使用的语言代码。当没有提供时,收银员使用英语。 |
optionalSteps | OptionalProgressStep[] - method, amount, receipt | 流中应该包含哪些可选步骤。 |
amountPresets | (string | number)[] (可选) | 预设金额可选步骤。这些显示为可选择的选项。值解析为 NaN 将被忽略。 |
currencyOptions | string[] (可选,如果 currency 提供) | 货币选项为金额可选步骤。 |
sessionId | string (如果需要 method 可选步骤已开启) | 当方法选择发生在收银端时,初始化事务所需的会话ID。 |
customerId | string (如果需要 method 可选步骤已开启) | 在收银端选择方法时初始化交易所需的客户ID。 |
初始化和通信方法
| 方法 | 参数(年代) | 返回 | 描述 |
|---|---|---|---|
initialize | - | Promise<TNGCashier> | 初始化收银员,包括加载iframe。返回承诺,该承诺可以通过对收银员对象的引用成功解析,也可以通过错误消息拒绝。 |
dispose | - | - | 清除侦听器并删除iframe。 |
updateConfig | config: Partial<CashierConfig> | - | 更新收银员配置。 |
onConfigMissing | callback: (result: HostEventData) => void | - | 注册一个回调,当收银员由于缺少配置值而没有正确初始化时将调用该回调。返回的事件将包括哪些字段完全丢失的信息。 |
onTransactionStart | callback: (result: HostEventData) => void | - | 注册一个回调,当收银员在服务器端启动事务时将调用该回调。请注意,在该事件触发之前,仍然可以通过更新配置来更改支付方式。Sent Event将包含事务和方法对象。 |
onTransactionComplete | callback: (result: HostEventData) => void | - | 注册一个回调,当收银员在服务器端完成事务时将调用该回调。Sent Event将包含事务和方法对象。 |
onNavigate | callback: (result: HostEventData) => void | - | 注册一个回调函数,当收银员的当前步骤发生变化时将调用该函数。发送的事件将包含有关当前步骤的信息。 |
onClose | callback: (result: HostEventData) => void | - | 注册一个回调函数,当用户请求关闭操作时将调用该函数。 |
onError | callback: (result: HostEventData) => void | - | 注册一个回调,当事务因客户端抛出错误而失败时将调用该回调。请注意,这并不包括PSP端的错误,因为这些错误将在常规流程中处理并作为事务结果返回。发送的事件将包含有关错误的信息。 |
on | newListeners: Partial<HostGlobalListeners> | - | 一种用一个方法注册多个侦听器的方法。不删除现有侦听器,但替换指定的侦听器(如果存在)。 |
css | css (可选): string | - | 将给定的CSS样式全局应用于iframe。如果不带参数调用,则清除已使用此方法设置的所有样式。注意:如果多次调用,则只应用最后一组样式。 |
cssVars | vars: TNGCssVars | - | 将给定的CSS变量全局应用到iframe。如果多次调用,则只应用最后一组变量。 |
icons | iconSets: IconSet[], aliases (可选): Dictionary<string[]> | - | 注册图标集和可选的别名。名称与收银台视图中出现的名称匹配的图标将取代默认图标。 |
stylesheets | stylesheets: StylesheetParams[] | - | 这里提供的样式表将被加载,以便在收银iframe中使用。 |
主题
收银员允许通过提供自定义CSS样式和CSS变量来进行主题化。
覆盖CSS的能力是无限的(通过 css 方法),但建议您尝试使用 cssVars 方法获取最需要的覆盖。
这种方法允许设置CSS变量,改变全局调色板和字体,以及覆盖调色板之外的特定元素的颜色。
以下是一个示例,供参考 TNGCssVars 对象,该对象设置当前所有可能的变量。所有字段都是可选的,所有值都是CSS值。
对于按钮覆盖, color 是语义按钮的颜色和 contrast 当该颜色用作填充背景时,用于文本/图标。
{
"color": {
"primary": {
"default": "#f00",
"light": "#222",
"dark": "#444",
"contrast": "#fff"
},
"danger": {
"default": "#ff8c00",
"light": "#ffa500",
"dark": "#ff4500",
"contrast": "#fff"
},
"success": {
"default": "#0000ff",
"light": "#add8e6",
"dark": "#00008b",
"contrast": "#fff"
},
"warning": {
"default": "#ee82ee",
"light": "#dda0dd",
"dark": "#9400d3",
"contrast": "#000"
},
"text": {
"default": "#000",
"light": "#222",
"dark": "#444",
"diffused": "#dadada"
},
"background": {
"default": "#e0ffff",
"light": "#fff",
"dark": "#87cefa",
"diffused": "#dadada"
},
"border": {
"default": "#000",
"light": "#222",
"dark": "#444",
"diffused": "#dadada"
}
},
"font": {
"base": "arial sans-serif",
"secondary": "roboto sans-serif",
"size": {
"base": "16px",
"2xs": "10px",
"xs": "12px",
"s": "14px",
"m": "16px",
"l": "18px",
"xl": "20px",
"2xl": "24px",
"3xl": "32px",
"4xl": "48px",
"5xl": "64px"
},
"weight": {
"light": "300",
"normal": "400",
"semiBold": "600",
"bold": "700"
}
},
"override": {
"field": {
"label": {
"color": "darkblue",
"size": "10px",
"weight": "900"
},
"content": {
"color": "red",
"size": "20px",
"weight": "700"
},
"placeholder": {
"color": "orange"
},
"background": {
"base": "yellow",
"hover": "lightyellow",
"active": "orange"
},
"validation": {
"color": "magenta",
"size": "15px",
"weight": "100"
},
"icon": {
"color": "darkgreen"
}
},
"button": {
"primary": {
"color": "blue",
"contrast": "yellow",
"opacity": "1",
"disabled": {
"color": "lightgray",
"contrast": "gray",
"opacity": "0.5"
},
"focus": {
"color": "darkblue",
"contrast": "darkred",
"opacity": "0.9"
},
"hover": {
"color": "lightblue",
"contrast": "orange",
"opacity": "0.7"
}
}
},
"table": {
"text": {
"color": "red",
"size": "30px",
"weight": "900"
},
"border": {
"color": "darkorange"
},
"background": {
"even": "lightyellow",
"odd": "lightgreen"
}
},
"scrollbar": {
"size": "10px",
"thumb": {
"color": {
"base": "blue",
"hover": "lightblue",
"active": "darkblue"
}
},
"track": {
"color": {
"base": "yellow",
"hover": "orange",
"active": "red"
}
}
},
"step": {
"method": {
"tile": {
"width": "400px"
}
}
}
}
}