Send bridge replies with GET callback
This commit is contained in:
@@ -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))) {
|
||||
|
||||
Reference in New Issue
Block a user