gremio10 14 Denunciar post Postado Outubro 10, 2011 Fala Galera, eu estou trabalhando com valores salvos no banco de dados, e na hora de transformar ele em inteiro, e enviar para o Gateway de pagamento, ele me retorna não capturado, o estranho é que se na variável eu colocar um valor inteiro, ex: 1000, ele captura, dando o retorno correto. esse é a tabela que busca os valores CREATE TABLE `payment_way` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `payment` varchar(50) DEFAULT NULL, `value` int(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 eu mando do value, que vem (string) virar (int), mas ele não consegue pegar. Estou usando a classe da Cielo do João Batista, que funciona perfeitamente, mas é esse problema que está me encomodando =)... Obrigado pela ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Outubro 10, 2011 Isso aqui `value` int(10) DEFAULT NULL, Não seria um decimal ou float ? afinal, em qual das colunas você guarda o valor do pagamento ? Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 10, 2011 Guardo no value, apenas criei o banco, isso ele gera automaticamente :lol: Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Outubro 10, 2011 Então guarde certo no banco. Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 10, 2011 Mas ele está correto, só que ele vem do banco em string, e quando transformo para (int) ele parece não ser enviado como tal. Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Outubro 10, 2011 Valor monetário deve ser tratado como tipo float e não int. Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 10, 2011 Eu estou trabalhando com valores inteiros, não estou mexendo neles como monetário. Apenas estou me referindo que quando busco o valor inteiro do meu banco, ele vem em formato string, e quando o transformo para int novamente, a Cielo não consegue capturar, e quando eu coloco um valor estático na variável, ele consegue. Compartilhar este post Link para o post Compartilhar em outros sites
Periscuelo 20 Denunciar post Postado Outubro 10, 2011 Amigo gremio10, Já tentou debugar? var_dump($variavel) para ver se realmente ela é do tipo int no momento de enviar o valor para captura? Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 10, 2011 Eu estou fazendo isso, quando ele vem do banco ele me retorna string '1990' (length=4) quando eu dou o (int) int 1990 quando dou o (float) float 1990 :huh: estranho =) Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Outubro 10, 2011 Pois é .. estranho .. mysql> use imasters; Database changed mysql> create table cielo( -> valor int( 11 ) not null -> )engine = myisam; Query OK, 0 rows affected (0.14 sec) mysql> insert into cielo values( 100 ) , ( 100.00 ) , ( '100.00' ) , ( '100' ) ; Query OK, 4 rows affected (0.06 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from cielo; +-------+ | valor | +-------+ | 100 | | 100 | | 100 | | 100 | +-------+ 4 rows in set (0.03 sec) mysql> alter table cielo add valor1 float( 9 , 2 ); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from cielo; +-------+--------+ | valor | valor1 | +-------+--------+ | 100 | NULL | | 100 | NULL | | 100 | NULL | | 100 | NULL | +-------+--------+ 4 rows in set (0.00 sec) mysql> update cielo set valor1 = 100.00 ; Query OK, 4 rows affected (0.05 sec) Rows matched: 4 Changed: 4 Warnings: 0 mysql> select * from cielo; +-------+--------+ | valor | valor1 | +-------+--------+ | 100 | 100.00 | | 100 | 100.00 | | 100 | 100.00 | | 100 | 100.00 | +-------+--------+ 4 rows in set (0.00 sec) mysql> Saída: <?php $Numbers = Array ( 100.00 , 100 , '100' ) ; echo '<pre>'; var_dump ( $Numbers ) ; $a = ( int ) $Numbers[ 0 ] ; $b = ( int ) $Numbers[ 1 ] ; $c = ( int ) $Numbers[ 2 ] ; var_dump( $a , $b , $c ) ; $PDO = new PDO( 'mysql:dbname=imasters' , 'root' , '?' ); $Data = $PDO->query( 'SELECT * FROM `cielo`' )->fetchAll( PDO::FETCH_ASSOC ) ; var_dump ( $Data ) ; $a = ( int ) $Data[ 0 ][ 'valor' ] ; $b = ( int ) $Data[ 1 ][ 'valor' ] ; $c = ( int ) $Data[ 2 ][ 'valor' ] ; $d = ( int ) $Data[ 3 ][ 'valor' ] ; $aa = ( float ) $Data[ 0 ][ 'valor1' ] ; $bb = ( float ) $Data[ 1 ][ 'valor1' ] ; $cc = ( float ) $Data[ 2 ][ 'valor1' ] ; $dd = ( float ) $Data[ 3 ][ 'valor1' ] ; var_dump ( $a , $b , $c , $d , $aa , $bb , $cc , $dd ); Saída: array(3) { [0]=> float(100) [1]=> int(100) [2]=> string(3) "100" } int(100) int(100) int(100) array(4) { [0]=> array(2) { ["valor"]=> string(3) "100" ["valor1"]=> string(6) "100.00" } [1]=> array(2) { ["valor"]=> string(3) "100" ["valor1"]=> string(6) "100.00" } [2]=> array(2) { ["valor"]=> string(3) "100" ["valor1"]=> string(6) "100.00" } [3]=> array(2) { ["valor"]=> string(3) "100" ["valor1"]=> string(6) "100.00" } } int(100) int(100) int(100) int(100) float(100) float(100) float(100) float(100) Isso aí ta me cheirando bug :) Mostra como você está atrelando isso no método que seta o valor do pagamento da cielo. Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 10, 2011 $profissionais_payment_way = new Application_Model_ProfissionalPaymentWay(); $paymentWay = $profissionais_payment_way->listByUserId( $field[ "id" ] ); valuePay = (int)$paymentWay[ "value" ]; Zend_Debug::dump( $paymentWay[ "value" ] );exit; if( $creditCard[ "credit_card_id" ] == 1 ) { $card = Zend_Cielo_Cielo_CreditCard::VISA; } else { $card = Zend_Cielo_Cielo_CreditCard::MASTER_CARD; } $cielo = new Zend_Cielo_Execute_Payment(); $cielo->setCard( $card ); $orderNumber = $field[ "id" ]; $orderValue = $valuePay; $paymentProduct = Zend_Cielo_Cielo_PaymentProduct::ONE_TIME_PAYMENT; $cielo_id = $cielo->buildRequest( $creditCard[ "card_number" ], $creditCard[ "card_validation" ], 1, $creditCard[ "card_security_code" ], $orderNumber, $orderValue, $paymentProduct ); Zend_Cielo_Cielo_Execute_Payment() <?php class Zend_Cielo_Execute_Payment { protected $card; public function buildRequest( $cardNumber, $cardExpiration, $indicator, $securityCode, $orderNumber, $orderValue, $paymentProduct, $parcels = 1 ) { if( $this->getCard() == "" || is_null( $this->getCard() ) ) { throw new Zend_Exception( "Você deve atribuir um valor para o cartão." ); exit; } $cardNumber = $this->decode( $cardNumber ); $securityCode = $this->decode( $securityCode ); $orderValue = (float)$orderValue; $cielo = new Zend_Cielo_Cielo_Cielo( Zend_Cielo_Cielo_CieloMode::DEPLOYMENT ); $cielo->setAffiliationCode( "xx" ); $cielo->setAffiliationKey( "xx" ); $tid = $cielo->buildTIDRequest( $this->getCard(), Zend_Cielo_Cielo_PaymentProduct::ONE_TIME_PAYMENT )->call()->getTID(); $transaction = $cielo ->automaticCapture() ->buildAuthorizationRequest( $tid, $this->getCard(), $cardNumber, $cardExpiration, $indicator, $securityCode, $orderNumber, $orderValue, $paymentProduct ) ->call(); $authorization = $transaction->getAuthorization(); try { $transactionTID = $transaction->getTID(); $transactionPan = $transaction->getPan(); $transactionStatus = $transaction->getStatus(); $authorizationValue = $authorization->getValue(); $authorizationDateTime = $authorization->getDateTime(); $card = array(); $card[ "tid" ] = $transactionTID; $card[ "pan" ] = $transactionPan; $card[ "status" ] = $transactionStatus; $card[ "value" ] = $authorizationValue; $card[ "date" ] = $authorizationDateTime; $card[ "profissionais_id" ] = $orderNumber; //id do profissional $cielo = new Application_Model_Cielo(); $cielo_id = $cielo->insert( $card ); return $cielo_id; } catch( Zend_Db_Table_Exception $e ) { } } } Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Outubro 10, 2011 Uma coisa é bom lembrar que para simular uma transação autorizada, é necessário que no valor da transação os dois últimos dígitos seja 0. Do contrário, toda autorização será negada, fiz um experimento aqui .. realmente está negando as autorizações, mesmo passando o valor diretamente. Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 10, 2011 Estranho Andrey, pois pra mim quando eu tentei, ele me retornou status 6, de capturado... Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 18, 2011 é necessário que no valor da transação os dois últimos dígitos seja 0 obrigado Andrey pela dica, dei uma lida novamente no que você falou e mudei os valores no meu banco, e realmente, como você falou, quando coloquei dois 0 ele foi capturado corretamente. Abraços. Compartilhar este post Link para o post Compartilhar em outros sites