using Aop.Api.Domain;
using ApiTools.Core.Entities.Common;
using Furion;
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DistributedIDGenerator;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Org.BouncyCastle.Ocsp;
using pingan.openbank.api.sdk.client;
using pingan.openbank.api.sdk.common.helper;
using pingan.openbank.api.sdk.common.http;
using pingan.openbank.api.sdk.common.util;
using pingan.openbank.api.sdk.entity;
using pingan.openbank.api.sdk.exception;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
namespace ApiTools.Core
{
///
/// 平安支付工具
///
public class PingAnPayUtils(
ILogger logger,
IOptions options,
IRepository repThreeResourceLog
) : ITransient
{
private readonly ILogger logger = logger;
private readonly IOptions options = options;
private readonly IRepository repThreeResourceLog = repThreeResourceLog;
///
/// 企业账户余额查询_银企直联此接口适应银行所有币种的活期账户的余额查询,其中的可用余额只包含自身的资金状况,而不包括集团内部的资金池。账面余额,也只是自身账号的账面金额。
///
///
///
public async Task CorAcctBalanceQuery(CorAcctBalanceQueryRequest request)
{
return await Send(request, "/V1.0/bedl/CorAcctBalanceQuery");
}
///
/// 历史余额查询_银企直联
///
///
///
public async Task HistoryBalanceQuery(HistoryBalanceQueryRequest request)
{
return await Send(request, "/V1.0/bedl/HistoryBalanceQuery");
}
///
/// 查询账户当日历史交易明细_银企直联
///
///
///
public async Task InquiryAccountDayHistoryTransactionDetails(InquiryAccountDayHistoryTransactionDetailsRequest request)
{
return await Send(request, "/V1.0/bedl/InquiryAccountDayHistoryTransactionDetails");
}
///
/// 账户止付和解止付_银企直联 对公账户层的止付、解除止付
///
///
///
public async Task StopPaymentAndSettlementAccounts(StopPaymentAndSettlementAccountsRequest request)
{
return await Send(request, "/V1.0/bedl/StopPaymentAndSettlementAccounts");
}
///
/// 账户止付详情查询_银企直联 对公账户层的冻结/止付详情查询,每页最大100条。
///
///
///
public async Task InquiryAccountStopPaymentDetails(InquiryAccountStopPaymentDetailsRequest request)
{
return await Send(request, "/V1.0/bedl/InquiryAccountStopPaymentDetails");
}
///
/// 单笔监管止付支付申请_银企直联
///
///
///
public async Task SingleApplicationSuspensionPayment(SingleApplicationSuspensionPaymentRequest request)
{
return await Send(request, "/V1.0/bedl/SingleApplicationSuspensionPayment");
}
///
/// 单笔转账指令查询_银企直联
///
///
///
public async Task CorSingleTransferQuery(CorSingleTransferQueryRequest request)
{
return await Send(request, "/V1.0/bedl/CorSingleTransferQuery");
}
///
/// 当日历史回单数据查询接口_银企直联
///
///
///
public async Task SingleDataQuery(SingleDataQueryRequest request)
{
return await Send(request, "/V1.0/bedl/SingleDataQuery");
}
///
/// 当日历史回单数据查询接口_银企直联
///
///
///
public async Task SameDayHistoryReceiptDataQuery(SameDayHistoryReceiptDataQueryRequest request)
{
return await Send(request, "/V1.0/bedl/SameDayHistoryReceiptDataQuery");
}
///
/// 单笔或多笔回单PDF合并下载(新)_银企直联
///
///
///
public async Task SingleOrBatchReceiptPDFMergeDownloadNew(SingleOrBatchReceiptPDFMergeDownloadNewRequest request)
{
return await Send(request, "/V1.0/bedl/SingleOrBatchReceiptPDFMergeDownloadNew");
}
///
/// 发送请求
///
///
///
///
///
///
public async Task Send(TRequest request, string path)
where TRequest : PingAnPayBaseRequest, new()
where TResponse : PingAnPayBaseResponse, new()
{
var logier = JwtUtils.GetCurrentLogier();
var sdkRequest = new SdkRequest();
sdkRequest.SetInterfaceName(path);
if (request.CnsmrSeqNo.IsNull())
{
request.CnsmrSeqNo = $"{DateTime.Now:yyyyMMddHHmmssfff}{new Random(IDGen.NextID().GetHashCode()).Next(100, 999)}";
}
request.MrChCode = options.Value.MrChCode;
var body = JObject.FromObject(request);
sdkRequest.SetBody(body);
sdkRequest.SetExtraHeaders(null);
//string text = sdkRequest.GetAppId();
//if (text.IsNull())
//{
// string configFilePath = sdkRequest.GetConfigFilePath();
// text = ((!configFilePath.IsNull()) ? configFilePath : AbstractApiClient.CheckAppIdOnlyOne());
//}
var log = new ThreeResourceLog
{
CreatedTime = DateTimeOffset.Now,
Id = IDGen.NextID(),
TraceId = App.GetTraceId(),
Method = EnumResourceMethod.Post,
//Domain = AbstractApiClient.GetOpenBankConfig(text).GetBaseUrl(),
Path = path,
CreatedUserId = logier?.Id,
CreatedChannelId = logier?.ChannelId,
Request = request.ToJson(),
};
await repThreeResourceLog.InsertNowAsync(log);
var stopwatch = Stopwatch.StartNew();
HttpResult httpResult = GetClient().Invoke(sdkRequest);
var sdkReturn = httpResult.GetData();
stopwatch.Stop();
var result = sdkReturn.JsonTo();
log.UpdatedTime = DateTimeOffset.Now;
log.Response = sdkReturn;
log.IsSuccess = result.Code.IsNotNull();
log.ElapsedMilliseconds = stopwatch.ElapsedMilliseconds;
await repThreeResourceLog.UpdateNowAsync(log);
return result;
}
public string DownloadFile(string documentId, string fileName)
{
try
{
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UserFiles", "PingAnPay");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
path += Path.DirectorySeparatorChar;
var fileRequest = new FileRequest();
fileRequest.SetFileNo(documentId);
fileRequest.SetFilePathName(path);
GetClient().FileDownLoad(fileRequest);
return $"{path}{documentId}.zip";
}
catch (OpenBankSdkException ex)
{
Console.WriteLine(ex);
throw;
}
}
private ApiClient GetClient()
{
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PingAnPayCert", "config.properties");
var propertyOper = new PropertyOper(path);
var client = ApiClient.GetInstance(propertyOper);
return client;
}
}
}