import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:fluwx/fluwx.dart'; import 'package:tobias/tobias.dart'; import 'package:url_launcher/url_launcher.dart'; import 'payment_jsapi.dart'; /// 只负责调起支付渠道;支付结果必须重新向服务端查询确认。 class PaymentLauncher { PaymentLauncher({Fluwx? wechat, Tobias? alipay}) : _wechat = wechat ?? Fluwx(), _alipay = alipay ?? Tobias(); final Fluwx _wechat; final Tobias _alipay; Future launch(Map payment) async { final channel = payment['channel']; final payType = payment['pay_type']; final argsText = payment['client_args'] as String? ?? ''; // 支付宝手机网站支付返回可直接打开的收银台 URL。 if (payType == 'wap') { final uri = Uri.tryParse(argsText); if (uri == null || !await launchUrl(uri, mode: LaunchMode.externalApplication)) { throw StateError('无法打开支付页面'); } return; } if (kIsWeb && payType == 'jsapi') { await invokeWechatJsapi(argsText); return; } if (channel == 'alipay') { await _alipay.pay(argsText); return; } final args = (jsonDecode(argsText) as Map).cast(); final accepted = await _wechat.pay( which: Payment( appId: payment['app_id'] as String? ?? '', partnerId: args['partnerId'] as String, prepayId: args['prepayId'] as String, packageValue: args['package'] as String, nonceStr: args['nonceStr'] as String, timestamp: int.parse(args['timeStamp'] as String), sign: args['sign'] as String, ), ); if (!accepted) throw StateError('微信未接受支付请求'); } }