fix(tenpaybusiness): 修复部分接口请求签名错误

This commit is contained in:
Fu Diwei
2024-02-15 19:07:13 +08:00
parent 4930bcaf76
commit ab4876296f

View File

@@ -9,6 +9,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayBusiness.Interceptors
{ {
using SKIT.FlurlHttpClient.Internal; using SKIT.FlurlHttpClient.Internal;
using SKIT.FlurlHttpClient.Primitives; using SKIT.FlurlHttpClient.Primitives;
using SKIT.FlurlHttpClient.Wechat.TenpayBusiness.Constants;
internal class WechatTenpayBusinessRequestSigningInterceptor : HttpInterceptor internal class WechatTenpayBusinessRequestSigningInterceptor : HttpInterceptor
{ {
@@ -45,39 +46,42 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayBusiness.Interceptors
string nonce = Guid.NewGuid().ToString("N"); string nonce = Guid.NewGuid().ToString("N");
string body = string.Empty; string body = string.Empty;
if (context.FlurlCall.HttpRequestMessage.Content is MultipartFormDataContent formdataContent) if (context.FlurlCall.HttpRequestMessage?.Content is not null)
{ {
// NOTICE: multipart/form-data 文件上传请求的待签名参数需特殊处理 if (context.FlurlCall.HttpRequestMessage.Content is MultipartFormDataContent multipartFormData)
var httpContent = formdataContent.SingleOrDefault(e => Constants.FormDataFields.FORMDATA_META.Equals(e.Headers.ContentDisposition?.Name?.Trim('\"')));
if (httpContent is not null)
{ {
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); 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 signData = $"{method}\n{url}\n{timestamp}\n{nonce}\n{body}\n";
string signText; string sign;
bool softSignRequired = _enterpriseId is not null && _enterpriseCertSn is not null && _enterpriseCertPk is not null; bool softSignRequired = _enterpriseId is not null && _enterpriseCertSn is not null && _enterpriseCertPk is not null;
string? softSignText = null; string? softSign = null;
switch (_signAlg) switch (_signAlg)
{ {
case Constants.SignAlgorithms.SHA256_WITH_RSA: case SignAlgorithms.SHA256_WITH_RSA:
{ {
try try
{ {
signText = Utilities.RSAUtility.Sign(_platformCertPk, plainText).Value!; sign = Utilities.RSAUtility.Sign(_platformCertPk, signData).Value!;
if (softSignRequired) if (softSignRequired)
{ {
byte[] keyBytes = EncodedString.FromBase64String(_enterpriseCertPk!); byte[] keyBytes = EncodedString.FromBase64String(_enterpriseCertPk!);
byte[] msgBytes = EncodedString.FromBase64String(signText); byte[] msgBytes = EncodedString.FromBase64String(sign);
softSignText = EncodedString.ToBase64String(Utilities.RSAUtility.Sign(keyBytes, msgBytes)).Value!; softSign = EncodedString.ToBase64String(Utilities.RSAUtility.Sign(keyBytes, msgBytes)).Value!;
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -91,11 +95,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayBusiness.Interceptors
throw new WechatTenpayBusinessException($"Failed to sign request. Unsupported signing algorithm: \"{_signAlg}\"."); 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) 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}\"");
} }
} }
} }