@blocklet/payment-broker-client 1.20.17
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/examples/README.md +277 -0
- package/examples/browser/README.md +119 -0
- package/examples/browser/simple-example.js +223 -0
- package/examples/nodejs/README.md +180 -0
- package/examples/nodejs/deploy-example.mjs +200 -0
- package/examples/nodejs/package.json +30 -0
- package/lib/adapters/config/browser.d.ts +12 -0
- package/lib/adapters/config/browser.d.ts.map +1 -0
- package/lib/adapters/config/browser.js +48 -0
- package/lib/adapters/config/browser.js.map +1 -0
- package/lib/adapters/config/node.d.ts +13 -0
- package/lib/adapters/config/node.d.ts.map +1 -0
- package/lib/adapters/config/node.js +62 -0
- package/lib/adapters/config/node.js.map +1 -0
- package/lib/adapters/http/browser.d.ts +12 -0
- package/lib/adapters/http/browser.d.ts.map +1 -0
- package/lib/adapters/http/browser.js +50 -0
- package/lib/adapters/http/browser.js.map +1 -0
- package/lib/adapters/http/node.d.ts +12 -0
- package/lib/adapters/http/node.d.ts.map +1 -0
- package/lib/adapters/http/node.js +30 -0
- package/lib/adapters/http/node.js.map +1 -0
- package/lib/browser/adapters/config/browser.d.ts +12 -0
- package/lib/browser/adapters/config/browser.d.ts.map +1 -0
- package/lib/browser/adapters/config/node.d.ts +13 -0
- package/lib/browser/adapters/config/node.d.ts.map +1 -0
- package/lib/browser/adapters/http/browser.d.ts +12 -0
- package/lib/browser/adapters/http/browser.d.ts.map +1 -0
- package/lib/browser/adapters/http/node.d.ts +12 -0
- package/lib/browser/adapters/http/node.d.ts.map +1 -0
- package/lib/browser/browser/factory.d.ts +19 -0
- package/lib/browser/browser/factory.d.ts.map +1 -0
- package/lib/browser/browser/index.d.ts +9 -0
- package/lib/browser/browser/index.d.ts.map +1 -0
- package/lib/browser/core/client.d.ts +29 -0
- package/lib/browser/core/client.d.ts.map +1 -0
- package/lib/browser/core/deployment.d.ts +20 -0
- package/lib/browser/core/deployment.d.ts.map +1 -0
- package/lib/browser/core/errors.d.ts +15 -0
- package/lib/browser/core/errors.d.ts.map +1 -0
- package/lib/browser/core/index.d.ts +10 -0
- package/lib/browser/core/index.d.ts.map +1 -0
- package/lib/browser/core/interfaces.d.ts +24 -0
- package/lib/browser/core/interfaces.d.ts.map +1 -0
- package/lib/browser/core/logger.d.ts +8 -0
- package/lib/browser/core/logger.d.ts.map +1 -0
- package/lib/browser/core/polling.d.ts +23 -0
- package/lib/browser/core/polling.d.ts.map +1 -0
- package/lib/browser/core/session.d.ts +31 -0
- package/lib/browser/core/session.d.ts.map +1 -0
- package/lib/browser/core/types.d.ts +175 -0
- package/lib/browser/core/types.d.ts.map +1 -0
- package/lib/browser/core/utils.d.ts +27 -0
- package/lib/browser/core/utils.d.ts.map +1 -0
- package/lib/browser/factory.d.ts +19 -0
- package/lib/browser/factory.d.ts.map +1 -0
- package/lib/browser/factory.js +30 -0
- package/lib/browser/factory.js.map +1 -0
- package/lib/browser/index.d.ts +8 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +973 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/node/factory.d.ts +9 -0
- package/lib/browser/node/factory.d.ts.map +1 -0
- package/lib/browser/node/index.d.ts +8 -0
- package/lib/browser/node/index.d.ts.map +1 -0
- package/lib/core/client.d.ts +29 -0
- package/lib/core/client.d.ts.map +1 -0
- package/lib/core/client.js +150 -0
- package/lib/core/client.js.map +1 -0
- package/lib/core/deployment.d.ts +20 -0
- package/lib/core/deployment.d.ts.map +1 -0
- package/lib/core/deployment.js +184 -0
- package/lib/core/deployment.js.map +1 -0
- package/lib/core/errors.d.ts +15 -0
- package/lib/core/errors.d.ts.map +1 -0
- package/lib/core/errors.js +21 -0
- package/lib/core/errors.js.map +1 -0
- package/lib/core/index.d.ts +10 -0
- package/lib/core/index.d.ts.map +1 -0
- package/lib/core/index.js +32 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/interfaces.d.ts +24 -0
- package/lib/core/interfaces.d.ts.map +1 -0
- package/lib/core/interfaces.js +4 -0
- package/lib/core/interfaces.js.map +1 -0
- package/lib/core/logger.d.ts +8 -0
- package/lib/core/logger.d.ts.map +1 -0
- package/lib/core/logger.js +39 -0
- package/lib/core/logger.js.map +1 -0
- package/lib/core/polling.d.ts +23 -0
- package/lib/core/polling.d.ts.map +1 -0
- package/lib/core/polling.js +97 -0
- package/lib/core/polling.js.map +1 -0
- package/lib/core/session.d.ts +31 -0
- package/lib/core/session.d.ts.map +1 -0
- package/lib/core/session.js +202 -0
- package/lib/core/session.js.map +1 -0
- package/lib/core/types.d.ts +175 -0
- package/lib/core/types.d.ts.map +1 -0
- package/lib/core/types.js +48 -0
- package/lib/core/types.js.map +1 -0
- package/lib/core/utils.d.ts +27 -0
- package/lib/core/utils.d.ts.map +1 -0
- package/lib/core/utils.js +181 -0
- package/lib/core/utils.js.map +1 -0
- package/lib/index.d.ts +484 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.esm.js +969 -0
- package/lib/index.esm.js.map +1 -0
- package/lib/index.js +984 -0
- package/lib/index.js.map +1 -0
- package/lib/node/adapters/config/browser.d.ts +12 -0
- package/lib/node/adapters/config/browser.d.ts.map +1 -0
- package/lib/node/adapters/config/node.d.ts +13 -0
- package/lib/node/adapters/config/node.d.ts.map +1 -0
- package/lib/node/adapters/http/browser.d.ts +12 -0
- package/lib/node/adapters/http/browser.d.ts.map +1 -0
- package/lib/node/adapters/http/node.d.ts +12 -0
- package/lib/node/adapters/http/node.d.ts.map +1 -0
- package/lib/node/browser/factory.d.ts +19 -0
- package/lib/node/browser/factory.d.ts.map +1 -0
- package/lib/node/browser/index.d.ts +9 -0
- package/lib/node/browser/index.d.ts.map +1 -0
- package/lib/node/core/client.d.ts +29 -0
- package/lib/node/core/client.d.ts.map +1 -0
- package/lib/node/core/deployment.d.ts +20 -0
- package/lib/node/core/deployment.d.ts.map +1 -0
- package/lib/node/core/errors.d.ts +15 -0
- package/lib/node/core/errors.d.ts.map +1 -0
- package/lib/node/core/index.d.ts +10 -0
- package/lib/node/core/index.d.ts.map +1 -0
- package/lib/node/core/interfaces.d.ts +24 -0
- package/lib/node/core/interfaces.d.ts.map +1 -0
- package/lib/node/core/logger.d.ts +8 -0
- package/lib/node/core/logger.d.ts.map +1 -0
- package/lib/node/core/polling.d.ts +23 -0
- package/lib/node/core/polling.d.ts.map +1 -0
- package/lib/node/core/session.d.ts +31 -0
- package/lib/node/core/session.d.ts.map +1 -0
- package/lib/node/core/types.d.ts +175 -0
- package/lib/node/core/types.d.ts.map +1 -0
- package/lib/node/core/utils.d.ts +27 -0
- package/lib/node/core/utils.d.ts.map +1 -0
- package/lib/node/factory.d.ts +9 -0
- package/lib/node/factory.d.ts.map +1 -0
- package/lib/node/factory.js +34 -0
- package/lib/node/factory.js.map +1 -0
- package/lib/node/index.d.ts +8 -0
- package/lib/node/index.d.ts.map +1 -0
- package/lib/node/index.js +984 -0
- package/lib/node/index.js.map +1 -0
- package/lib/node/node/factory.d.ts +9 -0
- package/lib/node/node/factory.d.ts.map +1 -0
- package/lib/node/node/index.d.ts +8 -0
- package/lib/node/node/index.d.ts.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# Payment Kit Broker Client - Examples
|
|
2
|
+
|
|
3
|
+
这里包含了 Payment Kit Broker Client 的完整使用示例,展示了如何在不同环境中使用 SDK 进行网站部署。
|
|
4
|
+
|
|
5
|
+
## 📁 目录结构
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
examples/
|
|
9
|
+
├── nodejs/ # Node.js 环境示例
|
|
10
|
+
│ ├── deploy-example.mjs # 完整部署示例
|
|
11
|
+
│ ├── package.json # 依赖配置
|
|
12
|
+
│ └── README.md # Node.js 示例文档
|
|
13
|
+
├── browser/ # 浏览器环境示例
|
|
14
|
+
│ ├── simple-example.js # 简化 JS 示例
|
|
15
|
+
│ └── README.md # Browser 示例文档(引用 test.tsx)
|
|
16
|
+
└── README.md # 本文件
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 🚀 快速开始
|
|
20
|
+
|
|
21
|
+
### Node.js 示例
|
|
22
|
+
|
|
23
|
+
适用于命令行工具、服务器端脚本等场景。
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# 进入 Node.js 示例目录
|
|
27
|
+
cd nodejs/
|
|
28
|
+
|
|
29
|
+
# 安装依赖
|
|
30
|
+
npm install
|
|
31
|
+
|
|
32
|
+
# 设置环境变量
|
|
33
|
+
export BASE_URL="https://your-blocklet-url.com"
|
|
34
|
+
export AUTH_TOKEN="your-auth-token"
|
|
35
|
+
|
|
36
|
+
# 运行示例
|
|
37
|
+
npm start
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**特点**:
|
|
41
|
+
- ✅ 完整的 CLI 体验
|
|
42
|
+
- 🔐 Auth Token 认证
|
|
43
|
+
- 🎨 彩色控制台输出
|
|
44
|
+
- 🌐 自动打开支付页面
|
|
45
|
+
- 🔄 支持恢复部署
|
|
46
|
+
|
|
47
|
+
### Browser 示例
|
|
48
|
+
|
|
49
|
+
适用于 Web 应用、管理面板等浏览器环境。
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 进入 Browser 示例目录
|
|
53
|
+
cd examples/browser/
|
|
54
|
+
|
|
55
|
+
# 查看 README.md 了解详细使用方法
|
|
56
|
+
cat README.md
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**两种集成方式:**
|
|
60
|
+
- **完整示例** - `README.md` 中包含完整的 React 组件代码
|
|
61
|
+
- **简化集成** - `simple-example.js` 中包含核心逻辑
|
|
62
|
+
|
|
63
|
+
**特点**:
|
|
64
|
+
- ✅ 现代化 Web UI
|
|
65
|
+
- 🌐 浏览器原生支持
|
|
66
|
+
- 📱 响应式设计
|
|
67
|
+
- 📊 实时日志显示
|
|
68
|
+
- 💾 本地存储持久化
|
|
69
|
+
|
|
70
|
+
## 🔧 配置对比
|
|
71
|
+
|
|
72
|
+
### Node.js 配置
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
import { BrokerClient, STEPS } from '@blocklet/payment-broker-client';
|
|
76
|
+
|
|
77
|
+
const client = new BrokerClient({
|
|
78
|
+
baseUrl: 'https://your-blocklet-url.com',
|
|
79
|
+
authToken: 'your-auth-token', // 必需:认证令牌
|
|
80
|
+
paymentLinkKey: 'PAYMENT_LINK_ID', // 可选:Payment Link 键名
|
|
81
|
+
timeout: 300000,
|
|
82
|
+
polling: {
|
|
83
|
+
interval: 3000,
|
|
84
|
+
maxAttempts: 100,
|
|
85
|
+
backoffStrategy: 'linear',
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Browser 配置
|
|
91
|
+
|
|
92
|
+
```javascript
|
|
93
|
+
import { BrokerClient, STEPS } from '@blocklet/payment-broker-client/browser';
|
|
94
|
+
|
|
95
|
+
const client = new BrokerClient({
|
|
96
|
+
baseUrl: 'https://your-blocklet-url.com',
|
|
97
|
+
api: yourApiInstance, // 必需:API 实例
|
|
98
|
+
paymentLinkKey: 'PAYMENT_LINK_ID', // 可选:Payment Link 键名
|
|
99
|
+
timeout: 300000,
|
|
100
|
+
polling: {
|
|
101
|
+
interval: 3000,
|
|
102
|
+
maxAttempts: 100,
|
|
103
|
+
backoffStrategy: 'linear',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## 📊 功能对比
|
|
109
|
+
|
|
110
|
+
| 功能 | Node.js | Browser | 说明 |
|
|
111
|
+
|------|---------|---------|------|
|
|
112
|
+
| **认证方式** | Auth Token | Cookie/Session | Node.js 需要显式令牌,Browser 依赖登录状态 |
|
|
113
|
+
| **HTTP 请求** | 内置 | 外部 API | Node.js 内置请求,Browser 需要传入 API 实例 |
|
|
114
|
+
| **配置获取** | API 调用 | window.blocklet | 不同的配置来源 |
|
|
115
|
+
| **支付页面** | 自动打开浏览器 | window.open | 都支持自动打开支付页面 |
|
|
116
|
+
| **错误处理** | 控制台输出 | UI 显示 | 不同的错误展示方式 |
|
|
117
|
+
| **数据持久化** | 文件/数据库 | localStorage | 不同的存储方式 |
|
|
118
|
+
|
|
119
|
+
## 🎯 使用场景
|
|
120
|
+
|
|
121
|
+
### Node.js 示例适用于:
|
|
122
|
+
|
|
123
|
+
- 📟 **命令行工具**: CLI 部署脚本
|
|
124
|
+
- 🤖 **自动化脚本**: CI/CD 流程
|
|
125
|
+
- 🖥️ **服务器端应用**: 后端服务集成
|
|
126
|
+
- 📦 **打包工具**: 构建时部署
|
|
127
|
+
- 🔧 **开发工具**: 开发者工具集成
|
|
128
|
+
|
|
129
|
+
### Browser 示例适用于:
|
|
130
|
+
|
|
131
|
+
- 🌐 **Web 管理面板**: 管理员界面
|
|
132
|
+
- 👤 **用户控制台**: 用户自助部署
|
|
133
|
+
- 📱 **移动端 Web**: 响应式部署界面
|
|
134
|
+
- 🔗 **嵌入式组件**: 集成到现有应用
|
|
135
|
+
- 🎨 **自定义 UI**: 基于示例定制界面
|
|
136
|
+
|
|
137
|
+
## 🔄 部署流程
|
|
138
|
+
|
|
139
|
+
两个示例都遵循相同的部署流程:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
1. 初始化 BrokerClient
|
|
143
|
+
↓
|
|
144
|
+
2. 调用 client.deploy()
|
|
145
|
+
↓
|
|
146
|
+
3. STEP1: 等待支付 → 支付成功
|
|
147
|
+
↓
|
|
148
|
+
4. STEP2: 开始安装 → 安装完成
|
|
149
|
+
↓
|
|
150
|
+
5. STEP3: 启动服务 → 服务完成
|
|
151
|
+
↓
|
|
152
|
+
6. STEP4: 获取地址 → 部署完成
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## 🛠️ 自定义和扩展
|
|
156
|
+
|
|
157
|
+
### 步骤回调自定义
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
const hooks = {
|
|
161
|
+
[STEPS.PAYMENT_PENDING]: async ({ sessionId, paymentUrl, isResuming }) => {
|
|
162
|
+
// 自定义支付步骤处理
|
|
163
|
+
console.log('处理支付步骤...');
|
|
164
|
+
|
|
165
|
+
// Node.js: 保存到文件
|
|
166
|
+
// Browser: 保存到 localStorage
|
|
167
|
+
|
|
168
|
+
if (!isResuming) {
|
|
169
|
+
// 自定义打开支付页面的逻辑
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
// 其他步骤回调...
|
|
174
|
+
};
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 错误处理自定义
|
|
178
|
+
|
|
179
|
+
```javascript
|
|
180
|
+
const onError = (error, step) => {
|
|
181
|
+
// 自定义错误处理
|
|
182
|
+
console.error(`部署失败于 ${step}:`, error.message);
|
|
183
|
+
|
|
184
|
+
// Node.js: 记录到日志文件
|
|
185
|
+
// Browser: 显示用户友好的错误消息
|
|
186
|
+
|
|
187
|
+
if (error.recovery?.suggestions) {
|
|
188
|
+
error.recovery.suggestions.forEach(suggestion => {
|
|
189
|
+
// 显示恢复建议
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## 📚 API 参考
|
|
196
|
+
|
|
197
|
+
### BrokerClient 方法
|
|
198
|
+
|
|
199
|
+
```javascript
|
|
200
|
+
// 部署方法
|
|
201
|
+
await client.deploy({
|
|
202
|
+
cachedCheckoutId?: string, // 缓存的会话 ID
|
|
203
|
+
cachedPaymentUrl?: string, // 缓存的支付 URL
|
|
204
|
+
page_info: { // 页面信息(必需)
|
|
205
|
+
success_message: {
|
|
206
|
+
en: string, // 英文成功消息
|
|
207
|
+
zh: string, // 中文成功消息
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
hooks?: DeploymentHooks, // 部署钩子
|
|
211
|
+
onError?: ErrorHandler, // 错误处理
|
|
212
|
+
});
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### 步骤常量
|
|
216
|
+
|
|
217
|
+
```javascript
|
|
218
|
+
import { STEPS } from '@blocklet/payment-broker-client';
|
|
219
|
+
|
|
220
|
+
STEPS.PAYMENT_PENDING // 等待支付
|
|
221
|
+
STEPS.PAYMENT_COMPLETED // 支付完成
|
|
222
|
+
STEPS.INSTALLATION_STARTING // 开始安装
|
|
223
|
+
STEPS.INSTALLATION_COMPLETED // 安装完成
|
|
224
|
+
STEPS.SERVICE_STARTING // 启动服务
|
|
225
|
+
STEPS.SERVICE_READY // 服务就绪
|
|
226
|
+
STEPS.ACCESS_PREPARING // 准备访问权限
|
|
227
|
+
STEPS.ACCESS_READY // 访问就绪
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## 🔍 故障排除
|
|
231
|
+
|
|
232
|
+
### 常见问题
|
|
233
|
+
|
|
234
|
+
1. **认证失败**
|
|
235
|
+
- Node.js: 检查 `AUTH_TOKEN` 环境变量
|
|
236
|
+
- Browser: 确保在已登录状态下运行
|
|
237
|
+
|
|
238
|
+
2. **网络错误**
|
|
239
|
+
- 检查 `BASE_URL` 是否正确
|
|
240
|
+
- 验证网络连接和防火墙设置
|
|
241
|
+
|
|
242
|
+
3. **Payment Link 错误**
|
|
243
|
+
- 确认 `paymentLinkKey` 对应的环境变量存在
|
|
244
|
+
- 检查 blocklet 配置
|
|
245
|
+
|
|
246
|
+
4. **构建问题**
|
|
247
|
+
- 确保正确构建了 SDK
|
|
248
|
+
- 检查文件路径和导入语句
|
|
249
|
+
|
|
250
|
+
### 调试技巧
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
// 开启详细日志
|
|
254
|
+
const client = new BrokerClient({
|
|
255
|
+
// ... 其他配置
|
|
256
|
+
logger: {
|
|
257
|
+
level: 'debug',
|
|
258
|
+
enabled: true,
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// 捕获所有错误
|
|
263
|
+
process.on('unhandledRejection', (error) => {
|
|
264
|
+
console.error('Unhandled rejection:', error);
|
|
265
|
+
});
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## 📖 更多资源
|
|
269
|
+
|
|
270
|
+
- [Payment Kit Broker Client 主文档](../README.md)
|
|
271
|
+
- [API 完整参考](../docs/api.md)
|
|
272
|
+
- [类型定义](../src/core/types.ts)
|
|
273
|
+
- [错误处理指南](../docs/error-handling.md)
|
|
274
|
+
|
|
275
|
+
## 🤝 贡献
|
|
276
|
+
|
|
277
|
+
欢迎提交示例改进和新的使用场景!请查看项目的贡献指南。
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Payment Kit Broker Client - Browser Example
|
|
2
|
+
|
|
3
|
+
这是一个使用 Payment Kit Broker Client 在浏览器环境中部署网站的完整示例。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 完整的部署流程演示
|
|
8
|
+
- 🌐 浏览器原生支持(无需 Auth Token)
|
|
9
|
+
- 🔄 支持恢复中断的部署
|
|
10
|
+
- 🎨 现代化 UI 设计
|
|
11
|
+
- 📱 响应式布局
|
|
12
|
+
- 🔗 自动打开支付页面
|
|
13
|
+
- ⚙️ 自定义 Payment Link Key
|
|
14
|
+
- 📊 实时日志显示
|
|
15
|
+
- 💾 本地存储持久化
|
|
16
|
+
- 📈 详细的步骤回调和错误处理
|
|
17
|
+
|
|
18
|
+
## 快速开始
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
如果你只需要核心功能,可以参考 `simple-example.js` 文件中的简化代码。
|
|
22
|
+
|
|
23
|
+
## 核心配置说明
|
|
24
|
+
|
|
25
|
+
### 浏览器环境特点
|
|
26
|
+
|
|
27
|
+
1. **无需 Auth Token** - 浏览器环境在已登录状态下运行
|
|
28
|
+
2. **需要 API 实例** - 必须传入 `api` 对象处理 HTTP 请求
|
|
29
|
+
3. **自动获取配置** - 从 `window.blocklet` 自动获取配置信息
|
|
30
|
+
|
|
31
|
+
### 配置参数
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
const client = new BrokerClient({
|
|
35
|
+
baseUrl: 'https://your-blocklet-url.com', // 必需:Blocklet URL
|
|
36
|
+
api: yourApiInstance, // 必需:API 实例
|
|
37
|
+
paymentLinkKey: 'PAYMENT_LINK_ID', // 可选:Payment Link 键名
|
|
38
|
+
timeout: 300000, // 可选:超时时间
|
|
39
|
+
polling: { // 可选:轮询配置
|
|
40
|
+
interval: 3000,
|
|
41
|
+
maxAttempts: 100,
|
|
42
|
+
backoffStrategy: 'linear',
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 功能特性说明
|
|
48
|
+
|
|
49
|
+
上面的完整示例包含了以下功能:
|
|
50
|
+
|
|
51
|
+
- ✅ 完整的 UI 界面
|
|
52
|
+
- 📊 实时日志显示
|
|
53
|
+
- 💾 localStorage 持久化
|
|
54
|
+
- 🔄 恢复部署功能
|
|
55
|
+
- 📱 响应式设计
|
|
56
|
+
- 🎨 Material-UI 组件
|
|
57
|
+
- 🔧 配置管理
|
|
58
|
+
- 🧹 缓存清理功能
|
|
59
|
+
|
|
60
|
+
这个示例是一个完全独立的组件,可以直接在任何 React 项目中使用。
|
|
61
|
+
|
|
62
|
+
## API 实例配置
|
|
63
|
+
|
|
64
|
+
浏览器环境需要传入 API 实例:
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
// 方法1: 使用 @blocklet/payment-react 的 api
|
|
68
|
+
import { api } from '@blocklet/payment-react';
|
|
69
|
+
|
|
70
|
+
// 方法2: 使用自定义 axios 实例
|
|
71
|
+
import axios from 'axios';
|
|
72
|
+
const api = axios.create({
|
|
73
|
+
baseURL: getCurrentBaseUrl(),
|
|
74
|
+
headers: { 'Content-Type': 'application/json' },
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// 方法3: 使用 fetch 包装
|
|
78
|
+
const api = {
|
|
79
|
+
get: async (url) => fetch(url).then(r => r.json()),
|
|
80
|
+
post: async (url, data) => fetch(url, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
headers: { 'Content-Type': 'application/json' },
|
|
83
|
+
body: JSON.stringify(data)
|
|
84
|
+
}).then(r => r.json())
|
|
85
|
+
};
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 故障排除
|
|
89
|
+
|
|
90
|
+
### 常见问题
|
|
91
|
+
|
|
92
|
+
1. **导入错误**
|
|
93
|
+
```bash
|
|
94
|
+
npm install @blocklet/payment-broker-client
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
2. **API 实例未配置**
|
|
98
|
+
```javascript
|
|
99
|
+
// 确保传入正确的 API 实例
|
|
100
|
+
import { api } from '@blocklet/payment-react';
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
3. **window.blocklet 未定义**
|
|
104
|
+
```javascript
|
|
105
|
+
// 确保在 blocklet 环境中运行
|
|
106
|
+
console.log(window.blocklet); // 应该有值
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
4. **支付页面无法打开**
|
|
110
|
+
```javascript
|
|
111
|
+
// 检查浏览器弹窗拦截设置
|
|
112
|
+
window.open(paymentUrl, '_blank');
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 相关链接
|
|
116
|
+
|
|
117
|
+
- [Payment Kit Broker Client 文档](../../README.md)
|
|
118
|
+
- [Node.js 示例](../nodejs/README.md)
|
|
119
|
+
- [API 参考](../../docs/api.md)
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Browser Example for Payment Kit Broker Client
|
|
3
|
+
*
|
|
4
|
+
* This is a minimal example showing how to use the BrokerClient in a browser environment.
|
|
5
|
+
* For a complete UI example, see index.html
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Import the BrokerClient (make sure to build and copy the browser version first)
|
|
9
|
+
// import { BrokerClient, STEPS } from './broker-client-browser.js';
|
|
10
|
+
|
|
11
|
+
// Example usage function
|
|
12
|
+
async function deployWebsiteSimple(options = {}) {
|
|
13
|
+
const {
|
|
14
|
+
paymentLinkKey,
|
|
15
|
+
cachedCheckoutId,
|
|
16
|
+
cachedPaymentUrl,
|
|
17
|
+
api = createDefaultApi(),
|
|
18
|
+
} = options;
|
|
19
|
+
|
|
20
|
+
console.log('🚀 Starting simple browser deployment...');
|
|
21
|
+
|
|
22
|
+
// Create BrokerClient instance
|
|
23
|
+
const client = new BrokerClient({
|
|
24
|
+
baseUrl: getCurrentBaseUrl(),
|
|
25
|
+
paymentLinkKey: paymentLinkKey || undefined,
|
|
26
|
+
api: api,
|
|
27
|
+
timeout: 300000,
|
|
28
|
+
polling: {
|
|
29
|
+
interval: 3000,
|
|
30
|
+
maxAttempts: 100,
|
|
31
|
+
backoffStrategy: 'linear',
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const result = await client.deploy({
|
|
37
|
+
cachedCheckoutId: cachedCheckoutId || undefined,
|
|
38
|
+
cachedPaymentUrl: cachedPaymentUrl || undefined,
|
|
39
|
+
page_info: {
|
|
40
|
+
success_message: {
|
|
41
|
+
en: 'Congratulations! Your website has been successfully deployed.',
|
|
42
|
+
zh: '恭喜您,网站部署成功!',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
hooks: {
|
|
46
|
+
[STEPS.PAYMENT_PENDING]: ({ sessionId, paymentUrl, linkId, isResuming }) => {
|
|
47
|
+
console.log('⏳ Step 1: Waiting for payment...');
|
|
48
|
+
console.log(`📋 Session ID: ${sessionId}`);
|
|
49
|
+
console.log(`🔗 Payment URL: ${paymentUrl}`);
|
|
50
|
+
|
|
51
|
+
if (!isResuming && paymentUrl) {
|
|
52
|
+
console.log('🌐 Opening payment page...');
|
|
53
|
+
window.open(paymentUrl, '_blank');
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
[STEPS.PAYMENT_COMPLETED]: ({ sessionId, vendors }) => {
|
|
58
|
+
console.log('✅ Payment successful!');
|
|
59
|
+
console.log(`📦 Vendors: ${vendors.length}`);
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
[STEPS.INSTALLATION_STARTING]: ({ vendors }) => {
|
|
63
|
+
console.log('📦 Step 2: Installing services...');
|
|
64
|
+
console.log(`📊 Installing ${vendors.length} services`);
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
[STEPS.INSTALLATION_COMPLETED]: ({ progress }) => {
|
|
68
|
+
console.log(`✅ Installation complete (${progress || 100}%)`);
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
[STEPS.SERVICE_STARTING]: ({ vendors }) => {
|
|
72
|
+
console.log('🚀 Step 3: Starting services...');
|
|
73
|
+
console.log(`🔧 Starting ${vendors.length} services`);
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
[STEPS.SERVICE_READY]: () => {
|
|
77
|
+
console.log('✅ Services started successfully');
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
[STEPS.ACCESS_PREPARING]: () => {
|
|
81
|
+
console.log('🌐 Step 4: Getting access URLs...');
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
[STEPS.ACCESS_READY]: ({ appUrl, homeUrl, subscriptionUrl, dashboardUrl }) => {
|
|
85
|
+
console.log('🎉 Deployment completed!');
|
|
86
|
+
console.log(`🏠 Website: ${homeUrl || appUrl}`);
|
|
87
|
+
if (subscriptionUrl) console.log(`💳 Subscription: ${subscriptionUrl}`);
|
|
88
|
+
if (dashboardUrl) console.log(`📊 Dashboard: ${dashboardUrl}`);
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
onError: (error, step) => {
|
|
93
|
+
console.error(`❌ Deployment failed at ${step}:`, error.message);
|
|
94
|
+
if (error.recovery?.suggestions) {
|
|
95
|
+
error.recovery.suggestions.forEach(suggestion => {
|
|
96
|
+
console.log(`💡 Suggestion: ${suggestion}`);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
console.log('🎊 Deployment successful:', result);
|
|
103
|
+
return result;
|
|
104
|
+
|
|
105
|
+
} catch (error) {
|
|
106
|
+
console.error('❌ Deployment failed:', error.message);
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Helper function to get current base URL
|
|
112
|
+
function getCurrentBaseUrl() {
|
|
113
|
+
return `${window.location.protocol}//${window.location.host}${window?.blocklet?.prefix || '/'}`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Default API implementation using fetch
|
|
117
|
+
function createDefaultApi() {
|
|
118
|
+
const baseURL = getCurrentBaseUrl();
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
async get(url) {
|
|
122
|
+
const response = await fetch(`${baseURL}${url}`);
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
125
|
+
}
|
|
126
|
+
return response.json();
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
async post(url, data) {
|
|
130
|
+
const response = await fetch(`${baseURL}${url}`, {
|
|
131
|
+
method: 'POST',
|
|
132
|
+
headers: {
|
|
133
|
+
'Content-Type': 'application/json',
|
|
134
|
+
},
|
|
135
|
+
body: JSON.stringify(data),
|
|
136
|
+
});
|
|
137
|
+
if (!response.ok) {
|
|
138
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
139
|
+
}
|
|
140
|
+
return response.json();
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Example usage scenarios
|
|
146
|
+
|
|
147
|
+
// 1. Basic deployment
|
|
148
|
+
function example1_BasicDeployment() {
|
|
149
|
+
return deployWebsiteSimple();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// 2. Resume deployment with cached session
|
|
153
|
+
function example2_ResumeDeployment() {
|
|
154
|
+
return deployWebsiteSimple({
|
|
155
|
+
cachedCheckoutId: 'cs_your_session_id_here',
|
|
156
|
+
cachedPaymentUrl: 'https://your-payment-url-here',
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// 3. Custom payment link key
|
|
161
|
+
function example3_CustomPaymentLinkKey() {
|
|
162
|
+
return deployWebsiteSimple({
|
|
163
|
+
paymentLinkKey: 'CUSTOM_PAYMENT_LINK_ID',
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// 4. Custom API instance
|
|
168
|
+
function example4_CustomAPI() {
|
|
169
|
+
const customApi = {
|
|
170
|
+
async get(url) {
|
|
171
|
+
// Your custom GET implementation
|
|
172
|
+
console.log('Custom GET:', url);
|
|
173
|
+
return fetch(url).then(r => r.json());
|
|
174
|
+
},
|
|
175
|
+
async post(url, data) {
|
|
176
|
+
// Your custom POST implementation
|
|
177
|
+
console.log('Custom POST:', url, data);
|
|
178
|
+
return fetch(url, {
|
|
179
|
+
method: 'POST',
|
|
180
|
+
headers: { 'Content-Type': 'application/json' },
|
|
181
|
+
body: JSON.stringify(data),
|
|
182
|
+
}).then(r => r.json());
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
return deployWebsiteSimple({
|
|
187
|
+
api: customApi,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Export for use in other modules
|
|
192
|
+
if (typeof module !== 'undefined' && module.exports) {
|
|
193
|
+
module.exports = {
|
|
194
|
+
deployWebsiteSimple,
|
|
195
|
+
getCurrentBaseUrl,
|
|
196
|
+
createDefaultApi,
|
|
197
|
+
example1_BasicDeployment,
|
|
198
|
+
example2_ResumeDeployment,
|
|
199
|
+
example3_CustomPaymentLinkKey,
|
|
200
|
+
example4_CustomAPI,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Global access for browser console
|
|
205
|
+
if (typeof window !== 'undefined') {
|
|
206
|
+
window.PaymentKitExamples = {
|
|
207
|
+
deployWebsiteSimple,
|
|
208
|
+
getCurrentBaseUrl,
|
|
209
|
+
createDefaultApi,
|
|
210
|
+
examples: {
|
|
211
|
+
basicDeployment: example1_BasicDeployment,
|
|
212
|
+
resumeDeployment: example2_ResumeDeployment,
|
|
213
|
+
customPaymentLinkKey: example3_CustomPaymentLinkKey,
|
|
214
|
+
customAPI: example4_CustomAPI,
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
console.log('🎯 Payment Kit Examples loaded! Try:');
|
|
219
|
+
console.log(' PaymentKitExamples.examples.basicDeployment()');
|
|
220
|
+
console.log(' PaymentKitExamples.examples.resumeDeployment()');
|
|
221
|
+
console.log(' PaymentKitExamples.examples.customPaymentLinkKey()');
|
|
222
|
+
console.log(' PaymentKitExamples.examples.customAPI()');
|
|
223
|
+
}
|