using System.Text; using System.Text.Json; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tiku.Application.PlatformBilling; namespace Tiku.Api.Controllers; [ApiController] [Tags("平台端-账务回调")] [Route("api/platform-billing/callbacks")] public sealed class PlatformBillingCallbackController( IPlatformBillingNotificationService notificationService) : ControllerBase { [AllowAnonymous] [HttpPost("{provider}")] [EndpointSummary("处理平台账务支付回调")] [EndpointDescription("接收平台账务支付渠道回调,按 provider 归一化后写入通知处理流程。")] public async Task Notify(string provider, CancellationToken cancellationToken) { Request.EnableBuffering(); using var reader = new StreamReader(Request.Body, Encoding.UTF8, leaveOpen: true); var rawBody = await reader.ReadToEndAsync(cancellationToken); Request.Body.Position = 0; JsonElement body; try { body = string.IsNullOrWhiteSpace(rawBody) ? JsonDocument.Parse("{}").RootElement.Clone() : JsonDocument.Parse(rawBody).RootElement.Clone(); } catch (JsonException) { body = JsonDocument.Parse("{}").RootElement.Clone(); } var normalizedProvider = provider.Trim().ToLowerInvariant().Replace('-', '_'); await notificationService.ProcessAsync(new PlatformBillingNotification( normalizedProvider, Request.Headers.ToDictionary(value => value.Key, value => value.Value.ToString(), StringComparer.OrdinalIgnoreCase), rawBody, body), cancellationToken); if (normalizedProvider is "alipay" or "ali_pay") { return Content("success", "text/plain", Encoding.UTF8); } return Ok(new { code = "SUCCESS", message = "成功" }); } }