新增支付流程,新增支付页面等待倒计时,自动检查订单状态等
This commit is contained in:
+122
-14
@@ -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}');
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user