mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 20:33:26 +08:00
升级自定义交易组件常用商品接口,spu接口,品牌接口,订单接口,物流接口。
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2022/6/29 16:22:45
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信交易组件下单前置检查 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsCheckBeforeAddOrderServices : BaseServices<CoreCmsCheckBeforeAddOrder>, ICoreCmsCheckBeforeAddOrderServices
|
||||
{
|
||||
private readonly ICoreCmsCheckBeforeAddOrderRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsCheckBeforeAddOrderServices(IUnitOfWork unitOfWork, ICoreCmsCheckBeforeAddOrderRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Caching.AccressToken;
|
||||
using CoreCms.Net.Caching.AutoMate.RedisCache;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
@@ -29,10 +30,15 @@ using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using CoreCms.Net.WeChat.Service.HttpClients;
|
||||
using CoreCms.Net.WeChat.Service.TransactionComponent.Enum;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SKIT.FlurlHttpClient.Wechat.Api;
|
||||
using SKIT.FlurlHttpClient.Wechat.Api.Models;
|
||||
using SqlSugar;
|
||||
using Yitter.IdGenerator;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
@@ -75,6 +81,9 @@ namespace CoreCms.Net.Services
|
||||
private readonly IRedisOperationRepository _redisOperationRepository;
|
||||
private readonly ICoreCmsUserWeChatInfoServices _userWeChatInfoServices;
|
||||
private readonly IWeChatTransactionComponentOrderServices _tcOrderServices;
|
||||
private readonly ICoreCmsCheckBeforeAddOrderServices _checkBeforeAddOrderServices;
|
||||
private readonly IWeChatTransactionComponentOrderServices _chatTransactionComponentOrderServices;
|
||||
private readonly WeChat.Service.HttpClients.IWeChatApiHttpClientFactory _weChatApiHttpClientFactory;
|
||||
|
||||
|
||||
|
||||
@@ -103,7 +112,7 @@ namespace CoreCms.Net.Services
|
||||
, ICoreCmsPaymentsServices paymentsServices
|
||||
, ICoreCmsBillRefundServices billRefundServices
|
||||
, ICoreCmsBillLadingServices billLadingServices
|
||||
, ICoreCmsBillReshipServices billReshipServices, ICoreCmsMessageCenterServices messageCenterServices, ICoreCmsGoodsCommentServices goodsCommentServices, ISysTaskLogServices taskLogServices, ICoreCmsPromotionRecordServices promotionRecordServices, IRedisOperationRepository redisOperationRepository, ICoreCmsUserWeChatInfoServices userWeChatInfoServices, IWeChatTransactionComponentOrderServices tcOrderServices)
|
||||
, ICoreCmsBillReshipServices billReshipServices, ICoreCmsMessageCenterServices messageCenterServices, ICoreCmsGoodsCommentServices goodsCommentServices, ISysTaskLogServices taskLogServices, ICoreCmsPromotionRecordServices promotionRecordServices, IRedisOperationRepository redisOperationRepository, ICoreCmsUserWeChatInfoServices userWeChatInfoServices, IWeChatTransactionComponentOrderServices tcOrderServices, ICoreCmsCheckBeforeAddOrderServices checkBeforeAddOrderServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory, IWeChatTransactionComponentOrderServices chatTransactionComponentOrderServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
@@ -139,6 +148,9 @@ namespace CoreCms.Net.Services
|
||||
_redisOperationRepository = redisOperationRepository;
|
||||
_userWeChatInfoServices = userWeChatInfoServices;
|
||||
_tcOrderServices = tcOrderServices;
|
||||
_checkBeforeAddOrderServices = checkBeforeAddOrderServices;
|
||||
_weChatApiHttpClientFactory = weChatApiHttpClientFactory;
|
||||
_chatTransactionComponentOrderServices = chatTransactionComponentOrderServices;
|
||||
}
|
||||
|
||||
|
||||
@@ -200,8 +212,11 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="taxCode">发票税务编码</param>
|
||||
/// <param name="objectId">关联非普通订单营销功能的序列</param>
|
||||
/// <param name="teamId">拼团订单分组序列</param>
|
||||
/// <param name="requireOrder">微信自定义组件(是否需要推单,1:需要,0:不需要)</param>
|
||||
/// <param name="requiredFundType">微信自定义组件(requireOrder = 1时生效,0,非二级商户号订单,1,二级商户号订单,2,两种方式皆可(后续只会存在1))</param>
|
||||
/// <param name="traceId">微信自定义组件(跟踪ID,有效期十分钟,会影响主播归因、分享员归因等,需创建订单前调用,调用生成订单 api 时需传入该参数)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ToAdd(int userId, int orderType, string cartIds, int receiptType, int ushipId, int storeId, string ladingName, string ladingMobile, string memo, int point, string couponCode, int source, int scene, int taxType, string taxName, string taxCode, int objectId, int teamId)
|
||||
public async Task<WebApiCallBack> ToAdd(int userId, int orderType, string cartIds, int receiptType, int ushipId, int storeId, string ladingName, string ladingMobile, string memo, int point, string couponCode, int source, int scene, int taxType, string taxName, string taxCode, int objectId, int teamId, int requireOrder, int requiredFundType, string traceId)
|
||||
{
|
||||
var jm = new WebApiCallBack() { methodDescription = "创建订单" };
|
||||
|
||||
@@ -253,6 +268,7 @@ namespace CoreCms.Net.Services
|
||||
order.createTime = DateTime.Now;
|
||||
order.scene = scene;
|
||||
|
||||
|
||||
//不同的订单类型会有不同的操作
|
||||
switch (orderType)
|
||||
{
|
||||
@@ -285,18 +301,22 @@ namespace CoreCms.Net.Services
|
||||
//砍价模式
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
jm.status = false;
|
||||
jm.data = 10000;
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
//开始事务处理
|
||||
await _dal.InsertAsync(order);
|
||||
|
||||
//插入获取的下单前的微信视频号直接数据
|
||||
var check = new CoreCmsCheckBeforeAddOrder();
|
||||
check.orderId = order.orderId;
|
||||
check.requireOrder = requireOrder;
|
||||
check.requiredFundType = requiredFundType;
|
||||
check.traceId = traceId;
|
||||
check.createTime = DateTime.Now;
|
||||
|
||||
await _checkBeforeAddOrderServices.InsertAsync(check);
|
||||
|
||||
//上面保存好订单表,下面保存订单的其他信息
|
||||
if (orderItems != null)
|
||||
{
|
||||
@@ -393,6 +413,102 @@ namespace CoreCms.Net.Services
|
||||
order.taxTitle = taxName;
|
||||
order.taxCode = taxCode;
|
||||
|
||||
|
||||
if (requireOrder == (int)GlobalEnumVars.RequireOrderType.需要)
|
||||
{
|
||||
|
||||
//获取小程序认证
|
||||
var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
|
||||
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
|
||||
|
||||
var orderInfo = new ShopOrderAddRequest
|
||||
{
|
||||
AccessToken = accessToken,
|
||||
Scene = scene,
|
||||
//基础
|
||||
CreateTime = new DateTimeOffset(DateTime.Now),
|
||||
//FundType = (int)GlobalEnumVars.RequiredFundType.二级商户号订单,
|
||||
FundType = (int)GlobalEnumVars.RequiredFundType.二级商户号订单, //新版自定义交易组件,必须要走二级商户订单模式
|
||||
OutOrderId = order.orderId,
|
||||
PagePath = UniAppConst.OrderPath(order.orderId)
|
||||
};
|
||||
|
||||
var weChatUserInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.userId == order.userId, true);
|
||||
if (weChatUserInfo != null)
|
||||
{
|
||||
orderInfo.OpenId = weChatUserInfo.openid;
|
||||
}
|
||||
orderInfo.OutUserId = order.userId.ToString();
|
||||
|
||||
//收货人信息
|
||||
orderInfo.Address = new ShopOrderAddRequest.Types.Address()
|
||||
{
|
||||
ReceiverName = order.shipName,
|
||||
Detail = order.shipAddress,
|
||||
TeleNumber = order.shipMobile,
|
||||
};
|
||||
//发货方式
|
||||
orderInfo.Delivery = new ShopOrderAddRequest.Types.Delivery()
|
||||
{
|
||||
DeliveryType = (int)DeliveryTypeEnum.正常快递
|
||||
};
|
||||
|
||||
orderInfo.OrderDetail = new ShopOrderAddRequest.Types.OrderDetail();
|
||||
|
||||
//支付信息
|
||||
orderInfo.OrderDetail.Payment = new ShopOrderAddRequest.Types.OrderDetail.Types.Payment()
|
||||
{
|
||||
PayType = (int)GlobalEnumVars.PayMethodType.微信支付
|
||||
};
|
||||
//价格体系
|
||||
orderInfo.OrderDetail.Amount = new ShopOrderAddRequest.Types.OrderDetail.Types.Amount()
|
||||
{
|
||||
OrderFee = Convert.ToInt32(order.orderAmount * 100),
|
||||
FreightFee = Convert.ToInt32(order.costFreight * 100),
|
||||
DiscountedFee = Convert.ToInt32((order.pointMoney + order.orderDiscountAmount + order.goodsDiscountAmount + order.couponDiscountAmount) * 100),
|
||||
AdditionalPrice = 0,
|
||||
AdditionalRemark = "无",
|
||||
};
|
||||
|
||||
//商品信息
|
||||
orderInfo.OrderDetail.ProductList = new List<ShopOrderAddRequest.Types.OrderDetail.Types.Product>();
|
||||
|
||||
|
||||
foreach (var item in orderItems)
|
||||
{
|
||||
orderInfo.OrderDetail.ProductList.Add(new ShopOrderAddRequest.Types.OrderDetail.Types.Product()
|
||||
{
|
||||
OutProductId = item.goodsId.ToString(),
|
||||
OutSKUId = item.productId.ToString(),
|
||||
Count = item.nums,
|
||||
SalePrice = Convert.ToInt32(item.amount * 100),
|
||||
SKURealPrice = Convert.ToInt32(item.amount * 100),
|
||||
PagePath = UniAppConst.GoodDetail(item.goodsId.ToString()),
|
||||
Title = item.name,
|
||||
HeadImageUrl = item.imageUrl
|
||||
});
|
||||
}
|
||||
|
||||
var shopOrderAddResponse = await client.ExecuteShopOrderAddAsync(orderInfo);
|
||||
if (shopOrderAddResponse.IsSuccessful())
|
||||
{
|
||||
var tcOrder = new WeChatTransactionComponentOrder
|
||||
{
|
||||
orderId = shopOrderAddResponse.Data.OrderId,
|
||||
outOrderId = shopOrderAddResponse.Data.OutOrderId,
|
||||
createTime = DateTime.Now,
|
||||
openid = orderInfo.OpenId
|
||||
};
|
||||
await _chatTransactionComponentOrderServices.InsertAsync(tcOrder);
|
||||
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.Order, "自定义交易组件", "推送自定义交易组件创建订单成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.Order, "自定义交易组件 ", "推送自定义交易组件创建订单失败");
|
||||
}
|
||||
jm.otherData = shopOrderAddResponse;
|
||||
}
|
||||
|
||||
//发送消息
|
||||
//推送消息
|
||||
await _messageCenterServices.SendMessage(order.userId, GlobalEnumVars.PlatformMessageTypes.CreateOrder.ToString(), JObject.FromObject(order));
|
||||
@@ -1394,12 +1510,13 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
}
|
||||
|
||||
if (order.orderType == (int)GlobalEnumVars.OrderType.Common && order.scene > 0)
|
||||
{
|
||||
order.paymentItem = new List<CoreCmsBillPayments> { billPaymentInfo };
|
||||
//自定义交易组件同步
|
||||
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.TransactionComponentPayOrderSync, JsonConvert.SerializeObject(order));
|
||||
}
|
||||
//新版自定义交易组件已经不需要同步订单支付状态。
|
||||
//if (order.orderType == (int)GlobalEnumVars.OrderType.Common && order.scene > 0)
|
||||
//{
|
||||
// order.paymentItem = new List<CoreCmsBillPayments> { billPaymentInfo };
|
||||
// //自定义交易组件同步
|
||||
// await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.TransactionComponentPayOrderSync, JsonConvert.SerializeObject(order));
|
||||
//}
|
||||
|
||||
//结佣处理
|
||||
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.OrderAgentOrDistribution, JsonConvert.SerializeObject(order));
|
||||
@@ -1495,6 +1612,10 @@ namespace CoreCms.Net.Services
|
||||
{
|
||||
_goodsServices.ChangeStock(item.productId, GlobalEnumVars.OrderChangeStockType.cancel.ToString(), item.nums);
|
||||
}
|
||||
|
||||
var orderInfoIds = orderInfo.Select(p => p.orderId).ToList();
|
||||
await CloseOrder(orderInfoIds);
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "订单取消成功";
|
||||
}
|
||||
@@ -1939,8 +2060,9 @@ namespace CoreCms.Net.Services
|
||||
/// <param name="orderId"></param>
|
||||
/// <param name="score">有序队列积分</param>
|
||||
/// <param name="remark"></param>
|
||||
/// <param name="source">来源/system(系统)/wxpost(微信消息推送)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> CompleteOrder(string orderId, int score = 0, string remark = "后台订单完成操作")
|
||||
public async Task<WebApiCallBack> CompleteOrder(string orderId, int score = 0, string remark = "后台订单完成操作", string source = "system")
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
@@ -2003,9 +2125,11 @@ namespace CoreCms.Net.Services
|
||||
//订单完成结算订单
|
||||
await _redisOperationRepository.SortedSetAddAsync(RedisMessageQueueKey.OrderFinishCommand, orderInfo.orderId, score);
|
||||
|
||||
// 微信自定义交易组件-订单确认收货
|
||||
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.TransactionComponentOrderDeliveryRecieveSync, JsonConvert.SerializeObject(orderInfo));
|
||||
|
||||
if (source== "system")
|
||||
{
|
||||
// 微信自定义交易组件-订单确认收货
|
||||
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.TransactionComponentOrderDeliveryRecieveSync, JsonConvert.SerializeObject(orderInfo));
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "订单完成";
|
||||
@@ -2126,6 +2250,9 @@ namespace CoreCms.Net.Services
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#region 重写根据条件列表数据
|
||||
/// <summary>
|
||||
/// 重写根据条件列表数据
|
||||
@@ -2191,6 +2318,8 @@ namespace CoreCms.Net.Services
|
||||
{
|
||||
var ids = orderInfos.Select(p => p.orderId).ToArray();
|
||||
jm = await CancelOrder(ids);
|
||||
|
||||
await CloseOrder(ids.ToList());
|
||||
}
|
||||
|
||||
|
||||
@@ -2441,5 +2570,45 @@ namespace CoreCms.Net.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 自定义交易组件-关闭订单
|
||||
|
||||
private async Task CloseOrder(ICollection<string> ids)
|
||||
{
|
||||
|
||||
//判断是否是自定义交易订单
|
||||
var coreCmsCheckBeforeAddOrders = await _checkBeforeAddOrderServices.QueryListByClauseAsync(p => ids.Contains(p.orderId) && p.requireOrder == (int)GlobalEnumVars.RequireOrderType.需要);
|
||||
if (coreCmsCheckBeforeAddOrders.Any())
|
||||
{
|
||||
var dataIds = coreCmsCheckBeforeAddOrders.Select(p => p.orderId).ToList();
|
||||
var orderInfos = await _dal.QueryListByClauseAsync(p => dataIds.Contains(p.orderId), p => p.createTime, OrderByType.Asc, true);
|
||||
|
||||
//获取小程序认证
|
||||
var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
|
||||
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
|
||||
|
||||
|
||||
foreach (var item in orderInfos)
|
||||
{
|
||||
var request = new ShopOrderCloseRequest();
|
||||
request.AccessToken = accessToken;
|
||||
request.OutOrderId = item.orderId;
|
||||
|
||||
var user = await _userWeChatInfoServices.QueryByClauseAsync(p => p.userId == item.userId);
|
||||
if (user == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
request.OutOrderId = item.orderId;
|
||||
request.OpenId = user.openid;
|
||||
|
||||
var response = await client.ExecuteShopOrderCloseAsync(request);
|
||||
NLogUtil.WriteAll(response.IsSuccessful() ? NLog.LogLevel.Info : NLog.LogLevel.Error,
|
||||
LogType.Web, "自定义交易组件-关闭订单", JsonConvert.SerializeObject(response));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,8 +19,6 @@ using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.WeChat.Service.HttpClients;
|
||||
using CoreCms.Net.WeChat.Service.TransactionComponent.Enum;
|
||||
using CoreCms.Net.WeChat.Service.TransactionComponent.Models;
|
||||
using Essensoft.Paylink.WeChatPay;
|
||||
using Essensoft.Paylink.WeChatPay.V2;
|
||||
using Essensoft.Paylink.WeChatPay.V2.Request;
|
||||
@@ -75,255 +73,145 @@ namespace CoreCms.Net.Services
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var orderItemServices = container.ServiceProvider.GetService<ICoreCmsOrderItemServices>();
|
||||
var billPaymentsServices = container.ServiceProvider.GetService<ICoreCmsBillPaymentsServices>();
|
||||
var weChatTransactionComponentOrderServices = container.ServiceProvider.GetService<IWeChatTransactionComponentOrderServices>();
|
||||
var checkBeforeAddOrderServices = container.ServiceProvider.GetService<ICoreCmsCheckBeforeAddOrderServices>();
|
||||
var transactionComponentOrderServices = container.ServiceProvider.GetService<IWeChatTransactionComponentOrderServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var weChatPayUrl = AppSettingsConstVars.PayCallBackWeChatPayUrl;
|
||||
if (string.IsNullOrEmpty(weChatPayUrl))
|
||||
var payment = await billPaymentsServices.QueryByClauseAsync(p => p.paymentId == entity.paymentId);
|
||||
var checkBeforeAddOrder = await checkBeforeAddOrderServices.QueryByClauseAsync(p => p.orderId == payment.sourceId);
|
||||
if (checkBeforeAddOrder != null && checkBeforeAddOrder.requireOrder == (int)GlobalEnumVars.RequireOrderType.需要)
|
||||
{
|
||||
jm.msg = "未获取到配置的通知地址";
|
||||
return jm;
|
||||
}
|
||||
var order = await transactionComponentOrderServices.QueryByClauseAsync(p => p.outOrderId == payment.sourceId);
|
||||
|
||||
var tradeType = GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString();
|
||||
if (!string.IsNullOrEmpty(entity.parameters))
|
||||
{
|
||||
var jobj = (JObject)JsonConvert.DeserializeObject(entity.parameters);
|
||||
if (jobj != null && jobj.ContainsKey("trade_type"))
|
||||
tradeType = GetTradeType(jobj["trade_type"].ObjectToString());
|
||||
}
|
||||
//获取小程序认证
|
||||
var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
|
||||
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
|
||||
|
||||
var openId = string.Empty;
|
||||
if (tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString())
|
||||
{
|
||||
var userAccount = await _userServices.QueryByIdAsync(_user.ID);
|
||||
if (userAccount == null)
|
||||
var getPaymentParameters = new ShopOrderGetPaymentParametersRequest();
|
||||
|
||||
getPaymentParameters.AccessToken = accessToken;
|
||||
getPaymentParameters.OpenId = order.openid;
|
||||
getPaymentParameters.OrderId = order.orderId;
|
||||
getPaymentParameters.OutOrderId = order.outOrderId;
|
||||
|
||||
var shopOrderGetPayment = await client.ExecuteShopOrderGetPaymentParametersAsync(getPaymentParameters);
|
||||
if (shopOrderGetPayment.IsSuccessful())
|
||||
{
|
||||
jm.msg = "用户账户获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (userAccount.userWx <= 0)
|
||||
{
|
||||
jm.msg = "账户关联微信用户信息获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var user = await _userWeChatInfoServices.QueryByClauseAsync(p => p.id == userAccount.userWx);
|
||||
if (user == null)
|
||||
{
|
||||
jm.msg = "微信用户信息获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
openId = user.openid;
|
||||
}
|
||||
|
||||
var orderRequest = new WeChatPayUnifiedOrderRequest
|
||||
{
|
||||
Body = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle,
|
||||
OutTradeNo = entity.paymentId,
|
||||
TotalFee = Convert.ToInt32(entity.money * 100),
|
||||
SpBillCreateIp = entity.ip,
|
||||
NotifyUrl = weChatPayUrl,
|
||||
TradeType = tradeType,
|
||||
//OpenId = openId
|
||||
};
|
||||
|
||||
if (tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString())
|
||||
{
|
||||
orderRequest.OpenId = openId;
|
||||
}
|
||||
|
||||
var response = await _client.ExecuteAsync(orderRequest, _optionsAccessor.Value);
|
||||
if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
|
||||
{
|
||||
var req = new WeChatPayJsApiSdkRequest
|
||||
{
|
||||
Package = "prepay_id=" + response.PrepayId
|
||||
};
|
||||
WeChatPayDictionary parameter;
|
||||
if (tradeType == GlobalEnumVars.WeiChatPayTradeType.APP.ToString())
|
||||
{
|
||||
var reqApp = new WeChatPayAppSdkRequest()
|
||||
jm.data = new
|
||||
{
|
||||
PrepayId = response.PrepayId
|
||||
shopOrderGetPayment.PaymentParameters,
|
||||
checkBeforeAddOrder,
|
||||
entity.paymentId
|
||||
};
|
||||
parameter = await _client.ExecuteAsync(reqApp, _optionsAccessor.Value);
|
||||
jm.status = true;
|
||||
await transactionComponentOrderServices.UpdateAsync(p => new WeChatTransactionComponentOrder() { paymentId = entity.paymentId },
|
||||
p => p.outOrderId == payment.sourceId);
|
||||
}
|
||||
else
|
||||
{
|
||||
parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
|
||||
jm.status = false;
|
||||
jm.msg = shopOrderGetPayment.ErrorMessage;
|
||||
}
|
||||
// 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)
|
||||
parameter.Add("paymentId", entity.paymentId);
|
||||
|
||||
if (entity.type == (int)GlobalEnumVars.BillPaymentsType.Common
|
||||
|| entity.type == (int)GlobalEnumVars.BillPaymentsType.PinTuan
|
||||
|| entity.type == (int)GlobalEnumVars.BillPaymentsType.Group
|
||||
|| entity.type == (int)GlobalEnumVars.BillPaymentsType.Skill
|
||||
|| entity.type == (int)GlobalEnumVars.BillPaymentsType.Bargain
|
||||
|| entity.type == (int)GlobalEnumVars.BillPaymentsType.Giveaway
|
||||
|| entity.type == (int)GlobalEnumVars.BillPaymentsType.Solitaire
|
||||
|| entity.type == (int)GlobalEnumVars.BillPaymentsType.TransactionComponent)
|
||||
{
|
||||
var payment = await billPaymentsServices.QueryByClauseAsync(p => p.paymentId == entity.paymentId);
|
||||
if (payment != null)
|
||||
{
|
||||
var is_matched = 0;
|
||||
var sceneResponse = new ShopSceneCheckResponse();
|
||||
#region 校验是否微信自定义交易组件
|
||||
var orderModel = await orderServices.QueryByClauseAsync(p => p.orderId == payment.sourceId);
|
||||
var orderInfo = new OrderInfo();
|
||||
//检查支付是否需要校验
|
||||
if (orderModel.source == 3 && orderModel.scene > 0)
|
||||
{
|
||||
//获取小程序认证
|
||||
var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
|
||||
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
|
||||
|
||||
var sceneRequest = new ShopSceneCheckRequest();
|
||||
sceneRequest.AccessToken = accessToken;
|
||||
sceneRequest.Scene = orderModel.scene;
|
||||
|
||||
sceneResponse = await client.ExecuteShopSceneCheckAsync(sceneRequest);
|
||||
is_matched = sceneResponse.IsMatched ? 1 : 0;
|
||||
//if (sceneResponse.IsSuccessful() && sceneResponse.IsMatched == true)
|
||||
if (sceneResponse.IsSuccessful())
|
||||
{
|
||||
//基础
|
||||
orderInfo.create_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
orderInfo.type = 0;
|
||||
orderInfo.out_order_id = orderModel.orderId;
|
||||
|
||||
var weChatUserInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.userId == orderModel.userId, true);
|
||||
if (weChatUserInfo != null)
|
||||
{
|
||||
orderInfo.openid = weChatUserInfo.openid;
|
||||
}
|
||||
orderInfo.path = UniAppConst.OrderPath(orderModel.orderId);
|
||||
orderInfo.out_user_id = orderModel.userId.ToString();
|
||||
|
||||
//收货人信息
|
||||
orderInfo.address_info = new AddressInfo();
|
||||
orderInfo.address_info.receiver_name = orderModel.shipName;
|
||||
orderInfo.address_info.detailed_address = orderModel.shipAddress;
|
||||
orderInfo.address_info.tel_number = orderModel.shipMobile;
|
||||
|
||||
|
||||
//发货方式
|
||||
orderInfo.delivery_detail = new DeliveryDetail();
|
||||
|
||||
if (orderModel.receiptType == (int)GlobalEnumVars.OrderReceiptType.Logistics)
|
||||
{
|
||||
orderInfo.delivery_detail.delivery_type = (int)DeliveryTypeEnum.正常快递;
|
||||
}
|
||||
else if (orderModel.receiptType == (int)GlobalEnumVars.OrderReceiptType.IntraCityService)
|
||||
{
|
||||
orderInfo.delivery_detail.delivery_type = (int)DeliveryTypeEnum.线下配送;
|
||||
}
|
||||
else if (orderModel.receiptType == (int)GlobalEnumVars.OrderReceiptType.SelfDelivery)
|
||||
{
|
||||
orderInfo.delivery_detail.delivery_type = (int)DeliveryTypeEnum.用户自提;
|
||||
}
|
||||
|
||||
orderInfo.order_detail = new OrderDetail();
|
||||
//订单详情
|
||||
|
||||
//支付信息
|
||||
orderInfo.order_detail.pay_info = new PayInfo()
|
||||
{
|
||||
pay_method = "微信支付",
|
||||
prepay_id = entity.paymentId,
|
||||
prepay_time = entity.createTime.ToString("yyyy-MM-dd HH:mm:ss")
|
||||
|
||||
};
|
||||
|
||||
//价格体系
|
||||
orderInfo.order_detail.price_info = new PriceInfo()
|
||||
{
|
||||
order_price = Convert.ToInt32(orderModel.orderAmount * 100),
|
||||
freight = Convert.ToInt32(orderModel.costFreight * 100),
|
||||
discounted_price = Convert.ToInt32((orderModel.pointMoney + orderModel.orderDiscountAmount + orderModel.goodsDiscountAmount + orderModel.couponDiscountAmount) * 100),
|
||||
additional_price = 0,
|
||||
additional_remarks = "无",
|
||||
};
|
||||
|
||||
//商品信息
|
||||
orderInfo.order_detail.product_infos = new List<ProductInfoItem>();
|
||||
|
||||
var orderItems = await orderItemServices.QueryListByClauseAsync(p => p.orderId == orderModel.orderId);
|
||||
|
||||
foreach (var item in orderItems)
|
||||
{
|
||||
orderInfo.order_detail.product_infos.Add(new ProductInfoItem()
|
||||
{
|
||||
out_product_id = item.goodsId.ToString(),
|
||||
out_sku_id = item.productId.ToString(),
|
||||
head_img = item.imageUrl,
|
||||
product_cnt = item.nums,
|
||||
sale_price = Convert.ToInt32(item.amount * 100),
|
||||
path = UniAppConst.GoodDetail(item.goodsId.ToString()),
|
||||
title = item.name
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
var tcOrder = await weChatTransactionComponentOrderServices.QueryByClauseAsync(p => p.outOrderId == orderModel.orderId);
|
||||
if (tcOrder == null)
|
||||
{
|
||||
tcOrder = new WeChatTransactionComponentOrder
|
||||
{
|
||||
outOrderId = orderModel.orderId,
|
||||
createTime = DateTime.Now,
|
||||
openid = openId
|
||||
};
|
||||
await weChatTransactionComponentOrderServices.InsertAsync(tcOrder);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
jm.otherData = new
|
||||
{
|
||||
response,
|
||||
orderInfo,
|
||||
checkSceneResult = new
|
||||
{
|
||||
is_matched,
|
||||
sceneResponse
|
||||
}
|
||||
};
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.otherData = response;
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
//jm.msg = "创建支付环境成功";
|
||||
jm.data = parameter;
|
||||
return jm;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "微信建立支付请求失败";
|
||||
jm.otherData = response;
|
||||
var weChatPayUrl = AppSettingsConstVars.PayCallBackWeChatPayUrl;
|
||||
if (string.IsNullOrEmpty(weChatPayUrl))
|
||||
{
|
||||
jm.msg = "未获取到配置的通知地址";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var tradeType = GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString();
|
||||
if (!string.IsNullOrEmpty(entity.parameters))
|
||||
{
|
||||
var jobj = (JObject)JsonConvert.DeserializeObject(entity.parameters);
|
||||
if (jobj != null && jobj.ContainsKey("trade_type"))
|
||||
tradeType = GetTradeType(jobj["trade_type"].ObjectToString());
|
||||
}
|
||||
|
||||
var openId = string.Empty;
|
||||
if (tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString())
|
||||
{
|
||||
var userAccount = await _userServices.QueryByIdAsync(_user.ID);
|
||||
if (userAccount == null)
|
||||
{
|
||||
jm.msg = "用户账户获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (userAccount.userWx <= 0)
|
||||
{
|
||||
jm.msg = "账户关联微信用户信息获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var user = await _userWeChatInfoServices.QueryByClauseAsync(p => p.id == userAccount.userWx);
|
||||
if (user == null)
|
||||
{
|
||||
jm.msg = "微信用户信息获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
openId = user.openid;
|
||||
}
|
||||
|
||||
var orderRequest = new WeChatPayUnifiedOrderRequest
|
||||
{
|
||||
Body = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle,
|
||||
OutTradeNo = entity.paymentId,
|
||||
TotalFee = Convert.ToInt32(entity.money * 100),
|
||||
SpBillCreateIp = entity.ip,
|
||||
NotifyUrl = weChatPayUrl,
|
||||
TradeType = tradeType,
|
||||
//OpenId = openId
|
||||
};
|
||||
|
||||
if (tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString())
|
||||
{
|
||||
orderRequest.OpenId = openId;
|
||||
}
|
||||
|
||||
var response = await _client.ExecuteAsync(orderRequest, _optionsAccessor.Value);
|
||||
if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
|
||||
{
|
||||
var req = new WeChatPayJsApiSdkRequest
|
||||
{
|
||||
Package = "prepay_id=" + response.PrepayId
|
||||
};
|
||||
WeChatPayDictionary parameter;
|
||||
if (tradeType == GlobalEnumVars.WeiChatPayTradeType.APP.ToString())
|
||||
{
|
||||
var reqApp = new WeChatPayAppSdkRequest()
|
||||
{
|
||||
PrepayId = response.PrepayId
|
||||
};
|
||||
parameter = await _client.ExecuteAsync(reqApp, _optionsAccessor.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
|
||||
}
|
||||
// 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)
|
||||
parameter.Add("paymentId", entity.paymentId);
|
||||
|
||||
jm.status = true;
|
||||
//jm.msg = "创建支付环境成功";
|
||||
jm.data = parameter;
|
||||
jm.otherData = response;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "微信建立支付请求失败";
|
||||
jm.otherData = response;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user