Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

LHardRex

Receber XML SOAP - Redecard

Recommended Posts

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.