Guilherme Luiz 41 Denunciar post Postado Dezembro 17, 2016 Olá pessoal, Já acionei o suporte da empresa que estou realizando a integração API mas nenhuma das respostas deles me ajudaram. O API que possuo é HTTP REST e eu realizo o envio das informações em json via cURL como mostro no codigo abaixo <?php //API DO GATEWAY $post['messages']['from'] = $dados['remetente']; $post['messages']['destinations']['to'] = $dados['pais'].$destinatario; $post['messages']['text'] = $dados['texto']; $post['messages']['flash'] = $dados['flash']; $post['messages']['notifyContentType'] = "application/json"; $post['messages']['notifyUrl'] = "http://www.meusite.com.br/infobip_dlr"; $url_dest = "https://api.infobip.com/sms/1/text/advanced"; $headers = array('Content-Type: application/json', 'Authorization: Basic '.$gatewayKey); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url_dest); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post)); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); $result = curl_exec($ch); ?> Através do notifyUrl eu especifico onde quero receber o callback do resultado final e no notifyContentType eu informo como quero recebe-lo, que no caso é via json. Como disse, já entrei em contato com o suporte e também já li e reli de ponta a ponta o manual API deles, mas em nenhum momento eles informam através de qual tipo de requisição eles mandam para a minha url as informações via application/json. URL do manual online sobre o recebimento do callback - https://dev.infobip.com/docs/notify-url Na minha pasta /infobip_dlr eu tenho um arquivo index que salva as informações recebidas em meu banco de dados. Eu já tentei salvar a matriz de $_GET e $_POST e nada. Já tentei também fazer algo como: <?php header('Content-Type: application/json; charset=utf-8'); require("bd_connect.php"); $json = file_get_contents('php://input'); $obj = json_decode($json, true); $sql = "INSERT INTO callback (report) VALUES ('".$obj."')"; $query = mysqli_query($connect_sql,$sql); ?> E também, nada!Essa tabela criei apenas para visualizar como eu receberia o DLR do API para que depois eu possa trata-lo, mas a questão aqui não é essa mas sim o recebimento do DLR em si porque essa minha index é requisitada porque vejo que há inserção de registro na tabela, mas o registro é sempre em branco, sem informação nenhuma. Será que alguém ai conseguiria me dar uma ajuda porque nem o suporte da empresa consegue me ajudar =\ Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Dezembro 17, 2016 Antes de ver se o problema está no seu sistema, tem que ver se não existe algum bug o outro lado, tipo: 1 - Você consegue aferir que a notifyurl foi enviada com sucesso? 2 - Existe algum log no sistema de lá que informa de fato que a notificação foi enviada? Partindo do princípio que sim, eu e assumindo que não sei o método em que a resposta é dada, começaria usando o REQUEST para resgatar, também faria um teste disparando um post para a url de notificação apenas para verificar se o meu script está ok. Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 17, 2016 1 - Você consegue aferir que a notifyurl foi enviada com sucesso? Sim porque se eu especifico o notifyurl e a deixo em branco, o API retorna informando que essa tag está vazia e se a utilizo de uma forma incorreta, tambem tenho erro de execução do API. 2 - Existe algum log no sistema de lá que informa de fato que a notificação foi enviada? O suporte deles me informa que o servidor fez o envio das informações corretamente para a minha url. Do teste de POSTJá fiz isso e a minha pagina recebe corretamente o POST. Normalmente os Gateways SMS enviam o DLR via POST ou GET e mesmo tentando salvar a matriz por inteira do $_POST ou $_GET eu tenho arrays vazios e também tenho resultado em branco fazendo da forma que demonstrei. No meu servidor, cheguei até dar permissão 777 para ver se eles enviam algum arquivo ao invés de requisições POST ou GET, mas também não recebo nada. Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 17, 2016 Em contato com a área de suporte da empresa, me informaram que os dados são enviados via POST O meu codigo para captar essa chamada post na minha url é : <?php require("../bd_connect.php"); $operadora = json_encode($_POST); $sql = "INSERT INTO teste (report) VALUES ('".$operadora."')"; $query = mysqli_query($connect_sql,$sql); ?> Será que estou fazendo algo errado?Porque o servidor deles chama a minha url, porem eu recebo dados NULL. Supostamente há algo errado comigo ou com eles? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Dezembro 17, 2016 Dependendo de alguns fatores, json_encode pode retornar null, tente salvar o valor do $_POST também, direto em algum arquivo ou outra tabela/coluna, se ele não estiver nulo, o problema está justamente no json_encode. Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 17, 2016 ESerra Fiz a sua sugestão e tive os seguintes valores adicionados na minha tabela de acordo com a captura que tentei realizar $dlr = $_POST; //ARRAY (em branco) $dlr2= $_POST['results']; //Em branco $dlr3= print_r($_POST['results']); //valor 1 $dlr4= print_r($_POST); // valor 1 $dlr5= var_dump($_POST); //Em branco $postData = file_get_contents("php://input"); //Em branco O que está me dando "raiva" é que o suporte dessa empresa diz que está enviando certinho o DLR via POST na minha url... Mas fiz de todas as formas possiveis de salvar valores vindos por _POST e nenhum me traz os valores! Alguma outra sugestão? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Dezembro 17, 2016 <?php ob_start(); print_r($_POST) $resultado = ob_get_clean(); ?> Se vier algo no POST estará na variável $resultado. Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 17, 2016 Resultado Array() Podemos ter a certeza que os dados não estão sendo enviados?! O servidor está apenas realizando a requisição na minha url com dados em branco!? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Dezembro 17, 2016 if ($_SERVER['REQUEST_METHOD'] === 'POST') { //requisição via post } Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 17, 2016 fiz o seguinte <?php require("../bd_connect.php"); if ($_SERVER['REQUEST_METHOD'] === 'POST') { ob_start(); print_r($_POST); $resultado = ob_get_clean(); $sql = "INSERT INTO teste (report) VALUES ('".$resultado."')"; $query = mysqli_query($connect_sql,$sql); }else{ $sql = "INSERT INTO teste (report) VALUES ('nao e post')"; $query = mysqli_query($connect_sql,$sql); } ?> E salvou na minha tabela o "não é post". Também fiz: <?php require("../bd_connect.php"); if ($_SERVER['REQUEST_METHOD'] === 'POST') { ob_start(); print_r($_POST); $resultado = ob_get_clean(); $sql = "INSERT INTO teste (report) VALUES ('".$resultado."')"; $query = mysqli_query($connect_sql,$sql); }else{ ob_start(); print_r($_REQUEST); $outroresultado = ob_get_clean(); $sql = "INSERT INTO teste (report) VALUES ('".$outroresultado ."')"; $query = mysqli_query($connect_sql,$sql); } ?> E ai tive salvo array() novamente no meu banco...Estou quase convicto que a "falha" é do servidor deles que não está me passando os dados. Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Dezembro 17, 2016 Existem outras possibilidades: 1 - Algum redirecionado no seu site (htaccess); 2 - Algum módulo do apache removendo os posts; 3 - Algum firewall no meio do caminho, mas esse caso seria estranho, já que por padrão bloqueia tudo; 4 - O uso de algum "Cloudflare da vida" também pode provocar isso. Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 18, 2016 O "engraçado" é que eu recebo de outros gateways normalmente. Pedi o corpo do post que me enviam. Esse connection close me incomoda... Porque isso pode indicar que o servidor teve conexão fechada antes de passar a info não? Baseado neste corpo de requisição como posso puxar essas infos? POST /smsfire/dashboard/v2/infobip_dlr HTTP/1.1 User-Agent: java/socket Content-Type: application/json Content-Length: 499 Connection: close Host: smsfire.16mb.com Accept: */* {"results":[{"bulkId":"1482018024079287423","price":{"pricePerMessage":0.0700,"currency":"BRL"},"status":{"id":5,"groupId":3,"groupName":"DELIVERED","name":"DELIVERED_TO_HANDSET","description":"Message delivered to handset"},"error":{"id":0,"name":"NO_ERROR","description":"No Error","groupId":0,"groupName":"OK","permanent":false},"messageId":"40ba9cd9-f801-4b47-aff3-8d08a5893aaa","doneAt":"2016-12-17T21:41:20.539-0200","smsCount":1,"sentAt":"2016-12-17T21:40:24.047-0200","to":"5511967203806"}]} Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Dezembro 18, 2016 Se a conexão não for persistente é esperando o connection close. O caminho mais curto pra testar a teoria do bloqueio/problema no servidor, se você tiver outra URL em outro servidor (de preferência em um data center diferente), verificar se nele ocorre o mesmo erro, pois apenas com esses dados não dá pra fazer muita coisa. Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 18, 2016 A conexao nao é persistente. Somente através da minha solicitação ao gateways é que eles se conectam ao meu servidor para mandar essas informações que mostrei acima. Sinceramente estou sem "rumo" porque não sei mais como fazer para conseguir capturar esses dados Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 18, 2016 Fiz mais alguns testes e continua não funcionando... Eu fiz uma requisição post do meu localhost para o servidor e também chega tudo em branco/null no meu script... No header do cURL tenho status 200 ok mas o conteudo sempre vai em branco/null Será que é meu servidor que não aceita POST externo? Como posso resolver isso? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Dezembro 18, 2016 Entre em contato com o suporte, se existe uma restrição está acima do que você pode alterar a nível de linguagem. Compartilhar este post Link para o post Compartilhar em outros sites
Guilherme Luiz 41 Denunciar post Postado Dezembro 18, 2016 Consegui!! Não sei porque ao querer puxar o _POST como um todo meus dados não são salvos. Então eu consegui especificando a posição do array... $json = file_get_contents('php://input'); $resultado = json_decode($json, true); $idRecebido = $resultado['results'][0]['messageId']; E por curiosidade eu tentei encodar em json novamente o que recebia $json = file_get_contents('php://input'); $resultado = json_decode($json, true); $encoda = json_encode($resultado); // result > {"results":[{"bulkId":"1482067321038044424","price":{"pricePerMessage":0.07,"currency":"BRL"},"status":{"id":5,"groupId":3,"groupName":"DELIVERED","name":"DELIVERED_TO_HANDSET","description":"Message delivered to handset"},"error":{"id":0,"name":"NO_ERROR... Finalmente, ao tentar ir para o basico consegui resolver!Obrigado por toda a ajuda e disponibilidade ESerra e aos demais que simplesmente leram Compartilhar este post Link para o post Compartilhar em outros sites