using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CoreCms.Net.Caching.AccressToken; using CoreCms.Net.Configuration; using CoreCms.Net.IServices; using CoreCms.Net.Loging; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using CoreCms.Net.WeChat.Service.HttpClients; using InitQ.Abstractions; using InitQ.Attributes; using Newtonsoft.Json; using SKIT.FlurlHttpClient.Wechat.Api; using SKIT.FlurlHttpClient.Wechat.Api.Models; namespace CoreCms.Net.RedisMQ { /// /// 微信支付成功后推送到接口进行发货处理 /// public class WeChatPayShippingSubscribe : IRedisSubscribe { private readonly IWeChatApiHttpClientFactory _weChatApiHttpClientFactory; private readonly ICoreCmsServicesServices _servicesServices; private readonly ICoreCmsBillPaymentsServices _billPaymentsServices; private readonly ICoreCmsBillDeliveryServices _billDeliveryServices; private readonly ICoreCmsOrderItemServices _orderItemServices; private readonly ICoreCmsUserServices _userServices; private readonly ICoreCmsUserWeChatInfoServices _weChatInfoServices; private readonly ICoreCmsOrderServices _orderServices; private readonly ICoreCmsSettingServices _settingServices; public WeChatPayShippingSubscribe(ICoreCmsBillPaymentsServices billPaymentsServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, ICoreCmsServicesServices servicesServices, ICoreCmsBillDeliveryServices billDeliveryServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsUserServices userServices, ICoreCmsUserWeChatInfoServices weChatInfoServices, ICoreCmsOrderServices orderServices, ICoreCmsSettingServices settingServices) { _billPaymentsServices = billPaymentsServices; _weChatApiHttpClientFactory = weChatApiHttpClientFactory; _servicesServices = servicesServices; _billDeliveryServices = billDeliveryServices; _orderItemServices = orderItemServices; _userServices = userServices; _weChatInfoServices = weChatInfoServices; _orderServices = orderServices; _settingServices = settingServices; } /// /// 微信支付成功后推送到接口进行发货处理 /// /// /// [Subscribe(RedisMessageQueueKey.WeChatPayShipping)] private async Task WeChatPayNotice(string msg) { try { var paymentOrder = await _billPaymentsServices.QueryByClauseAsync(p => p.paymentId == msg); if (paymentOrder == null) { NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":支付单不存在"); return; } else { if (paymentOrder.paymentCode != GlobalEnumVars.PaymentsTypes.wechatpay.ToString()) { NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":非微信支付方式不予处理"); return; } var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); var isTradeManagedRequest = new WxaSecOrderIsTradeManagedRequest() { AccessToken = accessToken }; //商品名称 var orderTitle = string.Empty; //检索是否开启了微信发货信息功能,才会进行后面的发货操作 var responseIsTradeManagedResponse = await client.ExecuteWxaSecOrderIsTradeManagedAsync(isTradeManagedRequest); if (responseIsTradeManagedResponse.IsSuccessful() && responseIsTradeManagedResponse.IsTradeManaged) { //判断不同支付单类型下如何获取商品标题,目前只是简单标题,非商品订单如果需要详细到具体明细,建议扩展获取其他关联信息。 switch (paymentOrder.type) { case (int)GlobalEnumVars.BillPaymentsType.Recharge: orderTitle = "用户充值" + paymentOrder.money + "元"; break; case (int)GlobalEnumVars.BillPaymentsType.FormOrder: orderTitle = "表单订单"; break; case (int)GlobalEnumVars.BillPaymentsType.FormPay: orderTitle = "表单付款码支付"; break; case (int)GlobalEnumVars.BillPaymentsType.ServiceOrder: { var id = Convert.ToInt32(paymentOrder.sourceId); var serviceModel = await _servicesServices.QueryByClauseAsync(p => p.id == id); if (serviceModel == null) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":服务项目获取失败"); return; } orderTitle = serviceModel.title; break; } case (int)GlobalEnumVars.BillPaymentsType.Common: case (int)GlobalEnumVars.BillPaymentsType.PinTuan: case (int)GlobalEnumVars.BillPaymentsType.Group: case (int)GlobalEnumVars.BillPaymentsType.Seckill: case (int)GlobalEnumVars.BillPaymentsType.Solitaire: { var orderItems = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId); if (!orderItems.Any()) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单详情获取失败"); return; } if (orderItems.Count == 1) { orderTitle = orderItems.FirstOrDefault()?.name; } else { orderItems.ForEach(p => { orderTitle += p.name + ";"; }); } break; } case (int)GlobalEnumVars.BillPaymentsType.Bargain: orderTitle = "砍价活动"; break; case (int)GlobalEnumVars.BillPaymentsType.Giveaway: orderTitle = "购物赠品"; break; default: NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单类型获取失败"); return; } //构建请求 var request = new WxaSecOrderUploadShippingInfoRequest { AccessToken = accessToken, OrderKey = new WxaSecOrderUploadCombinedShippingInfoRequest.Types.OrderKey() { OrderNumberType = 2, TransactionId = paymentOrder.tradeNo, }, IsFinishAll = true }; //组装参数 //获取openid var user = await _userServices.QueryByClauseAsync(p => p.id == paymentOrder.userId); if (user == null) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":用户信息获取失败"); return; } var weChatUserInfo = await _weChatInfoServices.QueryByClauseAsync(p => p.userId == user.id && p.type == (int)GlobalEnumVars.UserAccountTypes.微信小程序); if (weChatUserInfo == null) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":用户信息openId获取失败"); return; } request.Payer = new WxaSecOrderUploadCombinedShippingInfoRequest.Types.Payer() { OpenId = weChatUserInfo.openid }; //设置发货信息 //如果是商品模式是,则去走快递或者自提及同城配送。 //两种情况:1支付单支付成功后,自动调用此模式处理充值,服务商品,用户自提的订单,2、如果是后台手动发货,处理发货的订单业务。 var shippingList = new List(); if (paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Common || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.PinTuan || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Group || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Seckill || paymentOrder.type == (int)GlobalEnumVars.BillPaymentsType.Solitaire) { //获取订单 var order = await _orderServices.QueryByClauseAsync(p => p.orderId == paymentOrder.sourceId); if (order == null) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":订单获取失败"); return; } request.LogisticsType = order.receiptType switch { //设置物流的发货模式 (int)GlobalEnumVars.OrderReceiptType.SelfDelivery => (int)GlobalEnumVars.WeChatShippingLogisticsType.用户自提, (int)GlobalEnumVars.OrderReceiptType.IntraCityService => (int)GlobalEnumVars.WeChatShippingLogisticsType.同城配送, (int)GlobalEnumVars.OrderReceiptType.Logistics => (int)GlobalEnumVars.WeChatShippingLogisticsType.物流配送, (int)GlobalEnumVars.OrderReceiptType.DistributorDelivery=> (int)GlobalEnumVars.WeChatShippingLogisticsType.同城配送,//经销商配送视为同城 _ => request.LogisticsType }; //判断订单是否发货 if (order.shipStatus is (int)GlobalEnumVars.OrderShipStatus.PartialYes or (int)GlobalEnumVars.OrderShipStatus.Yes) { //获取订单的发货信息 var orderBillDeliveries = await _billDeliveryServices.QueryListByClauseAsync(p => p.orderId == paymentOrder.sourceId); if (orderBillDeliveries == null || !orderBillDeliveries.Any()) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":未获取到发货信息,自动发货停止操作"); return; } shippingList.AddRange(orderBillDeliveries.Select(item => new WxaSecOrderUploadShippingInfoRequest.Types.Shipping { ItemDescription = orderTitle, ExpressCompany = item.thirdPartylogiCode, TrackingNumber = item.logiNo })); request.DeliveryMode = orderBillDeliveries.Count > 1 ? (int)GlobalEnumVars.WeChatShippingDeliveryMode.SPLIT_DELIVERY : (int)GlobalEnumVars.WeChatShippingDeliveryMode.UNIFIED_DELIVERY; } else { //判断是否门店订单自动发货 var allConfigs = await _settingServices.GetConfigDictionaries(); var storeOrderAutomaticDelivery = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.StoreOrderAutomaticDelivery).ObjectToInt(1); if (storeOrderAutomaticDelivery == 1 || order.receiptType == (int)GlobalEnumVars.OrderReceiptType.SelfDelivery) { shippingList.Add(new WxaSecOrderUploadShippingInfoRequest.Types.Shipping() { ItemDescription = orderTitle, ExpressCompany = "", TrackingNumber = "" }); } else { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":未获取到发货信息,自动发货停止操作"); return; } } } else { //非商品模式,直接走虚拟发货。 request.LogisticsType = (int)GlobalEnumVars.WeChatShippingLogisticsType.虚拟商品; request.DeliveryMode = (int)GlobalEnumVars.WeChatShippingDeliveryMode.UNIFIED_DELIVERY; shippingList.Add(new WxaSecOrderUploadShippingInfoRequest.Types.Shipping() { ItemDescription = orderTitle, ExpressCompany = "", TrackingNumber = "" }); } request.ShippingList = shippingList; var response = await client.ExecuteWxaSecOrderUploadShippingInfoAsync(request); if (response.IsSuccessful()) { NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信发货信息处理", msg + ":发货提交成功"); } else { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理-推送接口", JsonConvert.SerializeObject(response)); } } else { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理-获取是否需要推送", JsonConvert.SerializeObject(responseIsTradeManagedResponse)); } } } catch (Exception ex) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信发货信息处理", msg, ex); throw; } await Task.CompletedTask; } } }