|
@@ -98,28 +98,30 @@ namespace WingPaymentService.Service
|
|
|
var orderInfo = await _paymentDBService.GetOrderDetailAsync(new GetOrderDetailDBRequest { OrderCode = request.OrderCode });
|
|
|
if (orderInfo != null && orderInfo.OrderAmount > 0)
|
|
|
{
|
|
|
- string payUrl = string.Empty;
|
|
|
+ string recordCode = Guid.NewGuid().ToString("N");
|
|
|
+ (string payUrl, string recordContent) payContent = (string.Empty,string.Empty);
|
|
|
switch (request.PayType)
|
|
|
{
|
|
|
case PayTypeEnum.Alipay_PAGE:
|
|
|
- payUrl = _alipayCommon.AlipayPagePay(orderInfo.OrderTitle, orderInfo.OrderAmount, orderInfo.Code);
|
|
|
+ payContent = _alipayCommon.AlipayPagePay(orderInfo.OrderTitle, orderInfo.OrderAmount, orderInfo.Code, recordCode);
|
|
|
break;
|
|
|
case PayTypeEnum.Alipay_WAP:
|
|
|
- payUrl = _alipayCommon.AlipayWapPay(orderInfo.OrderTitle, orderInfo.OrderAmount, orderInfo.Code);
|
|
|
+ payContent = _alipayCommon.AlipayWapPay(orderInfo.OrderTitle, orderInfo.OrderAmount, orderInfo.Code, recordCode);
|
|
|
break;
|
|
|
case PayTypeEnum.WeChat_PAGE:
|
|
|
- payUrl = await _weChatCommon.GetWebPayUrlAsync(orderInfo.OrderTitle, orderInfo.OrderAmount, orderInfo.Code, string.Empty, string.Empty);
|
|
|
+ payContent = await _weChatCommon.GetWebPayUrlAsync(orderInfo.OrderTitle, orderInfo.OrderAmount, orderInfo.Code, recordCode, string.Empty, string.Empty);
|
|
|
break;
|
|
|
case PayTypeEnum.WeChat_WAP:
|
|
|
- payUrl = await _weChatCommon.GetWapPayUrlAsync(orderInfo.OrderTitle, orderInfo.OrderAmount, orderInfo.Code, string.Empty, string.Empty);
|
|
|
+ payContent = await _weChatCommon.GetWapPayUrlAsync(orderInfo.OrderTitle, orderInfo.OrderAmount, orderInfo.Code, recordCode, string.Empty, string.Empty);
|
|
|
break;
|
|
|
}
|
|
|
- if (!string.IsNullOrWhiteSpace(payUrl))
|
|
|
+ await CreatePayStatusReq(recordCode, payContent.recordContent);
|
|
|
+ if (!string.IsNullOrWhiteSpace(payContent.payUrl))
|
|
|
{
|
|
|
return new PayInfoDTO
|
|
|
{
|
|
|
IsSuccess = true,
|
|
|
- PayUrl = payUrl
|
|
|
+ PayUrl = payContent.payUrl
|
|
|
};
|
|
|
}
|
|
|
}
|
|
@@ -139,19 +141,20 @@ namespace WingPaymentService.Service
|
|
|
/// <returns></returns>
|
|
|
public async Task<PayCallbackDTO> PayCallbackAsync(string src, string request)
|
|
|
{
|
|
|
+ bool isSuccess = false;
|
|
|
try
|
|
|
{
|
|
|
switch (src)
|
|
|
{
|
|
|
- case "Alipay":
|
|
|
- await AlipayCallback(request);
|
|
|
+ case "alipay":
|
|
|
+ isSuccess = await AlipayCallback(request);
|
|
|
break;
|
|
|
- case "WeChat":
|
|
|
- await WeChatCallback(request);
|
|
|
+ case "wechat":
|
|
|
+ isSuccess = await WeChatCallback(request);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- return new PayCallbackDTO { IsSuccess = true };
|
|
|
+ return new PayCallbackDTO { IsSuccess = isSuccess };
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
@@ -160,6 +163,11 @@ namespace WingPaymentService.Service
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 支付宝回调
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request"></param>
|
|
|
+ /// <returns></returns>
|
|
|
private async Task<bool> AlipayCallback(string request)
|
|
|
{
|
|
|
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
|
|
@@ -177,49 +185,75 @@ namespace WingPaymentService.Service
|
|
|
}
|
|
|
var payOutTradeNo = keyValuePairs.GetValueOrDefault("out_trade_no");
|
|
|
var totalAmount = keyValuePairs.GetValueOrDefault("total_amount");
|
|
|
- var paymentRecordCode = keyValuePairs.GetValueOrDefault("pay_record_code");
|
|
|
+ var payRecordCode = keyValuePairs.GetValueOrDefault("pay_record_code");
|
|
|
var payStatus = keyValuePairs.GetValueOrDefault("trade_status") == "TRADE_SUCCESS" ? WingInterfaceLibrary.Enum.PayStatusEnum.Paid : WingInterfaceLibrary.Enum.PayStatusEnum.NoPay;
|
|
|
var payTime = DateTime.UtcNow;
|
|
|
- await UpdatePayStatus(paymentRecordCode, payStatus, uriParams, payTime);
|
|
|
- if(payStatus == PayStatusEnum.Paid)
|
|
|
- {
|
|
|
- return await UpdateOrderStatus(payOutTradeNo, payStatus, totalAmount, payTime);
|
|
|
- }
|
|
|
- return false;
|
|
|
+ return await PayRecordWriteRes(payOutTradeNo, payRecordCode, totalAmount, payStatus, payTime, request);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 微信回调
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request"></param>
|
|
|
+ /// <returns></returns>
|
|
|
private async Task<bool> WeChatCallback(string request)
|
|
|
{
|
|
|
//转换数据格式, 取消签名校验,签名调用方自己调用,兼容支付和退款
|
|
|
WxPayData data = new WxPayData();
|
|
|
- var paramValues = data.FromXml(request,false);//回调不用签名校验
|
|
|
+ var paramValues = data.FromXml(request, false);//回调不用签名校验
|
|
|
var payOutTradeNo = paramValues.GetValueOrDefault("out_trade_no")?.ToString();
|
|
|
- var totalAmount = (double.Parse(paramValues.GetValueOrDefault("total_fee")?.ToString())/100).ToString("0.00");
|
|
|
+ var totalAmount = (double.Parse(paramValues.GetValueOrDefault("total_fee")?.ToString()) / 100).ToString("0.00");
|
|
|
var payRecordCode = paramValues.GetValueOrDefault("pay_record_code")?.ToString();
|
|
|
var payStatus = paramValues.GetValueOrDefault("result_code")?.ToString() == "SUCCESS" ? PayStatusEnum.Paid : PayStatusEnum.NoPay;
|
|
|
var payTime = DateTime.UtcNow;
|
|
|
- await UpdatePayStatus(payRecordCode, payStatus, request, payTime);
|
|
|
- if(payStatus == PayStatusEnum.Paid)
|
|
|
+ return await PayRecordWriteRes(payOutTradeNo, payRecordCode, totalAmount, payStatus, payTime, request);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 支付记录
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="orderCode">订单编码</param>
|
|
|
+ /// <param name="payRecordCode">支付记录编码</param>
|
|
|
+ /// <param name="totalAmount">支付金额</param>
|
|
|
+ /// <param name="payStatus">支付状态</param>
|
|
|
+ /// <param name="payTime">支付时间</param>
|
|
|
+ /// <param name="request">支付原始请求</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task<bool> PayRecordWriteRes(string orderCode, string payRecordCode, string totalAmount, PayStatusEnum payStatus, DateTime payTime, string res)
|
|
|
+ {
|
|
|
+ if (string.IsNullOrWhiteSpace(payRecordCode))
|
|
|
+ {
|
|
|
+ Logger.WriteLineError("Pay record code is empty");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ await UpdatePayStatusRes(payRecordCode, payStatus, res, payTime);
|
|
|
+ if (string.IsNullOrWhiteSpace(orderCode))
|
|
|
+ {
|
|
|
+ Logger.WriteLineError("Order code is empty");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (payStatus == PayStatusEnum.Paid)
|
|
|
{
|
|
|
- var result = await UpdateOrderStatus(payOutTradeNo, payStatus, totalAmount, payTime);
|
|
|
- return result;
|
|
|
+ return await UpdateOrderStatus(orderCode, payStatus, totalAmount, payTime);
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
private async Task<bool> UpdateOrderStatus(string orderCode, PayStatusEnum payStatus, string totalAmount, DateTime payTime)
|
|
|
{
|
|
|
- var orderInfo = await _paymentDBService.GetOrderDetailAsync(new GetOrderDetailDBRequest{ OrderCode = orderCode});
|
|
|
- if(orderInfo.OrderAmount.ToString("0.00") != totalAmount)
|
|
|
+ var orderInfo = await _paymentDBService.GetOrderDetailAsync(new GetOrderDetailDBRequest { OrderCode = orderCode });
|
|
|
+ if (orderInfo.OrderAmount.ToString("0.00") != totalAmount)
|
|
|
{
|
|
|
Logger.WriteLineError($"OrderCode:{orderInfo.Code} pay status {payStatus}, total amount error, order amount {orderInfo.OrderAmount.ToString("0.00")} paid amount {totalAmount}");
|
|
|
return false;
|
|
|
}
|
|
|
- var result = await _paymentDBService.UpdateOrderAsync(new UpdateOrderDBRequest{
|
|
|
+ var result = await _paymentDBService.UpdateOrderAsync(new UpdateOrderDBRequest
|
|
|
+ {
|
|
|
OrderCode = orderCode,
|
|
|
PayStatus = payStatus
|
|
|
});
|
|
|
- await _educationService.PaymentCallbackAsync(new PaymentCallbackRequest{
|
|
|
+ await _educationService.PaymentCallbackAsync(new PaymentCallbackRequest
|
|
|
+ {
|
|
|
PaymentOrderCode = orderCode,
|
|
|
PayStatus = payStatus,
|
|
|
PayTime = payTime
|
|
@@ -227,7 +261,14 @@ namespace WingPaymentService.Service
|
|
|
return result.IsSuccess;
|
|
|
}
|
|
|
|
|
|
- private async Task<UpdatePaymentRecordResultDTO> UpdatePayStatus(string paymentRecordCode, PayStatusEnum payStatus, string payResContent, DateTime payTime)
|
|
|
+ private async Task<CreatePaymentRecordResultDTO> CreatePayStatusReq(string paymentRecordCode, string payReqContent)
|
|
|
+ {
|
|
|
+ var createRecordInfo = new CreatePaymentRecordDBRequest();
|
|
|
+ createRecordInfo.PayReqContent = payReqContent;
|
|
|
+ return await _paymentDBService.CreatePaymentRecordAsync(createRecordInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<UpdatePaymentRecordResultDTO> UpdatePayStatusRes(string paymentRecordCode, PayStatusEnum payStatus, string payResContent, DateTime payTime)
|
|
|
{
|
|
|
var updateRecordInfo = new UpdatePaymentRecordDBRequest();
|
|
|
updateRecordInfo.Code = paymentRecordCode;
|