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
|
{
|
/// <summary>
|
/// 平安支付工具
|
/// </summary>
|
public class PingAnPayUtils(
|
ILogger<PingAnPayUtils> logger,
|
IOptions<PingAnPayOptions> options,
|
IRepository<ThreeResourceLog, LogDbContextLocator> repThreeResourceLog
|
) : ITransient
|
{
|
private readonly ILogger<PingAnPayUtils> logger = logger;
|
private readonly IOptions<PingAnPayOptions> options = options;
|
private readonly IRepository<ThreeResourceLog, LogDbContextLocator> repThreeResourceLog = repThreeResourceLog;
|
|
/// <summary>
|
/// 企业账户余额查询_银企直联此接口适应银行所有币种的活期账户的余额查询,其中的可用余额只包含自身的资金状况,而不包括集团内部的资金池。账面余额,也只是自身账号的账面金额。
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<CorAcctBalanceQueryResponse> CorAcctBalanceQuery(CorAcctBalanceQueryRequest request)
|
{
|
return await Send<CorAcctBalanceQueryRequest, CorAcctBalanceQueryResponse>(request, "/V1.0/bedl/CorAcctBalanceQuery");
|
}
|
|
/// <summary>
|
/// 历史余额查询_银企直联
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<HistoryBalanceQueryResponse> HistoryBalanceQuery(HistoryBalanceQueryRequest request)
|
{
|
return await Send<HistoryBalanceQueryRequest, HistoryBalanceQueryResponse>(request, "/V1.0/bedl/HistoryBalanceQuery");
|
}
|
|
/// <summary>
|
/// 查询账户当日历史交易明细_银企直联
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<InquiryAccountDayHistoryTransactionDetailsResponse> InquiryAccountDayHistoryTransactionDetails(InquiryAccountDayHistoryTransactionDetailsRequest request)
|
{
|
return await Send<InquiryAccountDayHistoryTransactionDetailsRequest, InquiryAccountDayHistoryTransactionDetailsResponse>(request, "/V1.0/bedl/InquiryAccountDayHistoryTransactionDetails");
|
}
|
|
/// <summary>
|
/// 账户止付和解止付_银企直联 对公账户层的止付、解除止付
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<StopPaymentAndSettlementAccountsResponse> StopPaymentAndSettlementAccounts(StopPaymentAndSettlementAccountsRequest request)
|
{
|
return await Send<StopPaymentAndSettlementAccountsRequest, StopPaymentAndSettlementAccountsResponse>(request, "/V1.0/bedl/StopPaymentAndSettlementAccounts");
|
}
|
|
/// <summary>
|
/// 账户止付详情查询_银企直联 对公账户层的冻结/止付详情查询,每页最大100条。
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<InquiryAccountStopPaymentDetailsResponse> InquiryAccountStopPaymentDetails(InquiryAccountStopPaymentDetailsRequest request)
|
{
|
return await Send<InquiryAccountStopPaymentDetailsRequest, InquiryAccountStopPaymentDetailsResponse>(request, "/V1.0/bedl/InquiryAccountStopPaymentDetails");
|
}
|
|
/// <summary>
|
/// 单笔监管止付支付申请_银企直联
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<SingleApplicationSuspensionPaymentResponse> SingleApplicationSuspensionPayment(SingleApplicationSuspensionPaymentRequest request)
|
{
|
return await Send<SingleApplicationSuspensionPaymentRequest, SingleApplicationSuspensionPaymentResponse>(request, "/V1.0/bedl/SingleApplicationSuspensionPayment");
|
}
|
|
/// <summary>
|
/// 单笔转账指令查询_银企直联
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<CorSingleTransferQueryResponse> CorSingleTransferQuery(CorSingleTransferQueryRequest request)
|
{
|
return await Send<CorSingleTransferQueryRequest, CorSingleTransferQueryResponse>(request, "/V1.0/bedl/CorSingleTransferQuery");
|
}
|
|
/// <summary>
|
/// 当日历史回单数据查询接口_银企直联
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<SingleDataQueryResponse> SingleDataQuery(SingleDataQueryRequest request)
|
{
|
return await Send<SingleDataQueryRequest, SingleDataQueryResponse>(request, "/V1.0/bedl/SingleDataQuery");
|
}
|
|
/// <summary>
|
/// 当日历史回单数据查询接口_银企直联
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<SameDayHistoryReceiptDataQueryResponse> SameDayHistoryReceiptDataQuery(SameDayHistoryReceiptDataQueryRequest request)
|
{
|
return await Send<SameDayHistoryReceiptDataQueryRequest, SameDayHistoryReceiptDataQueryResponse>(request, "/V1.0/bedl/SameDayHistoryReceiptDataQuery");
|
}
|
|
/// <summary>
|
/// 单笔或多笔回单PDF合并下载(新)_银企直联
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
public async Task<SingleOrBatchReceiptPDFMergeDownloadNewResponse> SingleOrBatchReceiptPDFMergeDownloadNew(SingleOrBatchReceiptPDFMergeDownloadNewRequest request)
|
{
|
return await Send<SingleOrBatchReceiptPDFMergeDownloadNewRequest, SingleOrBatchReceiptPDFMergeDownloadNewResponse>(request, "/V1.0/bedl/SingleOrBatchReceiptPDFMergeDownloadNew");
|
}
|
|
/// <summary>
|
/// 发送请求
|
/// </summary>
|
/// <typeparam name="TRequest"></typeparam>
|
/// <typeparam name="TResponse"></typeparam>
|
/// <param name="request"></param>
|
/// <param name="path"></param>
|
/// <returns></returns>
|
public async Task<TResponse> Send<TRequest, TResponse>(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<HttpResult>(sdkRequest);
|
var sdkReturn = httpResult.GetData();
|
stopwatch.Stop();
|
|
var result = sdkReturn.JsonTo<TResponse>();
|
|
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;
|
}
|
}
|
}
|