From 83971e864fbee9e1a12d25239fbf005760ee983f Mon Sep 17 00:00:00 2001 From: zhengyuxuan <zhengyuxuan1995> Date: 星期五, 28 三月 2025 14:22:59 +0800 Subject: [PATCH] fix:支付查询 --- LifePayment/LifePayment.Domain/Ali/AliPayApi.cs | 141 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 139 insertions(+), 2 deletions(-) diff --git a/LifePayment/LifePayment.Domain/Ali/AliPayApi.cs b/LifePayment/LifePayment.Domain/Ali/AliPayApi.cs index cdeb515..1a5ec58 100644 --- a/LifePayment/LifePayment.Domain/Ali/AliPayApi.cs +++ b/LifePayment/LifePayment.Domain/Ali/AliPayApi.cs @@ -5,7 +5,11 @@ using LifePayment.Domain.Shared; using Microsoft.Extensions.Options; using Nest; +using System; +using System.Collections; +using System.Collections.Generic; using System.Threading.Tasks; +using Tea; namespace LifePayment.Domain { @@ -13,10 +17,12 @@ { private readonly Config _options; + protected Alipay.EasySDK.Kernel.Client _kernel; public AliPayApi( - IOptionsMonitor<Config> optionsMonitor) + IOptionsMonitor<Config> optionsMonitor, Client kernel) { _options = optionsMonitor.CurrentValue; + _kernel = kernel; } public async Task<AlipayTradePrecreateResponse> GetAliPayQRCode(GetPayQrCodeInput input) @@ -40,6 +46,7 @@ return response; } + /// <summary> /// 鏌ヨ鏀粯瀹濋��娆捐鍗曚俊鎭� /// </summary> @@ -53,9 +60,139 @@ public async Task<AlipayTradeRefundResponse> TradeRefund(AlipayTradeRefundRequest input) { - AlipayTradeRefundResponse response = await Factory.Payment.Common().RefundAsync(input.OutTradeNo,input.RefundAmount); + AlipayTradeRefundResponse response = await TradeRefund(input.OutTradeNo,input.OutRefundNo, input.RefundAmount); return response; } + private async Task<AlipayTradeRefundResponse> TradeRefund(string outTradeNo, string outRefundNo, string refundAmount) + { + Dictionary<string, object> runtime_ = new Dictionary<string, object> + { + { + "ignoreSSL", + _kernel.GetConfig("ignoreSSL") + }, + { + "httpProxy", + _kernel.GetConfig("httpProxy") + }, + { "connectTimeout", 15000 }, + { "readTimeout", 15000 }, + { + "retry", + new Dictionary<string, int?> { { "maxAttempts", 0 } } + } + }; + TeaRequest _lastRequest = null; + Exception innerException = null; + long _now = DateTime.Now.Millisecond; + int _retryTimes = 0; + while (TeaCore.AllowRetry((IDictionary)runtime_["retry"], _retryTimes, _now)) + { + if (_retryTimes > 0) + { + int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes); + if (backoffTime > 0) + { + TeaCore.Sleep(backoffTime); + } + } + + _retryTimes++; + try + { + TeaRequest teaRequest = new TeaRequest(); + Dictionary<string, string> dictionary = new Dictionary<string, string> + { + { "method", "alipay.trade.refund" }, + { + "app_id", + _kernel.GetConfig("appId") + }, + { + "timestamp", + _kernel.GetTimestamp() + }, + { "format", "json" }, + { "version", "1.0" }, + { + "alipay_sdk", + _kernel.GetSdkVersion() + }, + { "charset", "UTF-8" }, + { + "sign_type", + _kernel.GetConfig("signType") + }, + { + "app_cert_sn", + _kernel.GetMerchantCertSN() + }, + { + "alipay_root_cert_sn", + _kernel.GetAlipayRootCertSN() + } + }; + Dictionary<string, object> bizParams = new Dictionary<string, object> + { + { "out_trade_no", outTradeNo }, + { "out_request_no", outRefundNo }, + { "refund_amount", refundAmount } + }; + Dictionary<string, string> dictionary2 = new Dictionary<string, string>(); + teaRequest.Protocol = _kernel.GetConfig("protocol"); + teaRequest.Method = "POST"; + teaRequest.Pathname = "/gateway.do"; + teaRequest.Headers = new Dictionary<string, string> + { + { + "host", + _kernel.GetConfig("gatewayHost") + }, + { "content-type", "application/x-www-form-urlencoded;charset=utf-8" } + }; + teaRequest.Query = _kernel.SortMap(TeaConverter.merge<string>(new object[3] + { + new Dictionary<string, string> { + { + "sign", + _kernel.Sign(dictionary, bizParams, dictionary2, _kernel.GetConfig("merchantPrivateKey")) + } }, + dictionary, + dictionary2 + })); + teaRequest.Body = TeaCore.BytesReadable(_kernel.ToUrlEncodedRequestBody(bizParams)); + _lastRequest = teaRequest; + TeaResponse response = await TeaCore.DoActionAsync(teaRequest, runtime_); + Dictionary<string, object> respMap = await _kernel.ReadAsJsonAsync(response, "alipay.trade.refund"); + if (_kernel.IsCertMode()) + { + if (_kernel.Verify(respMap, _kernel.ExtractAlipayPublicKey(_kernel.GetAlipayCertSN(respMap)))) + { + return TeaModel.ToObject<AlipayTradeRefundResponse>(_kernel.ToRespModel(respMap)); + } + } + else if (_kernel.Verify(respMap, _kernel.GetConfig("alipayPublicKey"))) + { + return TeaModel.ToObject<AlipayTradeRefundResponse>(_kernel.ToRespModel(respMap)); + } + + throw new TeaException(new Dictionary<string, string> { { "message", "楠岀澶辫触锛岃妫�鏌ユ敮浠樺疂鍏挜璁剧疆鏄惁姝g‘銆�" } }); + } + catch (Exception ex) + { + if (TeaCore.IsRetryable(ex)) + { + innerException = ex; + continue; + } + + throw ex; + } + } + + throw new TeaUnretryableException(_lastRequest, innerException); + } + } } \ No newline at end of file -- Gitblit v1.9.1