Send bridge replies with GET callback

This commit is contained in:
Tiago
2026-09-29 15:18:01 -03:00
parent 1cf689e16d
commit 3d58821059
@@ -16,6 +16,7 @@ import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
@@ -164,23 +165,39 @@ public final class ExternalBridgeHandler implements HttpHandler {
if(url.isBlank())return false;
try{
validarCallbackUrl(url);
Map<String,Object> payload=new LinkedHashMap<>();
payload.put("mensagem_id",envio.get("id"));
payload.put("resposta_id",respostaId);
payload.put("empresa_id",envio.get("empresa_id"));
payload.put("sistema_externo",envio.get("sistema_externo"));
payload.put("referencia_externa",envio.get("referencia_externa"));
payload.put("telefone",numero);
payload.put("resposta",texto);
String body=Json.write(payload);
HttpRequest.Builder req=HttpRequest.newBuilder(URI.create(url)).timeout(Duration.ofSeconds(15)).header("Content-Type","application/json");
Map<String,String> params=new LinkedHashMap<>();
params.put("mensagem_id", str(envio.get("id")));
params.put("resposta_id", String.valueOf(respostaId));
params.put("empresa_id", str(envio.get("empresa_id")));
params.put("sistema_externo", str(envio.get("sistema_externo")));
params.put("referencia_externa", str(envio.get("referencia_externa")));
params.put("telefone", numero);
params.put("resposta", texto);
String target = appendQuery(url, params);
HttpRequest.Builder req=HttpRequest.newBuilder(URI.create(target)).timeout(Duration.ofSeconds(15)).GET();
String secret=str(envio.get("callback_secret"));
if(!secret.isBlank())req.header("X-Seconectai-Signature", hmac(secret, body));
HttpResponse<String> resp=httpClient.send(req.POST(HttpRequest.BodyPublishers.ofString(body)).build(),HttpResponse.BodyHandlers.ofString());
if(!secret.isBlank())req.header("X-Seconectai-Signature", hmac(secret, target));
HttpResponse<String> resp=httpClient.send(req.build(),HttpResponse.BodyHandlers.ofString());
return resp.statusCode()>=200&&resp.statusCode()<300;
}catch(Exception e){System.err.println("Falha callback integracao: "+e.getMessage());return false;}
}
private String appendQuery(String url, Map<String,String> params) {
StringBuilder out = new StringBuilder(url);
out.append(url.contains("?") ? "&" : "?");
boolean first = true;
for (Map.Entry<String,String> e : params.entrySet()) {
if (!first) out.append('&');
first = false;
out.append(enc(e.getKey())).append('=').append(enc(e.getValue()));
}
return out.toString();
}
private String enc(String value) {
return URLEncoder.encode(value == null ? "" : value, StandardCharsets.UTF_8);
}
private void validarWebhookEvolution(HttpExchange ex) {
String recebido = ex.getRequestHeaders().getFirst("X-Webhook-Secret");
if (webhookSecret == null || webhookSecret.isBlank() || recebido == null || !MessageDigest.isEqual(webhookSecret.getBytes(StandardCharsets.UTF_8), recebido.getBytes(StandardCharsets.UTF_8))) {