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
{
///
/// 内部通知
///
public class InternalNotifySerivce : ServiceBase, 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;
}
///
/// 发起内部通知,没有支付记录
///
///
///
///
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
});
}
}
///
/// 发起内部通知,有支付记录
///
///
///
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
});
}
}
}
}
}