升级自定义交易组件常用商品接口,spu接口,品牌接口,订单接口,物流接口。

This commit is contained in:
大灰灰
2022-06-30 22:42:19 +08:00
parent 43a691d1be
commit dc408b8596
27 changed files with 1070 additions and 667 deletions

View File

@@ -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;
}
}
}

View File

@@ -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
}
}

View File

@@ -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>