From 8d6ff80cdcf8de967e5a254f7cb6833e6f8bc635 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Thu, 15 Feb 2024 19:07:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(tenpayv3):=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WechatTenpayRequestSigningInterceptor.cs | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpayRequestSigningInterceptor.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpayRequestSigningInterceptor.cs index 2927abc4..343d9cd1 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpayRequestSigningInterceptor.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpayRequestSigningInterceptor.cs @@ -36,22 +36,25 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Interceptors string nonce = Guid.NewGuid().ToString("N"); string body = string.Empty; - if (context.FlurlCall.HttpRequestMessage.Content is MultipartFormDataContent formdataContent) + if (context.FlurlCall.HttpRequestMessage?.Content is not null) { - // NOTICE: multipart/form-data 文件上传请求的待签名参数需特殊处理 - var httpContent = formdataContent.SingleOrDefault(e => FormDataFields.FORMDATA_META.Equals(e.Headers.ContentDisposition?.Name?.Trim('\"'))); - if (httpContent is not null) + if (context.FlurlCall.HttpRequestMessage.Content is MultipartFormDataContent multipartFormData) { + HttpContent httpContent = multipartFormData.SingleOrDefault(e => FormDataFields.FORMDATA_META.Equals(e.Headers.ContentDisposition?.Name?.Trim('\"'))); + if (httpContent is not null) + { + body = await _AsyncEx.RunTaskWithCancellationTokenAsync(httpContent.ReadAsStringAsync(), cancellationToken).ConfigureAwait(false); + } + } + else if (method != "GET") + { + HttpContent httpContent = context.FlurlCall.HttpRequestMessage.Content; body = await _AsyncEx.RunTaskWithCancellationTokenAsync(httpContent.ReadAsStringAsync(), cancellationToken).ConfigureAwait(false); } } - else - { - body = context.FlurlCall.RequestBody ?? string.Empty; - } - string msgText = $"{method}\n{url}\n{timestamp}\n{nonce}\n{body}\n"; - string signText; + string signData = $"{method}\n{url}\n{timestamp}\n{nonce}\n{body}\n"; + string sign; switch (_scheme) { @@ -59,7 +62,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Interceptors { try { - signText = Utilities.RSAUtility.Sign(_mchCertPk, msgText).Value!; + sign = Utilities.RSAUtility.Sign(_mchCertPk, signData).Value!; } catch (Exception ex) { @@ -72,7 +75,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Interceptors { try { - signText = Utilities.SM2Utility.SignWithSM3(_mchCertPk, msgText).Value!; + sign = Utilities.SM2Utility.SignWithSM3(_mchCertPk, signData).Value!; } catch (Exception ex) { @@ -85,7 +88,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Interceptors throw new WechatTenpayException($"Failed to sign request. Unsupported signing scheme: \"{_scheme}\"."); } - context.FlurlCall.Request.WithHeader(HttpHeaders.Authorization, $"{_scheme} mchid=\"{_mchId}\",nonce_str=\"{nonce}\",signature=\"{signText}\",timestamp=\"{timestamp}\",serial_no=\"{_mchCertSn}\""); + context.FlurlCall.Request.WithHeader(HttpHeaders.Authorization, $"{_scheme} mchid=\"{_mchId}\",nonce_str=\"{nonce}\",signature=\"{sign}\",timestamp=\"{timestamp}\",serial_no=\"{_mchCertSn}\""); } } }