dokan 0 Denunciar post Postado Abril 13, 2015 Alguem sabe como enviar esse xml via POST <purchaseService xmlns="http://br.com.getnet.ecommerce.ws.service/"> <!--Optional:--> <arg0 xmlns=""> <authentication> <username>string</username> <password>string</password> <merchantID>string</merchantID> </authentication> <purchases> <!--Zero or more repetitions:--> <purchase> <terminalID>string</terminalID> <merchantTrackID>string</merchantTrackID> <amount>string</amount> <currencycode>string</currencycode> <instType>string</instType> <!--Optional:--> <instNum>string</instNum> <card> <number>string</number> <!--Optional:--> <cvv2>string</cvv2> <expiryMonth>string</expiryMonth> <expiryYear>string</expiryYear> <holderName>string</holderName> </card> <!--Optional:--> <userDefinedField> <!--Optional:--> <udf1>string</udf1> <!--Optional:--> <udf2>string</udf2> <!--Optional:--> <udf3>string</udf3> <!--Optional:--> <udf4>string</udf4> <!--Optional:--> <udf5>string</udf5> </userDefinedField> <!--Optional:--> <tranMCC>string</tranMCC> <!--Optional:--> <softDescriptor>string</softDescriptor> </purchase> </purchases> </arg0> </purchaseService> Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Abril 14, 2015 É POST ou SOAP? Compartilhar este post Link para o post Compartilhar em outros sites
dokan 0 Denunciar post Postado Abril 14, 2015 O envio é via POST. Eu tenho que passar esse xml pelo metodo POST, na URL, veja a url abaixo. $info_conecta = array( "trace" => 1, "location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/AdministrationService", "uri" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/AdministrationService"); $client = new SoapClient("./wsdl/AdministrationService.wsdl",$info_conecta); $compra = $client->changeAuthenticationService($request); Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Abril 14, 2015 Ainda assim está um pouco confuso, pois em um momento você fala POST mas no exemplo usa SOAP. Você deve verificar o arquivo WSDL, pois ele descreve tudo que é necessário passar. Se o XML acima passado é a descrição de um método, indentando-o você encontrará tudo que é necessário: <purchaseService xmlns="http://br.com.getnet.ecommerce.ws.service/"> <!--Optional:--> <arg0 xmlns=""> <authentication> <username>string</username> <password>string</password> <merchantID>string</merchantID> </authentication> <purchases> <!--Zero or more repetitions:--> <purchase> <terminalID>string</terminalID> <merchantTrackID>string</merchantTrackID> <amount>string</amount> <currencycode>string</currencycode> <instType>string</instType> <!--Optional:--> <instNum>string</instNum> <card> <number>string</number> <!--Optional:--> <cvv2>string</cvv2> <expiryMonth>string</expiryMonth> <expiryYear>string</expiryYear> <holderName>string</holderName> </card> <!--Optional:--> <userDefinedField> <!--Optional:--> <udf1>string</udf1> <!--Optional:--> <udf2>string</udf2> <!--Optional:--> <udf3>string</udf3> <!--Optional:--> <udf4>string</udf4> <!--Optional:--> <udf5>string</udf5> </userDefinedField> <!--Optional:--> <tranMCC>string</tranMCC> <!--Optional:--> <softDescriptor>string</softDescriptor> </purchase> </purchases> </arg0> </purchaseService> Para passar os dados, você possui algumas formas, como arrays associativos, standard class ou mapeamento de classes. Como exemplo vou usar uma standard class, supondo que o nome do método é purchaseService: $purchaseService = new stdClass(); $authentication = new stdClass(); $authentication->username = "usuario"; $authentication->password = "senha"; $authentication->merchantID = "id"; $purchaseService->arg0->authentication = $authentication; /** exemplo compacto de várias compras **/ /** é preferível utilizar \ArrayObject ao invés de array() **/ $purchases = new \ArrayObject(); $purchase = new stdClass(); $purchase->terminalID = "string"; $purchase->merchantTrackID = "string"; $purchase->amount = "string"; $purchase->currencycode = "string"; $purchase->instType = "string"; /** demais configurações **/ /** adiciona-se o tipo especificado como SoapVar **/ $purchases->append(new \SoapVar($purchase , SOAP_ENC_OBJECT , null , null , 'purchase')); /** suponha-se que existe $purchase1 e $purchase2 **/ $purchases->append(new \SoapVar($purchase1 , SOAP_ENC_OBJECT , null , null , 'purchase')); $purchases->append(new \SoapVar($purchase2 , SOAP_ENC_OBJECT , null , null , 'purchase')); $purchaseService->arg0->purchases = new \SoapVar($purchases , SOAP_ENC_OBJECT , null , null , 'purchases'); /** varíavel criada no seu exemplo **/ $return = $client->purchaseService($purchaseService); Perceba que somente no momento em que eu criei uma lista de compras, eu fiz uso de SoapVar, e na hora da autenticação não. Isso se faz necessário para uma melhor interpretação da lista no XML, uma vez que em nenhum momento é definido que é uma lista do objeto "purchase", apenas "purchases".É interessante ler sobre o erro da tag BOGUS Compartilhar este post Link para o post Compartilhar em outros sites
dokan 0 Denunciar post Postado Abril 17, 2015 Gabriel, valew pela explicação consegui entender o funcionamento do SOAP, A questão acima é que na documentação diz via POST e no exemplo esta em SOAP, e como eu não conhecia SOAP fiquei perdido, mas agora eu vi que da pra fazer das duas formas. consegui fazer em SOAP mas agora não estou conseguindo pegar a informação descriptionResponse do array, em uma tela de consulta da transação. Com o var_dump($result) ele imprime todo o resultado mas eu preciso apenas do descriptionResponse e o transactionID <?php ini_set('soap.wsdl_cache_enabled',0); ini_set('soap.wsdl_cache_ttl',0); class JaxWsSoapClient extends SoapClient { public function __call($method, $arguments){ $response = parent::__call($method, $arguments); return $response; } } try { $client = new JaxWsSoapClient("./wsdl/CommerceService.wsdl", array("trace" => 1, "location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService", "uri" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService", )); $request = array( 'arg0' => array( 'authentication' => array( 'username' => 'user', 'password' => 'pass', 'merchantID' => '54345', ), 'query' => array( 'query' => array( 'terminalID' => 'D055362101', 'merchantTrackID' => '0008', ), ), ), ); $result = $client->__call('queryDataService', array($request)); echo("<br/>Dumping request:<br/>".$client->__getLastRequest()); echo("<br/>Returning value of __soapCall() call:<br/> "); var_dump($result); }catch(SoapFault $exception) { print_r("Got issue:<br/>") ; print_r($exception->getMessage()); } ?> Resultado object(stdClass)#2 (1) { ["queryResponse"]=> object(stdClass)#3 (1) { ["result"]=> object(stdClass)#4 (1) { ["result"]=> object(stdClass)#5 (7) { ["transactionID"]=> string(16) "65364455766456471" ["originalTransactionID"]=> string(2) "-1" ["merchantTrackID"]=> string(4) "0008" ["descriptionResponse"]=> string(8) "APPROVED" ["responseCode"]=> string(2) "00" ["auth"]=> string(6) "026155" ["postdate"]=> string(4) "0407" } } } } Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Abril 17, 2015 O restorno é um stdClass, que você armazena em $result. O método __getLastRequest apenas mostra o XML da última requisição, ele é para debug de código e não para uso em produção, você deve utilizar a variável $result. var_dump($result); A partir desse resultado, você pode consultar as variáveis mais abaixo: $queryResponse = $result->result->result; echo $queryResponse->transactionID; echo $queryResponse->originalTransactionID; /** assim por diante **/ Compartilhar este post Link para o post Compartilhar em outros sites
dokan 0 Denunciar post Postado Abril 17, 2015 Não entendi, pois aqui não funcionou o código ficou assim <?php ini_set('soap.wsdl_cache_enabled',0); ini_set('soap.wsdl_cache_ttl',0); class JaxWsSoapClient extends SoapClient { public function __call($method, $arguments){ $response = parent::__call($method, $arguments); return $response; } } try { $client = new JaxWsSoapClient("./wsdl/CommerceService.wsdl", array("trace" => 1, "location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService", "uri" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService", )); $request = array( 'arg0' => array( 'authentication' => array( 'username' => 'user', 'password' => 'pass', 'merchantID' => '54345', ), 'query' => array( 'query' => array( 'terminalID' => 'D055362101', 'merchantTrackID' => '0008', ), ), ), ); $result = $client->__call('queryDataService', array($request)); echo("<br/>Dumping request:<br/>".$client->__getLastRequest()); echo("<br/>Returning value of __soapCall() call:<br/> "); var_dump($result); $queryResponse = $result->result->result; echo $queryResponse->transactionID; echo $queryResponse->originalTransactionID; }catch(SoapFault $exception) { print_r("Got issue:<br/>") ; print_r($exception->getMessage()); } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Abril 17, 2015 O código que eu te passei, é para você verificar o retorno, e não para usar em produção. var_dump exibe o conteúdo da variável, avalie o que ela recebe e, então, utilize e ajuste o exemplo que eu passei por segundo. Compartilhar este post Link para o post Compartilhar em outros sites
dokan 0 Denunciar post Postado Abril 17, 2015 resultado do var_dump object(stdClass)#2 (1) { ["queryResponse"]=> object(stdClass)#3 (1) { ["result"]=> object(stdClass)#4 (1) { ["result"]=> object(stdClass)#5 (7) { ["transactionID"]=> string(16) "6536445561450971" ["originalTransactionID"]=> string(2) "-1" ["merchantTrackID"]=> string(4) "0008" ["descriptionResponse"]=> string(8) "APPROVED" ["responseCode"]=> string(2) "00" ["auth"]=> string(6) "026155" ["postdate"]=> string(4) "0407" } } } } Agora esse final eu não entendi ainda. $result = $client->__call('QueryDataService', array($request)); $queryResponse = $result->result->result; echo $queryResponse->descriptionResponse; echo $queryResponse->originalTransactionID; }catch(SoapFault $exception) { print_r("Got issue:<br/>") ; print_r($exception->getMessage()); } Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Abril 17, 2015 Veja bem, o var_dump resultou isso (obs: idente seus códigos, inclusive os retornos, facilitam a compreensão): object(stdClass)#2 (1) { ["queryResponse"]=> object(stdClass)#3 (1) { ["result"]=> object(stdClass)#4 (1) { ["result"]=> object(stdClass)#5 (7) { ["transactionID"]=> string(16) "6536445561450971" ["originalTransactionID"]=> string(2) "-1" ["merchantTrackID"]=> string(4) "0008" ["descriptionResponse"]=> string(8) "APPROVED" ["responseCode"]=> string(2) "00" ["auth"]=> string(6) "026155" ["postdate"]=> string(4) "0407" } } } } Veja que o objeto é uma stdClass, logo, você deve acessar ela como uma classe. Lhe darei um exemplo aonde eu crio uma stdClass: $class = new stdClass(); $class->variavel = "um resultado qualquer"; $class->result = new stdClass(); $class->result->result = new stdClass(); $class->result->result->result = "mais um valor qualquer"; var_dump($class); Saída: object(stdClass)[1] public 'variavel' => string 'um resultado qualquer' (length=21) public 'result' => object(stdClass)[2] public 'result' => object(stdClass)[3] public 'result' => string 'mais um valor qualquer' (length=22) Apesar da saída ser um pouco diferente (provavelmente seja pelo xdebug instalado na minha máquin) o exemplo continua sendo válido Compartilhar este post Link para o post Compartilhar em outros sites
dokan 0 Denunciar post Postado Abril 18, 2015 Gabriel Heming Muito obrigado! Agora consegui resolver! Compartilhar este post Link para o post Compartilhar em outros sites