Files
juipnet/Services/Hncore.Pass.PaymentCenter/Service/InternalNotifySerivce.cs
“wanyongkang” b562aba2b1 忽略dll文件git
2023-07-29 10:19:42 +08:00

177 lines
5.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Hncore.Infrastructure.Common;
using Hncore.Infrastructure.Extension;
using Hncore.Infrastructure.Serializer;
using Hncore.Infrastructure.Service;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;
namespace Hncore.Pass.PaymentCenter.Domain
{
/// <summary>
/// 内部通知
/// </summary>
public class InternalNotifySerivce : ServiceBase<PaymentNotify>, IFindService
{
private IHttpClientFactory m_httpClientFactory;
ServiceHttpClient m_ServiceHttpClient;
public InternalNotifySerivce(PaymentContext dbContext
, ServiceHttpClient _ServiceHttpClient
, IHttpContextAccessor httpContextAccessor
, IHttpClientFactory _httpClientFactory) : base(dbContext, httpContextAccessor)
{
m_httpClientFactory = _httpClientFactory;
m_ServiceHttpClient = _ServiceHttpClient;
}
/// <summary>
/// 发起内部通知,没有支付记录
/// </summary>
/// <param name="url"></param>
/// <param name="postData"></param>
/// <returns></returns>
public async Task Notify(string url, object postData)
{
bool success;
string responseData = "";
try
{
Stopwatch st = new Stopwatch();
st.Start();
responseData = await m_httpClientFactory
.CreateClient(TimeSpan.FromMinutes(5))
.PostAsJsonGetString(url, postData);
st.Stop();
LogHelper.Trace("支付内部通知请求:",
$"{url}\n\n{postData.ToJson(true)}\n\n响应\n{responseData}\n\n用时{st.ElapsedMilliseconds}毫秒");
if (responseData.ToLower() != "success")
{
success = false;
}
else
{
success = true;
}
}
catch (Exception e)
{
LogHelper.Error($"支付内部通知异常,{e.Message}", e);
success = false;
}
if (!success)
{
await this.Add(new PaymentNotify()
{
PaymentRecordId = 0,
Url = url,
ResponseData = responseData,
PostData = postData.ToJson(),
RetryCount = 0,
NotifyType= NotifyType.Faild
});
}
}
/// <summary>
/// 发起内部通知,有支付记录
/// </summary>
/// <param name="paymentRecord"></param>
/// <returns></returns>
public async Task Notify(PaymentRecord paymentRecord)
{
if (paymentRecord.CallbackStatus == CallbackStatus.Finished)
{
return;
}
bool success;
string responseData = "";
string callBackUrl = paymentRecord.CallbackUrl;
if (!callBackUrl.Has())
{
//LogHelper.Warn("该支付记录没有回调地址", paymentRecord.ToJson(true));
return;
}
if (!callBackUrl.StartsWith("http"))
{
LogHelper.Warn("该支付记录回调地址异常", paymentRecord.ToJson(true));
return;
}
callBackUrl = UrlHelper.SetUrlParam(callBackUrl, new {PaymentType = (int) paymentRecord.PaymentType});
var postData = new
{
Data = new
{
Attach = paymentRecord.Attach,
OrderId = paymentRecord.OrderId
}
};
try
{
Stopwatch st = new Stopwatch();
st.Start();
var client= m_ServiceHttpClient.CreateInternalClient();
responseData = await client.PostAsJsonGetString(callBackUrl, postData);
st.Stop();
LogHelper.Trace("支付内部通知请求:",
$"{callBackUrl}\n\n{postData.ToJson(true)}\n\n响应\n{responseData}\n\n用时{st.ElapsedMilliseconds}毫秒");
if (responseData.ToLower() != "success")
{
success = false;
}
else
{
success = true;
paymentRecord.CallbackStatus = CallbackStatus.Finished;
}
}
catch (Exception e)
{
LogHelper.Error($"支付内部通知异常,{e.Message}", e);
success = false;
}
if (!success)
{
var any = await this.Query(true).AnyAsync(t => t.Id == paymentRecord.Id);
if (!any)
{
await this.Add(new PaymentNotify()
{
PaymentRecordId = paymentRecord.Id,
Url = callBackUrl,
ResponseData = responseData,
PostData = postData.ToJson(),
RetryCount = 0,
NotifyType=NotifyType.Faild
});
}
}
}
}
}