示例#1
0
        /// <summary>
        /// 转换为支付类型
        /// </summary>
        /// <param name="prepayChannel"></param>
        /// <returns></returns>
        public static PayType Convert2Type(this PrepayChannel prepayChannel)
        {
            switch (prepayChannel)
            {
            case PrepayChannel.AliPayH5:
                return(PayType.AliPay);

            case PrepayChannel.WxNative:
            case PrepayChannel.WxH5:
            case PrepayChannel.WxApp:
            case PrepayChannel.WxJs:
                return(PayType.WxPay);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
示例#2
0
        /// <summary>
        /// 支付成功
        /// </summary>
        /// <param name="localTradeNo"></param>
        /// <param name="transactionId"></param>
        /// <param name="mchId"></param>
        /// <param name="appId"></param>
        /// <param name="attach"></param>
        /// <param name="traderId"></param>
        /// <param name="channel"></param>
        /// <param name="payData"></param>
        /// <returns></returns>
        public async Task Paid(string localTradeNo, string transactionId, string mchId, string appId, string attach,
                               string traderId, PrepayChannel channel, string payData)
        {
            using var _ = Locker.Lock(Lockers.PrepayOrderStatusChanged.Format(localTradeNo), 3);

            var order = await DbContext.Set <PrepayOrders>()
                        .FirstOrDefaultAsync(r => r.CurrentPayLocalTradeNo == localTradeNo);

            if (order == null)
            {
                throw new Exception($"支付完成,预付单不存在,localTradeNo: {localTradeNo}");
            }
            if (order.MchId != mchId)
            {
                Logger.LogWarning($"预付单支付成功, 商户id与原支付订单商户id不一致,可能是切换了支付方式. orderId: {order.Id}");
            }
            if (order.AppId != appId)
            {
                Logger.LogWarning($"预付单支付成功, appid与原支付订单appid不一致,可能是切换了支付方式. orderId: {order.Id}");
            }
            if (order.PayChannel != channel)
            {
                Logger.LogWarning($"预付单支付成功, channel与原支付订单channel不一致,可能是切换了支付方式. orderId: {order.Id}");
            }
            if (order.Attach != attach)
            {
                Logger.LogWarning($"预付单支付成功, attach与原支付订单attach不一致,可能是切换了支付方式. orderId: {order.Id}");
            }
            if (order.Status == PrepayOrderStatus.Succeed)
            {
                Logger.LogWarning($"预付单支付成功, 但订单状态为已支付成功, 可能是多次回调或者完成了支付查询. orderId: {order.Id}");
                return;
            }
            else if (order.Status != PrepayOrderStatus.Waiting)
            {
                Logger.LogWarning($"预付单支付成功, 但订单状态为{order.Status}. orderId: {order.Id}");
                return;
            }

            var tran = DbContext.Database.BeginTransaction();

            try
            {
                order.Status              = PrepayOrderStatus.Succeed;
                order.PayTime             = DateTime.Now.GetLongDate();
                order.TransactionId       = transactionId;
                order.TraderId            = traderId;
                order.PayChannel          = channel;
                order.PayNotifyOriginData = payData;
                order.MchId  = mchId;
                order.AppId  = appId;
                order.Attach = attach;

                await DbContext.SaveChangesAsync();

                var paidData = new OrderPaidData()
                {
                    Id            = order.Id,
                    Amount        = order.Amount,
                    PayTime       = order.PayTime.Value,
                    Sn            = order.Sn,
                    SourceId      = order.SourceId,
                    SourceSn      = order.SourceSn,
                    SourceType    = order.SourceType,
                    TransactionId = transactionId,
                    TraderId      = traderId,
                    UserId        = order.UserId,
                    UserName      = order.UserName,
                    UserPhone     = order.UserPhone,
                    OrderAttach   = order.Attach,
                    Channel       = order.PayChannel.Value
                };

                var dataProvider = ServiceProvider.GetServices <IPrepayOrderDataProvider>()
                                   .SingleOrDefault(p => p.SourceType == order.SourceType);
                if (dataProvider == null)
                {
                    throw new Exception("无效来源");
                }
                await dataProvider.PaySuccess(paidData);

                tran.Commit();
            }
            catch (Exception ex)
            {
                tran.Rollback();
                Logger.LogError(ex, "订单付款完成处理失败");
                throw;
            }
        }