@seaverse/payment-sdk 0.8.0 → 0.8.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  SeaVerse Payment SDK - 一站式支付解决方案,提供积分管理、支付弹窗、订阅管理和订单跟踪功能。
4
4
 
5
- > **最新版本**: v0.8.0 | **文档语言**: 中文优先(包含英文说明)
5
+ > **最新版本**: v0.8.2 | **文档语言**: 中文优先(包含英文说明)
6
6
 
7
7
  ## 📦 安装
8
8
 
@@ -95,6 +95,46 @@ const modal = new GenericPackageModal({
95
95
  modal.open();
96
96
  ```
97
97
 
98
+ ## 🏗️ 架构设计
99
+
100
+ ### 代码重构 (v0.8.1)
101
+
102
+ 为了提高代码可维护性和消除重复逻辑,SDK 进行了架构重构:
103
+
104
+ **核心改进**:
105
+ - ✅ **抽象基类设计** - 创建 `BasePackageModal<TPackage, TOptions>` 抽象基类
106
+ - ✅ **消除重复代码** - 减少 ~400 行重复代码(SDK 初始化、支付流程、事件处理)
107
+ - ✅ **类型安全** - 使用 TypeScript 泛型确保类型安全
108
+ - ✅ **向后兼容** - 公开 API 完全不变,现有代码无需修改
109
+
110
+ **类继承结构**:
111
+
112
+ ```
113
+ BasePackageModal<TPackage, TOptions> (抽象基类)
114
+ ├── CreditPackageModal (积分套餐弹框)
115
+ └── GenericPackageModal (通用套餐弹框)
116
+ ```
117
+
118
+ **BasePackageModal 提供的共享功能**:
119
+ - SDK 初始化和状态管理
120
+ - 支付流程处理(订单创建、支付弹框)
121
+ - 事件监听和按钮处理
122
+ - 工具方法(formatNumber、cleanup 等)
123
+
124
+ **子类只需实现**:
125
+ - `createModal()` - 创建和配置 PaymentModal
126
+ - `renderContent()` - 渲染弹框内容(UI 特定逻辑)
127
+ - `getPackages()` - 获取套餐列表
128
+ - `getPackageDisplayName()` - 获取套餐显示名称
129
+ - `getLoadingButtonHTML()` - 获取加载按钮 HTML
130
+
131
+ 这种设计确保:
132
+ - **单一职责** - 基类负责逻辑,子类负责 UI
133
+ - **DRY 原则** - 共享逻辑只需维护一处
134
+ - **易于扩展** - 添加新套餐类型只需继承基类
135
+
136
+ ---
137
+
98
138
  ## 📖 核心功能模块
99
139
 
100
140
  ### ⭐️ 推荐功能(新用户优先使用)
@@ -562,6 +602,170 @@ if (result.success) {
562
602
 
563
603
  ---
564
604
 
605
+ ### DropinPaymentModal - Dropin 支付弹框(带挽留功能)
606
+
607
+ **适用场景**:
608
+ - ✅ 需要弹框形式的 Dropin 支付(无需自己创建弹框容器)
609
+ - ✅ 支持用户取消支付时的挽留弹框(可选)
610
+ - ✅ 自动处理弹框打开/关闭/清理逻辑
611
+
612
+ #### 基础用法
613
+
614
+ ```typescript
615
+ import { SeaartPaymentSDK, DropinPaymentModal } from '@seaverse/payment-sdk';
616
+
617
+ // 1. 初始化 SDK
618
+ const sdk = SeaartPaymentSDK.getInstance();
619
+ await sdk.init({
620
+ scriptUrl: 'https://your-cdn.com/seaart-payment.js',
621
+ clientId: 'your-client-id',
622
+ language: 'en',
623
+ });
624
+
625
+ // 2. 获取支付方式
626
+ const methods = await sdk.getPaymentMethods({
627
+ country_code: 'US',
628
+ business_type: 1, // 1=一次性购买
629
+ });
630
+
631
+ // 3. 创建订单支付实例
632
+ const orderPayment = sdk.createOrderPayment({
633
+ orderId: 'order-123',
634
+ accountToken: 'user-token',
635
+ });
636
+
637
+ // 4. 选择 Dropin 支付方式
638
+ const dropinMethod = methods.find(m => m.payment_type === 2);
639
+
640
+ // 5. 创建 Dropin 支付弹框
641
+ const modal = new DropinPaymentModal(
642
+ orderPayment,
643
+ 'order-123',
644
+ 'user-token',
645
+ dropinMethod,
646
+ {
647
+ // 弹框配置
648
+ modalTitle: `Pay with ${dropinMethod.payment_method_name}`,
649
+ enableRetention: true, // 启用挽留弹框(默认:true)
650
+
651
+ // 挽留弹框配置
652
+ retentionOptions: {
653
+ language: 'en', // 'en' | 'zh-CN'
654
+ bonusAmount: 990, // 活动赠送积分(可选)
655
+ },
656
+
657
+ // 支付回调
658
+ onCompleted: (payload) => {
659
+ console.log('支付成功!', payload);
660
+ // 刷新积分、更新 UI 等
661
+ },
662
+
663
+ onFailed: (payload) => {
664
+ console.error('支付失败:', payload);
665
+ },
666
+
667
+ onLoading: (loading) => {
668
+ console.log('加载状态:', loading);
669
+ },
670
+ }
671
+ );
672
+
673
+ // 6. 打开弹框
674
+ await modal.open();
675
+
676
+ // 可选:手动关闭弹框
677
+ // modal.close();
678
+
679
+ // 可选:检查弹框状态
680
+ // console.log('弹框是否打开:', modal.isOpen());
681
+ ```
682
+
683
+ #### 挽留弹框流程说明
684
+
685
+ 当用户尝试取消支付时(点击关闭按钮或 ESC 键),会触发以下流程:
686
+
687
+ 1. **关闭支付弹框** → 支付弹框关闭
688
+ 2. **显示挽留弹框** → 自动弹出挽留弹框,展示:
689
+ - 订单详情(商品名称、购买数量、优惠价格)
690
+ - 倒计时提示(15分钟订单过期时间)
691
+ - 活动赠送(如果有)
692
+ 3. **用户选择**:
693
+ - **继续支付**:关闭挽留弹框 → 重新打开支付弹框
694
+ - **确认取消**:关闭所有弹框 → 清理资源
695
+
696
+ #### 配置选项
697
+
698
+ ```typescript
699
+ interface DropinPaymentModalOptions {
700
+ // 弹框标题
701
+ modalTitle?: string;
702
+
703
+ // 弹框选项
704
+ modalOptions?: {
705
+ showCloseButton?: boolean; // 显示关闭按钮(默认:true)
706
+ closeOnOverlayClick?: boolean; // 点击遮罩关闭(默认:false)
707
+ closeOnEsc?: boolean; // ESC 键关闭(默认:false)
708
+ className?: string; // 自定义类名
709
+ maxWidth?: string; // 最大宽度(默认:'600px')
710
+ };
711
+
712
+ // 是否启用挽留弹框(默认:true)
713
+ enableRetention?: boolean;
714
+
715
+ // 挽留弹框配置
716
+ retentionOptions?: {
717
+ language?: 'en' | 'zh-CN'; // 语言(默认:'en')
718
+ bonusAmount?: number; // 活动赠送积分(可选)
719
+ };
720
+
721
+ // 支付回调
722
+ onSubmit?: (payload: any) => void;
723
+ onError?: (payload: any, error: any) => void;
724
+ onCreateOrder?: (payload: any) => void;
725
+ onCompleted?: (payload: any) => void;
726
+ onFailed?: (payload: any) => void;
727
+ onLoading?: (loading: boolean) => void;
728
+ }
729
+ ```
730
+
731
+ #### 挽留弹框预览
732
+
733
+ 挽留弹框采用深色卡片设计,包含:
734
+ - 订单倒计时(15 分钟)
735
+ - 商品信息(名称、购买数量、活动赠送、优惠价)
736
+ - 价格显示(自动根据货币代码映射符号,如 USD→$, EUR→€, JPY→¥ 等)
737
+ - 两个按钮:「取消」和「继续支付」(使用与积分弹框一致的绿色渐变主题色)
738
+
739
+ **支持的货币符号**:
740
+ - 美元 (USD) → $
741
+ - 欧元 (EUR) → €
742
+ - 英镑 (GBP) → £
743
+ - 日元 (JPY) / 人民币 (CNY) → ¥
744
+ - 新加坡元 (SGD) → S$
745
+ - 港币 (HKD) → HK$
746
+ - 等 30+ 种货币符号...
747
+
748
+ #### 禁用挽留弹框
749
+
750
+ 如果不需要挽留功能,可以禁用:
751
+
752
+ ```typescript
753
+ const modal = new DropinPaymentModal(
754
+ orderPayment,
755
+ 'order-123',
756
+ 'user-token',
757
+ dropinMethod,
758
+ {
759
+ enableRetention: false, // 禁用挽留弹框
760
+ onCompleted: (payload) => {
761
+ console.log('支付成功!', payload);
762
+ },
763
+ }
764
+ );
765
+ ```
766
+
767
+ ---
768
+
565
769
  ## ⚙️ 配置选项
566
770
 
567
771
  ### 环境配置(Environment)
@@ -838,5 +1042,27 @@ MIT License
838
1042
 
839
1043
  ---
840
1044
 
841
- **更新日期**: 2026-01-31
842
- **SDK 版本**: v0.8.0
1045
+ **更新日期**: 2026-02-02
1046
+ **SDK 版本**: v0.8.2
1047
+
1048
+ ## 📝 更新日志
1049
+
1050
+ ### v0.8.2 (2026-02-02)
1051
+
1052
+ **架构重构**:
1053
+ - 🏗️ 创建 `BasePackageModal` 抽象基类,消除 `CreditPackageModal` 和 `GenericPackageModal` 之间的重复代码
1054
+ - 📉 减少约 400 行重复代码(25% 代码量减少)
1055
+ - 🎯 `CreditPackageModal`: 从 1042 行减少到 515 行
1056
+ - 🎯 `GenericPackageModal`: 从 752 行减少到 340 行
1057
+ - ✅ 完全向后兼容,现有代码无需修改
1058
+ - 🔒 通过 TypeScript 泛型确保类型安全
1059
+
1060
+ **类型系统改进**:
1061
+ - 新增 `BasePackage` 接口 - 所有套餐类型的基础接口
1062
+ - 新增 `BasePackageModalOptions<TPackage>` 接口 - 通用配置接口
1063
+ - `CreditPackage` 和 `GenericPackage` 现在继承自 `BasePackage`
1064
+
1065
+ **开发体验提升**:
1066
+ - 更容易添加新的套餐类型(只需继承 `BasePackageModal`)
1067
+ - 修复 bug 只需在基类中修改一处
1068
+ - 更清晰的职责分离(基类处理逻辑,子类处理 UI)