diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayBusiness/Interceptors/WechatTenpayBusinessRequestSigningInterceptor.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayBusiness/Interceptors/WechatTenpayBusinessRequestSigningInterceptor.cs index 32c29c68..ae8369a4 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayBusiness/Interceptors/WechatTenpayBusinessRequestSigningInterceptor.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayBusiness/Interceptors/WechatTenpayBusinessRequestSigningInterceptor.cs @@ -9,6 +9,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayBusiness.Interceptors { using SKIT.FlurlHttpClient.Internal; using SKIT.FlurlHttpClient.Primitives; + using SKIT.FlurlHttpClient.Wechat.TenpayBusiness.Constants; internal class WechatTenpayBusinessRequestSigningInterceptor : HttpInterceptor { @@ -45,39 +46,42 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayBusiness.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 => Constants.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 plainText = $"{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; bool softSignRequired = _enterpriseId is not null && _enterpriseCertSn is not null && _enterpriseCertPk is not null; - string? softSignText = null; + string? softSign = null; switch (_signAlg) { - case Constants.SignAlgorithms.SHA256_WITH_RSA: + case SignAlgorithms.SHA256_WITH_RSA: { try { - signText = Utilities.RSAUtility.Sign(_platformCertPk, plainText).Value!; + sign = Utilities.RSAUtility.Sign(_platformCertPk, signData).Value!; if (softSignRequired) { byte[] keyBytes = EncodedString.FromBase64String(_enterpriseCertPk!); - byte[] msgBytes = EncodedString.FromBase64String(signText); - softSignText = EncodedString.ToBase64String(Utilities.RSAUtility.Sign(keyBytes, msgBytes)).Value!; + byte[] msgBytes = EncodedString.FromBase64String(sign); + softSign = EncodedString.ToBase64String(Utilities.RSAUtility.Sign(keyBytes, msgBytes)).Value!; } } catch (Exception ex) @@ -91,11 +95,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayBusiness.Interceptors throw new WechatTenpayBusinessException($"Failed to sign request. Unsupported signing algorithm: \"{_signAlg}\"."); } - context.FlurlCall.Request.WithHeader(HTTP_HEADER_PLATFORM_AUTHORIZATION, $"platform_id=\"{_platformId}\",platform_serial_number=\"{_platformCertSn}\",nonce=\"{nonce}\",timestamp=\"{timestamp}\",signature=\"{signText}\",signature_algorithm=\"{_signAlg}\""); + context.FlurlCall.Request.WithHeader(HTTP_HEADER_PLATFORM_AUTHORIZATION, $"platform_id=\"{_platformId}\",platform_serial_number=\"{_platformCertSn}\",nonce=\"{nonce}\",timestamp=\"{timestamp}\",signature=\"{sign}\",signature_algorithm=\"{_signAlg}\""); if (softSignRequired) { - context.FlurlCall.Request.WithHeader(HTTP_HEADER_ENTERPRISE_AUTHORIZATION, $"ent_id=\"{_enterpriseId}\",enterprise_serial_number=\"{_enterpriseCertSn}\",signature=\"{softSignText}\",signature_algorithm=\"{_signAlg}\""); + context.FlurlCall.Request.WithHeader(HTTP_HEADER_ENTERPRISE_AUTHORIZATION, $"ent_id=\"{_enterpriseId}\",enterprise_serial_number=\"{_enterpriseCertSn}\",signature=\"{softSign}\",signature_algorithm=\"{_signAlg}\""); } } }