mirror of
https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git
synced 2026-02-11 02:07:49 +08:00
fix(tenpaybusiness): 修复部分接口请求签名错误
This commit is contained in:
@@ -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}\"");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user