57 lines
1.7 KiB
Dart
57 lines
1.7 KiB
Dart
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<void> launch(Map<String, Object?> 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<String, dynamic>();
|
|
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('微信未接受支付请求');
|
|
}
|
|
}
|