feat: 兼容 WMS 公众号回调路径 /apiwechat/verification

支持公众平台配置 oms.nanafa.com/api/apiwechat/verification 的验签与消息推送。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zzh 2026-06-29 20:27:07 +08:00
parent e4894f9627
commit 26ccc69dc6

View File

@ -20,6 +20,18 @@ public class WeChatMpAppService(
IHttpContextAccessor httpContextAccessor,
ILogger<WeChatMpAppService> logger) : ApplicationService
{
/// <summary>
/// 微信服务器接入验签(兼容 WMS 公众号菜单配置:/api/apiwechat/verification)。
/// </summary>
[HttpGet("/apiwechat/verification")]
[Produces("text/plain")]
public ContentResult ValidateLegacyAsync(
[FromQuery] string? signature,
[FromQuery] string? timestamp,
[FromQuery] string? nonce,
[FromQuery] string? echostr)
=> ValidateCore(signature, timestamp, nonce, echostr);
/// <summary>
/// 微信服务器接入验签。
/// </summary>
@ -33,22 +45,25 @@ public class WeChatMpAppService(
[FromQuery] string? echostr)
{
EnsureAppId(appId);
if (string.IsNullOrWhiteSpace(signature)
|| string.IsNullOrWhiteSpace(timestamp)
|| string.IsNullOrWhiteSpace(nonce)
|| string.IsNullOrWhiteSpace(echostr))
{
return new ContentResult { Content = "error", ContentType = "text/plain; charset=utf-8" };
}
var valid = WeChatSignatureHelper.Validate(options.Value.Token, timestamp, nonce, signature);
return new ContentResult
{
Content = valid ? echostr : "error",
ContentType = "text/plain; charset=utf-8"
};
return ValidateCore(signature, timestamp, nonce, echostr);
}
/// <summary>
/// 微信消息/事件回调(兼容 WMS:/api/apiwechat/verification)。
/// </summary>
[HttpPost("/apiwechat/verification")]
[Consumes("text/xml", "application/xml", "text/plain")]
[Produces("application/xml")]
public Task<ContentResult> MessageLegacyAsync(
[FromQuery] string signature,
[FromQuery] string timestamp,
[FromQuery] string nonce,
[FromQuery] string? openid,
[FromQuery(Name = "encrypt_type")] string? encryptType,
[FromQuery(Name = "msg_signature")] string? msgSignature,
CancellationToken cancellationToken = default)
=> MessageCoreAsync(signature, timestamp, nonce, encryptType, cancellationToken);
/// <summary>
/// 微信消息/事件回调。
/// </summary>
@ -66,6 +81,43 @@ public class WeChatMpAppService(
CancellationToken cancellationToken = default)
{
EnsureAppId(appId);
return await MessageCoreAsync(signature, timestamp, nonce, encryptType, cancellationToken);
}
private ContentResult ValidateCore(
string? signature,
string? timestamp,
string? nonce,
string? echostr)
{
if (string.IsNullOrWhiteSpace(options.Value.Token))
{
throw new BusinessException("未配置微信公众号 Token");
}
if (string.IsNullOrWhiteSpace(signature)
|| string.IsNullOrWhiteSpace(timestamp)
|| string.IsNullOrWhiteSpace(nonce)
|| string.IsNullOrWhiteSpace(echostr))
{
return new ContentResult { Content = "error", ContentType = "text/plain; charset=utf-8" };
}
var valid = WeChatSignatureHelper.Validate(options.Value.Token, timestamp, nonce, signature);
return new ContentResult
{
Content = valid ? echostr : "error",
ContentType = "text/plain; charset=utf-8"
};
}
private async Task<ContentResult> MessageCoreAsync(
string signature,
string timestamp,
string nonce,
string? encryptType,
CancellationToken cancellationToken)
{
if (!WeChatSignatureHelper.Validate(options.Value.Token, timestamp, nonce, signature))
{
logger.LogWarning("微信消息验签失败");