From 5983f3d7431ec699d381d689b33e909f49887946 Mon Sep 17 00:00:00 2001 From: "AERWEN\\26795" <123456789a> Date: Thu, 19 Oct 2023 20:50:53 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=B7=BB=E5=8A=A0=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrderManage/Orders/OrderServiceApi.cs | 23 ++++++++++++ .../PayManage/PayServiceApi.cs | 11 +++--- .../OrderManage/Orders/OrderService.cs | 5 ++- .../Api/Wechat/WxPay/WxPayController.cs | 6 ++-- .../OrderManage/Orders/OrderController.cs | 36 ++++++++++++++++++- ARW.WebApi/appsettings.json | 1 + Infrastructure/WeChat/TenPay/Pay.cs | 12 ++++--- 7 files changed, 79 insertions(+), 15 deletions(-) diff --git a/ARW.Service/Api/BusinessService/OrderManage/Orders/OrderServiceApi.cs b/ARW.Service/Api/BusinessService/OrderManage/Orders/OrderServiceApi.cs index 544dbb2..e1d2019 100644 --- a/ARW.Service/Api/BusinessService/OrderManage/Orders/OrderServiceApi.cs +++ b/ARW.Service/Api/BusinessService/OrderManage/Orders/OrderServiceApi.cs @@ -125,6 +125,29 @@ namespace ARW.Service.Api.BusinessService.OrderManage.Orders /// public async Task WaitPayCancelOrder(OrderDtoApi parm) { + // 找到该订单的商品,如果是下单立减库存,将库存加回来 + var orderGoodsList = await _OrderGoodsRepository.GetListAsync(s => s.OrderGuid == parm.OrderGuid); + foreach (var item in orderGoodsList) + { + var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == item.GoodsGuid); + if(good.GoodsDeductStockType == 1) + { + if(item.GoodsSkuId != 0) + { + var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == item.GoodsSkuId); + sku.GoodsSkuStockNum += item.GoodsTotalNum; + good.GoodsTotalInventory += item.GoodsTotalNum; + await _GoodsSkuRepository.UpdateAsync(sku); + await _GoodsRepository.UpdateAsync(good); + } + else + { + good.GoodsTotalInventory += item.GoodsTotalNum; + await _GoodsRepository.UpdateAsync(good); + } + } + } + var res = await _OrderRepository.UpdateAsync(f => new Order { OrderStatus = 2, diff --git a/ARW.Service/Api/BusinessService/PayManage/PayServiceApi.cs b/ARW.Service/Api/BusinessService/PayManage/PayServiceApi.cs index 33d3304..f700a43 100644 --- a/ARW.Service/Api/BusinessService/PayManage/PayServiceApi.cs +++ b/ARW.Service/Api/BusinessService/PayManage/PayServiceApi.cs @@ -109,7 +109,7 @@ namespace ARW.Service.Api.BusinessService.PaymentManage var totalPrice = goodsPrice + freight; /* 计算核销前后价格(优惠后价格) */ - var afterPriceRes = await CalculateAfterPrice(parm); + var afterPriceRes = await CalculateAfterPrice(parm, totalPrice); if (parm.TotalAmount != afterPriceRes.DiscountPrice) throw new CustomException("前端传递金额不合法!下单失败!"); parm.TotalAmount = afterPriceRes.DiscountPrice; @@ -251,10 +251,10 @@ namespace ARW.Service.Api.BusinessService.PaymentManage /// /// /// - public async Task CalculateAfterPrice(CommitPayDtoApi parm) + public async Task CalculateAfterPrice(CommitPayDtoApi parm,decimal totalPrice) { var res = new DiscountRes(); - res.DiscountPrice = parm.TotalAmount; + res.DiscountPrice = totalPrice; // 优惠券减免价格 if (parm.CouponList.Count > 0) { @@ -403,6 +403,7 @@ namespace ARW.Service.Api.BusinessService.PaymentManage OrderStatus = 1, DeliveryType = 1, ExpressPrice = freight, + CartIds = string.Join(",",item.CartIdsList) }; @@ -533,7 +534,7 @@ namespace ARW.Service.Api.BusinessService.PaymentManage await _PaymentRepository.UpdateAsync(f => new Payment { PaymentWeixinNumber = res.transaction_id, - PaymentMoney = res.amount.payer_total / 100, + PaymentMoney = ((decimal)res.amount.payer_total) / 100, PaymentStatus = 2, Update_time = DateTime.Now, }, f => f.PaymentNumber == res.out_trade_no); @@ -557,7 +558,7 @@ namespace ARW.Service.Api.BusinessService.PaymentManage await _OrderRepository.UpdateAsync(f => new Model.Models.Business.OrderManage.Orders.Order { TransactionId = res.transaction_id, - PayPrice = item.GoodsTotalAmoun, + PayPrice = ((decimal)res.amount.payer_total) / 100, PayStatus = 2, PayTime = DateTime.Now, Update_time = DateTime.Now, diff --git a/ARW.Service/Business/BusinessService/OrderManage/Orders/OrderService.cs b/ARW.Service/Business/BusinessService/OrderManage/Orders/OrderService.cs index da245a6..6e38c97 100644 --- a/ARW.Service/Business/BusinessService/OrderManage/Orders/OrderService.cs +++ b/ARW.Service/Business/BusinessService/OrderManage/Orders/OrderService.cs @@ -29,6 +29,7 @@ using Org.BouncyCastle.Crypto.Prng; using Senparc.CO2NET.Extensions; using ARW.Repository.Business.OrderManage.OrderCustomerAddreses; using ARW.Service.Business.IBusinessService.Custom.Regions; +using ARW.Repository.Business.Payments; namespace ARW.Service.Business.BusinessService.OrderManage.Orders { @@ -45,10 +46,11 @@ namespace ARW.Service.Business.BusinessService.OrderManage.Orders private readonly OrderGoodsRepository _OrderGoodsRepository; private readonly OrderCustomerAddressRepository _OrderCustomerAddressRepository; private readonly GoodsRepository _GoodsRepository; + private readonly PaymentRepository _PaymentRepository; private readonly IGoodsSkuService _GoodsSkuService; private readonly IRegionService _RegionService; - public OrderServiceImpl(OrderRepository OrderRepository, GoodsRepository goodsRepository, IGoodsSkuService goodsSkuService, OrderGoodsRepository orderGoodsRepository, OrderCustomerAddressRepository orderCustomerAddressRepository, IRegionService regionService) + public OrderServiceImpl(OrderRepository OrderRepository, GoodsRepository goodsRepository, IGoodsSkuService goodsSkuService, OrderGoodsRepository orderGoodsRepository, OrderCustomerAddressRepository orderCustomerAddressRepository, IRegionService regionService, PaymentRepository paymentRepository) { this._OrderRepository = OrderRepository; _GoodsRepository = goodsRepository; @@ -56,6 +58,7 @@ namespace ARW.Service.Business.BusinessService.OrderManage.Orders _OrderGoodsRepository = orderGoodsRepository; _OrderCustomerAddressRepository = orderCustomerAddressRepository; _RegionService = regionService; + _PaymentRepository = paymentRepository; } #region 业务逻辑代码 diff --git a/ARW.WebApi/Controllers/Api/Wechat/WxPay/WxPayController.cs b/ARW.WebApi/Controllers/Api/Wechat/WxPay/WxPayController.cs index d801007..2d4f7a0 100644 --- a/ARW.WebApi/Controllers/Api/Wechat/WxPay/WxPayController.cs +++ b/ARW.WebApi/Controllers/Api/Wechat/WxPay/WxPayController.cs @@ -145,7 +145,7 @@ namespace ARW.WebApi.Controllers.Api.Wechat.WxPay public async Task Refund([FromBody] OrderQueryDto parm) { Pay pay = new Pay(_httpClient); - var payment = _PayServiceApi.GetFirstAsync(s => s.PaymentNumber == parm.outTradeNo).Result; + var payment = await _PayServiceApi.GetFirstAsync(s => s.PaymentNumber == parm.outTradeNo); var transactionId = payment.PaymentWeixinNumber; string paymentRefundNumber = ""; if (!string.IsNullOrEmpty(payment.PaymentRefundNumber)) @@ -153,8 +153,8 @@ namespace ARW.WebApi.Controllers.Api.Wechat.WxPay paymentRefundNumber = payment.PaymentRefundNumber; } - var totalFee = payment.PaymentMoney; - var res = await pay.Refund(transactionId, totalFee, paymentRefundNumber); + var totalFee = payment.PaymentMoney * 100; + var res = await pay.Refund(transactionId, totalFee, paymentRefundNumber, "商品退款"); if (res.ResultCode.Success == false) throw new CustomException("订单退款失败!"); else diff --git a/ARW.WebApi/Controllers/Business/OrderManage/Orders/OrderController.cs b/ARW.WebApi/Controllers/Business/OrderManage/Orders/OrderController.cs index 2b71155..0bcc0de 100644 --- a/ARW.WebApi/Controllers/Business/OrderManage/Orders/OrderController.cs +++ b/ARW.WebApi/Controllers/Business/OrderManage/Orders/OrderController.cs @@ -20,6 +20,13 @@ using Geocoding; using ARW.Service.Business.IBusinessService.OrderManage.OrderGoodss; using ARW.Service.Business.IBusinessService.OrderManage.OrderCustomerAddreses; using ARW.Service.Business.IBusinessService.ShopManager.Shops; +using ARW.Repository.Business.OrderManage.Orders; +using ARW.Repository.Business.Payments; +using Infrastructure.WeChat.TenPay; +using System.Net.Http; +using Senparc.CO2NET.HttpUtility; +using ARW.Service.Business.IBusinessService.Payments; +using ARW.Model.Models.Business.Payments; namespace ARW.WebApi.Controllers.Business.OrderManage.Orders { @@ -37,17 +44,21 @@ namespace ARW.WebApi.Controllers.Business.OrderManage.Orders private readonly IOrderService _OrderService; private readonly IOrderGoodsService _OrderGoodsService; private readonly IOrderCustomerAddressService _OrderCustomerAddressService; + private readonly IPaymentService _PaymentService; + private readonly SenparcHttpClient _httpClient; /// /// 依赖注入 /// /// 订单服务 - public OrderController(IOrderService OrderService, IOrderGoodsService orderGoodsService, IOrderCustomerAddressService orderCustomerAddressService, IShopService shopService) + public OrderController(IOrderService OrderService, IOrderGoodsService orderGoodsService, IOrderCustomerAddressService orderCustomerAddressService, IShopService shopService, SenparcHttpClient httpClient, IPaymentService paymentService) { _OrderService = OrderService; _OrderGoodsService = orderGoodsService; _OrderCustomerAddressService = orderCustomerAddressService; _ShopService = shopService; + _httpClient = httpClient; + _PaymentService = paymentService; } @@ -140,6 +151,29 @@ namespace ARW.WebApi.Controllers.Business.OrderManage.Orders { if (parm == null) { throw new CustomException("请求参数错误"); } + var order = await _OrderService.GetFirstAsync(s => s.OrderGuid == parm.OrderGuid); + var payment = await _PaymentService.GetFirstAsync(s => s.PaymentGuid == order.PaymentGuid); + + Pay pay = new Pay(_httpClient); + var transactionId = payment.PaymentWeixinNumber; + string paymentRefundNumber = ""; + if (!string.IsNullOrEmpty(payment.PaymentRefundNumber)) + { + paymentRefundNumber = payment.PaymentRefundNumber; + } + + var totalFee = payment.PaymentMoney * 100; + var canleRes = await pay.Refund(transactionId, totalFee, paymentRefundNumber,"商品退款"); + if (canleRes.ResultCode.Success == false) + throw new CustomException("订单退款失败!"); + else + { + var respones = _PaymentService.UpdateAsync(f => new Payment + { + PaymentRefundNumber = canleRes.out_refund_no, + }, f => f.PaymentNumber == canleRes.out_trade_no); + } + var res = await _OrderService.CancelOrder(parm); return SUCCESS(res); } diff --git a/ARW.WebApi/appsettings.json b/ARW.WebApi/appsettings.json index c9c4ccc..fd59a49 100644 --- a/ARW.WebApi/appsettings.json +++ b/ARW.WebApi/appsettings.json @@ -149,6 +149,7 @@ "TenPayV3_CertPath": "D:\\.Net\\Aerwen\\shop_template\\wecaht_information\\cert\\apiclient_cert.p12", //支付证书物理路径,如:D:\\cert\\apiclient_cert.p12 "TenPayV3_CertSecret": "1645875842", //支付证书密码(原始密码和 MchId 相同) "TenPayV3_TenpayNotify": "http://shop.api.aerwen.net/api/WxPay/Notify", // 回调方法 + "TenPayV3_RefundNotify": "http://shop.api.aerwen.net/api/WxPay/refundNotifyUrl", // 退款回调方法 "TenPayV3_WxOpenNotify": "http://shop.api.aerwen.net/api/WxPay/Notify", // 小程序回调方法 "TenPayV3_PrivateKey": "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7wzMe6ZBFh+Zsa4cZf0s2dfMfDlmbGD7KEly6l1aK42YsR+5VpFcB+TJH3pVAsRO0X//mMrQXDqlAzha8PgMKa5PuSc6LevfUaX6nHf454AwaTXc3CHdhClNbrHdaAqh+LqxvrAJwZydrBGwI9IgW73Ze0oFWiNGt7aLhnH30CxC1vmHkq/BrTsV7qUVenjJmmxdSR3SwtRI1IdeWOdTXasR4LU5hROvnVs/HIjzQTp+J3XMwf4zaOZgWTqz+23KZhuCVE9ZXe+quJCgWvuT+O8Do9SyG5iAZMlLg6nZYGy3L6cke/Am3KZDD9cUwQI+uS3z3gF0TYiG8fQVoJl25AgMBAAECggEBAJ+9diR6eO9uqy7aXFno3kg7GNf3EWzNt72a2aE1V79Zr3dEyxO5ePyI0aorR7d971GpysBBqs1i/8POkbEc4OFgnL5BtKMdvvLLvaDX942tex51gVMktMuuSTTZCcFeOZMAiluHb5vJZtO5M2B7CbzZhU8usDK6vAjI/6YJyW5w9cp9JLQwRGHe4P9aSbqlCE0swMDzdpGCvXB6GTSlATQtNkjnaPeZpv1HtOgJk72HNV56BY55zsYSrhTA+7Pd5jKCGPdQry84RkBnbTzM/BlFBfR5LXzwCH/cRBz3cgdhoklxT730oBnbaHDERzan4GbDY7pKqF6bIM8mJou2AbECgYEA6RikdNXFmbmuJ8GDgt/wtuEAsEQLovoCw2KFGGMk1Uu5rZJ908OKJ0aTzMdTXQEz4+QBqstJNzg2VA1blnTw/06l0RjprcJ0Ibq9BB0vCfFjR2R3OhiZlq/KjFHIeJ14+qhKKQlZ+inCL4G5VGRcR2MuHCmq3Msa6wAkCBMp7vsCgYEAzjY4p9TldFg+qJIv2x53Gz0SbqIA3g0L08tSvlxI2sWkluWMk1KVU6pMsInL/eogEGqYV/n1kjjTVJp75G7fxThdeO9BUxlpwmjTYXGlMUkLGB3/LXw//IKi6dWDJoZUW60z/yYfsPnM9/eYLXRF4dsHlb6nJvISXCLjZ4OdN9sCgYAPhJd2O8ES8dyZQvXJYbU5x5LvKSiJKhHDBi0MKZWLKaZr2sPLtEnfQYCXcnGnUGwu8L/3qd7u8SwUvmrpglGE/axmVj1AVyC6Gh95RaQbClnsp9CUKo0XDg7y9oLdHMawEUIWp0u5LsyBsyYuaxwFmKG6OD/qwQ7CtFixvOzevwKBgHZC0FEoHoOPzDd+xyVCHoqnhred/yNZlgvb0lNLt5iHurGzaeBffzYhN6QTEsNHDyZ7C22A853tKv2dLyo9j+WaQrkFdZBDxcxxs7BxrYxLWKp3IY4jcMrO3MF/6pwgc6az+Vr9sTUcvbkD7Ok8gotZwsrVMSV7tJ3UgFgwOez7AoGAB2TKMM7QrVfotvDtcDR689NvJ55RGWiKZv/BzsT5zE7LJH+0jwWl1jy24I1DSGgsPmLAt29+VLfgwfAyCz5ytMgvx6iu+cnsyriK3/SNdFZtymUegkIdzSONXslVZYqFsBKQz/M+BmgPvnQao/e8r8eWpIBZLBr93ud+LpDmEio=", //(新)证书私钥 "TenPayV3_SerialNumber": "6C34D380F6B239BEE351D9EB4AD2655FF38D4AAA", //(新)证书序列号 diff --git a/Infrastructure/WeChat/TenPay/Pay.cs b/Infrastructure/WeChat/TenPay/Pay.cs index 029d279..0610c1c 100644 --- a/Infrastructure/WeChat/TenPay/Pay.cs +++ b/Infrastructure/WeChat/TenPay/Pay.cs @@ -250,16 +250,16 @@ namespace Infrastructure.WeChat.TenPay /// 退款申请接口 /// /// - public async Task Refund(string transactionId, decimal totalFee,string? paymentRefundNumber) + public async Task Refund(string transactionId, decimal totalFee,string? paymentRefundNumber,string reason) { try { string outRefundNo; - await payLog("WechatRefund", "1"); + await payLog("WechatRefund", "1asdasdas"); string nonceStr = TenPayV3Util.GetNoncestr(); - await payLog("WechatRefund", "2 退款微信单号transactionId:" + transactionId); + await payLog("WechatRefund", "2 退款微信单号transactionId:" + transactionId + "/n 订单金额:" + totalFee); if (!string.IsNullOrEmpty(paymentRefundNumber)) { @@ -271,12 +271,13 @@ namespace Infrastructure.WeChat.TenPay } int refundFee = Convert.ToInt32(totalFee); string opUserId = TenPayV3Info.MchId; - var notifyUrl = "http://aerwen.net/prod-api/api/WxPay/refundNotifyUrl"; + var notifyUrl = AppSettings.GetConfig("SenparcWeixinSetting:TenPayV3_RefundNotify"); //var dataInfo = new TenPayV3RefundRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, TenPayV3Info.Key, // null, nonceStr, null, outTradeNo, outRefundNo, totalFee, refundFee, opUserId, null, notifyUrl: notifyUrl); //TODO:该接口参数二选一传入 - var dataInfo = new RefundRequsetData(transactionId, null, outRefundNo, "Senparc TenPayV3 demo退款测试", notifyUrl, null, new RefundRequsetData.Amount(refundFee, null, refundFee, "CNY"), null); + var dataInfo = new RefundRequsetData(transactionId, null, outRefundNo, reason, notifyUrl, null, new RefundRequsetData.Amount(refundFee, null, refundFee, "CNY"), null); + await payLog("WechatRefund", "2.5 DataInfo:" + dataInfo.ToJson()); //#region 新方法(Senparc.Weixin v6.4.4+) //var result = TenPayOldV3.Refund(_serviceProvider, dataInfo);//证书地址、密码,在配置文件中设置,并在注册微信支付信息时自动记录 @@ -289,6 +290,7 @@ namespace Infrastructure.WeChat.TenPay } catch (Exception ex) { + await payLog("WechatRefund", "报错:" + ex.Message); WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw;