@blocklet/payment-react 1.20.16 → 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/.aigne/doc-smith/config.yaml +7 -1
- package/.aigne/doc-smith/upload-cache.yaml +441 -0
- package/docs/components-business-auto-topup.ja.md +187 -0
- package/docs/components-business-auto-topup.zh-TW.md +187 -0
- package/docs/components-business-auto-topup.zh.md +187 -0
- package/docs/components-business-overdue-invoice-payment.ja.md +196 -0
- package/docs/components-business-overdue-invoice-payment.zh-TW.md +197 -0
- package/docs/components-business-overdue-invoice-payment.zh.md +197 -0
- package/docs/components-business-resume-subscription.ja.md +190 -0
- package/docs/components-business-resume-subscription.zh-TW.md +190 -0
- package/docs/components-business-resume-subscription.zh.md +190 -0
- package/docs/components-business.ja.md +21 -0
- package/docs/components-business.zh-TW.md +21 -0
- package/docs/components-business.zh.md +21 -0
- package/docs/components-checkout-checkout-donate.ja.md +259 -0
- package/docs/components-checkout-checkout-donate.zh-TW.md +259 -0
- package/docs/components-checkout-checkout-donate.zh.md +259 -0
- package/docs/components-checkout-checkout-form.ja.md +163 -0
- package/docs/components-checkout-checkout-form.zh-TW.md +163 -0
- package/docs/components-checkout-checkout-form.zh.md +163 -0
- package/docs/components-checkout-checkout-table.ja.md +148 -0
- package/docs/components-checkout-checkout-table.zh-TW.md +148 -0
- package/docs/components-checkout-checkout-table.zh.md +149 -0
- package/docs/components-checkout.ja.md +65 -0
- package/docs/components-checkout.zh-TW.md +65 -0
- package/docs/components-checkout.zh.md +65 -0
- package/docs/components-history-credit-grants-list.ja.md +73 -0
- package/docs/components-history-credit-grants-list.zh-TW.md +73 -0
- package/docs/components-history-credit-grants-list.zh.md +73 -0
- package/docs/components-history-credit-transactions-list.ja.md +106 -0
- package/docs/components-history-credit-transactions-list.zh-TW.md +106 -0
- package/docs/components-history-credit-transactions-list.zh.md +106 -0
- package/docs/components-history-invoice-list.ja.md +110 -0
- package/docs/components-history-invoice-list.zh-TW.md +110 -0
- package/docs/components-history-invoice-list.zh.md +110 -0
- package/docs/components-history-payment-list.ja.md +44 -0
- package/docs/components-history-payment-list.zh-TW.md +44 -0
- package/docs/components-history-payment-list.zh.md +44 -0
- package/docs/components-history.ja.md +67 -0
- package/docs/components-history.zh-TW.md +67 -0
- package/docs/components-history.zh.md +67 -0
- package/docs/components-ui-form-elements-address-form.ja.md +121 -0
- package/docs/components-ui-form-elements-address-form.zh-TW.md +121 -0
- package/docs/components-ui-form-elements-address-form.zh.md +121 -0
- package/docs/components-ui-form-elements-country-select.ja.md +126 -0
- package/docs/components-ui-form-elements-country-select.zh-TW.md +126 -0
- package/docs/components-ui-form-elements-country-select.zh.md +126 -0
- package/docs/components-ui-form-elements-currency-selector.ja.md +108 -0
- package/docs/components-ui-form-elements-currency-selector.zh-TW.md +108 -0
- package/docs/components-ui-form-elements-currency-selector.zh.md +108 -0
- package/docs/components-ui-form-elements-phone-input.ja.md +138 -0
- package/docs/components-ui-form-elements-phone-input.zh-TW.md +138 -0
- package/docs/components-ui-form-elements-phone-input.zh.md +139 -0
- package/docs/components-ui-form-elements.ja.md +91 -0
- package/docs/components-ui-form-elements.zh-TW.md +91 -0
- package/docs/components-ui-form-elements.zh.md +91 -0
- package/docs/components-ui-payment-summary.ja.md +109 -0
- package/docs/components-ui-payment-summary.zh-TW.md +109 -0
- package/docs/components-ui-payment-summary.zh.md +109 -0
- package/docs/components-ui-pricing-table.ja.md +140 -0
- package/docs/components-ui-pricing-table.zh-TW.md +140 -0
- package/docs/components-ui-pricing-table.zh.md +140 -0
- package/docs/components-ui.ja.md +71 -0
- package/docs/components-ui.zh-TW.md +71 -0
- package/docs/components-ui.zh.md +71 -0
- package/docs/components.ja.md +122 -0
- package/docs/components.zh-TW.md +122 -0
- package/docs/components.zh.md +122 -0
- package/docs/getting-started.ja.md +84 -0
- package/docs/getting-started.zh-TW.md +84 -0
- package/docs/getting-started.zh.md +84 -0
- package/docs/guides-theming.ja.md +213 -0
- package/docs/guides-theming.zh-TW.md +213 -0
- package/docs/guides-theming.zh.md +213 -0
- package/docs/guides-utilities.ja.md +197 -0
- package/docs/guides-utilities.zh-TW.md +197 -0
- package/docs/guides-utilities.zh.md +197 -0
- package/docs/guides.ja.md +18 -0
- package/docs/guides.zh-TW.md +18 -0
- package/docs/guides.zh.md +18 -0
- package/docs/hooks-use-mobile.ja.md +84 -0
- package/docs/hooks-use-mobile.zh-TW.md +84 -0
- package/docs/hooks-use-mobile.zh.md +84 -0
- package/docs/hooks-use-subscription.ja.md +111 -0
- package/docs/hooks-use-subscription.zh-TW.md +111 -0
- package/docs/hooks-use-subscription.zh.md +110 -0
- package/docs/hooks.ja.md +14 -0
- package/docs/hooks.zh-TW.md +14 -0
- package/docs/hooks.zh.md +14 -0
- package/docs/overview.ja.md +80 -0
- package/docs/overview.zh-TW.md +80 -0
- package/docs/overview.zh.md +80 -0
- package/docs/providers-donate-provider.ja.md +153 -0
- package/docs/providers-donate-provider.zh-TW.md +153 -0
- package/docs/providers-donate-provider.zh.md +153 -0
- package/docs/providers-payment-provider.ja.md +191 -0
- package/docs/providers-payment-provider.zh-TW.md +191 -0
- package/docs/providers-payment-provider.zh.md +191 -0
- package/docs/providers.ja.md +42 -0
- package/docs/providers.zh-TW.md +42 -0
- package/docs/providers.zh.md +42 -0
- package/package.json +3 -3
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# CheckoutDonate
|
|
2
|
+
|
|
3
|
+
`CheckoutDonate` 组件为您的应用程序添加捐赠功能提供了一个灵活且易于集成的解决方案。它支持多种显示模式,从一个简单的打开结账对话框的按钮,到一个由您完全控制的自定义 UI。
|
|
4
|
+
|
|
5
|
+
该组件必须同时包装在 `PaymentProvider` 和 `DonateProvider` 中才能正常工作。`DonateProvider` 管理应用程序特定范围内的捐赠实例的设置和状态。
|
|
6
|
+
|
|
7
|
+
## 工作原理
|
|
8
|
+
|
|
9
|
+
捐赠流程由 `DonateProvider` 和 `CheckoutDonate` 共同协调。以下是其高级概述:
|
|
10
|
+
|
|
11
|
+
```d2 工作原理 icon=graph-ql:diagram
|
|
12
|
+
direction: down
|
|
13
|
+
|
|
14
|
+
user: {
|
|
15
|
+
shape: c4-person
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
app: {
|
|
19
|
+
label: "您的 React 应用"
|
|
20
|
+
|
|
21
|
+
checkout-donate: {
|
|
22
|
+
label: "CheckoutDonate"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
checkout-form: {
|
|
26
|
+
label: "CheckoutForm(在对话框中)"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
payment-api: {
|
|
31
|
+
label: "支付后端 API"
|
|
32
|
+
shape: cylinder
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# 初始加载
|
|
36
|
+
app.checkout-donate -> payment-api: "获取设置和支持者"
|
|
37
|
+
|
|
38
|
+
# 捐赠流程
|
|
39
|
+
user -> app.checkout-donate: "1. 点击捐赠"
|
|
40
|
+
app.checkout-donate -> app.checkout-form: "2. 打开带有 CheckoutForm 的对话框"
|
|
41
|
+
app.checkout-form -> payment-api: "3. 处理支付"
|
|
42
|
+
payment-api -> app.checkout-form: "4. 返回成功"
|
|
43
|
+
app.checkout-form -> app.checkout-donate: "5. 触发 onPaid 回调"
|
|
44
|
+
app.checkout-donate -> payment-api: "6. 重新获取支持者列表"
|
|
45
|
+
payment-api -> app.checkout-donate: "7. 返回更新后的支持者"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
1. **初始化**:`DonateProvider` 从后端获取并缓存捐赠设置(如预设金额、按钮文本),这些设置由唯一的 `mountLocation` 标识。
|
|
49
|
+
2. **渲染**:`CheckoutDonate` 根据检索到的设置及其 props 渲染一个按钮或自定义 UI。
|
|
50
|
+
3. **交互**:当用户发起捐赠时,`CheckoutDonate` 会打开一个包含为该捐赠预先配置好的 `CheckoutForm` 的对话框。
|
|
51
|
+
4. **支付**:用户通过 `CheckoutForm` 完成支付。
|
|
52
|
+
5. **确认**:支付成功后,将触发 `onPaid` 回调,并且组件会自动刷新支持者列表。
|
|
53
|
+
|
|
54
|
+
## Provider 设置
|
|
55
|
+
|
|
56
|
+
在使用 `CheckoutDonate` 之前,您必须使用 `PaymentProvider` 和 `DonateProvider` 包装您的组件树。
|
|
57
|
+
|
|
58
|
+
```tsx Provider 设置示例 icon=logos:react
|
|
59
|
+
import {
|
|
60
|
+
PaymentProvider,
|
|
61
|
+
DonateProvider,
|
|
62
|
+
CheckoutDonate,
|
|
63
|
+
} from '@blocklet/payment-react';
|
|
64
|
+
import { useSessionContext } from '../hooks/session-context'; // 你的会话上下文钩子
|
|
65
|
+
|
|
66
|
+
function DonationPage() {
|
|
67
|
+
const { session, connect } = useSessionContext();
|
|
68
|
+
|
|
69
|
+
// 确保在渲染 provider 之前已加载会话
|
|
70
|
+
if (!session) {
|
|
71
|
+
return <div>加载中...</div>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<PaymentProvider session={session} connect={connect}>
|
|
76
|
+
<DonateProvider
|
|
77
|
+
mountLocation="unique-page-identifier" // 此捐赠上下文的唯一键
|
|
78
|
+
description="为我的精彩博客文章捐赠"
|
|
79
|
+
defaultSettings={{
|
|
80
|
+
btnText: '支持我',
|
|
81
|
+
}}>
|
|
82
|
+
{/* 你的 CheckoutDonate 组件放在这里 */}
|
|
83
|
+
<CheckoutDonate
|
|
84
|
+
settings={{
|
|
85
|
+
target: "post-123",
|
|
86
|
+
title: "支持作者",
|
|
87
|
+
description: "如果您觉得这篇文章有帮助,可以请我喝杯咖啡",
|
|
88
|
+
reference: "https://your-site.com/posts/123",
|
|
89
|
+
beneficiaries: [
|
|
90
|
+
{
|
|
91
|
+
address: "z2qa...",
|
|
92
|
+
share: "100",
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
}}
|
|
96
|
+
/>
|
|
97
|
+
</DonateProvider>
|
|
98
|
+
</PaymentProvider>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
更多详情,请参阅 [`DonateProvider`](./providers-donate-provider.md) 文档。
|
|
104
|
+
|
|
105
|
+
## 组件属性
|
|
106
|
+
|
|
107
|
+
### `DonateProps`
|
|
108
|
+
|
|
109
|
+
| Prop | Type | Description |
|
|
110
|
+
| --- | --- | --- |
|
|
111
|
+
| `settings` | `CheckoutDonateSettings` | **必需。** 此特定捐赠实例的配置。 |
|
|
112
|
+
| `onPaid` | `(session) => void` | 可选。支付成功后执行的回调函数。 |
|
|
113
|
+
| `onError` | `(error) => void` | 可选。发生错误时执行的回调函数。 |
|
|
114
|
+
| `mode` | `'default' \| 'inline' \| 'custom'` | 可选。渲染模式。默认为 `'default'`。 |
|
|
115
|
+
| `livemode` | `boolean` | 可选。覆盖来自 `PaymentProvider` 的 `livemode`。 |
|
|
116
|
+
| `timeout` | `number` | 可选。支付后等待关闭对话框的毫秒数。默认为 `5000`。 |
|
|
117
|
+
| `theme` | `'default' \| 'inherit' \| object` | 可选。主题自定义选项。请参阅 [Theming](./guides-theming.md) 指南。 |
|
|
118
|
+
| `children` | `(openDialog, donateTotalAmount, supporters, loading, donateSettings) => React.ReactNode` | 可选。仅在 `mode="custom"` 时使用的渲染属性函数。 |
|
|
119
|
+
|
|
120
|
+
### `CheckoutDonateSettings`
|
|
121
|
+
|
|
122
|
+
此对象传递给 `settings` 属性,并定义了捐赠的核心细节。
|
|
123
|
+
|
|
124
|
+
| Property | Type | Description |
|
|
125
|
+
| --- | --- | --- |
|
|
126
|
+
| `target` | `string` | **必需。** 捐赠目标的唯一标识符(例如,帖子 ID、项目名称)。 |
|
|
127
|
+
| `title` | `string` | **必需。** 显示在捐赠对话框顶部的标题。 |
|
|
128
|
+
| `description` | `string` | **必需。** 显示在捐赠对话框中的简短描述。 |
|
|
129
|
+
| `reference` | `string` | **必需。** 与捐赠相关的 URL,用于参考。 |
|
|
130
|
+
| `beneficiaries` | `PaymentBeneficiary[]` | **必需。** 定义资金接收者的对象数组。每个对象需要一个 `address`(收款人的 DID)和 `share`(百分比)。 |
|
|
131
|
+
| `amount` | `object` | 可选。配置捐赠金额,包括 `presets`(例如,`['1', '5', '10']`)、默认的 `preset`、`minimum`、`maximum`,以及是否允许 `custom` 金额。 |
|
|
132
|
+
| `appearance` | `object` | 可选。自定义外观和感觉,包括 `button`(文本、图标、变体)和 `history` 显示(`'avatar'` 或 `'table'`)。 |
|
|
133
|
+
|
|
134
|
+
## 用法示例
|
|
135
|
+
|
|
136
|
+
### 默认模式
|
|
137
|
+
|
|
138
|
+
这是使用 `CheckoutDonate` 的最简单方法。它会渲染一个打开捐赠对话框的按钮,以及近期支持者的摘要。
|
|
139
|
+
|
|
140
|
+
```tsx 默认捐赠按钮 icon=logos:react
|
|
141
|
+
import {
|
|
142
|
+
PaymentProvider,
|
|
143
|
+
DonateProvider,
|
|
144
|
+
CheckoutDonate,
|
|
145
|
+
} from '@blocklet/payment-react';
|
|
146
|
+
import { useSessionContext } from '../hooks/session-context';
|
|
147
|
+
|
|
148
|
+
function App() {
|
|
149
|
+
const { session, connect } = useSessionContext();
|
|
150
|
+
|
|
151
|
+
if (!session) {
|
|
152
|
+
return <div>加载会话中...</div>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return (
|
|
156
|
+
<PaymentProvider session={session} connect={connect}>
|
|
157
|
+
<DonateProvider
|
|
158
|
+
mountLocation="blog-post-123"
|
|
159
|
+
description="为博客文章 123 捐赠"
|
|
160
|
+
defaultSettings={{
|
|
161
|
+
btnText: '请我喝杯咖啡',
|
|
162
|
+
historyType: 'avatar',
|
|
163
|
+
}}>
|
|
164
|
+
<CheckoutDonate
|
|
165
|
+
settings={{
|
|
166
|
+
target: 'post-123',
|
|
167
|
+
title: '支持作者',
|
|
168
|
+
description: '如果您觉得这篇文章有帮助,可以考虑小额捐赠。',
|
|
169
|
+
reference: 'https://example.com/posts/123',
|
|
170
|
+
beneficiaries: [
|
|
171
|
+
{
|
|
172
|
+
address: 'z2qa...gCLd', // 作者的 DID 地址
|
|
173
|
+
share: '100',
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
}}
|
|
177
|
+
onPaid={() => {
|
|
178
|
+
console.log('捐赠成功!');
|
|
179
|
+
}}
|
|
180
|
+
/>
|
|
181
|
+
</DonateProvider>
|
|
182
|
+
</PaymentProvider>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 自定义 UI 模式
|
|
188
|
+
|
|
189
|
+
要完全控制用户界面,请使用 `mode="custom"` 并提供一个渲染属性作为 `children`。此函数让您能够访问捐赠状态,包括筹集到的总金额和支持者列表,从而允许您构建一个完全自定义的显示。
|
|
190
|
+
|
|
191
|
+
```tsx 自定义捐赠 UI icon=logos:react
|
|
192
|
+
import {
|
|
193
|
+
PaymentProvider,
|
|
194
|
+
DonateProvider,
|
|
195
|
+
CheckoutDonate,
|
|
196
|
+
} from '@blocklet/payment-react';
|
|
197
|
+
import { useSessionContext } from '../hooks/session-context';
|
|
198
|
+
import { CircularProgress, Button } from '@mui/material';
|
|
199
|
+
|
|
200
|
+
function CustomDonationDisplay() {
|
|
201
|
+
const { session, connect } = useSessionContext();
|
|
202
|
+
|
|
203
|
+
if (!session) {
|
|
204
|
+
return <div>加载会话中...</div>;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const donateSettings = {
|
|
208
|
+
target: 'post-123',
|
|
209
|
+
title: '支持作者',
|
|
210
|
+
description: '如果您觉得这篇文章有帮助,可以考虑小额捐赠。',
|
|
211
|
+
reference: 'https://example.com/posts/123',
|
|
212
|
+
beneficiaries: [
|
|
213
|
+
{
|
|
214
|
+
address: 'z2qa...gCLd', // 作者的 DID 地址
|
|
215
|
+
share: '100',
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<PaymentProvider session={session} connect={connect}>
|
|
222
|
+
<DonateProvider
|
|
223
|
+
mountLocation="blog-post-123"
|
|
224
|
+
description="为博客文章 123 捐赠">
|
|
225
|
+
<CheckoutDonate mode="custom" settings={donateSettings}>
|
|
226
|
+
{(openDonate, totalAmount, supporters, loading, settings) => (
|
|
227
|
+
<div style={{ border: '1px solid #ccc', padding: '16px', borderRadius: '8px' }}>
|
|
228
|
+
<h2>我们的支持者</h2>
|
|
229
|
+
<p>总捐赠额:<strong>{totalAmount}</strong></p>
|
|
230
|
+
<Button variant="contained" onClick={openDonate}>
|
|
231
|
+
{settings?.appearance?.button?.text || '立即捐赠'}
|
|
232
|
+
</Button>
|
|
233
|
+
{loading ? (
|
|
234
|
+
<CircularProgress style={{ marginTop: '16px' }} />
|
|
235
|
+
) : (
|
|
236
|
+
<ul style={{ listStyle: 'none', padding: 0, marginTop: '16px' }}>
|
|
237
|
+
{(supporters.supporters || []).map((supporter) => (
|
|
238
|
+
<li key={supporter.id}>
|
|
239
|
+
<span>{supporter.customer?.name}</span>
|
|
240
|
+
</li>
|
|
241
|
+
))}
|
|
242
|
+
</ul>
|
|
243
|
+
)}
|
|
244
|
+
</div>
|
|
245
|
+
)}
|
|
246
|
+
</CheckoutDonate>
|
|
247
|
+
</DonateProvider>
|
|
248
|
+
</PaymentProvider>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
`children` 函数接收以下参数:
|
|
254
|
+
|
|
255
|
+
- `openDonate`:一个手动触发捐赠对话框的函数。
|
|
256
|
+
- `totalAmount`:格式化后的总捐赠金额字符串(例如,`"125.00 T"`)。
|
|
257
|
+
- `supporters`:一个 `DonateHistory` 对象,包含 `supporters` 数组和货币信息。
|
|
258
|
+
- `loading`:一个布尔值,指示是否正在获取支持者数据。
|
|
259
|
+
- `settings`:解析后的捐赠设置,由 `DonateProvider` 和 props 合并而成。
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# CheckoutForm
|
|
2
|
+
|
|
3
|
+
`CheckoutForm`コンポーネントは、支払いリンクとチェックアウトセッションを処理するための主要なエントリーポイントです。提供されたIDに基づいて必要なすべてのデータを取得し、適切な支払いまたは寄付インターフェースをレンダリングする高レベルのラッパーとして機能します。このコンポーネントは、完全なチェックアウトフローをアプリケーションに統合する最も簡単な方法です。
|
|
4
|
+
|
|
5
|
+
`CheckoutForm`またはその親コンポーネントを`PaymentProvider`でラップして、セッション情報やAPI設定などの必要なコンテキストにアクセスできるようにすることが不可欠です。詳細については、[PaymentProviderのドキュメント](./providers-payment-provider.md)を参照してください。
|
|
6
|
+
|
|
7
|
+
## 仕組み
|
|
8
|
+
|
|
9
|
+
コンポーネントは、チェックアウトプロセス全体を調整します:
|
|
10
|
+
|
|
11
|
+
1. **初期化**: `paymentLink` ID(`plink_`で始まる)または`checkoutSession` ID(`cs_`で始まる)でマウントされます。
|
|
12
|
+
2. **データ取得**: 支払いバックエンドと通信して、支払い方法、ラインアイテム、顧客詳細など、必要なすべてのコンテキストを取得します。
|
|
13
|
+
3. **UIレンダリング**: `formType` propに基づいて、内部で標準の`Payment`コンポーネントまたは特化した`DonationForm`コンポーネントをレンダリングします。
|
|
14
|
+
4. **状態管理**: 読み込み状態、完了ステータス、エラーハンドリングなど、支払いのライフサイクル全体を処理します。
|
|
15
|
+
|
|
16
|
+
```d2 Basic Flow of CheckoutForm icon=lucide:workflow
|
|
17
|
+
direction: down
|
|
18
|
+
shape: sequence_diagram
|
|
19
|
+
|
|
20
|
+
User-Action: {
|
|
21
|
+
shape: c4-person
|
|
22
|
+
label: "ユーザー"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
Application: {
|
|
26
|
+
label: "あなたのReactアプリケーション"
|
|
27
|
+
|
|
28
|
+
CheckoutForm-Component: {
|
|
29
|
+
label: "CheckoutForm"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
Payment-Component: {
|
|
33
|
+
label: "Paymentコンポーネント"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
Donation-Component: {
|
|
37
|
+
label: "DonationFormコンポーネント"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Payment-API: {
|
|
42
|
+
label: "支払いバックエンドAPI"
|
|
43
|
+
shape: cylinder
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
User-Action -> Application.CheckoutForm-Component: "1. 'id' propでマウント"
|
|
47
|
+
Application.CheckoutForm-Component -> Payment-API: "2. セッションデータを取得"
|
|
48
|
+
Payment-API -> Application.CheckoutForm-Component: "3. チェックアウトコンテキストを返す"
|
|
49
|
+
|
|
50
|
+
alt "formTypeが'payment'の場合" {
|
|
51
|
+
Application.CheckoutForm-Component -> Application.Payment-Component: "4. Payment UIをレンダリング"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
alt "formTypeが'donation'の場合" {
|
|
55
|
+
Application.CheckoutForm-Component -> Application.Donation-Component: "5. Donation UIをレンダリング"
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
User-Action -> Application.Payment-Component: "6. 支払いを完了"
|
|
59
|
+
User-Action -> Application.Donation-Component: "7. 寄付を完了"
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Props
|
|
64
|
+
|
|
65
|
+
`CheckoutForm`コンポーネントは、次のpropsを受け入れます:
|
|
66
|
+
|
|
67
|
+
| Prop | Type | 必須 | デフォルト | 説明 |
|
|
68
|
+
|---------------|----------------------------------------------------------------------------|----------|---------------|-------------------------------------------------------------------------------------------------------------------------|
|
|
69
|
+
| `id` | `string` | はい | - | 支払いリンク(`plink_...`)またはチェックアウトセッション(`cs_...`)の一意の識別子。 |
|
|
70
|
+
| `mode` | `'standalone'` \| `'inline'` \| `'popup'` \| `'inline-minimal'` \| `'popup-minimal'` | いいえ | `'inline'` | レンダリングモードを定義します。`'standalone'`はフルページビュー用、`'inline'`はコンテナに埋め込む用です。 |
|
|
71
|
+
| `formType` | `'payment'` \| `'donation'` | いいえ | `'payment'` | レンダリングするフォームのタイプを決定します。特化した寄付フローには`'donation'`を使用します。 |
|
|
72
|
+
| `onPaid` | `(res: CheckoutContext) => void` | いいえ | - | 支払いが成功したときに実行されるコールバック関数。最終的なチェックアウトコンテキストを引数として受け取ります。 |
|
|
73
|
+
| `onError` | `(err: Error) => void` | いいえ | `console.error` | プロセス中にエラーが発生したときに実行されるコールバック関数。 |
|
|
74
|
+
| `onChange` | `(data: CheckoutFormData) => void` | いいえ | - | いずれかのフォームフィールドの値が変更されたときに発行されるコールバック関数。 |
|
|
75
|
+
| `goBack` | `() => void` | いいえ | - | 提供された場合、戻るボタンをレンダリングし、クリックされたときにこの関数を呼び出します。 |
|
|
76
|
+
| `extraParams` | `Record<string, any>` | いいえ | `{}` | 支払いリンクからセッションを開始する際にURLで渡される追加パラメータのオブジェクト。 |
|
|
77
|
+
| `theme` | `'default'` \| `'inherit'` \| `PaymentThemeOptions` | いいえ | `'default'` | コンポーネントのテーマを制御します。`'inherit'`は親テーマを使用するか、カスタムテーマオブジェクトを渡すことができます。 |
|
|
78
|
+
| `action` | `string` | いいえ | `''` | ボタンのテキストなどのUI要素をカスタマイズしたり、特定のフローを追跡したりするために使用される文字列識別子。 |
|
|
79
|
+
|
|
80
|
+
## 使用方法
|
|
81
|
+
|
|
82
|
+
### 基本的なインライン支払いフォーム
|
|
83
|
+
|
|
84
|
+
これは、支払いフォームをアプリケーションのUI内に直接埋め込む最も一般的なユースケースです。コンポーネントが内部ですべてのロジックを処理します。
|
|
85
|
+
|
|
86
|
+
```tsx MyStorePage.tsx icon=lucide:shopping-cart
|
|
87
|
+
import { PaymentProvider, CheckoutForm } from '@blocklet/payment-react';
|
|
88
|
+
import { useSessionContext } from './hooks/session-context'; // アプリのセッションフック
|
|
89
|
+
|
|
90
|
+
export default function MyStorePage() {
|
|
91
|
+
const { session, connectApi } = useSessionContext();
|
|
92
|
+
|
|
93
|
+
const handlePaymentSuccess = (result) => {
|
|
94
|
+
console.log('支払いが成功しました!', result);
|
|
95
|
+
alert('ご購入ありがとうございます!');
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const handlePaymentError = (error) => {
|
|
99
|
+
console.error('支払いが失敗しました:', error);
|
|
100
|
+
alert('申し訳ありませんが、支払いを処理できませんでした。');
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
return (
|
|
104
|
+
<PaymentProvider session={session} connectApi={connectApi}>
|
|
105
|
+
<div style={{ maxWidth: '960px', margin: '0 auto' }}>
|
|
106
|
+
<h1>Checkout</h1>
|
|
107
|
+
<CheckoutForm
|
|
108
|
+
id="plink_xxxxxxxxxxxxxx" // あなたの支払いリンクIDに置き換えてください
|
|
109
|
+
mode="inline"
|
|
110
|
+
onPaid={handlePaymentSuccess}
|
|
111
|
+
onError={handlePaymentError}
|
|
112
|
+
/>
|
|
113
|
+
</div>
|
|
114
|
+
</PaymentProvider>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### スタンドアロンのフルページチェックアウト
|
|
120
|
+
|
|
121
|
+
`mode="standalone"`を使用すると、専用のフルページチェックアウトエクスペリエンスをレンダリングできます。これは、ユーザーを別のページにリダイレクトして支払いを完了させるシナリオに最適です。
|
|
122
|
+
|
|
123
|
+
```tsx CheckoutPage.tsx icon=lucide:layout-template
|
|
124
|
+
import { PaymentProvider, CheckoutForm } from '@blocklet/payment-react';
|
|
125
|
+
import { useSessionContext } from './hooks/session-context';
|
|
126
|
+
|
|
127
|
+
export default function CheckoutPage() {
|
|
128
|
+
const { session, connectApi } = useSessionContext();
|
|
129
|
+
const paymentLinkId = 'plink_xxxxxxxxxxxxxx'; // URLパラメータから取得可能
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
<PaymentProvider session={session} connectApi={connectApi}>
|
|
133
|
+
<CheckoutForm id={paymentLinkId} mode="standalone" />
|
|
134
|
+
</PaymentProvider>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 寄付フォーム
|
|
140
|
+
|
|
141
|
+
`formType="donation"`を設定することで、コンポーネントは寄付キャンペーンに特化したUIをレンダリングします。これには、金額のプリセットや特典の表示などの機能が含まれます。
|
|
142
|
+
|
|
143
|
+
```tsx DonationPage.tsx icon=lucide:gift
|
|
144
|
+
import { PaymentProvider, CheckoutForm } from '@blocklet/payment-react';
|
|
145
|
+
import { useSessionContext } from './hooks/session-context';
|
|
146
|
+
|
|
147
|
+
export default function DonationPage() {
|
|
148
|
+
const { session, connectApi } = useSessionContext();
|
|
149
|
+
|
|
150
|
+
return (
|
|
151
|
+
<PaymentProvider session={session} connectApi={connectApi}>
|
|
152
|
+
<div style={{ padding: '2rem' }}>
|
|
153
|
+
<h2>Support Our Cause</h2>
|
|
154
|
+
<CheckoutForm
|
|
155
|
+
id="plink_yyyyyyyyyyyyyy" // あなたの寄付リンクIDに置き換えてください
|
|
156
|
+
formType="donation"
|
|
157
|
+
onPaid={() => alert('寛大なご寄付ありがとうございます!')}
|
|
158
|
+
/>
|
|
159
|
+
</div>
|
|
160
|
+
</PaymentProvider>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
```
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# CheckoutForm
|
|
2
|
+
|
|
3
|
+
`CheckoutForm` 元件是處理付款連結和結帳會話的主要進入點。它作為一個高階封裝器,根據提供的 ID 擷取所有必要的資料,並呈現適當的付款或捐款介面。此元件是將完整的結帳流程整合到您應用程式中最簡單的方法。
|
|
4
|
+
|
|
5
|
+
務必將 `CheckoutForm` 或其任何父層元件用 `PaymentProvider` 包裹,以確保它能存取必要的情境資訊,例如會話資訊和 API 設定。更多詳細資訊,請參閱 [PaymentProvider 文件](./providers-payment-provider.md)。
|
|
6
|
+
|
|
7
|
+
## 運作方式
|
|
8
|
+
|
|
9
|
+
該元件會協調整個結帳流程:
|
|
10
|
+
|
|
11
|
+
1. **初始化**:它會以一個 `paymentLink` ID (前綴為 `plink_`) 或一個 `checkoutSession` ID (前綴為 `cs_`) 掛載。
|
|
12
|
+
2. **資料擷取**:它會與付款後端通訊,以擷取所有必要的情境資訊,包括付款方式、訂單項目和顧客詳細資訊。
|
|
13
|
+
3. **UI 渲染**:根據 `formType` prop,它會在內部渲染標準的 `Payment` 元件或專門的 `DonationForm` 元件。
|
|
14
|
+
4. **狀態管理**:它會處理付款的整個生命週期,包括載入狀態、完成狀態和錯誤處理。
|
|
15
|
+
|
|
16
|
+
```d2 Basic Flow of CheckoutForm icon=lucide:workflow
|
|
17
|
+
direction: down
|
|
18
|
+
shape: sequence_diagram
|
|
19
|
+
|
|
20
|
+
User-Action: {
|
|
21
|
+
shape: c4-person
|
|
22
|
+
label: "使用者"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
Application: {
|
|
26
|
+
label: "您的 React 應用程式"
|
|
27
|
+
|
|
28
|
+
CheckoutForm-Component: {
|
|
29
|
+
label: "CheckoutForm"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
Payment-Component: {
|
|
33
|
+
label: "付款元件"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
Donation-Component: {
|
|
37
|
+
label: "捐款表單元件"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Payment-API: {
|
|
42
|
+
label: "付款後端 API"
|
|
43
|
+
shape: cylinder
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
User-Action -> Application.CheckoutForm-Component: "1. 以 'id' prop 掛載"
|
|
47
|
+
Application.CheckoutForm-Component -> Payment-API: "2. 擷取會話資料"
|
|
48
|
+
Payment-API -> Application.CheckoutForm-Component: "3. 回傳結帳情境"
|
|
49
|
+
|
|
50
|
+
alt "若 formType 為 'payment'" {
|
|
51
|
+
Application.CheckoutForm-Component -> Application.Payment-Component: "4. 渲染付款 UI"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
alt "若 formType 為 'donation'" {
|
|
55
|
+
Application.CheckoutForm-Component -> Application.Donation-Component: "5. 渲染捐款 UI"
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
User-Action -> Application.Payment-Component: "6. 完成付款"
|
|
59
|
+
User-Action -> Application.Donation-Component: "7. 完成捐款"
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Props
|
|
64
|
+
|
|
65
|
+
`CheckoutForm` 元件接受以下 props:
|
|
66
|
+
|
|
67
|
+
| Prop | Type | Required | Default | Description |
|
|
68
|
+
|---------------|----------------------------------------------------------------------------|----------|---------------|-------------------------------------------------------------------------------------------------------------------------|
|
|
69
|
+
| `id` | `string` | 是 | - | 付款連結 (`plink_...`) 或結帳會話 (`cs_...`) 的唯一識別碼。 |
|
|
70
|
+
| `mode` | `'standalone'` \| `'inline'` \| `'popup'` \| `'inline-minimal'` \| `'popup-minimal'` | 否 | `'inline'` | 定義渲染模式。`'standalone'` 用於全頁檢視,`'inline'` 用於嵌入容器中。 |
|
|
71
|
+
| `formType` | `'payment'` \| `'donation'` | 否 | `'payment'` | 決定要渲染的表單類型。使用 `'donation'` 來實現專門的捐款流程。 |
|
|
72
|
+
| `onPaid` | `(res: CheckoutContext) => void` | 否 | - | 付款成功後執行的回呼函式。接收最終的結帳情境作為參數。 |
|
|
73
|
+
| `onError` | `(err: Error) => void` | 否 | `console.error` | 在過程中發生錯誤時執行的回呼函式。 |
|
|
74
|
+
| `onChange` | `(data: CheckoutFormData) => void` | 否 | - | 任何表單欄位值變更時觸發的回呼函式。 |
|
|
75
|
+
| `goBack` | `() => void` | 否 | - | 如果提供,會渲染一個返回按鈕,並在點擊時呼叫此函式。 |
|
|
76
|
+
| `extraParams` | `Record<string, any>` | 否 | `{}` | 從付款連結啟動會話時,要傳遞到 URL 中的額外參數物件。 |
|
|
77
|
+
| `theme` | `'default'` \| `'inherit'` \| `PaymentThemeOptions` | 否 | `'default'` | 控制元件的主題。`'inherit'` 使用父層主題,或者您可以傳遞一個自訂主題物件。 |
|
|
78
|
+
| `action` | `string` | 否 | `''` | 用於自訂 UI 元素(如按鈕文字)或追蹤特定流程的字串識別碼。 |
|
|
79
|
+
|
|
80
|
+
## 使用方式
|
|
81
|
+
|
|
82
|
+
### 基本的內嵌付款表單
|
|
83
|
+
|
|
84
|
+
這是將付款表單直接嵌入到您應用程式 UI 中最常見的使用案例。該元件會在內部處理所有邏輯。
|
|
85
|
+
|
|
86
|
+
```tsx MyStorePage.tsx icon=lucide:shopping-cart
|
|
87
|
+
import { PaymentProvider, CheckoutForm } from '@blocklet/payment-react';
|
|
88
|
+
import { useSessionContext } from './hooks/session-context'; // 您應用程式的 session hook
|
|
89
|
+
|
|
90
|
+
export default function MyStorePage() {
|
|
91
|
+
const { session, connectApi } = useSessionContext();
|
|
92
|
+
|
|
93
|
+
const handlePaymentSuccess = (result) => {
|
|
94
|
+
console.log('付款成功!', result);
|
|
95
|
+
alert('感謝您的購買!');
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const handlePaymentError = (error) => {
|
|
99
|
+
console.error('付款失敗:', error);
|
|
100
|
+
alert('抱歉,您的付款無法處理。');
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
return (
|
|
104
|
+
<PaymentProvider session={session} connectApi={connectApi}>
|
|
105
|
+
<div style={{ maxWidth: '960px', margin: '0 auto' }}>
|
|
106
|
+
<h1>結帳</h1>
|
|
107
|
+
<CheckoutForm
|
|
108
|
+
id="plink_xxxxxxxxxxxxxx" // 請替換成您的付款連結 ID
|
|
109
|
+
mode="inline"
|
|
110
|
+
onPaid={handlePaymentSuccess}
|
|
111
|
+
onError={handlePaymentError}
|
|
112
|
+
/>
|
|
113
|
+
</div>
|
|
114
|
+
</PaymentProvider>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 獨立的全頁結帳
|
|
120
|
+
|
|
121
|
+
使用 `mode="standalone"` 來渲染一個專用的全頁結帳體驗。這非常適合您將使用者重新導向到一個單獨頁面以完成付款的場景。
|
|
122
|
+
|
|
123
|
+
```tsx CheckoutPage.tsx icon=lucide:layout-template
|
|
124
|
+
import { PaymentProvider, CheckoutForm } from '@blocklet/payment-react';
|
|
125
|
+
import { useSessionContext } from './hooks/session-context';
|
|
126
|
+
|
|
127
|
+
export default function CheckoutPage() {
|
|
128
|
+
const { session, connectApi } = useSessionContext();
|
|
129
|
+
const paymentLinkId = 'plink_xxxxxxxxxxxxxx'; // 可從 URL 參數中取得
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
<PaymentProvider session={session} connectApi={connectApi}>
|
|
133
|
+
<CheckoutForm id={paymentLinkId} mode="standalone" />
|
|
134
|
+
</PaymentProvider>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 捐款表單
|
|
140
|
+
|
|
141
|
+
透過設定 `formType="donation"`,該元件會渲染一個專為捐款活動量身打造的特殊 UI,包括金額預設和福利顯示等功能。
|
|
142
|
+
|
|
143
|
+
```tsx DonationPage.tsx icon=lucide:gift
|
|
144
|
+
import { PaymentProvider, CheckoutForm } from '@blocklet/payment-react';
|
|
145
|
+
import { useSessionContext } from './hooks/session-context';
|
|
146
|
+
|
|
147
|
+
export default function DonationPage() {
|
|
148
|
+
const { session, connectApi } = useSessionContext();
|
|
149
|
+
|
|
150
|
+
return (
|
|
151
|
+
<PaymentProvider session={session} connectApi={connectApi}>
|
|
152
|
+
<div style={{ padding: '2rem' }}>
|
|
153
|
+
<h2>支持我們的事業</h2>
|
|
154
|
+
<CheckoutForm
|
|
155
|
+
id="plink_yyyyyyyyyyyyyy" // 請替換成您的捐款連結 ID
|
|
156
|
+
formType="donation"
|
|
157
|
+
onPaid={() => alert('感謝您的慷慨捐款!')}
|
|
158
|
+
/>
|
|
159
|
+
</div>
|
|
160
|
+
</PaymentProvider>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
```
|