能力介绍
@blocklet/payment-react 是一个为 Blocklet 应用设计的 React 支付组件库,集成支付基础设施,支持支付流程、订阅管理和打赏系统。
以下是所有组件和能力的分类归集,方便开发者快速定位。
1. 上下文与状态管理#
提供支付相关的上下文和钩子。
PaymentProvider#
支付上下文提供者: 如果要使用Payment Kit 服务,必须提供 PaymentProvider。
import { PaymentProvider, CheckoutForm } from '@blocklet/payment-react';
function App() {
return (
<PaymentProvider session={session} connect={connectApi}>
<CheckoutForm id="plink_xxx" />
</PaymentProvider>
);
}
DonateProvider#
打赏配置上下文: 如果要集成 Payment Kit 打赏配置管理, 必须提供 DonateProvider。
import { PaymentProvider, DonateProvider, CheckoutDonate } from '@blocklet/payment-react';
function DonatePage() {
return (
<PaymentProvider session={session} connect={connectApi}>
<DonateProvider mountLocation="xx-blocklet-donate" descriprion="xx blocklet donate config">
<CheckoutDonate ...donateProps />
</DonateProvider>
</PaymentProvider>
);
}
PaymentThemeProvider#
Payment KIt 样式主题
import { PaymentThemeProvider, CheckoutForm } from '@blocklet/payment-react';
function ThemedApp() {
return (
<PaymentThemeProvider>
...
</PaymentThemeProvider>
);
}
useSubscription#
订阅事件监听。
const subscription = useSubscription('events');
useEffect(() => {
if (subscription && customer_id) {
subscription.on('invoice.paid', ({ response }: { response: TInvoiceExpanded }) => {
if (response.customer_id === customer_id) {
handleInvoicePaid();
}
});
}
}, [subscription]);
useMobile#
检测是否为移动设备。
const isMobile = useMobile(mobilePoint?: 'md' | 'sm' | 'lg' | 'xl' | 'xs')
2. 支付流程组件#
用于实现支付、打赏和定价展示的核心功能。
CheckoutForm#
支付表单,支持内嵌或弹窗模式,适用于支付链接或会话
import { PaymentProvider, CheckoutForm } from '@blocklet/payment-react';
function Payment() {
return (
<PaymentProvider session={session} connect={connectApi}>
<CheckoutForm id="plink_xxx" mode="inline" onChange={(state) => console.log(state)} />
</PaymentProvider>
);
}
CheckoutTable#
展示产品定价的表格
import { PaymentProvider, CheckoutTable } from '@blocklet/payment-react';
function Pricing() {
return (
<PaymentProvider session={session} connect={connectApi}>
<CheckoutTable id="prctbl_xxx" />
</PaymentProvider>
);
}
CheckoutDonate#
打赏控件,支持自定义金额和受益人。快速开启 ->
import { PaymentProvider, DonateProvider, CheckoutDonate } from '@blocklet/payment-react';
function DonationButton() {
return (
<PaymentProvider session={session} connect={connectApi}>
<DonateProvider
mountLocation="your-unique-donate-instance" // 必填,打赏实例的挂载位置标识符
description="帮助定位此打赏实例" // 可选,描述挂载位置的作用
>
<CheckoutDonate
settings={{
target: "post-123", // 必填,打赏实例的唯一标识符
title: "支持作者", // 必填,打赏弹窗标题
description: "如果这篇文章对你有帮助,不妨请我喝杯咖啡", // 必填,打赏描述
reference: "https://your-site.com/posts/123", // 必填,打赏参考链接
beneficiaries: [
{
address: "tip user did", // 必填,受益人地址(替换为实际 DID)
share: "100", // 必填,分享百分比
},
],
}}
/>
</DonateProvider>
</PaymentProvider>
);
}
export default DonationButton;
OverdueInvoicePayment#
处理订阅中的逾期账单
import { PaymentProvider, OverdueInvoicePayment } from '@blocklet/payment-react';
function Invoice() {
return (
<PaymentProvider session={session} connect={connectApi}>
<OverdueInvoicePayment subscriptionId="sub_xxx" onPaid={() => console.log("已支付")} />
</PaymentProvider>
);
}
3. 历史记录组件#
展示支付和账单历史。
CustomerInvoiceList#
列出客户账单历史。
import { PaymentProvider, CustomerInvoiceList } from '@blocklet/payment-react';
function Invoices() {
return (
<PaymentProvider session={session} connect={connectApi}>
<CustomerInvoiceList
subscription_id="sub_xxx"
customer_id="cus_xxx"
type="table"
include_staking
status="open,paid,uncollectible,void"
/>
</PaymentProvider>
);
}
CustomerPaymentList#
import { PaymentProvider, CustomerPaymentList } from '@blocklet/payment-react';
function Payments() {
return (
<PaymentProvider session={session} connect={connectApi}>
<CustomerPaymentList status="completed" />
</PaymentProvider>
);
}
4. 表单输入组件#
用于收集用户输入数据,支持支付相关表单。
FormInput#
基础表单输入组件。
import { FormInput } from '@blocklet/payment-react';
function Input() {
return <FormInput label="用户名" name="name" />;
}
PhoneInput#
电话号码输入(支持选择国家)。
import { PhoneInput } from '@blocklet/payment-react';
function Phone() {
return <PhoneInput name="phone" countryFieldName="address.country" errorPosition="right" />;
}
StripeForm#
集成 Stripe 的支付表单。
import { PaymentProvider, StripeForm } from '@blocklet/payment-react';
function Stripe() {
return (
<PaymentProvider session={session} connect={connectApi}>
<StripeForm
clientSecret={secretKey}
intentType="payment_intent"
publicKey={publicKey}
customer={state.customer as TCustomer}
mode="setup"
onConfirm={onStripeConfirm}
onCancel={onStripeCancel}
returnUrl={window.location.href.replace(/\/[^/]+$/, '')}
/>
</PaymentProvider>
);
}
CurrencySelector#
货币选择下拉菜单。
import { CurrencySelector } from '@blocklet/payment-react';
function Currency() {
return <CurrencySelector currencies={[{symbol: 'ABT', logo: '', method: {name: 'Arcblock'}}]} value="0" onChange={(currencyIndex) => console.log(currencyIndex)} />;
}
CountrySelect#
国家选择下拉菜单。
import { CountrySelect } from '@blocklet/payment-react';
function Country() {
return <CountrySelect name="country" onChange={(country) => console.log(country)} />;
}
5. 数据展示组件#
用于格式化显示支付相关信息。
Livemode#
显示测试模式状态。
import { Livemode } from '@blocklet/payment-react';
function Mode() {
return <Livemode />;
}
TruncatedText#
截断长文本并显示省略号。
import { TruncatedText } from '@blocklet/payment-react';
function Text() {
return <TruncatedText maxLength={10} text="这是一个很长的文本" />;
}
6. 交互组件#
提供用户交互的 UI 元素。
LoadingButton#
带加载状态的按钮。
import { LoadingButton } from '@blocklet/payment-react';
import { useState } from 'react';
function Button() {
const [loading, setLoading] = useState(false);
return (
<LoadingButton loading={loading} onClick={() => setLoading(true)} loadingPosition="end">
支付
</LoadingButton>
);
}
// LoadingButton Props
interface LoadingButtonProps extends ButtonProps {
loading?: boolean;
loadingIndicator?: React.ReactNode;
loadingPosition?: 'start' | 'center' | 'end';
loadingProps?: Partial<CircularProgressProps>; // can custom Loading style
loadingOnly?: boolean; // hide text if loadingOnly is true
}
Switch#
开关按钮,用于状态切换。
import { Switch } from '@blocklet/payment-react';
function Toggle() {
return <Switch checked={true} onChange={(checked) => console.log(checked)} />;
}
ConfirmDialog#
确认对话框,用于用户确认操作。
import { ConfirmDialog } from '@blocklet/payment-react';
import { useState } from 'react';
function Confirm() {
const [open, setOpen] = useState(false);
return (
<>
<button onClick={() => setOpen(true)}>打开</button>
<ConfirmDialog
onConfirm={() => console.log("确认")}
onCancel={() => setOpen(false)}
title="确认操作"
message="确认是否执行?"
confirm="确定"
/>
</>
);
}
Link#
导航链接。
import { Link } from '@blocklet/payment-react';
// use navigate
<Link to="/demo" target="_blank">
跳转
</Link>
// window.open
<Link to="https://example.com" target="_blank">
跳转
</Link>
7. 交易相关组件#
处理交易信息展示。
TxLink#
显示交易链接。
import { TxLink } from '@blocklet/payment-react';
import type { PaymentDetails, TPaymentMethod } from '@blocklet/payment-types';
function Transaction() {
return <TxLink detail={detail as PaymentDetails} method={method as TPaymentMethod} />;
}
TxGas#
显示交易 gas 费。
import { TxGas } from '@blocklet/payment-react';
import type { PaymentDetails, TPaymentMethod } from '@blocklet/payment-types';
function Transaction() {
return <TxGas detail={detail as PaymentDetails} method={method as TPaymentMethod} />;
}
PaymentBeneficiaries#
列出支付受益人及其分成比例。
import { PaymentBeneficiaries } from '@blocklet/payment-react';
function Beneficiaries() {
return <PaymentBeneficiaries totalAmount="10000" beneficiaries={[{ address: "did_123", name: 'hhh', percent: 100 }]} />;
}
8. 工具与实用功能#
提供 API 调用、缓存和格式化工具。
CachedRequest#
缓存 API 请求。
import { CachedRequest } from '@blocklet/payment-react';
// 1. Choose appropriate cache strategy
const shortLivedCache = new CachedRequest('key', fetchData, {
strategy: 'memory',
ttl: 60 * 1000 // 1 minute
});
const persistentCache = new CachedRequest('key', fetchData, {
strategy: 'local',
ttl: 24 * 60 * 60 * 1000 // 1 day
});
// 2. Clear cache when data changes
async function updateData() {
await api.post('/api/data', newData);
await cache.fetch(true); // Force refresh
}
// 3. Handle cache errors
try {
const data = await cache.fetch();
} catch (err) {
console.error('Cache error:', err);
// Fallback to fresh data
const fresh = await cache.fetch(true);
}
translations #
多语言支持
import { translations as extraTranslations } from '@blocklet/payment-react';
import merge from 'lodash/merge';
import en from './en';
import zh from './zh';
export const translations = merge(
{
zh,
en,
},
extraTranslations
);
createLazyComponent#
延迟加载组件。
import { createLazyComponent } from '@blocklet/payment-react';
export default LazyComponent<React.ComponentType<StripeCheckoutProps>, StripeCheckoutProps>(async () => {
const [lodash] = await Promise.all([import('lodash')]); // import lazy package
window.__Lodash = {
lodash
};
const { default: Component } = await import('./form');
return Component;
});
// form.tsx
const { lodash } = (globalThis as any).__Lodash;
export function Form(){
// use lodash
return (
...
)
}