|
@@ -1,7 +1,4 @@
|
|
|
-using System.Net;
|
|
|
-using System.Net.Cache;
|
|
|
using System;
|
|
|
-using System.Text;
|
|
|
using System.Web;
|
|
|
using WingServerCommon.Service;
|
|
|
using WingInterfaceLibrary.Interface;
|
|
@@ -16,6 +13,7 @@ using WingServerCommon.Log;
|
|
|
using WingPaymentService.Common;
|
|
|
using WingInterfaceLibrary.Enum;
|
|
|
using WingInterfaceLibrary.Request;
|
|
|
+using WingPaymentService.Common.WeChat;
|
|
|
|
|
|
namespace WingPaymentService.Service
|
|
|
{
|
|
@@ -85,6 +83,11 @@ namespace WingPaymentService.Service
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 发起支付请求
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request"></param>
|
|
|
+ /// <returns></returns>
|
|
|
public async Task<PayInfoDTO> GoToPayAsync(GoToPayRequest request)
|
|
|
{
|
|
|
if (!string.IsNullOrWhiteSpace(request.OrderCode))
|
|
@@ -125,31 +128,26 @@ namespace WingPaymentService.Service
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- public async Task<PayCallbackDTO> PayCallbackAsync(string request)
|
|
|
+ /// <summary>
|
|
|
+ /// 支付后回调
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="src">来源</param>
|
|
|
+ /// <param name="request">请求信息</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task<PayCallbackDTO> PayCallbackAsync(string src, string request)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
|
|
|
- var uriParams = HttpUtility.UrlDecode(request);
|
|
|
- if (uriParams != null)
|
|
|
+ switch (src)
|
|
|
{
|
|
|
- var paramsArr = uriParams.Split('&');
|
|
|
- foreach (string param in paramsArr)
|
|
|
- {
|
|
|
- var keyValue = param.Split('=');
|
|
|
- var key = keyValue[0];
|
|
|
- var value = keyValue.Length > 1 ? keyValue[1] : string.Empty;
|
|
|
- keyValuePairs.Add(key, value);
|
|
|
- }
|
|
|
+ case "Alipay":
|
|
|
+ await AlipayCallback(request);
|
|
|
+ break;
|
|
|
+ case "WeChat":
|
|
|
+ await WeChatCallback(request);
|
|
|
+ break;
|
|
|
}
|
|
|
- var paymentRecordCode = keyValuePairs.GetValueOrDefault("PaymentRecordCode");
|
|
|
- var payStatus = keyValuePairs.GetValueOrDefault("trade_status") == "TRADE_SUCCESS" ? WingInterfaceLibrary.Enum.PayStatusEnum.Paid : WingInterfaceLibrary.Enum.PayStatusEnum.NoPay;
|
|
|
- var updateRecordInfo = new UpdatePaymentRecordDBRequest();
|
|
|
- updateRecordInfo.Code = paymentRecordCode;
|
|
|
- updateRecordInfo.PayTime = DateTime.UtcNow;
|
|
|
- updateRecordInfo.PayStatus = payStatus;
|
|
|
- updateRecordInfo.PayResContent = uriParams;
|
|
|
- await _paymentDBService.UpdatePaymentRecordAsync(updateRecordInfo);
|
|
|
+
|
|
|
return new PayCallbackDTO { IsSuccess = true };
|
|
|
}
|
|
|
catch (Exception ex)
|
|
@@ -159,7 +157,74 @@ namespace WingPaymentService.Service
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private async Task<bool> AlipayCallback(string request)
|
|
|
+ {
|
|
|
+ Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
|
|
|
+ var uriParams = HttpUtility.UrlDecode(request);
|
|
|
+ if (uriParams != null)
|
|
|
+ {
|
|
|
+ var paramsArr = uriParams.Split('&');
|
|
|
+ foreach (string param in paramsArr)
|
|
|
+ {
|
|
|
+ var keyValue = param.Split('=');
|
|
|
+ var key = keyValue[0];
|
|
|
+ var value = keyValue.Length > 1 ? keyValue[1] : string.Empty;
|
|
|
+ keyValuePairs.Add(key, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var payOutTradeNo = keyValuePairs.GetValueOrDefault("out_trade_no");
|
|
|
+ var totalAmount = keyValuePairs.GetValueOrDefault("total_amount");
|
|
|
+ var paymentRecordCode = keyValuePairs.GetValueOrDefault("pay_record_code");
|
|
|
+ var payStatus = keyValuePairs.GetValueOrDefault("trade_status") == "TRADE_SUCCESS" ? WingInterfaceLibrary.Enum.PayStatusEnum.Paid : WingInterfaceLibrary.Enum.PayStatusEnum.NoPay;
|
|
|
+ await UpdatePayStatus(paymentRecordCode, payStatus, uriParams);
|
|
|
+ if(payStatus == PayStatusEnum.Paid)
|
|
|
+ {
|
|
|
+ return await UpdateOrderStatus(payOutTradeNo, payStatus, totalAmount);
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<bool> WeChatCallback(string request)
|
|
|
+ {
|
|
|
+ //转换数据格式, 取消签名校验,签名调用方自己调用,兼容支付和退款
|
|
|
+ WxPayData data = new WxPayData();
|
|
|
+ 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 payRecordCode = paramValues.GetValueOrDefault("pay_record_code")?.ToString();
|
|
|
+ var payStatus = paramValues.GetValueOrDefault("result_code")?.ToString() == "SUCCESS" ? PayStatusEnum.Paid : PayStatusEnum.NoPay;
|
|
|
+ await UpdatePayStatus(payRecordCode, payStatus, request);
|
|
|
+ if(payStatus == PayStatusEnum.Paid)
|
|
|
+ {
|
|
|
+ return await UpdateOrderStatus(payOutTradeNo, payStatus, totalAmount);
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
+ private async Task<bool> UpdateOrderStatus(string orderCode, PayStatusEnum payStatus, string 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{
|
|
|
+ OrderCode = orderCode,
|
|
|
+ PayStatus = payStatus
|
|
|
+ });
|
|
|
+ return result.IsSuccess;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<UpdatePaymentRecordResultDTO> UpdatePayStatus(string paymentRecordCode, PayStatusEnum payStatus, string payResContent)
|
|
|
+ {
|
|
|
+ var updateRecordInfo = new UpdatePaymentRecordDBRequest();
|
|
|
+ updateRecordInfo.Code = paymentRecordCode;
|
|
|
+ updateRecordInfo.PayTime = DateTime.UtcNow;
|
|
|
+ updateRecordInfo.PayStatus = payStatus;
|
|
|
+ updateRecordInfo.PayResContent = payResContent;
|
|
|
+ return await _paymentDBService.UpdatePaymentRecordAsync(updateRecordInfo);
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 客户端用户验证
|
|
|
/// </summary>
|