|
@@ -21,6 +21,7 @@ using System.Collections.Specialized;
|
|
|
using System.Configuration;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
+using System.Text;
|
|
|
using System.Web;
|
|
|
|
|
|
namespace Central.Control.WebApi.Service
|
|
@@ -37,10 +38,15 @@ namespace Central.Control.WebApi.Service
|
|
|
/// 支付宝回写地址
|
|
|
/// </summary>
|
|
|
public readonly static string aliNotifyUrl = ConfigurationManager.AppSettings["aliNotifyUrl"].ToString();
|
|
|
+ /// <summary>
|
|
|
+ /// 支付中间页地址
|
|
|
+ /// </summary>
|
|
|
+ public readonly static string payRedirectUrl = ConfigurationManager.AppSettings["payredirecturl"].ToString();
|
|
|
|
|
|
private readonly IDbContext _dbContent;
|
|
|
private readonly IUserService _userService;
|
|
|
private readonly ILog4NetHelper _log4NetHelper;
|
|
|
+ private readonly IYWLogService _ywLogService;
|
|
|
|
|
|
/// <summary>
|
|
|
///
|
|
@@ -48,14 +54,17 @@ namespace Central.Control.WebApi.Service
|
|
|
/// <param name="dbContent"></param>
|
|
|
/// <param name="userService"></param>
|
|
|
/// <param name="log4NetHelper"></param>
|
|
|
+ /// <param name="ywLogService"></param>
|
|
|
public OrderService(
|
|
|
IDbContext dbContent,
|
|
|
IUserService userService,
|
|
|
- ILog4NetHelper log4NetHelper)
|
|
|
+ ILog4NetHelper log4NetHelper,
|
|
|
+ IYWLogService ywLogService)
|
|
|
{
|
|
|
_dbContent = dbContent;
|
|
|
_userService = userService;
|
|
|
_log4NetHelper = log4NetHelper;
|
|
|
+ _ywLogService = ywLogService;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -126,7 +135,7 @@ namespace Central.Control.WebApi.Service
|
|
|
var orderId = IdGenerator.NewId();
|
|
|
List<YW_OrderDetails> orderDetailAdds = new List<YW_OrderDetails>();
|
|
|
List<YW_OrderProcess> orderProcessAdds = new List<YW_OrderProcess>();
|
|
|
-
|
|
|
+ StringBuilder orderName = new StringBuilder();
|
|
|
foreach (var o in req.OrderInfo)
|
|
|
{
|
|
|
var currentProduct = products.FirstOrDefault(p => p.Id == o.ProductId);
|
|
@@ -156,6 +165,10 @@ namespace Central.Control.WebApi.Service
|
|
|
Count = o.Count,
|
|
|
CreateBY = session.UserId
|
|
|
});
|
|
|
+ if (orderName.Length < 40)
|
|
|
+ {
|
|
|
+ orderName.Append($"{currentProduct.Name},");
|
|
|
+ }
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
@@ -163,6 +176,7 @@ namespace Central.Control.WebApi.Service
|
|
|
YW_Order order = new YW_Order()
|
|
|
{
|
|
|
Id = orderId,
|
|
|
+ Name = orderName.ToString().TrimEnd(','),
|
|
|
DeviceId = session.UserId,
|
|
|
Price = orderDetailAdds.Sum(p => p.Price * p.Count),
|
|
|
PayStatus = PayStatusEnum.UnPay,
|
|
@@ -177,7 +191,7 @@ namespace Central.Control.WebApi.Service
|
|
|
DeviceId = session.UserId,
|
|
|
CurrentOrderStatus = OrderStatusEnum.UnPay,
|
|
|
Message = "下单成功",
|
|
|
- CreateBY = session.Id
|
|
|
+ CreateBY = session.UserId
|
|
|
};
|
|
|
#endregion
|
|
|
|
|
@@ -190,16 +204,14 @@ namespace Central.Control.WebApi.Service
|
|
|
_dbContent.SaveChanges();
|
|
|
#endregion
|
|
|
|
|
|
- #region 5、支付宝支付--目前直接入支付宝支付测试,后期需要替换成中间页面
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- #endregion
|
|
|
+ // 写入订单日志
|
|
|
+ _ywLogService.WriteOrderLog(order.Id, "下单", "下单成功", session.UserId);
|
|
|
|
|
|
return new ApiResult<OrderResponseDto>(new OrderResponseDto()
|
|
|
{
|
|
|
OrderId = order.Id,
|
|
|
- Price = order.Price
|
|
|
+ Price = order.Price,
|
|
|
+ QrCode = string.Format(payRedirectUrl, order.Id)
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -263,7 +275,7 @@ namespace Central.Control.WebApi.Service
|
|
|
{
|
|
|
return new ApiResult(ApiStatusCode.InvalidParameter, "未支付或已取消订单不能回写流程");
|
|
|
}
|
|
|
- var seesion = _userService.GetLoginSession();
|
|
|
+ var session = _userService.GetLoginSession();
|
|
|
// 修改订单状态
|
|
|
order.OrderStatus = req.OrderStatus;
|
|
|
// 记录订单流程
|
|
@@ -271,19 +283,99 @@ namespace Central.Control.WebApi.Service
|
|
|
{
|
|
|
Id = IdGenerator.NewId(),
|
|
|
OrderId = req.OrderId,
|
|
|
- DeviceId = seesion.UserId,
|
|
|
+ DeviceId = session.UserId,
|
|
|
CurrentOrderStatus = req.OrderStatus,
|
|
|
Message = req.Message,
|
|
|
- CreateBY = seesion.UserId
|
|
|
+ CreateBY = session.UserId
|
|
|
};
|
|
|
_dbContent.Set<YW_OrderProcess>().Add(orderProcess);
|
|
|
_dbContent.SaveChanges();
|
|
|
|
|
|
+ // 写入订单日志
|
|
|
+ _ywLogService.WriteOrderLog(order.Id, "流程回写", $"回写流程状态{req.OrderStatus.ToString()}", session.UserId);
|
|
|
+
|
|
|
return new ApiResult();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 支付宝回写
|
|
|
+ /// 获取支付宝支付链接
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="id"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public string AliPayProcess(string id)
|
|
|
+ {
|
|
|
+ // 1、先查询订单是否存在
|
|
|
+ var order = _dbContent.Set<YW_Order>().FirstOrDefault(p => p.IsDelete == 0 && p.Id == id);
|
|
|
+ if (order == null)
|
|
|
+ {
|
|
|
+ return "http://api.rgtech.ltd/html/ordernotexist.html";
|
|
|
+ }
|
|
|
+ string result = "http://api.rgtech.ltd/html/error.html";
|
|
|
+ // 查询订单详情
|
|
|
+ var orderDetails = _dbContent.Set<YW_OrderDetails>().Where(p => p.IsDelete == 0 && p.OrderId == order.Id).ToList();
|
|
|
+
|
|
|
+ #region 拼写支付宝支付参数
|
|
|
+
|
|
|
+ AlipayTradePrecreateContentBuilder builder = new AlipayTradePrecreateContentBuilder();
|
|
|
+ //收款账号
|
|
|
+ builder.seller_id = AliPayConfig.pid;
|
|
|
+ //订单编号
|
|
|
+ builder.out_trade_no = order.Id;
|
|
|
+ //订单总金额
|
|
|
+ builder.total_amount = order.Price.ToString();
|
|
|
+ //参与优惠计算的金额
|
|
|
+ //builder.discountable_amount = "";
|
|
|
+ //不参与优惠计算的金额
|
|
|
+ //builder.undiscountable_amount = "";
|
|
|
+ //订单名称
|
|
|
+ builder.subject = order.Name;
|
|
|
+ //自定义超时时间
|
|
|
+ builder.timeout_express = "10m";
|
|
|
+ //订单描述
|
|
|
+ builder.body = "";
|
|
|
+ //门店编号,很重要的参数,可以用作之后的营销
|
|
|
+ builder.store_id = order.DeviceId;
|
|
|
+ //操作员编号,很重要的参数,可以用作之后的营销
|
|
|
+ //builder.operator_id = "test";
|
|
|
+
|
|
|
+ //传入商品信息详情
|
|
|
+ List<GoodsInfo> gList = orderDetails?.Select(od => new GoodsInfo()
|
|
|
+ {
|
|
|
+ goods_id = od.Id,
|
|
|
+ goods_name = od.Name,
|
|
|
+ price = od.Price.ToString(),
|
|
|
+ quantity = od.Count.ToString()
|
|
|
+ }).ToList() ?? new List<GoodsInfo>();
|
|
|
+ builder.goods_detail = gList;
|
|
|
+
|
|
|
+ //系统商接入可以填此参数用作返佣
|
|
|
+ //ExtendParams exParam = new ExtendParams();
|
|
|
+ //exParam.sysServiceProviderId = "20880000000000";
|
|
|
+ //builder.extendParams = exParam;
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ //如果需要接收扫码支付异步通知,那么请把下面两行注释代替本行。
|
|
|
+ //推荐使用轮询撤销机制,不推荐使用异步通知,避免单边账问题发生。
|
|
|
+ AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, aliNotifyUrl);//商户接收异步通知的地址,采用异步回写通知
|
|
|
+
|
|
|
+ switch (precreateResult.Status)
|
|
|
+ {
|
|
|
+ case ResultEnum.SUCCESS:
|
|
|
+ result = precreateResult.response.QrCode;
|
|
|
+ break;
|
|
|
+ case ResultEnum.FAILED:
|
|
|
+ case ResultEnum.UNKNOWN:
|
|
|
+ default:
|
|
|
+ // 请求失败,记录日志
|
|
|
+ _log4NetHelper.Error($"[AliPayProcess]-tradePrecreate失败:{JsonConvert.SerializeObject(precreateResult)}");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 支付宝支付回写(已测试好,勿动)
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
public string AliPayNotify()
|
|
@@ -303,6 +395,14 @@ namespace Central.Control.WebApi.Service
|
|
|
if (verifyResult && CheckParams()) //验签成功 && 关键业务参数校验成功
|
|
|
{
|
|
|
_log4NetHelper.Info("[AliPayNotify]-验签成功");
|
|
|
+
|
|
|
+ string paySerialId = HttpContext.Current.Request.Form["trade_no"] ?? string.Empty;
|
|
|
+ string outTradeNo = HttpContext.Current.Request.Form["out_trade_no"] ?? string.Empty;
|
|
|
+ string payResponse = JsonConvert.SerializeObject(sPara);
|
|
|
+
|
|
|
+ // 写入支付日志-里面有trycatch
|
|
|
+ _ywLogService.WritePayCallLog(paySerialId, outTradeNo, PayWayEnum.AliPay, payResponse);
|
|
|
+
|
|
|
PayStatusEnum payStatus = PayStatusEnum.Fail;
|
|
|
if (HttpContext.Current.Request.Form["trade_status"] == "TRADE_SUCCESS")
|
|
|
{
|
|
@@ -311,8 +411,8 @@ namespace Central.Control.WebApi.Service
|
|
|
|
|
|
PayWriteBackRequestDto payWriteBack = new PayWriteBackRequestDto()
|
|
|
{
|
|
|
- PaySerialId = HttpContext.Current.Request.Form["trade_no"] ?? string.Empty,
|
|
|
- OrderId = HttpContext.Current.Request.Form["out_trade_no"] ?? string.Empty,
|
|
|
+ PaySerialId = paySerialId,
|
|
|
+ OrderId = outTradeNo,
|
|
|
PayStatus = payStatus,
|
|
|
PayWay = PayWayEnum.AliPay,
|
|
|
BuyerId = HttpContext.Current.Request.Form["buyer_id"] ?? string.Empty,
|
|
@@ -322,7 +422,7 @@ namespace Central.Control.WebApi.Service
|
|
|
TotalAmount = ConvertHelper.ToDecimal(HttpContext.Current.Request.Form["total_amount"]),
|
|
|
PayAmount = ConvertHelper.ToDecimal(HttpContext.Current.Request.Form["buyer_pay_amount"]),
|
|
|
PayTime = ConvertHelper.ToDateTime(HttpContext.Current.Request.Form["gmt_payment"]),
|
|
|
- PayResponse = JsonConvert.SerializeObject(sPara)
|
|
|
+ PayResponse = payResponse
|
|
|
};
|
|
|
// 回写到实际表中
|
|
|
var result = PayWriteBack(payWriteBack);
|
|
@@ -360,13 +460,17 @@ namespace Central.Control.WebApi.Service
|
|
|
}
|
|
|
if (order.Price != req.TotalAmount)
|
|
|
{
|
|
|
- // 需要写入订单日志------------------------
|
|
|
- return new ApiResult(ApiStatusCode.InvalidParameter, $"回写总金额与订单金额不匹配,订单号{order.Id};订单价格{order.Price};支付流水号{req.PaySerialId};支付订单总金额{req.TotalAmount}");
|
|
|
+ // 写入订单日志
|
|
|
+ string msg = $"回写总金额与订单金额不匹配,订单号{order.Id};订单价格{order.Price};支付流水号{req.PaySerialId};支付订单总金额{req.TotalAmount}";
|
|
|
+ _ywLogService.WriteOrderLog(order.Id, "支付回写", msg, req.PayWay.ToString());
|
|
|
+ return new ApiResult(ApiStatusCode.InvalidParameter, msg);
|
|
|
}
|
|
|
if (order.Price != req.PayAmount)
|
|
|
{
|
|
|
- // 需要写入订单日志------------------------
|
|
|
- return new ApiResult(ApiStatusCode.InvalidParameter, $"回写支付金额与订单金额不匹配,订单号{order.Id};订单价格{order.Price};支付流水号{req.PaySerialId};支付订单已付金额{req.PayAmount}");
|
|
|
+ // 写入订单日志
|
|
|
+ string msg = $"回写支付金额与订单金额不匹配,订单号{order.Id};订单价格{order.Price};支付流水号{req.PaySerialId};支付订单已付金额{req.PayAmount}";
|
|
|
+ _ywLogService.WriteOrderLog(order.Id, "支付回写", msg, req.PayWay.ToString());
|
|
|
+ return new ApiResult(ApiStatusCode.InvalidParameter, msg);
|
|
|
}
|
|
|
var status = GetStatusByPayWriteBack(req.PayStatus);
|
|
|
// 修改订单状态
|
|
@@ -393,6 +497,9 @@ namespace Central.Control.WebApi.Service
|
|
|
_dbContent.Set<YW_PayCall>().Add(payCall);
|
|
|
_dbContent.SaveChanges();
|
|
|
|
|
|
+ // 记录订单日志
|
|
|
+ _ywLogService.WriteOrderLog(order.Id, "支付回写", "回写成功", req.PayWay.ToString());
|
|
|
+
|
|
|
return new ApiResult();
|
|
|
}
|
|
|
|
|
@@ -493,8 +600,6 @@ namespace Central.Control.WebApi.Service
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
/// <summary>
|
|
|
///
|
|
|
/// </summary>
|
|
@@ -506,7 +611,7 @@ namespace Central.Control.WebApi.Service
|
|
|
OrderStatusEnum orderStatus = OrderStatusEnum.UnPay;
|
|
|
switch (payStatus)
|
|
|
{
|
|
|
- case PayStatusEnum.UnPay:// 成功
|
|
|
+ case PayStatusEnum.Paid:// 成功
|
|
|
orderStatus = OrderStatusEnum.Paid;
|
|
|
break;
|
|
|
default:// 失败
|
|
@@ -516,7 +621,6 @@ namespace Central.Control.WebApi.Service
|
|
|
return new Tuple<PayStatusEnum, OrderStatusEnum>(payStatus, orderStatus);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
|
|
|
/// </summary>
|