LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs
@@ -10,6 +10,10 @@ public interface ILifePayService : IApplicationService { //Task<ElectricParValueResponse> GetTopStatistics(); /// <summary> /// 获取电费面值 /// </summary> @@ -54,8 +58,10 @@ /// <param name="orderNo"></param> /// <param name="acoolyOrderNo"></param> /// <param name="status"></param> /// <param name="acoolyStatus"></param> /// <param name="payAmount"></param> /// <returns></returns> Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status); Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount); /// <summary> /// 创建生活缴费话费订单 @@ -188,6 +194,14 @@ /// <returns></returns> Task<PageOutput<LifePayOrderListOutput>> GetLifePayOrderPage(QueryLifePayOrderListInput input); /// <summary> /// 获取订单详情 /// </summary> /// <param name="orderNo"></param> /// <returns></returns> Task<LifePayOrderOutput> GetLifePayOrderDetail(string orderNo); /// <summary> /// 根据订单号获取支付状态 /// </summary> LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs
@@ -293,6 +293,7 @@ public string RefundCheckRemark { get; set; } } public class RefundUserLifePayOrderInput : ChannelsBaseInput { public Guid Id { get; set; } @@ -403,7 +404,8 @@ /// <summary> /// 注册时间 /// </summary> public DateTime? CreationTime { get; set; } public DateTime? CreationTimeBegin { get; set; } public DateTime? CreationTimeEnd { get; set; } } public class Model_UserAccountExtraProperties LifePayment/LifePayment.Application.Contracts/LifePay/LifePayOutput.cs
@@ -181,6 +181,11 @@ public decimal RechargeAmount { get; set; } /// <summary> /// 实际充值金额 /// </summary> public decimal? ActualRechargeAmount { get; set; } /// <summary> /// 优惠金额 /// </summary> public decimal DiscountAmount { get; set; } @@ -194,6 +199,12 @@ /// 支付时间 /// </summary> public DateTime? PayTime { get; set; } /// <summary> /// 平台扣款金额 /// </summary> public decimal? PlatformDeductionAmount { get; set; } /// <summary> /// 支付状态 @@ -230,13 +241,30 @@ /// </summary> public DateTime? RefundTime { get; set; } /// <summary> /// 申请退款原因 /// </summary> public string RefundApplyRemark { get; set; } /// <summary> /// 驳回原因 /// </summary> public string RefundCheckRemark { get; set; } /// <summary> /// 供应商订单号 /// </summary> public string ACOOLYOrderNo { get; set; } /// <summary> /// 供应商订单状态 /// </summary> public ACOOLYStatusEnum? ACOOLYStatus { get; set; } /// <summary> /// 平台退款状态 /// </summary> public LifePayRefundStatusEnum? LifePayRefundStatus { get; set; } } public class LifePayOrderListTemplate @@ -424,6 +452,158 @@ public string ACOOLYOrderNo { get; set; } } public class LifePayOrderOutput { public Guid Id { get; set; } /// <summary> /// 用户账号 /// </summary> public string UserPhoneNumber { get; set; } public string UserName { get; set; } public string LifePayChannle { get; set; } /// <summary> /// 生活缴费支付类型 /// </summary> public LifePayTypeEnum? LifePayType { get; set; } /// <summary> /// 订单类型 /// </summary> public LifePayOrderTypeEnum LifePayOrderType { get; set; } /// <summary> /// 订单号 /// </summary> public string OrderNo { get; set; } /// <summary> /// 充值金额 /// </summary> public decimal RechargeAmount { get; set; } /// <summary> /// 优惠金额 /// </summary> public decimal DiscountAmount { get; set; } /// <summary> /// 实付金额 /// </summary> public decimal PayAmount { get; set; } /// <summary> /// 支付时间 /// </summary> public DateTime? PayTime { get; set; } /// <summary> /// 支付状态 /// </summary> public LifePayStatusEnum PayStatus { get; set; } /// <summary> /// 订单状态 /// </summary> public LifePayOrderStatusEnum LifePayOrderStatus { get; set; } /// <summary> /// 完成时间 /// </summary> public DateTime? FinishTime { get; set; } /// <summary> /// 外部订单号 /// </summary> public string OutOrderNo { get; set; } /// <summary> /// 订单详细数据 /// </summary> public string OrderParamDetailJsonStr { get; set; } /// <summary> /// 下单时间 /// </summary> public DateTime? CreationTime { get; set; } /// <summary> /// 退款时间 /// </summary> public DateTime? RefundTime { get; set; } /// <summary> /// 退款凭证 /// </summary> public string RefundCredentialsImgUrl { get; set; } public string RefundApplyRemark { get; set; } public string RefundCheckRemark { get; set; } /// <summary> /// 渠道流水号 /// </summary> public string ACOOLYOrderNo { get; set; } /// <summary> /// 平台退款状态 /// </summary> public LifePayRefundStatusEnum? LifePayRefundStatus { get; set; } /// <summary> /// 实际充值金额 /// </summary> public decimal? ActualRechargeAmount { get; set; } /// <summary> /// 退款金额 /// </summary> public decimal? RefundPrice { get; set; } /// <summary> /// 平台折扣比例 /// </summary> public decimal? PlatformRate { get; set; } /// <summary> /// 平台扣款金额 /// </summary> public decimal? PlatformPrice { get; set; } /// <summary> /// 渠道折扣 /// </summary> public decimal? ChannleRate { get; set; } /// <summary> /// 渠道佣金比例 /// </summary> public decimal? ChannlesRakeRate { get; set; } /// <summary> /// 渠道佣金 /// </summary> public decimal? ChannlesRakePrice { get; set; } /// <summary> /// 手续费比例 /// </summary> public decimal PremiumRate { get; set; } /// <summary> /// 手续费 /// </summary> public decimal PremiumPrice { get; set; } public decimal? Profit { get; set; } } public class CreateLifePayOrderOutput { public string OrderNo { get; set; } @@ -505,3 +685,18 @@ public bool IsDeleted { get; set; } } public class TopStatisticsOutput { /// <summary> /// 账户余额 /// </summary> public string Amount { get; set; } /// <summary> /// 累计收款 /// </summary> public string AccumulatedReceipts { get; set; } } LifePayment/LifePayment.Application.Contracts/User/CreateBackClientUserInput.cs
@@ -15,6 +15,7 @@ /// 手机号 /// </summary> public string PhoneNumber { get; set; } public string Password { get; set; } /// <summary> /// 账户 LifePayment/LifePayment.Application/LifePay/LifePayService.cs
@@ -19,7 +19,10 @@ using Volo.Abp.EventBus.Distributed; using Z.EntityFramework.Plus; using ZeroD.Util; using Alipay.EasySDK.Payment.Common.Models; using static LifePayment.Domain.Shared.LifePaymentConstant; using ZeroD.Util.Fadd; using Nest; namespace LifePayment.Application; @@ -166,7 +169,8 @@ { return await _channelFilter.GetChannelLifePayUserFilter(_lifePayUserRepository).Where(x => x.IsDeleted == false) .WhereIf(!string.IsNullOrEmpty(input.QueryCondition), x => x.PhoneNumber.Contains(input.QueryCondition) || x.Name.Contains(input.QueryCondition)) .WhereIf(input.CreationTime.HasValue, x => x.CreationTime.ToString("yyyy-MM-dd") == input.CreationTime.Value.ToString("yyyy-MM-dd")) .WhereIf(input.CreationTimeBegin.HasValue, x => x.CreationTime >= input.CreationTimeBegin) .WhereIf(input.CreationTimeEnd.HasValue, x => x.CreationTime <= input.CreationTimeEnd) .Select(x => new UserListOutput() { @@ -218,7 +222,6 @@ /// <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) @@ -254,8 +257,62 @@ 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 order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); var platformRate = await _lifePayRateRepository.FirstOrDefaultAsync(r => r.RateType == LifePayRateTypeEnum.供应商折扣价); var channle = await _lifePayChannlesRep.FirstOrDefaultAsync(r => r.ChannlesNum == order.ChannelId); var premium = await _lifePayPremiumRepository.Where(x => x.IsDeleted == false && x.PremiumType == order.LifePayType).FirstOrDefaultAsync(); CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在"); var user = await _lifePayUserRepository.FirstOrDefaultAsync(x => x.Id == order.UserId); var channlesRakePrice = (order.PayAmount - (order.PlatformDeductionAmount == null ? 0 : order.PlatformDeductionAmount)) * channle.ChannlesRakeRate / 100; var result = new LifePayOrderOutput() { UserName = user.Name, UserPhoneNumber = user.PhoneNumber, DiscountAmount = order.DiscountAmount, FinishTime = order.FinishTime, Id = order.Id, OutOrderNo = order.OutOrderNo, LifePayChannle = channle.ChannlesName, LifePayOrderStatus = order.LifePayOrderStatus, LifePayOrderType = order.LifePayOrderType, LifePayType = order.LifePayType, OrderNo = order.OrderNo, PayAmount = order.PayAmount, RechargeAmount = order.RechargeAmount, PayStatus = order.PayStatus, PayTime = order.PayTime, OrderParamDetailJsonStr = order.OrderParamDetailJsonStr, RefundCredentialsImgUrl = order.RefundCredentialsImgUrl.GetOssPath(), CreationTime = order.CreationTime, RefundCheckRemark = order.RefundCheckRemark, RefundApplyRemark = order.RefundApplyRemark, RefundTime = order.RefundTime, ACOOLYOrderNo = order.ACOOLYOrderNo, LifePayRefundStatus = order.LifePayRefundStatus, ActualRechargeAmount = order.ActualRechargeAmount, RefundPrice = order.RefundPrice, PlatformRate = platformRate.Rate, PlatformPrice = order.PlatformDeductionAmount, ChannleRate = channle.ChannlesRate, ChannlesRakeRate = channle.ChannlesRakeRate, ChannlesRakePrice = channlesRakePrice.HasValue ? 0 : Math.Round(channlesRakePrice.Value, 2), PremiumRate = premium == null ? 0 : premium.Rate, PremiumPrice = premium == null ? 0 : Math.Round(order.PayAmount * premium.Rate, 2), Profit = (order.PayAmount - order.PlatformDeductionAmount) * (1.00m - channle.ChannlesRakeRate / 100) - (premium == null ? 0 : Math.Round(order.PayAmount * premium.Rate, 2)) }; return result; } @@ -336,6 +393,8 @@ return result; } /// <summary> /// 根据订单号获取支付状态 @@ -549,7 +608,7 @@ var orderInput = new CreateLifePayOrderInput { OrderNo = CreateOrderNo(), OrderNo = channle.ChannlesNum + CreateOrderNo(), LifePayOrderStatus = LifePayOrderStatusEnum.待确认, LifePayOrderType = LifePayOrderTypeEnum.话费订单, //LifePayType = input.LifePayType, @@ -593,7 +652,7 @@ var orderInput = new CreateLifePayOrderInput { OrderNo = CreateOrderNo(), OrderNo = channle.ChannlesNum + CreateOrderNo(), LifePayOrderStatus = LifePayOrderStatusEnum.待确认, LifePayOrderType = LifePayOrderTypeEnum.电费订单, // LifePayType = input.LifePayType, @@ -637,7 +696,7 @@ var orderInput = new CreateLifePayOrderInput { OrderNo = CreateOrderNo(), OrderNo = channle.ChannlesNum + CreateOrderNo(), LifePayOrderStatus = LifePayOrderStatusEnum.待确认, LifePayOrderType = LifePayOrderTypeEnum.燃气订单, // LifePayType = input.LifePayType, @@ -967,7 +1026,7 @@ /// <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, "订单不存在"); @@ -978,6 +1037,8 @@ } order.LifePayOrderStatus = status; order.ACOOLYStatus = acoolyStatus; order.PlatformDeductionAmount = payAmount; if (acoolyOrderNo.IsNotNullOrEmpty()) { order.ACOOLYOrderNo = acoolyOrderNo; @@ -1017,15 +1078,44 @@ 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("退款失败"); } 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); @@ -1065,7 +1155,7 @@ order.LifePayOrderStatus = LifePayOrderStatusEnum.退款待审核; order.RefundApplyRemark = input.RefundApplyRemark; order.RefundTime = DateTime.Now; order.RefundApplyTime = DateTime.Now; await _lifePayOrderRepository.UpdateAsync(order); } @@ -1099,7 +1189,10 @@ return res; } private async Task<AlipayTradeRefundResponse> AliTradeRefund(AlipayTradeRefundRequest input) { return await _aliPayApi.TradeRefund(input); } public async Task<int> AddUpdateUserAccount(AddUpdateUserAccountInput input) { @@ -1371,10 +1464,10 @@ 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, "支付金额错误"); @@ -1494,7 +1587,6 @@ CheckExtensions.IfTrueThrowUserFriendlyException(amount <= 0, CustomeErrorMessage.SometingMustSometing, "获取支付二维码时金额", "大于0"); var res = await _wxPayApi.PayTransactionsH5(new PayTransactionsNativeH5 { Appid = _wxPayOptions.AppID, @@ -1547,6 +1639,7 @@ return res.QrCode; } /// <summary> /// 构造待签名字符串 /// </summary> LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYConstant.cs
@@ -62,5 +62,20 @@ public const string PROCESSING = "PROCESSING"; } public static class Status { public const string 充值成功 = "SUCCESS"; public const string 充值中 = "PROCESSING"; public const string 充值失败 = "FAIL"; public const string 退款中 = "REFUNDING"; public const string 退款完成 = "REFUND_CLOSE"; public const string 失败关闭 = "FAIL_CLOSE"; } public const string NotifyUrl = "/api/ACOOLYNotify/ACOOLYNotify"; } LifePayment/LifePayment.Domain.Shared/Ali/GetPayQrCodeInput.cs
@@ -25,4 +25,14 @@ /// </summary> public string OutTradeNo { get; set; } } public class AlipayTradeRefundRequest { /// <summary> /// 交易创建时传入的商户订单号 /// </summary> public string OutTradeNo { get; set; } public string RefundAmount { get; set; } } } LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs
@@ -36,6 +36,9 @@ [Description("已退款")] 已退款 = 40, [Description("退款中")] 退款中 = 50, } public enum LifePayOrderStatusEnum @@ -57,6 +60,26 @@ [Description("退款失败")] 退款失败 = 60, [Description("退款中")] 退款中 = 70, } public enum ACOOLYStatusEnum { [Description("充值中")] 充值中 = 10, [Description("充值成功")] 充值成功 = 20, [Description("已完成")] 已完成 = 30, [Description("部分充值成功")] 部分充值成功 = 40, [Description("充值失败")] 充值失败 = 50, [Description("已退款")] 已退款 = 60, } public enum LifePayRefundStatusEnum LifePayment/LifePayment.Domain.Shared/WeChat/WxPayPostBaseModel.cs
@@ -600,11 +600,6 @@ /// </summary> public class WxPayDomesticRefundsRequest { /// <summary> /// 微信支付订单号 和out_trade_no必须二选一进行传参 /// </summary> [JsonProperty("transaction_id")] public string TransactionId { get; set; } /// <summary> /// 商户订单号 和out_trade_no必须二选一进行传参 @@ -630,11 +625,6 @@ [JsonProperty("notify_url")] public string NotifyUrl { get; set; } /// <summary> /// 退款资金来源 /// </summary> [JsonProperty("funds_account")] public string FundsAccount { get; set; } /// <summary> /// 金额信息 必填 LifePayment/LifePayment.Domain/Ali/AliPayApi.cs
@@ -33,5 +33,11 @@ AlipayTradeQueryResponse response = Factory.Payment.Common().Query(input.OutTradeNo); return response; } public async Task<AlipayTradeRefundResponse> TradeRefund(AlipayTradeRefundRequest input) { AlipayTradeRefundResponse response = Factory.Payment.Common().Refund(input.OutTradeNo,input.RefundAmount); return response; } } } LifePayment/LifePayment.Domain/Ali/AlipayApiConstant.cs
@@ -26,6 +26,8 @@ internal const string DataBillErceiptApply = "alipay.data.bill.ereceiptagent.apply"; internal const string DataBillEreceiptQuery = "alipay.data.bill.accountbookereceipt.query"; internal const string DataDataserviceBillDownloadUrlQuery = "alipay.data.dataservice.bill.downloadurl.query"; } public class AlipayResultCode LifePayment/LifePayment.Domain/Ali/IAliPayApi.cs
@@ -11,5 +11,7 @@ Task<AlipayTradePrecreateResponse> GetAliPayQRCode(GetPayQrCodeInput input); AlipayTradeQueryResponse OrderInQuiry(OrderInQuiryInput input); Task<AlipayTradeRefundResponse> TradeRefund(AlipayTradeRefundRequest input); } } LifePayment/LifePayment.Domain/LifePay/LifePayOrder.cs
@@ -38,6 +38,8 @@ /// </summary> public decimal RechargeAmount { get; set; } /// <summary> /// 优惠金额 /// </summary> @@ -47,6 +49,11 @@ /// 实付金额 /// </summary> public decimal PayAmount { get; set; } /// <summary> /// 平台扣款金额 /// </summary> public decimal? PlatformDeductionAmount { get; set; } /// <summary> /// 支付时间 @@ -74,6 +81,11 @@ public LifePayOrderStatusEnum LifePayOrderStatus { get; set; } /// <summary> /// 平台状态 /// </summary> public ACOOLYStatusEnum? ACOOLYStatus { get; set; } /// <summary> /// 完成时间 /// </summary> public DateTime? FinishTime { get; set; } @@ -98,12 +110,41 @@ /// </summary> public DateTime? RefundTime { get; set; } /// <summary> /// 退款申请原因 /// </summary> public string RefundApplyRemark { get; set; } /// <summary> /// 退款申请时间 /// </summary> public DateTime? RefundApplyTime { get; set; } /// <summary> /// 驳回原因 /// </summary> public string RefundCheckRemark { get; set; } /// <summary> /// 退款审核人 /// </summary> public Guid? RefundCheckUserId { get; set; } public string? ChannelId { get; set; } /// <summary> /// 退款金额 /// </summary> public decimal? RefundPrice { get; set; } /// <summary> /// 实际充值金额 /// </summary> public decimal? ActualRechargeAmount { get; set; } /// <summary> /// 平台退款状态 /// </summary> public LifePayRefundStatusEnum? LifePayRefundStatus { get; set; } } } LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml
@@ -124,6 +124,13 @@ <param name="input"></param> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.GetLifePayOrderDetail(System.String)"> <summary> 获取订单详情 </summary> <param name="orderNo"></param> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.GetUserLifePayOrderPage(LifePayment.Application.Contracts.QueryLifePayOrderListInput)"> <summary> 获取我的订单分页数据 LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml
@@ -42,13 +42,15 @@ <param name="outOrderNo"></param> <returns></returns> </member> <member name="M:LifePayment.Application.Contracts.ILifePayService.ACOOLYOrderNotifyHandler(System.String,System.String,LifePayment.Domain.Shared.LifePayOrderStatusEnum)"> <member name="M:LifePayment.Application.Contracts.ILifePayService.ACOOLYOrderNotifyHandler(System.String,System.String,LifePayment.Domain.Shared.LifePayOrderStatusEnum,LifePayment.Domain.Shared.ACOOLYStatusEnum,System.Decimal)"> <summary> 支付成功回调处理 </summary> <param name="orderNo"></param> <param name="acoolyOrderNo"></param> <param name="status"></param> <param name="acoolyStatus"></param> <param name="payAmount"></param> <returns></returns> </member> <member name="M:LifePayment.Application.Contracts.ILifePayService.CreateLifePayPhoneOrder(LifePayment.Application.Contracts.CreateLifePayOrderInput{LifePayment.Application.Contracts.LifePhoneData})"> @@ -173,6 +175,13 @@ 获取订单分页数据 </summary> <param name="input"></param> <returns></returns> </member> <member name="M:LifePayment.Application.Contracts.ILifePayService.GetLifePayOrderDetail(System.String)"> <summary> 获取订单详情 </summary> <param name="orderNo"></param> <returns></returns> </member> <member name="M:LifePayment.Application.Contracts.ILifePayService.GetPayStatusByOrderNo(System.String)"> @@ -501,7 +510,7 @@ 手机号/用户名 </summary> </member> <member name="P:LifePayment.Application.Contracts.QueryUserPageInput.CreationTime"> <member name="P:LifePayment.Application.Contracts.QueryUserPageInput.CreationTimeBegin"> <summary> 注册时间 </summary> @@ -621,6 +630,11 @@ 充值金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.ActualRechargeAmount"> <summary> 实际充值金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.DiscountAmount"> <summary> 优惠金额 @@ -634,6 +648,11 @@ <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.PayTime"> <summary> 支付时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.PlatformDeductionAmount"> <summary> 平台扣款金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.PayStatus"> @@ -669,6 +688,31 @@ <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.RefundTime"> <summary> 退款时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.RefundApplyRemark"> <summary> 申请退款原因 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.RefundCheckRemark"> <summary> 驳回原因 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.ACOOLYOrderNo"> <summary> 供应商订单号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.ACOOLYStatus"> <summary> 供应商订单状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.LifePayRefundStatus"> <summary> 平台退款状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListTemplate.CreationTime"> @@ -786,6 +830,131 @@ 渠道流水号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.LifePayType"> <summary> 生活缴费支付类型 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.LifePayOrderType"> <summary> 订单类型 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.OrderNo"> <summary> 订单号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.RechargeAmount"> <summary> 充值金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.DiscountAmount"> <summary> 优惠金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.PayAmount"> <summary> 实付金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.PayTime"> <summary> 支付时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.PayStatus"> <summary> 支付状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.LifePayOrderStatus"> <summary> 订单状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.FinishTime"> <summary> 完成时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.OrderParamDetailJsonStr"> <summary> 订单详细数据 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.CreationTime"> <summary> 下单时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.RefundTime"> <summary> 退款时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.RefundCredentialsImgUrl"> <summary> 退款凭证 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.ACOOLYOrderNo"> <summary> 渠道流水号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.LifePayRefundStatus"> <summary> 平台退款状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.ActualRechargeAmount"> <summary> 实际充值金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.RefundPrice"> <summary> 退款金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.PlatformRate"> <summary> 平台折扣比例 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.PlatformPrice"> <summary> 平台扣款金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.ChannleRate"> <summary> 渠道折扣 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.ChannlesRakeRate"> <summary> 渠道佣金比例 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.ChannlesRakePrice"> <summary> 渠道佣金 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.PremiumRate"> <summary> 手续费比例 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.PremiumPrice"> <summary> 手续费 </summary> </member> <member name="P:LifePayment.Application.Contracts.UserLifePayOrderRefundOutput.Id"> <summary> 订单编号 @@ -851,6 +1020,16 @@ 创建时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.TopStatisticsOutput.Amount"> <summary> 账户余额 </summary> </member> <member name="P:LifePayment.Application.Contracts.TopStatisticsOutput.AccumulatedReceipts"> <summary> 累计收款 </summary> </member> <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.RelationId"> <summary> 关联关系ID LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs
@@ -53,7 +53,9 @@ var baseInfo = JsonConvert.DeserializeObject<ACOOLYRequestBaseResponse>(body); var orderNo = string.Empty; var status = LifePayOrderStatusEnum.待确认; var acoolyStatus = ACOOLYStatusEnum.充值失败; var acoolyOrderNo = string.Empty; decimal payAmount = 0; _logger.LogError("ACOOLY回调通处理类型:" + baseInfo.Service); _logger.LogError("ACOOLY回调内容:" + body); switch (baseInfo.Service) @@ -62,29 +64,33 @@ var confirmElectricOrderResponse = JsonConvert.DeserializeObject<ConfirmElectricOrderResponse>(body); orderNo = confirmElectricOrderResponse.ElectricChargeOrder.OutOrderNo; acoolyOrderNo = confirmElectricOrderResponse.ElectricChargeOrder.BusiOrderNo; payAmount = confirmElectricOrderResponse.ElectricChargeOrder.PayAmount; _logger.LogError("ACOOLY回调通处理结果状态:" + confirmElectricOrderResponse.ElectricChargeOrder.Status); /// TODO 状态不正确 if (!confirmElectricOrderResponse.Success || (confirmElectricOrderResponse.Code != ACOOLYConstant.Code.SUCCESS && confirmElectricOrderResponse.Code != ACOOLYConstant.Code.PROCESSING)) { status = LifePayOrderStatusEnum.已失败; acoolyStatus = ACOOLYStatusEnum.充值失败; } else if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Code.SUCCESS) if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Status.充值成功) { status = LifePayOrderStatusEnum.已完成; acoolyStatus = ACOOLYStatusEnum.充值成功; } else if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Code.PROCESSING) if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Status.充值中) { status = LifePayOrderStatusEnum.待确认; acoolyStatus = ACOOLYStatusEnum.充值中; } else { status = LifePayOrderStatusEnum.已失败; acoolyStatus = ACOOLYStatusEnum.充值失败; } break; @@ -92,35 +98,81 @@ var confirmPhoneOrderResponse = JsonConvert.DeserializeObject<ConfirmPhoneOrderResponse>(body); orderNo = confirmPhoneOrderResponse.PhoneChargeOrder.OutOrderNo; acoolyOrderNo = confirmPhoneOrderResponse.PhoneChargeOrder.BusiOrderNo; payAmount = confirmPhoneOrderResponse.PhoneChargeOrder.PayAmount; _logger.LogError("ACOOLY回调通处理结果状态:" + confirmPhoneOrderResponse.PhoneChargeOrder.Status); if (!confirmPhoneOrderResponse.Success || (confirmPhoneOrderResponse.Code != ACOOLYConstant.Code.SUCCESS && confirmPhoneOrderResponse.Code != ACOOLYConstant.Code.PROCESSING)) { status = LifePayOrderStatusEnum.已失败; acoolyStatus = ACOOLYStatusEnum.充值失败; } else if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Code.SUCCESS) if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Status.充值成功) { status = LifePayOrderStatusEnum.已完成; acoolyStatus = ACOOLYStatusEnum.充值成功; } else if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Code.PROCESSING) if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Status.充值中) { status = LifePayOrderStatusEnum.待确认; acoolyStatus = ACOOLYStatusEnum.充值中; } else { status = LifePayOrderStatusEnum.已失败; acoolyStatus = ACOOLYStatusEnum.充值失败; } break; case ACOOLYConstant.Sevice.ConfirmGasOrder: var confirmGasOrderResponse = JsonConvert.DeserializeObject<ConfirmGasOrderResponse>(body); orderNo = confirmGasOrderResponse.GasChargeOrder.OutOrderNo; acoolyOrderNo = confirmGasOrderResponse.GasChargeOrder.BusiOrderNo; payAmount = confirmGasOrderResponse.GasChargeOrder.PayAmount; _logger.LogError("ACOOLY回调通处理结果状态:" + confirmGasOrderResponse.GasChargeOrder.Status); if (!confirmGasOrderResponse.Success || (confirmGasOrderResponse.Code != ACOOLYConstant.Code.SUCCESS && confirmGasOrderResponse.Code != ACOOLYConstant.Code.PROCESSING)) { status = LifePayOrderStatusEnum.已失败; } else if (confirmGasOrderResponse.GasChargeOrder.Status == ACOOLYConstant.Status.充值成功) { status = LifePayOrderStatusEnum.已完成; // TODO 确认什么情况下可以判断是部分充值成功 //if (confirmGasOrderResponse.GasChargeOrder.ParValue == confirmGasOrderResponse.GasChargeOrder.PayAmount) //{ // acoolyStatus = ACOOLYStatusEnum.充值成功; //} //else //{ // acoolyStatus = ACOOLYStatusEnum.部分充值成功; //} acoolyStatus = ACOOLYStatusEnum.充值成功; } else if (confirmGasOrderResponse.GasChargeOrder.Status == ACOOLYConstant.Status.充值中) { status = LifePayOrderStatusEnum.待确认; acoolyStatus = ACOOLYStatusEnum.充值中; } else { status = LifePayOrderStatusEnum.已失败; acoolyStatus = ACOOLYStatusEnum.充值失败; } break; default: break; } await _lifePayService.ACOOLYOrderNotifyHandler(orderNo, acoolyOrderNo, status); await _lifePayService.ACOOLYOrderNotifyHandler(orderNo, acoolyOrderNo, status, acoolyStatus, payAmount); } } } LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs
@@ -51,7 +51,7 @@ //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); if (input.OutTradeNo.StartsWith("JF") && Regex.IsMatch(input.OutTradeNo, @"^JF\d+$")) if (input.OutTradeNo.Contains("JF")) { if (input.TradeStatus == LifePaymentConstant.AliPayStatus.支付成功) { @@ -72,7 +72,7 @@ [AllowAnonymous] public async Task<ContentResult> TestAliRechargeNotify(string outTradeNo, string tradeNo, bool success) { if (outTradeNo.StartsWith("JF") && Regex.IsMatch(outTradeNo, @"^JF\d+$")) if (outTradeNo.Contains("JF")) { if (success) { LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs
@@ -36,6 +36,17 @@ #region 查询 /// <summary> /// 获取顶部统计数据 /// </summary> /// <returns></returns> //[HttpGet] //[AllowAnonymous] //public async Task<TopStatisticsOutput> GetTopStatistics() //{ // return await _lifePayService.GetTopStatistics(); //} /// <summary> /// 获取电费面值 /// </summary> /// <returns></returns> @@ -181,6 +192,18 @@ } /// <summary> /// 获取订单详情 /// </summary> /// <param name="orderNo"></param> /// <returns></returns> [HttpGet] public async Task<LifePayOrderOutput> GetLifePayOrderDetail(string orderNo) { return await _lifePayService.GetLifePayOrderDetail(orderNo); } /// <summary> /// 获取我的订单分页数据 /// </summary> /// <param name="input"></param> LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs
@@ -48,7 +48,7 @@ var data = _wxPayApi.AesGcmDecrypt(input.Resource.AssociatedData, input.Resource.Nonce, input.Resource.Ciphertext); var wxPayNotice = JsonConvert.DeserializeObject<WxPayNotice>(data); if (wxPayNotice.OutTradeNo.StartsWith("JF") && Regex.IsMatch(wxPayNotice.OutTradeNo, @"^JF\d+$")) if (wxPayNotice.OutTradeNo.Contains("JF") ) { if (wxPayNotice.TradeState == LifePaymentConstant.WxPayStatus.支付成功) {