feat(client): 购买页三档 + 支付页 render_type 多态(crypto/redirect/qr 预留)+ 导航接线

购买页三档 pro(月/季/年,金额来自 GET /v1/pay/catalog)选档 → 选支付方式 → 下单;
支付页按 session.render_type 多态渲染(crypto_address 地址+精确金额+复制、redirect
外链拉起、qr 预留复制兜底),轮询用 Task 6 的 paymentFlowProvider,409
CURRENCY_MISMATCH 走「换方式开新单」。同时收口 paymentFlowProvider 非 autoDispose
带来的轮询生命周期缺口——支付页 dispose 时停轮询(cancel() 延后到微任务执行,避免
在自身 unmount 期间同步改 state 炸 Riverpod 断言)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
This commit is contained in:
wangjia
2026-07-10 23:50:35 +08:00
parent e66f79fdf6
commit a5fff28134
15 changed files with 783 additions and 14 deletions
+55
View File
@@ -326,4 +326,59 @@ class StringsZh extends AppText {
String get ob3Title => '安全 · 无日志';
@override
String get ob3Sub => '端到端加密,我们不记录你的任何浏览数据。';
@override
String get purchaseTitle => '购买套餐';
@override
String get paymentTitle => '支付';
@override
String get buyNow => '立即购买';
@override
String get payMethodAlipay => '支付宝';
@override
String get payMethodCrypto => 'USDT (TRC20)';
@override
String get choosePayMethod => '选择支付方式';
@override
String get proMonthly => '专业版·月付';
@override
String get proQuarterly => '专业版·季付';
@override
String get proYearly => '专业版·年付';
@override
String get perQuarter => '/季';
@override
String get perYear => '/年';
@override
String get payAmountLabel => '转账金额';
@override
String get payAddressLabel => '收款地址';
@override
String get payNetworkLabel => '网络';
@override
String get payExactAmountHint => '金额须精确一致,到账后自动开通';
@override
String get copied => '已复制';
@override
String get openAlipay => '打开支付宝支付';
@override
String get openAlipayHint => '完成支付后返回,本页会自动刷新';
@override
String get awaitingPayment => '等待付款';
@override
String get paySucceeded => '已开通';
@override
String get payExpiresAt => '有效期至';
@override
String get payDone => '完成';
@override
String get payFailed => '支付失败';
@override
String get payRetry => '重试';
@override
String get switchPayMethod => '换一种支付方式';
@override
String get cancelOrder => '取消订单';
@override
String get qrNotSupported => '请复制内容后在支付宝内打开';
}