lingling
2025-03-20 4cb523bee320f335100c63df4c8f51ed09fca9eb
Merge branch 'master' of http://120.26.58.240:8888/r/LifePaymentApi
19个文件已修改
731 ■■■■■ 已修改文件
LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application.Contracts/LifePay/LifePayOutput.cs 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application.Contracts/User/CreateBackClientUserInput.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application/LifePay/LifePayService.cs 121 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYConstant.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain.Shared/Ali/GetPayQrCodeInput.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain.Shared/WeChat/WxPayPostBaseModel.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain/Ali/AliPayApi.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain/Ali/AlipayApiConstant.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain/Ali/IAliPayApi.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain/LifePay/LifePayOrder.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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.支付成功)
                    {