新增支付流程,新增支付页面等待倒计时,自动检查订单状态等

This commit is contained in:
2025-10-22 17:47:07 +08:00
parent 15d2e1047b
commit 2e7e85fb27
8 changed files with 432 additions and 67 deletions
@@ -4,6 +4,7 @@ import 'package:kaer_with_panels/app/model/response/kr_package_list.dart';
import 'package:kaer_with_panels/app/utils/kr_common_util.dart';
import 'package:kaer_with_panels/app/localization/app_translations.dart';
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../../common/app_run_data.dart';
import '../../../common/app_config.dart';
@@ -399,22 +400,31 @@ class KRPurchaseMembershipController extends GetxController {
'',
);
// 打印下单请求和响应
print('═══════════════════════════════════════');
print('🔗 下单接口: /v1/public/order/purchase');
print('📤 请求参数:');
print(' subscribe_id: ${selectedPlan.kr_id}');
print(' quantity: $quantity');
print(' payment: $paymentMethodId');
print(' coupon: ""');
print('');
purchaseEither.fold(
(error) => KRCommonUtil.kr_showToast(error.msg),
(error) {
print('❌ 请求失败:');
print(' 错误码: ${error.code}');
print(' 错误信息: ${error.msg}');
print('═══════════════════════════════════════');
KRCommonUtil.kr_showToast(error.msg);
},
(order) async {
// 所有支付方式都需要调用 checkout 接口
final checkoutEither = await _kr_subscribeApi.kr_checkout(order);
checkoutEither.fold(
(error) => KRCommonUtil.kr_showToast(error.msg),
(uri) => Get.toNamed(
Routes.KR_ORDER_STATUS,
arguments: {
'url': uri,
'order': order,
'payment_type': paymentPlatform,
},
),
);
print('✅ 请求成功:');
print(' 订单号: $order');
print('═══════════════════════════════════════');
// 调用 checkout 接口获取支付链接
await _kr_handleCheckout(order, paymentPlatform);
},
);
}
@@ -597,4 +607,102 @@ class KRPurchaseMembershipController extends GetxController {
return AppTranslations.kr_purchaseMembership
.devices(plan.kr_deviceLimit.toString());
}
/// 处理 checkout 并打开支付链接(参考 Tauri 项目)
Future<void> _kr_handleCheckout(String orderNo, String paymentPlatform) async {
print('');
print('═══════════════════════════════════════');
print('🔗 调用 Checkout 接口');
print('📤 请求参数:');
print(' orderNo: $orderNo');
print(' returnUrl: ${AppConfig.getInstance().baseUrl}');
print('');
final checkoutEither = await _kr_subscribeApi.kr_checkout(orderNo);
checkoutEither.fold(
(error) {
print('❌ Checkout 失败:');
print(' 错误码: ${error.code}');
print(' 错误信息: ${error.msg}');
print('═══════════════════════════════════════');
KRCommonUtil.kr_showToast(error.msg);
},
(checkoutResponse) async {
print('✅ Checkout 成功:');
print(' 支付类型: ${checkoutResponse.type}');
if (checkoutResponse.type == 'url') {
// URL 类型:在浏览器中打开支付链接,同时跳转到订单状态页面
if (checkoutResponse.checkoutUrl != null && checkoutResponse.checkoutUrl!.isNotEmpty) {
print(' 支付链接: ${checkoutResponse.checkoutUrl}');
print('🌐 正在用外部浏览器打开支付链接...');
print('═══════════════════════════════════════');
final url = Uri.parse(checkoutResponse.checkoutUrl!);
if (await canLaunchUrl(url)) {
// 在外部浏览器打开支付链接
await launchUrl(
url,
mode: LaunchMode.externalApplication,
);
// 跳转到订单状态页面进行轮询检查
Get.toNamed(
Routes.KR_ORDER_STATUS,
arguments: {
'url': checkoutResponse.checkoutUrl,
'order': orderNo,
'payment_type': paymentPlatform,
'checkout_type': 'url',
},
);
} else {
print('❌ 无法打开URL: ${checkoutResponse.checkoutUrl}');
KRCommonUtil.kr_showToast('无法打开支付链接');
}
} else {
print('⚠️ 支付链接为空');
print('═══════════════════════════════════════');
KRCommonUtil.kr_showToast('支付链接为空');
}
} else if (checkoutResponse.type == 'qr') {
// QR 类型:显示二维码(跳转到订单状态页面)
print(' 二维码内容: ${checkoutResponse.checkoutUrl}');
print('📱 显示二维码支付...');
print('═══════════════════════════════════════');
Get.toNamed(
Routes.KR_ORDER_STATUS,
arguments: {
'url': checkoutResponse.checkoutUrl,
'order': orderNo,
'payment_type': paymentPlatform,
'checkout_type': 'qr',
},
);
} else if (checkoutResponse.type == 'stripe') {
// Stripe 类型:显示 Stripe 支付表单
print(' Stripe Method: ${checkoutResponse.stripe?.method}');
print(' Stripe Client Secret: ${checkoutResponse.stripe?.clientSecret}');
print('💳 显示 Stripe 支付表单...');
print('═══════════════════════════════════════');
Get.toNamed(
Routes.KR_ORDER_STATUS,
arguments: {
'order': orderNo,
'payment_type': paymentPlatform,
'checkout_type': 'stripe',
'stripe': checkoutResponse.stripe,
},
);
} else {
print('⚠️ 未知的支付类型: ${checkoutResponse.type}');
print('═══════════════════════════════════════');
KRCommonUtil.kr_showToast('不支持的支付类型: ${checkoutResponse.type}');
}
},
);
}
}