From 6739e98662c16571da7aec0e9b52fab0afd3833b Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期五, 13 六月 2025 14:07:28 +0800 Subject: [PATCH] fix:修订支付回调和供应商回调并发问题 --- LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs | 9 ++-- LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs | 3 + LifePayment/LifePayment.Worker/LifePaymentServicesWorkModule.cs | 2 LifePayment/LifePayment.Worker/Worker/CheckUnPayOrderWork.cs | 63 ++++++++++++++++--------------- LifePayment/LifePayment.Application/LifePay/LifePayService.cs | 15 +++---- LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs | 12 ++--- 6 files changed, 52 insertions(+), 52 deletions(-) diff --git a/LifePayment/LifePayment.Application/LifePay/LifePayService.cs b/LifePayment/LifePayment.Application/LifePay/LifePayService.cs index 637ff94..258cc91 100644 --- a/LifePayment/LifePayment.Application/LifePay/LifePayService.cs +++ b/LifePayment/LifePayment.Application/LifePay/LifePayService.cs @@ -1484,7 +1484,6 @@ order.OutRequestNo = result.RequestNo.IsNullOrEmpty() ? null : result.RequestNo; order.ACOOLYOrderNo = result.ACOOLYOrderNo; order.ACOOLYStatus = ACOOLYStatusEnum.鍏呭�间腑; - await _lifePayOrderRepository.UpdateAsync(order); _logger.LogInformation("鐢熸椿缂磋垂璁㈠崟锛�" + order.ToJson()); /// 鍒涘缓鐢熸椿缂磋垂娑堣垂璁板綍 @@ -1499,9 +1498,9 @@ order.LifePayRefundStatus = LifePayRefundStatusEnum.寰呴��娆�; order.ACOOLYStatus = ACOOLYStatusEnum.鍏呭�煎け璐�; order.RefundApplyRemark = ex.Message; - await _lifePayOrderRepository.UpdateAsync(order); - _logger.LogError("鐢熸椿缂磋垂璁㈠崟鐘舵�侊細" + order.LifePayOrderStatus.ToString()); } + _logger.LogError("鐢熸椿缂磋垂璁㈠崟鐘舵�侊細" + order.LifePayOrderStatus.ToString()); + await _lifePayOrderRepository.UpdateAsync(order); } public async Task LifePayRefundsHandler(string orderNo, LifePayRefundStatusEnum refundStatus) @@ -1532,12 +1531,12 @@ /// <returns></returns> public async Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount, string refundApplyRemark, decimal? parValue = 0, decimal? actualParValue = 0) { + await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{orderNo}", TimeSpan.FromSeconds(60)); + _logger.LogInformation($"閿侊細LockKey:UpdateOrder:{orderNo} - {orderLock != null}"); + var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "璁㈠崟涓嶅瓨鍦�"); - - await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{orderNo}", TimeSpan.FromSeconds(60)); - _logger.LogInformation($"閿侊細LockKey:UpdateOrder:{orderNo} - {orderLock != null}"); if (order.ACOOLYStatus.HasValue && (int)order.ACOOLYStatus > (int)acoolyStatus) { @@ -1583,8 +1582,6 @@ order.RefundPrice = Math.Round((1 - ((order.ActualReceivedAmount ?? 0) / (order.RechargeAmount ?? 0))) * (order.PayAmount ?? 0), 2); } - await _lifePayOrderRepository.UpdateAsync(order); - if (order.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�) { ///缁撶畻娓犻亾浣i噾 @@ -1610,6 +1607,8 @@ /// 鍒涘缓鐢熸椿缂磋垂娑堣垂璁板綍 await _lifePayOrderService.CreatLifePayConsumption(acoolyStatus, order.OrderNo, order.ACOOLYOrderNo, order.PlatformDeductionAmount ?? 0, order.ChannelId, order.CreationTime, order.FinishTime, order.ChannleRate, parValue, actualParValue); + + await CurrentUnitOfWork.SaveChangesAsync(); } /// <summary> diff --git a/LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs b/LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs index cae6846..d44e90d 100644 --- a/LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs +++ b/LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs @@ -7,6 +7,7 @@ using System; using System.IO; using System.Text; +using System.Threading; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc; @@ -39,11 +40,11 @@ /// </summary> /// <returns></returns> [HttpPost] - [UnitOfWork] [AllowAnonymous] public async Task ACOOLYNotify() { _logger.LogError("ACOOLY鍥炶皟閫氱煡寮�濮嬭繘鍏�"); + Thread.Sleep(200); var body = string.Empty; using (var reader = new StreamReader(Request.Body, Encoding.UTF8)) { diff --git a/LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs b/LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs index be0fd5a..9450126 100644 --- a/LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs +++ b/LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs @@ -49,7 +49,6 @@ /// </summary> /// <returns></returns> [HttpPost] - [UnitOfWork] public async Task<ContentResult> AliRechargeNotify() { _logger.LogError($"鐢熸椿绠″鏀粯瀹濆厖鍊煎洖璋冮�氱煡锛氳繘鍏ユ敮浠樺疂鍥炶皟"); @@ -61,13 +60,13 @@ //var serializeRequest = "{\"gmt_create\":\"2025-02-25 13:18:59\",\"charset\":\"UTF-8\",\"seller_email\":\"zfb1@818nb.com\",\"subject\":\"鐢熸椿缂磋垂-璇濊垂\",\"sign\":\"Sp06G1GxrAfDvoHPz9l3DJ20SxhvRzEGFeCGu4LHrSWmEG4OY7MHMx+iJi54ETbdXV0YsyDH9JZD7PWN3HCpEq/wGO4Wh4VSYSe7lqxD6r4f/HFiB0YlrdQoSzjZgYPzLjy6bcdlKRRHOeDkgs2i7TfvIsxWxHs9t0xuS0RlkpdZfb7d7m0EuZ/3v2Cbsj5AHjxb1S2PkO0oQyriYgGQdmkPqILZHwieST+tNEHS4dGFKYu2nkfctAGjWIDv/hKQNY7jEUxsEeG0SnK4TPU8zNplFR9/aKM0Wfwp1pdlaiP2u/d8vOtNh5q+emvaYbKrUkIEFBok8pDLNDta7ZjtVw==\",\"invoice_amount\":\"0.01\",\"buyer_open_id\":\"071xYXDfXBLAI9U11jg_WrH1K6hWq8HYGz0u85xBivf3Sce\",\"notify_id\":\"2025022501222131904087711494539601\",\"fund_bill_list\":\"[{\\\"amount\\\":\\\"0.01\\\",\\\"fundChannel\\\":\\\"ALIPAYACCOUNT\\\"}]\",\"notify_type\":\"trade_status_sync\",\"trade_status\":\"TRADE_SUCCESS\",\"receipt_amount\":\"0.01\",\"buyer_pay_amount\":\"0.01\",\"app_id\":\"2021004171602214\",\"sign_type\":\"RSA2\",\"seller_id\":\"2088050542042301\",\"gmt_payment\":\"2025-02-25 13:19:03\",\"notify_time\":\"2025-02-25 13:44:34\",\"merchant_app_id\":\"2021004171602214\",\"version\":\"1.0\",\"out_trade_no\":\"JF202502251318555214671\",\"total_amount\":\"0.01\",\"trade_no\":\"2025022522001487711401331043\",\"auth_app_id\":\"2021004171602214\",\"buyer_logon_id\":\"130****2238\",\"point_amount\":\"0.00\"}"; var input = JsonConvert.DeserializeObject<AliRechargeNotifyInput>(serializeRequest); + await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{input.OutTradeNo}", TimeSpan.FromSeconds(60)); + _logger.LogInformation($"閿侊細LockKey:UpdateOrder:{input.OutTradeNo} - {orderLock != null}"); + if (input.OutTradeNo.Contains("JF")) { if (input.TradeStatus == LifePaymentConstant.AliPayStatus.鏀粯鎴愬姛 && input.OutBizNo.IsNullOrEmpty()) { - await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{input.OutTradeNo}", TimeSpan.FromSeconds(60)); - _logger.LogInformation($"閿侊細LockKey:UpdateOrder:{input.OutTradeNo} - {orderLock != null}"); - await _lifePayService.LifePaySuccessHandler(input.OutTradeNo, input.TradeNo); // 鎻掑叆鏀舵敮娴佹按 await _lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput() @@ -77,14 +76,12 @@ LifePayType = LifePayTypeEnum.AliPay, ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Expenses }); + await CurrentUnitOfWork.SaveChangesAsync(); } else if (((input.TradeStatus == LifePaymentConstant.AliPayStatus.鏀粯鎴愬姛 || input.TradeStatus == LifePaymentConstant.AliPayStatus.瓒呮椂鍏抽棴) && input.OutBizNo.IsNotNullOrEmpty() && (input.RefundFee.HasValue && input.RefundFee > 0))) { - await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{input.OutTradeNo}", TimeSpan.FromSeconds(60)); - _logger.LogInformation($"閿侊細LockKey:UpdateOrder:{input.OutTradeNo} - {orderLock != null}"); - await _lifePayService.LifePayRefundsHandler(input.OutTradeNo, LifePayRefundStatusEnum.宸查��娆�); // 鎻掑叆鏀舵敮娴佹按 await _lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput() @@ -95,6 +92,7 @@ LifePayType = LifePayTypeEnum.AliPay, ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts }); + await CurrentUnitOfWork.SaveChangesAsync(); } } else diff --git a/LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs b/LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs index 74ddb7b..9e30708 100644 --- a/LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs +++ b/LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs @@ -53,7 +53,6 @@ /// <param name="input"></param> /// <returns></returns> [HttpPost] - [UnitOfWork] public async Task<WxRechargeNotifyResult> WxRechargeNotify(WxRechargeNotifyInput input) { try @@ -64,12 +63,13 @@ _logger.LogInformation($"鐢熸椿绠″寰俊鍏呭�煎洖璋冮�氱煡data锛�" + data); var wxPayNotice = JsonConvert.DeserializeObject<WxPayNotice>(data); + await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{wxPayNotice.OutTradeNo}", TimeSpan.FromSeconds(60)); + _logger.LogInformation($"閿侊細LockKey:UpdateOrder:{wxPayNotice.OutTradeNo} - {orderLock != null}"); + if (wxPayNotice.OutTradeNo.Contains("JF")) { if (wxPayNotice.TradeState == LifePaymentConstant.WxPayStatus.鏀粯鎴愬姛) { - await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{wxPayNotice.OutTradeNo}", TimeSpan.FromSeconds(60)); - _logger.LogInformation($"閿侊細LockKey:UpdateOrder:{wxPayNotice.OutTradeNo} - {orderLock != null}"); var key = $"WxRechargeNotify_{wxPayNotice.OutTradeNo}"; if (string.IsNullOrWhiteSpace(distributedCache.Get(key))) @@ -93,6 +93,8 @@ { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10) }); + + await CurrentUnitOfWork.SaveChangesAsync(); } else { @@ -111,7 +113,6 @@ } catch (Exception ex) { - await CurrentUnitOfWork.RollbackAsync(); return new WxRechargeNotifyResult { Code = "FAIL", diff --git a/LifePayment/LifePayment.Worker/LifePaymentServicesWorkModule.cs b/LifePayment/LifePayment.Worker/LifePaymentServicesWorkModule.cs index 94062ab..c5c9272 100644 --- a/LifePayment/LifePayment.Worker/LifePaymentServicesWorkModule.cs +++ b/LifePayment/LifePayment.Worker/LifePaymentServicesWorkModule.cs @@ -52,7 +52,7 @@ public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { await context.AddBackgroundWorkerAsync<GetStaticsWorker>(); - await context.AddBackgroundWorkerAsync<CheckUnPayOrderWork>(); + //await context.AddBackgroundWorkerAsync<CheckUnPayOrderWork>();s } private void ConfigurePays(ServiceConfigurationContext context, IConfiguration configuration) diff --git a/LifePayment/LifePayment.Worker/Worker/CheckUnPayOrderWork.cs b/LifePayment/LifePayment.Worker/Worker/CheckUnPayOrderWork.cs index 0de3470..0d8287d 100644 --- a/LifePayment/LifePayment.Worker/Worker/CheckUnPayOrderWork.cs +++ b/LifePayment/LifePayment.Worker/Worker/CheckUnPayOrderWork.cs @@ -41,7 +41,7 @@ IAbpDistributedLock distributedLock, IRepository<LifePayOrder, Guid> lifePayOrderRepository) : base(timer, serviceScopeFactory) { - timer.Period = (int)TimeSpan.FromSeconds(5).TotalMilliseconds; + timer.Period = (int)TimeSpan.FromMinutes(30).TotalMilliseconds; this.logger = logger; this.lifePayOrderService = lifePayOrderService; this.lifePayService = lifePayService; @@ -55,39 +55,40 @@ try { Logger.LogInformation($"妫�鏌ユ湭鏀粯璁㈠崟鐘舵�佸紑濮�: {DateTime.Now}"); - var end = DateTime.Now; - var start = end.AddMinutes(-15); - var orders = lifePayOrderRepository.Where(it => it.PayStatus == LifePayStatusEnum.鏈敮浠� && it.CreationTime >= start && it.CreationTime <= end).ToList(); - foreach (var order in orders) - { - await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{order.OrderNo}", TimeSpan.FromSeconds(60)); - logger.LogInformation($"閿侊細LockKey:UpdateOrder:{order.OrderNo} - {orderLock != null}"); + //var end = DateTime.Now; + //var start = end.AddMinutes(-45); + //end = end.AddMinutes(-15); + //var orders = lifePayOrderRepository.Where(it => it.PayStatus == LifePayStatusEnum.鏈敮浠� && it.CreationTime >= start && it.CreationTime <= end).ToList(); + //foreach (var order in orders) + //{ + // await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{order.OrderNo}", TimeSpan.FromSeconds(60)); + // logger.LogInformation($"閿侊細LockKey:UpdateOrder:{order.OrderNo} - {orderLock != null}"); - Logger.LogInformation($"璁㈠崟锛歿order.OrderNo}-{order.ToJson()}"); - var wxPayNotice = await lifePayService.WxPayTradeQuery(order.OrderNo); - var json = wxPayNotice.ToJson(); - Logger.LogInformation($"璁㈠崟锛坽wxPayNotice.OutTradeNo}锛変俊鎭�: {json}"); - if (wxPayNotice.OutTradeNo.Contains("JF") && wxPayNotice.TradeState == LifePaymentConstant.WxPayStatus.鏀粯鎴愬姛) - { - await lifePayService.LifePaySuccessHandler(wxPayNotice.OutTradeNo, wxPayNotice.TransactionId); + // Logger.LogInformation($"璁㈠崟锛歿order.OrderNo}-{order.ToJson()}"); + // var wxPayNotice = await lifePayService.WxPayTradeQuery(order.OrderNo); + // var json = wxPayNotice.ToJson(); + // Logger.LogInformation($"璁㈠崟锛坽wxPayNotice.OutTradeNo}锛変俊鎭�: {json}"); + // if (wxPayNotice.OutTradeNo.Contains("JF") && wxPayNotice.TradeState == LifePaymentConstant.WxPayStatus.鏀粯鎴愬姛) + // { + // await lifePayService.LifePaySuccessHandler(wxPayNotice.OutTradeNo, wxPayNotice.TransactionId); - // 鎻掑叆鏀舵敮娴佹按 - await lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput() - { - OrderNo = wxPayNotice.OutTradeNo, - OutOrderNo = wxPayNotice.TransactionId, - LifePayType = LifePayTypeEnum.WxPay, - ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Expenses, - Amount = wxPayNotice.Amount.Total - }); + // // 鎻掑叆鏀舵敮娴佹按 + // await lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput() + // { + // OrderNo = wxPayNotice.OutTradeNo, + // OutOrderNo = wxPayNotice.TransactionId, + // LifePayType = LifePayTypeEnum.WxPay, + // ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Expenses, + // Amount = wxPayNotice.Amount.Total + // }); - Logger.LogInformation("宸叉敼涓烘敮浠樻垚鍔�"); - } - else - { - Logger.LogInformation("鏈洿鏂�"); - } - } + // Logger.LogInformation("宸叉敼涓烘敮浠樻垚鍔�"); + // } + // else + // { + // Logger.LogInformation("鏈洿鏂�"); + // } + //} } catch (Exception ex) { -- Gitblit v1.9.1