/// <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(); } }
/// <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; } }