rpa 0 Denunciar post Postado Julho 27, 2009 Ola pessoal, estou com um problema aqui que me empacou. Nunca trabalhei com xml_parser e to penando pra extrair os dados em forma de variavel: Veja o que tenho: $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0); xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1); xml_parse_into_struct($xml_parser, $result, $vals, $index); xml_parser_free($xml_parser); Se eu uso print_r($result); eu consigo ver os dados do xml se eu uso print_r($vals); eu vejo a estrutura, como por exemplo: Array ( [0] => Array ( [tag] => Result [type] => open [level] => 1 ) [1] => Array ( [tag] => TransTime [type] => complete [level] => 2 [value] => Mon Jul 27 12:31:09 EDT 2009 ) A minha questão é: como faço para extrair por exemplo algo do tipo $vals['o_campo_desejado_aqui'] ? Alguem poderia me dar umas dicas, to de cabelo em pe por aqui. Obrigado a todos. Ricardo Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 Ola pessoal, estou com um problema aqui que me empacou. Nunca trabalhei com xml_parser e to penando pra extrair os dados em forma de variavel: Alguem poderia me dar umas dicas, to de cabelo em pe por aqui. Bom amigo, se não for realmente necessário usar xml_parser então talvez você possa usar DOM e XPath, é a forma mais rápida de se acessar um valor em um XML: imagine o seguinte arquivo.xml <?xml version="1.0" encoding="utf-8"?> <dados> <linha id='1'> <coluna name='nome'>João Batista Neto</coluna> <coluna name='valor'>27</coluna> </linha> <linha id='2'> <coluna name='nome'>Neto</coluna> <coluna name='valor'>100</coluna> </linha> <linha id='3'> <coluna name='nome'>Teste</coluna> <coluna name='valor'>1</coluna> </linha> </dados> Para acessar dentro da linha com id='2' a coluna com name='nome' $dom = new DOMDocument(); $dom->load( "arquivo.xml" ); $xpath = new DOMXPath( $dom ); $nome = $xpath->query( sprintf( "//dados/linha[ @id=%d ]/coluna[ @name = 'nome' ]/text()" , 2 ) )->item( 0 )->nodeValue; $valor = $xpath->query( sprintf( "//dados/linha[ @id=%d ]/coluna[ @name = 'valor' ]/text()" , 2 ) )->item( 0 )->nodeValue; printf( "O nome é %s e o valor é %d\n" , $nome , $valor ); //O nome é Neto e o valor é 100 Dessa forma, apenas usando XPath você consegue contar, somar, filtrar e buscar qualquer informação em qualquer parte do XML: $valor = $xpath->evaluate( "count(//dados/linha)" ); printf( "Existem %d linhas de dados\n" , $valor ); //Existem 3 linhas de dados $valor = $xpath->evaluate( "sum(//dados/linha/coluna[ @name = 'valor' ])" ); printf( "A soma de todos os valores é %d\n" , $valor ); //A soma de todos os valores é 128 Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 Ola João, Então, o problema é que não tenho opção, tenho que usar o xml_parser pois a resposta vem do servidor e como é uma rotina de pagamento online(cartão de crédito), tenho que manipular esse retorno pra fazer algumas operações internas no nosso site. No caso apenas tenho que pegar um valor e fazer um simples if, mas pra pegar essa variável que esta sendo o problema, se tiver alguma dica extra fico muito agradecido. Muito obrigado. Ricardo Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 Então, o problema é que não tenho opção, tenho que usar o xml_parser pois a resposta vem do servidor e como é uma rotina de pagamento online(cartão de crédito), tenho que manipular esse retorno pra fazer algumas operações internas no nosso site. No caso apenas tenho que pegar um valor e fazer um simples if, mas pra pegar essa variável que esta sendo o problema, se tiver alguma dica extra fico muito agradecido. Você tem um sample do XML ai ? Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 Ola, tenho sim: Abaixo, tenho que pegar este retorno: [4] => Array ( [tag] => Approved [type] => complete [level] => 2 [value] => APPROVED ) em caso APPROVED, ai prossigo com o meu checkout Obrigado! Ricardo Array ( [0] => Array ( [tag] => Result [type] => open [level] => 1 ) [1] => Array ( [tag] => TransTime [type] => complete [level] => 2 [value] => Mon Jul 27 14:48:43 EDT 2009 ) [2] => Array ( [tag] => OrderID [type] => complete [level] => 2 [value] => 2009072714484309874 ) [3] => Array ( [tag] => TransactionType [type] => complete [level] => 2 [value] => SALE ) [4] => Array ( [tag] => Approved [type] => complete [level] => 2 [value] => APPROVED ) [5] => Array ( [tag] => ReturnCode [type] => complete [level] => 2 [value] => Y:123456:0abcdef:M:X:NNN ) [6] => Array ( [tag] => ErrMsg [type] => complete [level] => 2 ) [7] => Array ( [tag] => TaxTotal [type] => complete [level] => 2 [value] => 0.00 ) [8] => Array ( [tag] => ShipTotal [type] => complete [level] => 2 [value] => 0.00 ) [9] => Array ( [tag] => SubTotal [type] => complete [level] => 2 [value] => 10.00 ) [10] => Array ( [tag] => FullTotal [type] => complete [level] => 2 [value] => 10.00 ) [11] => Array ( [tag] => PaymentType [type] => complete [level] => 2 [value] => CC ) [12] => Array ( [tag] => CardNumber [type] => complete [level] => 2 [value] => ......1111 ) [13] => Array ( [tag] => TransRefNumber [type] => complete [level] => 2 [value] => 1be1a8fd42c45f72 ) [14] => Array ( [tag] => CardIDResult [type] => complete [level] => 2 [value] => M ) [15] => Array ( [tag] => AVSResult [type] => complete [level] => 2 [value] => X ) [16] => Array ( [tag] => CardAuthNumber [type] => complete [level] => 2 [value] => 123456 ) [17] => Array ( [tag] => CardRefNumber [type] => complete [level] => 2 [value] => 0abcdef ) [18] => Array ( [tag] => CardType [type] => complete [level] => 2 [value] => VISA ) apenas complementando, tenho esta instrução que não entendi direito: // $vals = array of XML tags Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 Ola, tenho sim: Abaixo, tenho que pegar este retorno: Certo amigão, mas no formato XML. É mais fácil p te ajudar se tiver o XML, no formato que você enviou vou ter que voltar para XML para só então fazer experimentos... ;) Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 Então, ai que mora o perigo, não tem: eu faço um post para o servidor deles e eles retornam uma resposta do servidor. Olha o que tenho aqui deles: Obrigado Ricardo //aqui nest XPost eu passo as variaveis do cartao $XPost = ' <Order> <StoreID>teststore</StoreID> <Passphrase>psigate1234</Passphrase> <Subtotal>'.$_POST["Subtotal"].'</Subtotal> <PaymentType>CC</PaymentType> <CardAction>0</CardAction> <CardNumber>'.$_POST["CardNumber"].'</CardNumber> <CardExpMonth>'.$_POST["CardExpMonth"].'</CardExpMonth> <CardExpYear>'.$_POST["CardExpYear"].'</CardExpYear> <CustomerIP>'.$_POST["CustomerIP"].'</CustomerIP> <CardIDNumber>'.$_POST["CardIDNumber"].'</CardIDNumber> </Order>'; //tem que mandar pra essa url $url = "https://dev.psigate.com:7989/Messenger/XMLMessenger"; $ch = curl_init(); // initialize curl handle curl_setopt($ch, CURLOPT_URL,$url); // set url to post to curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable curl_setopt($ch, CURLOPT_TIMEOUT, 40); // times out after 40s curl_setopt($ch, CURLOPT_POSTFIELDS, $XPost); // add POST fields $result = curl_exec($ch); // run the whole process if (curl_errno($ch)) { print curl_error($ch); } else { curl_close($ch); } echo $result.'<br/>'; //contains response from server << aqui vem uma linha com a resposta do servidor com detalhes da compra, se foi aprovado ou nao..A partir daqui que to empacado // use XML Parser on $result, and your set! $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0); xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1); xml_parse_into_struct($xml_parser, $result, $vals, $index); xml_parser_free($xml_parser); // $vals = array of XML tags. Go get em! Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 echo $result.'<br/>'; //contains response from server << aqui vem uma linha com a resposta do servidor com detalhes da compra, se foi aprovado ou nao..A partir daqui que to empacado hehe, É esse kara que precisamos, ele contém um XML válido e que segue um padrão bem definido. de um var_dump( $result ) que com esse conteúdo conseguiremos matar seu problema. PS. Retire os dados sensitivos do resultado Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 Veja só, acho que eles devem ter algo que protege esse acesso, veja o que retorna: Mon Jul 27 15:16:08 EDT 2009 2009072715160809878 SALE APPROVED Y:123456:0abcdef:M:X:NNN 0.00 0.00 10.00 10.00 CC ......1111 1be1a8fd6b16f196 M X 123456 0abcdef VISA echo $result.'<br/>'; //contains response from server << aqui vem uma linha com a resposta do servidor com detalhes da compra, se foi aprovado ou nao..A partir daqui que to empacado hehe, É esse kara que precisamos, ele contém um XML válido e que segue um padrão bem definido. de um var_dump( $result ) que com esse conteúdo conseguiremos matar seu problema. PS. Retire os dados sensitivos do resultado Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 Veja só, acho que eles devem ter algo que protege esse acesso, veja o que retorna: Se você pegou esse resultado da tela do navegador, você pegou interpretado. O navegador interpreta as tags XML e mostra só o conteúdo text. Abra o código fonte da página que você pegou esse conteúdo que o XML vai estar lá. :D Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 Legal, ta la. Nunca tinha trabalhado com xml pra manipular o resultado antes... O que busco pra comparar e esta linha: <Approved>APPROVED</Approved> <?xml version="1.0" encoding="UTF-8"?> <Result> <TransTime>Mon Jul 27 15:16:08 EDT 2009</TransTime> <OrderID>2009072715160809878</OrderID> <TransactionType>SALE</TransactionType> <Approved>APPROVED</Approved> <ReturnCode>Y:123456:0abcdef:M:X:NNN</ReturnCode> <ErrMsg></ErrMsg> <TaxTotal>0.00</TaxTotal> <ShipTotal>0.00</ShipTotal> <SubTotal>10.00</SubTotal> <FullTotal>10.00</FullTotal> <PaymentType>CC</PaymentType> <CardNumber>......1111</CardNumber> <TransRefNumber>1be1a8fd6b16f196</TransRefNumber> <CardIDResult>M</CardIDResult> <AVSResult>X</AVSResult> <CardAuthNumber>123456</CardAuthNumber> <CardRefNumber>0abcdef</CardRefNumber> <CardType>VISA</CardType> <IPResult>NNN</IPResult> </Result> Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 Legal, ta la. Nunca tinha trabalhado com xml pra manipular o resultado antes... O que busco pra comparar e esta linha: <Approved>APPROVED</Approved> Legal, agora tenta com esse cara aqui: /** * Interpreta o retorno da administradora do cartão e verifica se a transação foi aprovada * @param string $xml O retorno da administradora * @return boolean TRUE se a transação for aprovada */ function isApproved( $xml ){ $ret = false; $dom = new DOMDocument(); $dom->loadXML( $xml ); $xpath = new DOMXpath( $dom ); $apprv = $xpath->query( "//Result/Approved/text()" ); if ( $apprv ){ $ret = (bool) preg_match( "/^APPROVED$/i" , $apprv->item( 0 )->nodeValue ); } return( $ret ); } Esse kara ai em cima faz o trabalho para você, ai para verificar se foi aprovado você faz: if ( isApproved( $result ) ){ echo "Legal, foi aprovado !!!"; } else { echo "Opz..." } Onde $result é a string XML que você recebeu Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 Ta dando este erro: Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /home/bids4job/wwwroot/bids4jobs.com/bids4jobs-psigate/psigate/gateway/xml.php on line 53 na linha 53 tem isso: $ret = (bool) preg_match( "/^APPROVED$/i" , $apprv->item( 0 )->nodeValue ); eu to testando o codigo que me passou logo apos isso: xml_parser_free($xml_parser); esta certo? Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 Ta dando este erro: Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /home/bids4job/wwwroot/bids4jobs.com/bids4jobs-psigate/psigate/gateway/xml.php on line 53 na linha 53 tem isso: $ret = (bool) preg_match( "/^APPROVED$/i" , $apprv->item( 0 )->nodeValue ); eu to testando o codigo que me passou logo apos isso: xml_parser_free($xml_parser); esta certo? Você não vai mais precisar do xml_parser, mas tenta colocar um ponto-e-virgula lá em baixo que eu esqueci: if ( isApproved( $result ) ){ echo "Legal, foi aprovado !!!"; } else { echo "Opz..."; } Se isso não funcionar tenta retirar o cast da frente do preg_match: $ret = preg_match( "/^APPROVED$/i" , $apprv->item( 0 )->nodeValue ); Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 continua com o erro T_OBJECT_OPERATOR tem algum lugar pra eu pesquisar pra te ajudar? Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 continua com o erro T_OBJECT_OPERATOR tem algum lugar pra eu pesquisar pra te ajudar? Amigão, isso está me cheirando PHP antigo, hehehe Tenta usar essa versão da função: /** * Interpreta o retorno da administradora do cartão e verifica se a transação foi aprovada * @param string $xml O retorno da administradora * @return boolean TRUE se a transação for aprovada */ function isApproved( $xml ){ $ret = false; $nodes = simplexml_load_string( $xml ); if ( isset( $nodes->Approved ) ){ $ret = preg_match( "/^APPROVED$/i" , $nodes->Approved ); } return( $ret ); } O uso é exatamente igual: if ( isApproved( $result ) ){ echo "Legal, foi aprovado !!!"; } else { echo "Opz..."; } Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 deu outro erro agora: Call to undefined function: simplexml_load_string() ....on line 43 line 43 > $nodes = simplexml_load_string( $xml ); so uma coisa: isso ai que voce fez esta nesta secao? http://us2.php.net/manual/en/book.xml.php Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 seguinte amigão.....vou ter que ir embora agora porque o pessoal vai encerrar o expediente daqui a pouco, porem vou pesquisar sobre isso que me enviou pra ver se consigo entender pra te ajudar tambem ok, se puder me mandar algo sobre o que devo ler pra entender isso ai que voce ta fazendo seria interesante pois preciso entender isso tambem. Até o momento muitiiiiiiiiiiiiisiiiiiimo obrigado. Vamos nos falando ok? Obrigadão. Ricardo Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2009 deu outro erro agora: Call to undefined function: simplexml_load_string() ....on line 43 Amigão, isso definitivamente é coisa de PHP antigo, hehehehe Versão 3: /** * Interpreta o retorno da administradora do cartão e verifica se a transação foi aprovada * @param string $xml O retorno da administradora * @return boolean TRUE se a transação for aprovada */ function isApproved( $xml ){ $ret = false; $dom = new DOMDocument(); $dom->loadXML( $xml ); if ( ( $approved = $dom->getElementsByTagName( "Approved" ) ) ){ $node = $approved->item( 0 ); $value = $node->nodeValue; if ( preg_match( "/^APPROVED$/i" , $value ) ){ $ret = true; } } return( $ret ); } O uso continua exatamente igual: if ( isApproved( $result ) ){ echo "Legal, foi aprovado !!!"; } else { echo "Opz..."; } so uma coisa: isso ai que voce fez esta nesta secao? http://us2.php.net/m...en/book.xml.php DOM => http://us2.php.net/m...en/book.dom.php Compartilhar este post Link para o post Compartilhar em outros sites
rpa 0 Denunciar post Postado Julho 27, 2009 valeu, vou ver se consigo entender um pouco isso ai. valeu mesmo ! Compartilhar este post Link para o post Compartilhar em outros sites