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; } } }