alipay_io.dart 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /// 支付宝 Native 实现(Android/iOS,封装 alipay_kit)
  2. library;
  3. import 'dart:async';
  4. import 'package:alipay_kit/alipay_kit.dart';
  5. /// 支付宝支付结果
  6. class AlipayPayResult {
  7. final int? resultStatus;
  8. final String? memo;
  9. AlipayPayResult({this.resultStatus, this.memo});
  10. bool get isSuccessful => resultStatus == 9000;
  11. bool get isCancelled => resultStatus == 6001;
  12. }
  13. /// 支付宝封装(App 支付)
  14. class AlipayFlow {
  15. AlipayFlow._();
  16. static final AlipayFlow instance = AlipayFlow._();
  17. StreamSubscription<AlipayResp>? _sub;
  18. /// 拉起支付宝 App 支付
  19. /// [orderStr] 后端 sdkExecute 生成的调起字符串
  20. ///
  21. /// alipay_kit 的支付结果是异步流(payResp),需先订阅再发起,避免丢失结果。
  22. Future<AlipayPayResult> pay(String orderStr) async {
  23. final completer = Completer<AlipayPayResult>();
  24. // 先订阅结果流
  25. await _sub?.cancel();
  26. _sub = AlipayKitPlatform.instance.payResp().listen((resp) {
  27. if (!completer.isCompleted) {
  28. completer.complete(
  29. AlipayPayResult(resultStatus: resp.resultStatus, memo: resp.memo),
  30. );
  31. }
  32. });
  33. // 发起支付(原生弹起支付宝;结果经 payResp 流返回)
  34. await AlipayKitPlatform.instance.pay(orderInfo: orderStr);
  35. // 等待结果(超时兜底,避免永远阻塞)
  36. return completer.future.timeout(
  37. const Duration(seconds: 90),
  38. onTimeout: () => AlipayPayResult(resultStatus: 6002, memo: '支付超时'),
  39. );
  40. }
  41. }