LHardRex 0 Denunciar post Postado Fevereiro 26, 2011 olá pessoal, ao começa a desenvolver o sistema de pagamento webservice redecard em minha loja me deparei com Soap. Até então não conhecia, mas procurei sobre o assunto. Devo enviar e receber parametros por 3 vezes usando Soap. Na primeira etapa (operação GetAuthorized) os parametros são enviados para a URL https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx. Enviei os parametros por form para url porém com o final /GetAuthorized, assim me retorna o XML com outros parametros, eu tenho que pegar esses dados e enviar outros para confirmar a transação. Agora eles chamam de Operação ConfirmTxn e envio para a mesma URL. De novo me retorna um XML e preciso pegar os dados e enviar para https://ecommerce.redecard.com.br/pos_virtual/cupom.asp para emitir o comprovante. A minha dúvida é como eu capturo esse XML que me é retornado para depois enviar novamente? Como faço isso por soap? Imagino que por Soap seja melhor pq posso fazer todo o processo de uma só vez sem ficar redirecinando a pagina. Agradeço desde já Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Fevereiro 26, 2011 Para trabalhar com Soap no PHP você pode utilizar a classe SoapClient e para ler o XML recebido a função simplexml_load_string, que irá ler o conteúdo do XML e retornar um objeto com os dados. Não sei se é essa exatamente a sua dúvida, mas qualquer coisa posta aí. Compartilhar este post Link para o post Compartilhar em outros sites
LHardRex 0 Denunciar post Postado Fevereiro 26, 2011 Obrigado por resposnder Léo! Não consigo usar a função simplexml_load_string, pois ao enviar o form já é carregado o XML. Aqui você pode ver como acontece: http://174.122.1.105/teste/komerci_teste.php O form é enviado e logo depois aparece o XML. Acredito que deve ter alguma função Soap que pegue isso. Estava vendo a __doRequest. Penso também que talvez não tenho que enviar por form, mas tudo soap. Talvez com a função __soapCall. Está muito dificil de entender o manual php pra classe Soap. O manual está aqui para você entender minha dúvida. Por favor, não quero que façam para mim, além disso quero aprender!!! https://services.redecard.com.br/NovoPortal/Portals/_PierNet/documents/Komerci_Manual_Webservice.pdf Tenho apenas 3 meses que comecei a estudar programação, e to com muita vontade de aprender! Obrigado novamente. Compartilhar este post Link para o post Compartilhar em outros sites
LHardRex 0 Denunciar post Postado Fevereiro 26, 2011 Tentei adaptar um script para minha necessidade: <?php /** * Troque pelo caminho do WSDL do seu webservice */ $wsdl = 'https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx?WSDL'; /** * Se seu webservice não for SOAP 1.1 document literal com codificação UTF-8, * faça os ajustes para o seu caso */ $client = new SoapClient($wsdl,array('exceptions' => 1, 'style' => SOAP_DOCUMENT, 'use' => SOAP_LITERAL, 'soap_version' => SOAP_1_1, 'encoding' => 'UTF-8', 'TOTAL' => '0.01', 'TRANSACAO' => 08, 'FILIACAO' => 123456, 'NUMPEDIDO' => 578, 'NRCARTAO'=> 1234123412341234, 'CVC2' => 123, 'MES' => 11, 'ANO' => 14, 'PORTADOR'=> 'Frederic Chopin', 'IATA' => NULL, 'DISTRIBUIDOR' => NULL, 'CONCENTRADOR' => NULL, 'TAXAEMBARQUE' => NULL, 'ENTRADA' => NULL, 'NUMDOC1' => NULL, 'NUMDOC2' => NULL, 'NUMDOC3' => NULL, 'NUMDOC4' => NULL, 'PAX1' => NULL, 'PAX2' => NULL, 'PAX3' => NULL, 'PAX4' => NULL, 'CONFTXN' => NULL, 'ADD_DATA' => NULL ) ); try { $response = $client->GetAuthorized(); //chamando o método ListaProfissoes var_dump ($response ); //vai exibir a resposta } catch ( SoapFault $f ){ echo 'Opz, ' , $f->getMessage(); } ?> O que me retorna é object(stdClass)#2 (1) { ["GetAuthorizedResult"]=> object(stdClass)#3 (1) { ["any"]=> string(247) "76Refa%E7a+a+transa%E7%E3o.+Sua+transa%E7%E3o+n%E3o+pode+ser+conclu%EDda.+Por+favor,+tente+novamente." } } Isso que dizer que estou enviado os parametros coretamente? Estranho pq quando envio do mesmo jeito por form o codigo é 23 e não 76, e a mensagem é outra. Compartilhar este post Link para o post Compartilhar em outros sites
André Severino 3 Denunciar post Postado Fevereiro 26, 2011 você está usando https ? ? de uma olhada nisso Clique aqui Compartilhar este post Link para o post Compartilhar em outros sites
LHardRex 0 Denunciar post Postado Fevereiro 27, 2011 Olá André, Estou usando HTTPS sim. Consultei o link q indicou e pelo que percebi eles desistiram do soap e estão usando curl? Eu também não conhecia curl. Esta tudo bem obscuro pra mim, não consigo encontrar nenhum exemplo para o meu caso, nem no google. Pelo que vi conectar com o webservice é facil (isso pq eu acho q consegui conecta) mas depois disso não tenhop nem ideia de que fazer. Precisaria apenas saber como enviar os parametros e como pego as informação que recebo. Compartilhar este post Link para o post Compartilhar em outros sites
LHardRex 0 Denunciar post Postado Fevereiro 27, 2011 Pessoal, neste tópico aquiusei como exemplo para mim, pois é exatamente o modo que preciso enviar. Adaptei para minha necessidade mas está dando erro "Catchable fatal error: Object of class stdClass could not be converted to string" Objeto da classe std não pode ser convertido para string <?php /** * Preparando requisição */ $parameters = new stdClass(); $parameters->Total = '0.01'; //aqui você vai colocar seu merchantId $parameters->Transacao = '04'; $parameters->Parcelas = '00'; $parameters->Filiacao = '123123'; $parameters->NumPedido = '123'; $parameters->Nrcartao = '1234123412341234'; $parameters->CVC2 = '123'; $parameters->Mes = '11'; $parameters->Ano = '11'; $parameters->Portador = 'Frederic Chopin'; $parameters->IATA = NULL; $parameters->Distribuidor = NULL; $parameters->Concentrador = NULL; $parameters->TaxaEmbarque = NULL; $parameters->Entrada = NULL; $parameters->Pax1 = NULL; $parameters->Pax2 = NULL; $parameters->Pax3 = NULL; $parameters->Pax4 = NULL; $parameters->Numdoc1 = NULL; $parameters->Numdoc2 = NULL; $parameters->Numdoc3 = NULL; $parameters->Numdoc4 = NULL; $parameters->ConfTxn = NULL; $parameters->Add_Data = NULL; /** * Aqui enviamos a requisição */ try { $komerci = new SoapClient( 'https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx?WSDL', array( 'trace' => 1, 'exceptions' => 1, 'style' => SOAP_DOCUMENT, 'use' => SOAP_LITERAL, 'soap_version' => SOAP_1_1, 'encoding' => 'UTF-8' ) ); /** * A variável $EncryptRequestResult abaixo conterá o conteúdo criptografado se tudo ocorrer bem */ $GetAuthorizedResponse = $komerci->GetAuthorized( $parameters ); echo $GetAuthorizedResponse->GetAuthorizedResult; //Exibindo o conteúdo criptografado } catch( SoapFault $fault ){ echo 'Ocorreu um erro: ' , $fault->getMessage(); } ?> De onde será que vem essa stdClass()? Compartilhar este post Link para o post Compartilhar em outros sites
LHardRex 0 Denunciar post Postado Março 1, 2011 Olá Pessoal, Consegui resolver metade do problema, o código funciona muito bem para mim. O que estava dando erro era dar um echo em $GetAuthorizedResponse->GetAuthorizedResult; Com um print_r me aparece o retorno. Ou também echo $komerci->__getLastResponse(); me aparece a resposta limpa. Agora o meu problema é tratar o XML retornado. Ele me retorna assim stdClass Object ( [any] => 26Transa%E7%E3o+n%E3o+autorizada123 ) Mas o código fonte retorna assim: stdClass Object ( [any] => <AUTHORIZATION xmlns=""> <CODRET>26</CODRET> <MSGRET>Transa%E7%E3o+n%E3o+autorizada</MSGRET> <NUMPEDIDO>123</NUMPEDIDO> <DATA/> <NUMAUTOR/> <NUMCV/> <NUMAUTENT/> <NUMSQN/> <ORIGEM_BIN/> </AUTHORIZATION> ) Como faço para tratar isso, já que ele exclui as tags do xml? No máximo com um echo $komerci->__getLastResponse(); ele me retorna 26Transa%E7%E3o+n%E3o+autorizada123 E o código fonte <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetAuthorizedResponse xmlns="http://ecommerce.redecard.com.br"> <GetAuthorizedResult> <AUTHORIZATION xmlns=""> <CODRET>26</CODRET> <MSGRET>Transa%E7%E3o+n%E3o+autorizada</MSGRET> <NUMPEDIDO>123</NUMPEDIDO> <DATA></DATA> <NUMAUTOR></NUMAUTOR> <NUMCV></NUMCV> <NUMAUTENT></NUMAUTENT> <NUMSQN></NUMSQN> <ORIGEM_BIN></ORIGEM_BIN> </AUTHORIZATION> </GetAuthorizedResult> </GetAuthorizedResponse> </soap:Body> </soap:Envelope> Agradeço mais uma vez pela grande força que o forum esá dando! Realmente o fórum é de alto nível, não estava conseguindo encontrar isso nem gringo. Ainda mais para quem está iniciando. Abraço Compartilhar este post Link para o post Compartilhar em outros sites
etapombas 0 Denunciar post Postado Abril 28, 2011 LlHardRex confesso que você fez o mais dificil e esbarrou na parte mais simples. De qualquer forma estamos ai pra ajudar $GetAuthorizedResponse = $komerci -> GetAuthorizedTst($parameters); $resposta = $GetAuthorizedResponse -> GetAuthorizedTstResult; //Exibindo o conteúdo criptografado echo $resposta -> any; Você já finalizou este código? Abs Desculpe, li novamente e sua pergunta era sobre tratar o XML. Segue código: $GetAuthorized = $komerci -> GetAuthorizedTst($parms); $resposta = $GetAuthorized -> GetAuthorizedTstResult; //Exibindo o conteúdo criptografado $xml = simplexml_load_string($resposta -> any); echo $xml -> CODRET; Nos meus testes sempre dá retorno 76, e em produção retorno 24. Sabe me dizer se precisa configurar alguma coisa dentro do painel do komerci? Compartilhar este post Link para o post Compartilhar em outros sites
LHardRex 0 Denunciar post Postado Abril 29, 2011 Etapombas, terminei o código sim. Depois de muito quebrar a cabeça, simplismente tratei o xml que é retornado até deixar ele puro. Usei str_replace e preg_match_all para deixar-lo assim: <AUTHORIZATION> <CODRET>26</CODRET> <MSGRET>Transa%E7%E3o+n%E3o+autorizada</MSGRET> <NUMPEDIDO>123</NUMPEDIDO> <DATA></DATA> <NUMAUTOR></NUMAUTOR> <NUMCV></NUMCV> <NUMAUTENT></NUMAUTENT> <NUMSQN></NUMSQN> <ORIGEM_BIN></ORIGEM_BIN> </AUTHORIZATION> Desculpe não ter postado antes, vou colocar como resolvido. Abraço e muito obrigado pela ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
etapombas 0 Denunciar post Postado Abril 29, 2011 Legal, mas você viu que eu postei uma forma de tratar o xml mais fácil do que o preg_match? Compartilhar este post Link para o post Compartilhar em outros sites
etapombas 0 Denunciar post Postado Maio 20, 2011 Amigo também fiquei preso no erro 76 refaça a transação, estou usando Https e SoapClient . O que fez para resolver? Obrigado Compartilhar este post Link para o post Compartilhar em outros sites