第三方平台通過 HTTP GET/POST 向我方配置的 backurl 推送數據(如 backurl?a=xx&c=xxx),包含實時與非實時數據。我方需建立接口接收並處理。
public class PushDataDto
{
public string A { get; set; }
public string C { get; set; }
// 其他字段...
public DateTime ReceivedAt { get; set; } = DateTime.UtcNow;
}
[ApiController]
[Route("api/webhook")]
public class WebhookController : ControllerBase
{
private readonly ILogger<WebhookController> _logger;
private readonly IMessageQueue _queue; // 推薦異步處理
public WebhookController(ILogger<WebhookController> logger, IMessageQueue queue)
{
_logger = logger;
_queue = queue;
}
[HttpGet("callback")]
[HttpPost("callback")]
public async Task<IActionResult> Receive([FromQuery] PushDataDto query, [FromBody] PushDataDto body)
{
var data = query ?? body; // 支持 GET 查詢字符串與 POST Body
if (data == null) return BadRequest("Empty payload");
_logger.LogInformation("收到推送: {@Data}", data);
// 異步入隊,快速響應 200 OK
await _queue.EnqueueAsync(data);
return Ok(new { success = true, message = "Received" });
}
}
| 問題 | 解決方案 |
|---|---|
| 實時/非實時混合 | 統一入隊,消費端根據業務類型路由處理 |
| 高併發衝擊 | 接口極簡邏輯(驗證+入隊),返回 200,異步消費 |
| 重複推送/幂等性 | 基於唯一標識(如訂單號+時間戳)去重,Redis Set 或 DB 唯一索引 |
| 簽名驗證 | 中間件驗證簽名(HMAC-SHA256),失敗返回 401 |
| IP 白名單 | 中間件或網關層限制來源 IP |
public class PushDataConsumer : BackgroundService
{
private readonly IMessageQueue _queue;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var data = await _queue.DequeueAsync(stoppingToken);
try
{
// 業務處理:入庫、發通知、觸發工作流...
await ProcessBusinessAsync(data);
}
catch (Exception ex)
{
_logger.LogError(ex, "處理推送失敗,重試機制...");
// 重試/死信隊列
}
}
}
}
若不想自建服務,可用:
接收第三方推送核心是:**輕量級 Webhook 端點 + 異步消息隊列 + 幂等去重 + 安全驗證**。切勿在接口中同步處理耗時業務,導致第三方超時重試、數據堆積。