using Ant.Core.Utils;
using Ant.Core.WebApi.Enum;
using Ant.Core.WebApi.Model;
using Aop.Api.Util;
using Central.Control.WebApi.Config;
using Central.Control.WebApi.DbEntity;
using Central.Control.WebApi.EFDbContext;
using Central.Control.WebApi.Enum;
using Central.Control.WebApi.Log4net;
using Central.Control.WebApi.Models.Request;
using Central.Control.WebApi.Models.Response;
using Central.Control.WebApi.Service.Interface;
using Com.Alipay;
using Com.Alipay.Business;
using Com.Alipay.Domain;
using Com.Alipay.Model;
using F2FPayDll.Domain;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
namespace Central.Control.WebApi.Service
{
///
///
///
public class OrderService: IOrderService
{
IAlipayTradeService serviceClient = F2FBiz.CreateClientInstance(AliPayConfig.serverUrl, AliPayConfig.appId, AliPayConfig.merchant_private_key, AliPayConfig.version,
AliPayConfig.sign_type, AliPayConfig.alipay_public_key, AliPayConfig.charset);
///
/// 支付宝回写地址
///
public readonly static string aliNotifyUrl = ConfigurationManager.AppSettings["aliNotifyUrl"].ToString();
///
/// 支付中间页地址
///
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;
///
///
///
///
///
///
///
public OrderService(
IDbContext dbContent,
IUserService userService,
ILog4NetHelper log4NetHelper,
IYWLogService ywLogService)
{
_dbContent = dbContent;
_userService = userService;
_log4NetHelper = log4NetHelper;
_ywLogService = ywLogService;
}
///
/// 下单
///
///
///
public ApiResult Order(OrderRequestDto req)
{
#region 1、验证参数
if (req == null
|| string.IsNullOrWhiteSpace(req.ProductId)
|| req.Count <= 0)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "请求参数不正确");
}
#endregion
#region 2、验证相应数据和库存
var productInfo = (from p in _dbContent.Set().Where(p => p.IsDelete == 0 && p.Sale == Enum.SaleEnum.On)
join dp in _dbContent.Set().Where(p => p.IsDelete == 0) on p.Id equals dp.ProductId
where p.Id == req.ProductId
select new {
Product = p,
DeviceProduct = dp
}).FirstOrDefault();
if (productInfo == null)
{
return new ApiResult(ApiStatusCode.RecordNotFound, "未找到下单的商品");
}
#endregion
#region 3、包装盒库存验证
var session = _userService.GetLoginSession();
// 修改
var devicePacking = _dbContent.Set().FirstOrDefault(p => p.IsDelete == 0 && p.DeviceId == session.UserId);
if (devicePacking == null)
{
return new ApiResult(ApiStatusCode.Forbidden, "当前机器未放置或者未设置打包盒包,请联系工作人员添加包装盒");
}
// int orderCount = req.OrderInfo.Sum(p => p.Count);
int packingCount = devicePacking.Stock * devicePacking.Capacity;
if (packingCount < req.Count)
{
return new ApiResult(ApiStatusCode.Forbidden, "包装盒库存不足,请联系工作人员添加包装盒");
}
// 计算使用的包装盒数量(减包装盒库存)
var exceptStock = req.Count / devicePacking.Capacity;
var yushu = req.Count % devicePacking.Capacity;
if (yushu > 0)
{
exceptStock++;
}
// 扣库存
devicePacking.Stock -= exceptStock;
#endregion
#region 4、商品库存验证
var orderId = IdGenerator.NewId();
if (productInfo.DeviceProduct.Stock < req.Count)
{
return new ApiResult(ApiStatusCode.Forbidden, $"{productInfo.Product.Name}库存不足,请修改后重新下单");
}
// 扣库存
var deviceProduct = productInfo.DeviceProduct;
deviceProduct.Stock -= req.Count;
#endregion
#region 5、下单
YW_Order order = new YW_Order()
{
Id = orderId,
Name = productInfo.Product.Name,
DeviceId = session.UserId,
Price = deviceProduct.Price * req.Count,
PayStatus = PayStatusEnum.UnPay,
OrderStatus = OrderStatusEnum.UnPay,
// PaySerialId = Snowflake.Instance().GetId().ToString(), // 支付流水号,支付完成会回写
CreateBY = session.UserId
};
// orderDetails
var orderDetails = new YW_OrderDetails()
{
Id = IdGenerator.NewId(),
OrderId = orderId,
ProductId = productInfo.Product.Id,
Name = productInfo.Product.Name,
Code = productInfo.Product.Code,
Img = productInfo.Product.Img,
Info = productInfo.Product.Info,
Price = productInfo.DeviceProduct.Price,
BuyingPrice = productInfo.Product.BuyingPrice,
Count = req.Count,
CreateBY = session.UserId
};
YW_OrderProcess orderProcess = new YW_OrderProcess()
{
Id = IdGenerator.NewId(),
OrderId = order.Id,
DeviceId = session.UserId,
CurrentOrderStatus = OrderStatusEnum.UnPay,
Message = "下单成功",
CreateBY = session.UserId
};
#endregion
#region 6、存库
_dbContent.Set().Add(order);
_dbContent.Set().Add(orderProcess);
_dbContent.Set().Add(orderDetails);
// 数据库执行 库存已经改过了,会自动保存
_dbContent.SaveChanges();
#endregion
// 写入订单日志
_ywLogService.WriteOrderLog(order.Id, "下单", "下单成功", session.UserName);
return new ApiResult(new OrderResponseDto()
{
OrderId = order.Id,
Price = order.Price,
QrCode = string.Format(payRedirectUrl, order.Id)
});
}
///
/// 根据id获取商品信息
///
///
///
public ApiResult GetQueueOrder(string orderId)
{
var session = _userService.GetLoginSession();
var order = _dbContent.Set().FirstOrDefault(p => p.IsDelete == 0 && p.Id == orderId && p.DeviceId == session.UserId);
if (order == null)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "订单不存在");
}
OrderInfoResponseDto result = new OrderInfoResponseDto() {
Id = order.Id,
Name = order.Name,
Price = order.Price,
PayStatus = order.PayStatus,
PaySerialId = order.PaySerialId,
PayWay = order.PayWay
};
return new ApiResult(result);
}
///
/// 获取待烧烤的商品列表
///
///
public ApiResult> GetQueueOrders()
{
var session = _userService.GetLoginSession();
var orders = _dbContent.Set()
.Where(p => p.IsDelete == 0
&& p.PayStatus == PayStatusEnum.Paid
&& p.OrderStatus == OrderStatusEnum.Paid
&& p.DeviceId == session.UserId)
.OrderBy(p => p.CreateDT).ToList();
var orderIds = orders.Select(p => p.Id).ToList();
var orderDetails = _dbContent.Set().Where(p => p.IsDelete == 0 && orderIds.Contains(p.OrderId)).ToList();
List result = new List();
orders.ForEach(item =>
{
var currentOrderDetails = orderDetails.FirstOrDefault(p => p.ProductId == item.Id);
var img = string.Empty;
if (!string.IsNullOrWhiteSpace(currentOrderDetails?.Img))
{
img = $"{ProductService.ImagePrefix}{currentOrderDetails.Img}";
}
QueueOrderResponseDto resultItem = new QueueOrderResponseDto()
{
OrderId = item.Id,
TotalPrice = item.Price,
Name = item.Name,
Code = currentOrderDetails?.Code,
Img = img,
Price = currentOrderDetails?.Price ?? 0,
Count = currentOrderDetails?.Count ?? 0
};
result.Add(resultItem);
});
return new ApiResult>(result);
}
///
/// 取消未支付订单
///
///
public ApiResult CancelUnPayOrder(string orderId)
{
var session = _userService.GetLoginSession();
var order = _dbContent.Set().FirstOrDefault(p => p.IsDelete == 0 && p.Id == orderId && p.DeviceId == session.UserId);
if (order == null)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "取消的订单不存在");
}
if (order.PayStatus != PayStatusEnum.UnPay && order.OrderStatus != OrderStatusEnum.UnPay)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "当前订单不是未支付状态,不能取消");
}
// 需要试试查询支付宝或者
if (order.PayWay == PayWayEnum.AliPay)
{
var tradeQueryResult = serviceClient.tradeQuery(order.Id);
if (tradeQueryResult.Status == ResultEnum.SUCCESS && tradeQueryResult.response.TradeStatus == "TRADE_SUCCESS")
{
// 已经支付成功
return new ApiResult(ApiStatusCode.InvalidParameter, "当前订单已经支付成功,不能取消");
}
}
order.PayStatus = PayStatusEnum.Cancel;
order.OrderStatus = OrderStatusEnum.Cancel;
_dbContent.SaveChanges();
return new ApiResult();
}
///
/// 回写流程状态
///
///
///
public ApiResult OrderProcess(OrderProcessRequestDto req)
{
if (req == null)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "请求参数不正确");
}
var order = _dbContent.Set().FirstOrDefault(p => p.Id == req.OrderId);
if (order == null)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "未找到相应订单");
}
if (order.PayStatus != PayStatusEnum.Paid)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "未支付订单不能回写流程");
}
if (order.OrderStatus == OrderStatusEnum.UnPay
|| order.OrderStatus == OrderStatusEnum.Cancel)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "未支付或已取消订单不能回写流程");
}
var session = _userService.GetLoginSession();
// 修改订单状态
order.OrderStatus = req.OrderStatus;
// 记录订单流程
YW_OrderProcess orderProcess = new YW_OrderProcess()
{
Id = IdGenerator.NewId(),
OrderId = req.OrderId,
DeviceId = session.UserId,
CurrentOrderStatus = req.OrderStatus,
Message = req.Message,
CreateBY = session.UserId
};
_dbContent.Set().Add(orderProcess);
_dbContent.SaveChanges();
// 写入订单日志
_ywLogService.WriteOrderLog(order.Id, "流程回写", $"回写流程状态{req.OrderStatus.ToString()}", session.UserId);
return new ApiResult();
}
///
/// 获取支付宝支付链接
///
///
///
public string AliPayProcess(string id)
{
// 1、先查询订单是否存在
var order = _dbContent.Set().FirstOrDefault(p => p.IsDelete == 0 && p.Id == id);
if (order == null)
{
return "http://api.rgtech.ltd/html/ordernotexist.html";
}
if (order.PayStatus == PayStatusEnum.Cancel)
{
// 订单已取消,不能支付再次支付
return "http://api.rgtech.ltd/html/ordercancel.html";
}
if (order.PayWay != PayWayEnum.UnKnow && order.PayWay != PayWayEnum.AliPay)
{
// 上次请求非支付宝支付、返回失败
return "http://api.rgtech.ltd/html/errorpayway.html";
}
string result = "http://api.rgtech.ltd/html/error.html";
// 查询订单详情
var orderDetails = _dbContent.Set().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 = "2m";
//订单描述
builder.body = "";
//门店编号,很重要的参数,可以用作之后的营销
builder.store_id = order.DeviceId;
//操作员编号,很重要的参数,可以用作之后的营销
//builder.operator_id = "test";
//传入商品信息详情
List 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();
builder.goods_detail = gList;
//系统商接入可以填此参数用作返佣
//ExtendParams exParam = new ExtendParams();
//exParam.sysServiceProviderId = "20880000000000";
//builder.extendParams = exParam;
#endregion
//如果需要接收扫码支付异步通知,那么请把下面两行注释代替本行。
//推荐使用轮询撤销机制,不推荐使用异步通知,避免单边账问题发生。
//AlipayF2FPrecreateResult precreateResult = new AlipayF2FPrecreateResult();
AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, aliNotifyUrl);//商户接收异步通知的地址,采用异步回写通知
switch (precreateResult.Status)
{
case ResultEnum.SUCCESS:// 申请支付成功,写入订单支付方式(以便于其他人再次扫码使用不同支付方式)
order.PayWay = PayWayEnum.AliPay;
order.ModifyDT = DateTime.Now;
_dbContent.SaveChanges();
result = precreateResult.response.QrCode;
break;
case ResultEnum.FAILED:
case ResultEnum.UNKNOWN:
default:
// 请求失败,记录日志
_log4NetHelper.Error($"[AliPayProcess]-tradePrecreate失败:{JsonConvert.SerializeObject(precreateResult)}");
break;
}
return result;
}
///
/// 支付宝支付回写(已测试好,勿动)
///
///
public string AliPayNotify()
{
_log4NetHelper.Info("[AliPayNotify]-start");
SortedDictionary sPara = GetRequestPost();
_log4NetHelper.Info("[AliPayNotify]-[原始请求参数]-" + JsonConvert.SerializeObject(sPara));
Notify aliNotify = new Notify(AliPayConfig.charset, AliPayConfig.sign_type, AliPayConfig.pid, AliPayConfig.mapiUrl, AliPayConfig.alipay_public_key);
string notifyId = HttpContext.Current.Request.Form["notify_id"];
string sign = HttpContext.Current.Request.Form["sign"];
_log4NetHelper.Info($"[AliPayNotify]-[基础参数]-notify_id:{notifyId};sign{sign}");
//对异步通知进行验签
bool verifyResult = aliNotify.Verify(sPara, notifyId, sign);
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")
{
payStatus = PayStatusEnum.Paid;
}
PayWriteBackRequestDto payWriteBack = new PayWriteBackRequestDto()
{
PaySerialId = paySerialId,
OrderId = outTradeNo,
PayStatus = payStatus,
PayWay = PayWayEnum.AliPay,
BuyerId = HttpContext.Current.Request.Form["buyer_id"] ?? string.Empty,
BuyAccount = HttpContext.Current.Request.Form["buyer_logon_id"] ?? string.Empty,
SellerId = HttpContext.Current.Request.Form["seller_id"] ?? string.Empty,
SellAccount = HttpContext.Current.Request.Form["seller_email"] ?? string.Empty,
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 = payResponse
};
// 回写到实际表中
var result = PayWriteBack(payWriteBack);
if (!result.IsSuccess)
{
// 失败了
_log4NetHelper.Info($"[AliPayNotify]-[支付回写验证失败]-{result.Message}");
return "false";
}
return "sucess";
}
else
{
_log4NetHelper.Info("[AliPayNotify]-验签失败!!!");
return "false";
}
}
///
/// 申请退款
///
///
public ApiResult OrderRefund(string orderId)
{
var order = _dbContent.Set().FirstOrDefault(p => p.IsDelete == 0 && p.Id == orderId);
if (order.PayStatus != PayStatusEnum.Paid)
{
// 订单状态不可退款
return new ApiResult(ApiStatusCode.InvalidParameter, "当前订单状态不可退款");
}
ApiResult result = null;
switch (order.PayWay)
{
case PayWayEnum.WeChatPay:
result = new ApiResult(ApiStatusCode.Forbidden, "微信支付暂未接入,无法发起退款");
break;
case PayWayEnum.AliPay:
// 支付宝退款
result = AliPayRefund(order.Id, order.PaySerialId, order.Price, order.Id, "客户发起退款");
break;
default:
result = new ApiResult(ApiStatusCode.Forbidden, "未知支付方式,无法在线自动退款");
break;
}
if (result.IsSuccess)
{
// 修改订单状态
order.PayStatus = PayStatusEnum.Refunding;
order.OrderStatus = OrderStatusEnum.Cancel;
order.ModifyDT = DateTime.Now;
order.ModifyBY = "系统申请";
_dbContent.SaveChanges();
// 写入订单流程记录
_ywLogService.WriteOrderProcess(order.Id, order.DeviceId, OrderStatusEnum.Cancel, "申请退款", "用户申请");
}
return result;
}
///
/// 轮询查询退款信息,并更新订单的退款记录
///
///
public ApiResult OrderRefundLoop()
{
// 1、查询出所有退款中的订单
// 2、请求支付宝退款接口查询是否已退款成功
// 3、退款成功或失败时,回写到订单中
var modifyDt = DateTime.Now.AddMinutes(-2);// 查询2分钟以前的订单,因为退款需要一定时间,马上查询会返回失败
var order = _dbContent.Set().Where(p => p.IsDelete == 0 && p.PayStatus == PayStatusEnum.Refunding && p.ModifyDT < modifyDt).OrderBy(p => p.ModifyDT).FirstOrDefault();
if (order == null)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "无退款中订单");
}
// 更新modifydt以便下次捞取别的订单
order.ModifyDT = DateTime.Now;
// 测试
//var order = new YW_Order()
//{
// Id = "GBJUJCBWD3E26SIV",
// PaySerialId = "2022040322001434260501434677",
// DeviceId = string.Empty,// "cb8b354c-b713-4dd7-9752-a6f3217004a0",
// PayWay = PayWayEnum.AliPay
//};
ApiResult result = null;
switch (order.PayWay)
{
case PayWayEnum.WeChatPay:
result = new ApiResult(ApiStatusCode.Forbidden, "微信支付暂未接入,无法进行查询");
break;
case PayWayEnum.AliPay:
// 查询支付宝退款
result = AliPayRefundQuery(order.Id, order.PaySerialId, order.Price);
break;
default:
result = new ApiResult(ApiStatusCode.Forbidden, "未知支付方式,无法进行查询");
break;
}
if (result.IsSuccess)
{
// 修改订单状态
order.PayStatus = PayStatusEnum.Refunded;
order.OrderStatus = OrderStatusEnum.Cancel;
order.ModifyDT = DateTime.Now;
order.ModifyBY = "用户申请";
// 写入订单流程记录
_ywLogService.WriteOrderProcess(order.Id, order.DeviceId, OrderStatusEnum.Cancel, "退款成功", "用户申请");
}
else
{
// 退款失败,将订单更新成错误,并记录订单日志
// order.PayStatus = PayStatusEnum.Fail;
order.OrderStatus = OrderStatusEnum.Cancel;
order.ModifyDT = DateTime.Now;
order.ModifyBY = "用户申请";
// 写入订单日志
_ywLogService.WriteOrderLog(order.Id, "订单退款失败", result.Message, "用户申请");
}
_dbContent.SaveChanges();
return result;
}
#region privatemethods
///
/// 支付回写(回写到实际表中)
///
///
///
private ApiResult PayWriteBack(PayWriteBackRequestDto req)
{
if (req == null
|| string.IsNullOrWhiteSpace(req.PaySerialId))
{
return new ApiResult(ApiStatusCode.InvalidParameter, "请求参数不正确");
}
var order = _dbContent.Set().FirstOrDefault(p => p.Id == req.OrderId);
if (order == null)
{
return new ApiResult(ApiStatusCode.InvalidParameter, "未找到相应订单");
}
if (order.Price != 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)
{
// 写入订单日志
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);
// 修改订单状态
order.PayStatus = status.Item1;
order.OrderStatus = status.Item2;
order.PaySerialId = req.PaySerialId;
// 记录订单支付流程
YW_PayCall payCall = new YW_PayCall()
{
Id = IdGenerator.NewId(),
OrderId = req.OrderId,
PayStatus = status.Item1,
PaySerialId = req.PaySerialId,
PayWay = req.PayWay,
BuyerId = req.BuyerId,
BuyAccount = req.BuyAccount,
SellerId = req.SellerId,
SellAccount = req.SellAccount,
PayAmount = req.PayAmount,
PayTime = req.PayTime,
PayResponse = req.PayResponse,
CreateBY = req.BuyAccount
};
_dbContent.Set().Add(payCall);
// 写入订单流程信息
_ywLogService.WriteOrderProcess(req.OrderId, order.DeviceId, order.OrderStatus, "订单回写成功", "支付回写");
_dbContent.SaveChanges();
// 记录订单日志
_ywLogService.WriteOrderLog(order.Id, "支付回写", "回写成功", req.PayWay.ToString());
return new ApiResult();
}
///
/// 支付宝退款
///
///
///
///
///
///
private ApiResult AliPayRefund(string orderId,string paySerialId,decimal refundAmount, string out_request_no, string refundReason)
{
AlipayTradeRefundContentBuilder builder = new AlipayTradeRefundContentBuilder()
{
trade_no = paySerialId,
out_trade_no = orderId,
refund_amount = refundAmount.ToString(),
out_request_no = out_request_no,
refund_reason = refundReason,
};
ApiResult result = null;
// 支付宝退款
_log4NetHelper.Error($"[AliPayRefund]-tradeRefund-start:request:{JsonConvert.SerializeObject(builder)}");
AlipayF2FRefundResult refundResult = serviceClient.tradeRefund(builder);
_log4NetHelper.Error($"[AliPayRefund]-tradeRefund-end:request:{JsonConvert.SerializeObject(refundResult)}");
switch (refundResult.Status)
{
case ResultEnum.SUCCESS:
// 退款成功-记录日志
_ywLogService.WriteOrderLog(orderId, "申请退款", $"申请退款成功:退款金额{refundResult.response?.SendBackFee}", "用户申请");
result = new ApiResult();
break;
default:
result = new ApiResult(ApiStatusCode.InternalServerError, "请求支付宝退款失败" + refundResult.response?.SubMsg);
// 退款失败-记录订单日志
_ywLogService.WriteOrderLog(orderId, "申请退款", $"申请退款失败:{refundResult.response?.SubMsg}", "用户申请");
// 请求失败,记录log4net日志
_log4NetHelper.Error($"[AliPayRefund]-tradeRefund失败:request:{JsonConvert.SerializeObject(builder)};response:{JsonConvert.SerializeObject(refundResult)}");
break;
}
return result;
}
///
/// 支付宝退款查询
///
///
///
///
///
private ApiResult AliPayRefundQuery(string orderId, string paySerialId, decimal orderPrice)
{
var builder = new AlipayTradeFastpayRefundQueryContentBuilder()
{
trade_no = paySerialId,
out_trade_no = orderId,
out_request_no = orderId
};
ApiResult result = null;
// 支付宝退款
_log4NetHelper.Error($"[AliPayRefund]-AliPayRefundQuery-start:request:{JsonConvert.SerializeObject(builder)}");
var refundQueryResult = serviceClient.tradeFastpayRefundQuery(builder);
_log4NetHelper.Error($"[AliPayRefund]-AliPayRefundQuery-end:response:{JsonConvert.SerializeObject(refundQueryResult)}");
switch (refundQueryResult.Status)
{
case ResultEnum.SUCCESS:
string content = "成功";
if (ConvertHelper.ToDecimal(refundQueryResult.response.RefundAmount) == orderPrice)
{
// 退款成功
result = new ApiResult();
content = $"退款成功:退款金额{refundQueryResult.response?.RefundAmount}";
}
else
{
// 退款失败
result = new ApiResult(ApiStatusCode.InternalServerError, "请求支付宝退款失败" + refundQueryResult.response?.SubMsg);
content = $"退款失败:{refundQueryResult.response?.SubMsg}";
}
// 记录订单日志
_ywLogService.WriteOrderLog(orderId, "退款查询", content, "用户申请");
break;
default:
result = new ApiResult(ApiStatusCode.InternalServerError, "请求支付宝退款失败" + refundQueryResult.response?.SubMsg);
// 退款失败-记录订单日志
_ywLogService.WriteOrderLog(orderId, "退款查询", $"退款失败:{refundQueryResult.response?.SubMsg}", "用户申请");
// 请求失败,记录log4net日志
_log4NetHelper.Error($"[AliPayRefund]-AliPayRefundQuery失败:request:{JsonConvert.SerializeObject(builder)};response:{JsonConvert.SerializeObject(refundQueryResult)}");
break;
}
return result;
}
///
/// 支付测试
///
///
public ApiResult PayTest()
{
AlipayTradePrecreateContentBuilder builder = BuildPrecreateContent();
string out_trade_no = builder.out_trade_no;
//如果需要接收扫码支付异步通知,那么请把下面两行注释代替本行。
//推荐使用轮询撤销机制,不推荐使用异步通知,避免单边账问题发生。
// AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder);
string notify_url = aliNotifyUrl; //商户接收异步通知的地址
AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, notify_url);
//以下返回结果的处理供参考。
//payResponse.QrCode即二维码对于的链接
//将链接用二维码工具生成二维码打印出来,顾客可以用支付宝钱包扫码支付。
string result = "";
return new ApiResult(precreateResult);
//switch (precreateResult.Status)
//{
// case ResultEnum.SUCCESS:
// DoWaitProcess(precreateResult);
// txtRCCode.Text = precreateResult.response.QrCode;
// break;
// case ResultEnum.FAILED:
// result = precreateResult.response.Body;
// Response.Redirect("result.aspx?Text=" + result);
// break;
// case ResultEnum.UNKNOWN:
// if (precreateResult.response == null)
// {
// result = "配置或网络异常,请检查后重试";
// }
// else
// {
// result = "系统异常,请更新外部订单后重新发起请求";
// }
// Response.Redirect("result.aspx?Text=" + result);
// break;
//}
}
///
/// 构造支付请求数据
///
/// 请求数据集
private AlipayTradePrecreateContentBuilder BuildPrecreateContent()
{
AlipayTradePrecreateContentBuilder builder = new AlipayTradePrecreateContentBuilder();
//收款账号
builder.seller_id = AliPayConfig.pid;
//订单编号-----------------------
builder.out_trade_no = DateTime.Now.ToString("yyyyMMddHHmmss") + "0000" + (new Random()).Next(1, 10000).ToString();
//订单总金额-----------------------------
builder.total_amount = "0.02";
//参与优惠计算的金额
//builder.discountable_amount = "";
//不参与优惠计算的金额
//builder.undiscountable_amount = "";
//订单名称-------------------------------
builder.subject = "smj_webapi测试订单";
//自定义超时时间
builder.timeout_express = "5m";
//订单描述
builder.body = "";
//门店编号,很重要的参数,可以用作之后的营销--------------------
builder.store_id = "test store id";
//操作员编号,很重要的参数,可以用作之后的营销---------------------
builder.operator_id = "test";
//传入商品信息详情
List gList = new List();
GoodsInfo goods = new GoodsInfo();
goods.goods_id = "goods id";
goods.goods_name = "goods name";
goods.price = "0.02";
goods.quantity = "1";
gList.Add(goods);
builder.goods_detail = gList;
//系统商接入可以填此参数用作返佣
//ExtendParams exParam = new ExtendParams();
//exParam.sysServiceProviderId = "20880000000000";
//builder.extendParams = exParam;
return builder;
}
///
///
///
///
///
private Tuple GetStatusByPayWriteBack(PayStatusEnum payStatus)
{
// 临时:payStatus 0失败,1成功
OrderStatusEnum orderStatus = OrderStatusEnum.UnPay;
switch (payStatus)
{
case PayStatusEnum.Paid:// 成功
orderStatus = OrderStatusEnum.Paid;
break;
default:// 失败
break;
}
return new Tuple(payStatus, orderStatus);
}
///
/// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
///
/// request回来的信息组成的数组
private SortedDictionary GetRequestPost()
{
int i = 0;
SortedDictionary sArray = new SortedDictionary();
NameValueCollection coll;
//Load Form variables into NameValueCollection variable.
coll = HttpContext.Current.Request.Form;
// Get names of all forms into a string array.
String[] requestItem = coll.AllKeys;
for (i = 0; i < requestItem.Length; i++)
{
sArray.Add(requestItem[i], HttpContext.Current.Request.Form[requestItem[i]]);
}
return sArray;
}
///
/// 对支付宝异步通知的关键参数进行校验
///
///
private bool CheckParams()
{
bool ret = true;
//获得调用方的appid;
//如果是非授权模式,appid是商户的appid;如果是授权模式(token调用),appid是系统商的appid
string app_id = HttpContext.Current.Request.Form["app_id"];
if (app_id != AliPayConfig.appId)
{
ret = false;
_log4NetHelper.Info($"[支付回写][appid认证失败]:request_appid:{app_id};sys_appid:{AliPayConfig.appId}");
}
return ret;
}
#endregion
public AlipayF2FQueryResult tradeQuery(string orderId)
{
return serviceClient.tradeQuery(orderId);
}
}
}