Exemplos por linguagem
Endpoints prontos para receber e validar o webhook nas linguagens mais comuns.
PHP
<?php
declare(strict_types=1);
// ===== CONFIG =====
const TOKEN_ESPERADO = 'SEU_TOKEN_AQUI';
const LOG_FILE = __DIR__ . '/webhook_log.txt';
// ==================
// Função para obter o header Authorization
function obterAuthHeader(): string {
$headers = getallheaders();
return $headers['Authorization'] ?? $_SERVER['HTTP_AUTHORIZATION'] ?? '';
}
header('Content-Type: application/json; charset=utf-8');
try {
$auth = obterAuthHeader();
if (!str_starts_with($auth, 'Bearer ')) {
http_response_code(401);
echo json_encode(['status' => 'erro', 'msg' => 'Token ausente']);
exit;
}
$token = trim(substr($auth, 7));
if ($token !== TOKEN_ESPERADO) {
http_response_code(401);
echo json_encode(['status' => 'erro', 'msg' => 'Token inválido']);
exit;
}
$raw = file_get_contents('php://input');
$payload = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
// Loga o payload recebido
file_put_contents(LOG_FILE, date('Y-m-d H:i:s') . ' - ' . json_encode($payload) . PHP_EOL, FILE_APPEND | LOCK_EX);
echo json_encode(['status' => 'ok', 'msgid' => $payload['msgid'] ?? null]);
} catch (JsonException) {
http_response_code(400);
echo json_encode(['status' => 'erro', 'msg' => 'JSON inválido']);
exit;
} catch (Throwable $e) {
http_response_code(500);
echo json_encode(['status' => 'erro', 'msg' => 'Erro interno']);
exit;
}
?>
Python (Flask)
from flask import Flask, request, jsonify
app = Flask(__name__)
TOKEN = "SEU_TOKEN_AQUI"
@app.route('/webhook', methods=['POST'])
def webhook():
auth = request.headers.get('Authorization', '')
if not auth.startswith('Bearer '):
return jsonify({'status':'erro','msg':'Token ausente'}), 401
if auth.split(' ',1)[1] != TOKEN:
return jsonify({'status':'erro','msg':'Token inválido'}), 401
try:
payload = request.get_json(force=True)
except Exception:
return jsonify({'status':'erro','msg':'JSON inválido'}), 400
print('Webhook recebido:', payload)
return jsonify({'status':'ok','msgid':payload.get('msgid')}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Node.js (Express)
const express = require('express');
const app = express();
const TOKEN = 'SEU_TOKEN_AQUI';
app.use(express.json());
app.post('/webhook', (req, res) => {
const auth = req.get('Authorization') || '';
if (!auth.startsWith('Bearer ')) return res.status(401).json({status:'erro', msg:'Token ausente'});
if (auth.slice(7) !== TOKEN) return res.status(401).json({status:'erro', msg:'Token inválido'});
console.log('Webhook:', req.body);
return res.json({status:'ok', msgid:req.body.msgid});
});
app.listen(3000, () => console.log('listening on 3000'));
Java (Spring Boot)
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
public class WebhookController {
private static final String TOKEN = "SEU_TOKEN_AQUI";
@PostMapping("/webhook")
public ResponseEntity<Object> receive(
@RequestHeader(value = "Authorization", required = false) String auth,
@RequestBody Map<String,Object> payload
) {
if (auth == null || !auth.startsWith("Bearer "))
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(Map.of("status","erro","msg","Token ausente"));
if (!auth.substring(7).equals(TOKEN))
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(Map.of("status","erro","msg","Token inválido"));
System.out.println("Webhook: " + payload);
return ResponseEntity.ok(Map.of("status","ok","msgid",payload.get("msgid")));
}
}
C# (ASP.NET Core)
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("webhook")]
public class WebhookController : ControllerBase
{
private const string TOKEN = "SEU_TOKEN_AQUI";
[HttpPost]
public IActionResult Post([FromBody] Dictionary<string, object> payload)
{
var auth = Request.Headers["Authorization"].ToString();
if (string.IsNullOrEmpty(auth) || !auth.StartsWith("Bearer "))
return Unauthorized(new { status = "erro", msg = "Token ausente" });
if (auth.Substring(7) != TOKEN)
return Unauthorized(new { status = "erro", msg = "Token inválido" });
Console.WriteLine($"Webhook: {System.Text.Json.JsonSerializer.Serialize(payload)}");
return Ok(new { status = "ok", msgid = payload.ContainsKey("msgid") ? payload["msgid"] : null });
}
}