mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 14:53:26 +08:00
279 lines
16 KiB
C#
279 lines
16 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// 微信支付成功后推送到接口进行发货处理
|
||
/// </summary>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 微信支付成功后推送到接口进行发货处理
|
||
/// </summary>
|
||
/// <param name="msg"></param>
|
||
/// <returns></returns>
|
||
[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<WxaSecOrderUploadShippingInfoRequest.Types.Shipping>();
|
||
|
||
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.物流配送,
|
||
_ => 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;
|
||
}
|
||
|
||
}
|
||
}
|