兼容win7版应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
5.5 KiB

using System;
using System.Threading.Tasks;
using AIK.Models.ApiModels.Payment;
using AIK.Service.IService;
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
using System.Windows.Threading;
namespace AIK.ViewModels.Integral
{
public partial class PaymentQrCodeViewModel : ObservableObject
{
private readonly IPaymentOrderService _paymentOrderService;
private readonly IUserSessionCoordinator _userSessionCoordinator;
private readonly ILogger<PaymentQrCodeViewModel> _logger;
private readonly DispatcherTimer _timer;
public PaymentQrCodeViewModel(
IPaymentOrderService paymentOrderService,
IUserSessionCoordinator userSessionCoordinator,
ILogger<PaymentQrCodeViewModel> logger)
{
_paymentOrderService = paymentOrderService;
_userSessionCoordinator = userSessionCoordinator;
_logger = logger;
_timer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(2)
};
_timer.Tick += OnTimerTick;
}
[ObservableProperty]
private long _orderId;
[ObservableProperty]
private decimal _amount;
[ObservableProperty]
private byte[]? _qrCodeBytes;
[ObservableProperty]
private string _statusMessage =
#if CN || TEST
"请使用微信扫码支付";
#else
"请在浏览器中完成PayPal支付";
#endif
[ObservableProperty]
private bool _isPaid;
[ObservableProperty]
private bool _isQrCodeMode =
#if CN || TEST
true;
#else
false;
#endif
[ObservableProperty]
private string _paymentButtonText =
#if CN || TEST
"关闭";
#else
"重新打开PayPal";
#endif
[ObservableProperty]
private string _paymentLaunchUrl = string.Empty;
public event Action? PaymentSucceeded;
public void Start(PaymentParametersPC payment, decimal amount, byte[] qrCodeBytes)
{
OrderId = payment.id;
Amount = amount;
QrCodeBytes = qrCodeBytes;
#if CN || TEST
StatusMessage = "请使用微信扫码支付";
#else
PaymentLaunchUrl = PaymentLaunchHelper.BuildPaypalLaunchUrl(payment.PaypalApproveUrl ?? string.Empty);
StatusMessage = "请在浏览器中完成PayPal支付";
TryOpenPaypal();
#endif
IsPaid = false;
_timer.Start();
}
public void Stop()
{
_timer.Stop();
}
private async void OnTimerTick(object? sender, EventArgs e)
{
if (OrderId <= 0)
{
return;
}
try
{
#if CN || TEST
var status = await _paymentOrderService.GetOrderPayStatusAsync(OrderId, 2);
#else
int? status = null;
try
{
status = await _paymentOrderService.RefreshPaypalOrderAsync(OrderId, 2);
}
catch (Exception ex)
{
_logger.LogWarning(ex, "刷新PayPal订单状态失败,继续查询订单支付状态,订单:{OrderId}", OrderId);
}
status ??= await _paymentOrderService.GetOrderPayStatusAsync(OrderId, 2);
#endif
switch (status)
{
case 1:
_timer.Stop();
IsPaid = true;
StatusMessage = "支付成功,正在刷新积分...";
await _userSessionCoordinator.RefreshIntegralAsync();
PaymentSucceeded?.Invoke();
break;
case -1:
_timer.Stop();
StatusMessage = "支付失败,请重新发起支付";
break;
case 2:
_timer.Stop();
StatusMessage = "支付已取消";
break;
default:
#if CN || TEST
StatusMessage = "等待支付完成...";
#else
StatusMessage = "等待PayPal支付完成...";
#endif
break;
}
}
catch (Exception ex)
{
_logger.LogWarning(ex, "查询积分充值支付状态失败,订单:{OrderId}", OrderId);
#if CN || TEST
StatusMessage = "正在等待支付结果...";
#else
StatusMessage = "正在等待PayPal支付结果...";
#endif
}
}
public void ReopenPaypal()
{
#if !(CN || TEST)
TryOpenPaypal();
#endif
}
#if !(CN || TEST)
private void TryOpenPaypal()
{
if (string.IsNullOrWhiteSpace(PaymentLaunchUrl))
{
StatusMessage = "PayPal支付链接无效";
return;
}
try
{
Process.Start(new ProcessStartInfo
{
FileName = PaymentLaunchUrl,
UseShellExecute = true
});
}
catch (Exception ex)
{
_logger.LogWarning(ex, "打开PayPal支付页面失败,订单:{OrderId}", OrderId);
StatusMessage = "无法自动打开PayPal页面,请稍后重试";
}
}
#endif
}
}