| | |
| | | using Volo.Abp.EventBus.Distributed; |
| | | using Z.EntityFramework.Plus; |
| | | using ZeroD.Util; |
| | | using Alipay.EasySDK.Payment.Common.Models; |
| | | using static LifePayment.Domain.Shared.LifePaymentConstant; |
| | | |
| | | namespace LifePayment.Application; |
| | |
| | | /// <returns></returns> |
| | | public async Task<PageOutput<LifePayOrderListOutput>> GetLifePayOrderPage(QueryLifePayOrderListInput input) |
| | | { |
| | | |
| | | var result = await (from a in _channelFilter.GetChannelLifePayOrderFilter(_lifePayOrderRepository) |
| | | .WhereIf(input.BeginFinishTime.HasValue, x => x.FinishTime >= input.BeginFinishTime) |
| | | .WhereIf(input.EndFinishTime.HasValue, x => x.FinishTime <= input.EndFinishTime) |
| | |
| | | RefundCheckRemark = a.RefundCheckRemark, |
| | | RefundApplyRemark = a.RefundApplyRemark, |
| | | RefundTime = a.RefundTime, |
| | | ChannelName = b.ChannlesName |
| | | ChannelName = b.ChannlesName, |
| | | ActualRechargeAmount = a.ActualRechargeAmount, |
| | | PlatformDeductionAmount = a.PlatformDeductionAmount, |
| | | ACOOLYStatus = a.ACOOLYStatus, |
| | | LifePayRefundStatus = a.LifePayRefundStatus, |
| | | }).GetPageResult(input.PageModel); |
| | | |
| | | return result; |
| | | } |
| | | |
| | | public async Task<LifePayOrderOutput> GetLifePayOrderDetail(string orderNo) |
| | | { |
| | | var result = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo) |
| | | .Select(x => |
| | | new LifePayOrderOutput |
| | | { |
| | | DiscountAmount = x.DiscountAmount, |
| | | FinishTime = x.FinishTime, |
| | | Id = x.Id, |
| | | LifePayOrderStatus = x.LifePayOrderStatus, |
| | | LifePayOrderType = x.LifePayOrderType, |
| | | LifePayType = x.LifePayType, |
| | | OrderNo = x.OrderNo, |
| | | PayAmount = x.PayAmount, |
| | | RechargeAmount = x.RechargeAmount, |
| | | PayStatus = x.PayStatus, |
| | | PayTime = x.PayTime, |
| | | OrderParamDetailJsonStr = x.OrderParamDetailJsonStr, |
| | | RefundCredentialsImgUrl = x.RefundCredentialsImgUrl.GetOssPath(), |
| | | CreationTime = x.CreationTime, |
| | | RefundCheckRemark = x.RefundCheckRemark, |
| | | RefundApplyRemark = x.RefundApplyRemark, |
| | | RefundTime = x.RefundTime, |
| | | ACOOLYOrderNo = x.ACOOLYOrderNo, |
| | | }) |
| | | .FirstOrDefaultAsync(); |
| | | CheckExtensions.IfTrueThrowUserFriendlyException(result == null, "订单不存在"); |
| | | |
| | | return result; |
| | | } |
| | |
| | | |
| | | return result; |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 根据订单号获取支付状态 |
| | |
| | | |
| | | var orderInput = new CreateLifePayOrderInput |
| | | { |
| | | OrderNo = CreateOrderNo(), |
| | | OrderNo = channle.ChannlesNum + CreateOrderNo(), |
| | | LifePayOrderStatus = LifePayOrderStatusEnum.待确认, |
| | | LifePayOrderType = LifePayOrderTypeEnum.话费订单, |
| | | //LifePayType = input.LifePayType, |
| | |
| | | |
| | | var orderInput = new CreateLifePayOrderInput |
| | | { |
| | | OrderNo = CreateOrderNo(), |
| | | OrderNo = channle.ChannlesNum + CreateOrderNo(), |
| | | LifePayOrderStatus = LifePayOrderStatusEnum.待确认, |
| | | LifePayOrderType = LifePayOrderTypeEnum.电费订单, |
| | | // LifePayType = input.LifePayType, |
| | |
| | | |
| | | var orderInput = new CreateLifePayOrderInput |
| | | { |
| | | OrderNo = CreateOrderNo(), |
| | | OrderNo = channle.ChannlesNum + CreateOrderNo(), |
| | | LifePayOrderStatus = LifePayOrderStatusEnum.待确认, |
| | | LifePayOrderType = LifePayOrderTypeEnum.燃气订单, |
| | | // LifePayType = input.LifePayType, |
| | |
| | | /// <param name="orderNo"></param> |
| | | /// <param name="outOrderNo"></param> |
| | | /// <returns></returns> |
| | | public async Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status) |
| | | public async Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount) |
| | | { |
| | | var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); |
| | | CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在"); |
| | |
| | | } |
| | | |
| | | order.LifePayOrderStatus = status; |
| | | order.ACOOLYStatus = acoolyStatus; |
| | | order.PlatformDeductionAmount = payAmount; |
| | | if (acoolyOrderNo.IsNotNullOrEmpty()) |
| | | { |
| | | order.ACOOLYOrderNo = acoolyOrderNo; |
| | |
| | | throw new UserFriendlyException("当前订单状态无法退款"); |
| | | } |
| | | |
| | | /// TODO 退款请求完成后如何操作 |
| | | /// var refundResult = await WxPayDomesticRefunds(order.OrderNo, order.RefundApplyRemark, Convert.ToInt32(order.PayAmount * 100), Convert.ToInt32(order.PayAmount * 100)); |
| | | switch (order.LifePayType) |
| | | { |
| | | case LifePayTypeEnum.WxPay: |
| | | var wxRefundResult = await WxPayDomesticRefunds(order.OrderNo, order.RefundApplyRemark, Convert.ToInt32(order.PayAmount * 100), Convert.ToInt32(order.PayAmount * 100)); |
| | | if (wxRefundResult.Status == "SUCCESS") |
| | | { |
| | | order.PayStatus = LifePayStatusEnum.已退款; |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.已退款; |
| | | } |
| | | else if (wxRefundResult.Status == "PROCESSING") |
| | | { |
| | | order.PayStatus = LifePayStatusEnum.退款中; |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.退款中; |
| | | } |
| | | else |
| | | { |
| | | throw new UserFriendlyException("退款失败"); |
| | | } |
| | | |
| | | order.PayStatus = LifePayStatusEnum.已退款; |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.已退款; |
| | | break; |
| | | case LifePayTypeEnum.AliPay: |
| | | var aliRefundResult = await AliTradeRefund(new AlipayTradeRefundRequest() { OutTradeNo = order.OrderNo, RefundAmount = order.PayAmount.ToString() }); |
| | | if (aliRefundResult.Code != AlipayResultCode.Success) |
| | | { |
| | | throw new UserFriendlyException("退款失败"); |
| | | } |
| | | |
| | | order.PayStatus = LifePayStatusEnum.已退款; |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.已退款; |
| | | break; |
| | | default: throw new UserFriendlyException("退款失败"); |
| | | } |
| | | |
| | | order.RefundCredentialsImgUrl = input.RefundCredentialsImgUrl; |
| | | order.RefundCheckRemark = input.RefundCheckRemark; |
| | | order.RefundTime = DateTime.Now; |
| | | order.RefundCheckUserId = CurrentUser.Id; |
| | | order.RefundPrice = order.PayAmount; |
| | | |
| | | await _lifePayOrderRepository.UpdateAsync(order); |
| | | |
| | |
| | | |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.退款待审核; |
| | | order.RefundApplyRemark = input.RefundApplyRemark; |
| | | order.RefundTime = DateTime.Now; |
| | | order.RefundApplyTime = DateTime.Now; |
| | | |
| | | await _lifePayOrderRepository.UpdateAsync(order); |
| | | } |
| | |
| | | return res; |
| | | } |
| | | |
| | | |
| | | private async Task<AlipayTradeRefundResponse> AliTradeRefund(AlipayTradeRefundRequest input) |
| | | { |
| | | return await _aliPayApi.TradeRefund(input); |
| | | } |
| | | |
| | | public async Task<int> AddUpdateUserAccount(AddUpdateUserAccountInput input) |
| | | { |
| | |
| | | private (decimal PayAmont, decimal DiscountAmount, decimal RechargeAmount) CalculateAmount(decimal amount, decimal rate) |
| | | { |
| | | /// 正常支付 |
| | | var payAmount = decimal.Round(amount * rate / 100, 2, MidpointRounding.AwayFromZero); |
| | | //var payAmount = decimal.Round(amount * rate / 100, 2, MidpointRounding.AwayFromZero); |
| | | |
| | | /// 1分钱支付 |
| | | //decimal payAmount = 0.01m; |
| | | decimal payAmount = 0.01m; |
| | | |
| | | CheckExtensions.IfTrueThrowUserFriendlyException(payAmount < 0.01m, "支付金额错误"); |
| | | |
| | |
| | | CheckExtensions.IfTrueThrowUserFriendlyException(amount <= 0, |
| | | CustomeErrorMessage.SometingMustSometing, |
| | | "获取支付二维码时金额", "大于0"); |
| | | |
| | | var res = await _wxPayApi.PayTransactionsH5(new PayTransactionsNativeH5 |
| | | { |
| | | Appid = _wxPayOptions.AppID, |
| | |
| | | |
| | | return res.QrCode; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 构造待签名字符串 |
| | | /// </summary> |