Integração com PagSeguro

Olá pessoal, já vi alguns topicos relacionados ao pagseguro aqui, mas nenhum me atendeu.

Não to conseguindo integrar o pagSeguro ao Yii. Ja inclui a biblioteca do pagSeguro na pasta protected/vendors/

e registrei o autoloader do pagseguro, assim:


Yii::import('application.vendors.PagSeguroLibrary.PagSeguroLibrary');

            

            Yii::registerAutoloader(array('PagSeguroAutoLoader', 'addClass'), true);         

            

            

            

            

            $pagSeguroRequest = new PagSeguroPaymentRequest();

Porém, o Yii gera o erro:


Passed array does not specify an existing static method (class 'PagSeguroAutoLoader' not found) 

Tentei usar a classe PagSeguroLibrary no registerAutoloader também, mas também não dá certo.

Alguém pode me ajudar com isso?

abraço

A maneira que consegui usar a biblioteca do PagSeguro foi colocando, assim como você no diretório vendores.

E para usar o que fiz foi:




Yii::import('application.vendors.*');

require_once('PagSeguroLibrary/PagSeguroLibrary.php');

$paymentRequest = new PaymentRequest();



Veja se funciona para você.

Não funcionou andredelorme. Vc nao mudou nada mais pra usar desse jeito ai?

Veja o arquivo PagSeguroLibray.php

Troque isso:




require_once "loader".DIRECTORY_SEPARATOR."PagSeguroAutoLoader.class.php";

Por


 require_once "PagSeguroLibrary/loader/PagSeguroAutoLoader.class.php";

Pra mim isso funcionou

Abraço

Opa Clayton, tranquilo?

Como vc fez o resto da integração, como chamou a biblioteca do pagseguro?

Faz alguma manipulação com o autoload?

Tentando fazer como em um tutorial que falam sobre a integração com outros frameworks, assim:




spl_autoload_unregister(array('YiiBase', 'autoload'));

            require_once(Yii::app()->basePath .'/vendors/PagSeguroLibrary/PagSeguroLibrary.php');

           spl_autoload_register(array('YiiBase', 'autoload'));



Porém, aí o seguinte erro começa a aparecer.


Fatal error: Class 'CExceptionEvent' not found in D:\3NW\Dev\Yii\yii-1.1.8.r3324\framework\base\CApplication.php on line 703

Dyego,

Qual versão da biblioteca você está usando?

A atual é 2.1.0, quando eu integrei estava na 2.0.0 algo deve ter mudado.

Terei que fazer novos testes para ver a melhor forma.

A documentação da biblioteca do PagSeguro não é muito boa. Não acho um changelog.

To usando a 2.1.0 mesmo.

Tentei chamar ela sem mexer com os autoloads, mas ai ja vai pra um erro diferente.


require_once(Yii::app()->basePath .'/vendors/PagSeguroLibrary/PagSeguroLibrary.php');


PagSeguroLibrary: cURL library is required. 

Entao ativei o cUrl nas configurações do PHP.

Depois disso, o Yii passa a gerar outro erro, esse sim por causa do autoload.

Bom, no fim fiz assim:




spl_autoload_unregister(array('YiiBase', 'autoload'));

require_once(Yii::app()->basePath .'/vendors/PagSeguroLibrary/PagSeguroLibrary.php');

spl_autoload_register(array('YiiBase', 'autoload'));



E ativei o curl nas configurações do php.

Agora parece que deu certo.

Valeu ai pessoal, pela força.

abraço

Alguem poderia cria um tutorial mostrando como integrae e carregar a api v2 do pagseguro no yii. Pois este toppico esta muito confuso.

Obrigado

Pessoal,

eu resolvi o problema de autoloader do Pagseguro alterando o método construtor da classe PagSeguroAutoloader.class.php

Meu construtor está da seguinte maneira:




private function __construct() {

    Yii::registerAutoloader(array($this, 'addClass'), true);

}



Para carregar simplesmente insira no inicio do arquivo da sua classe que deverá usar a biblioteca:




Yii::import('application.vendors.*');

require_once('PagSeguroLibrary/PagSeguroLibrary.php');



Depois de muitos 404, resolvi escrever esse tuts para ajudar o pessoal que usa o PagSeguro.

Achei essas respostas muito confusas mas me ajudou a entender o problema.

O Yii possui um autoload completo e ele impede que outro autoload funcione com ele, então devemos desligar o autoload nativo do Yii para que o autoload do PagSeguro possa funcionar.

acrecente essa linha


spl_autoload_unregister(array('YiiBase','autoload'));

para que o autoload do Yii desligue!

Agora vc vai utilizar 100% da API do PagSeguro

Depois que vc terminar de utilizar a API do Pag Seguro utilize essa linha para ligar novamente o autoload do Yii


spl_autoload_register(array('YiiBase', 'autoload'));

abaixo segue um exemplo completo!

[color="#FF0000"]Biblioteca PagSeguro em PHP

Versão: 2.2.1[/color]




<?php 

class CompraController extends Controller

{		

	public function actionIndex()

	{

		$itens = array(  

			'0' => array(  

				'id' => '0001',  

				'description' => 'Foto 20x30(012455.jpg)',   

				'quantity' => 4,   

				'amount' => number_format('4', 2, '.', ''), //ATENÇÃO A API DO PAGSEGURO NÃO ACEITA NUMERO INTEIROS PORTANDO RECOMENDO UTILIZAR  number_format('$STRING_PREÇO', 2, '.', '')

			),  

			'1' => array(  

				'id' => '0002',  

				'description' => 'Foto 10x15 (DSC_000154.jpg)',   

				'quantity' => 2,  

				'amount' =>number_format('1.85', 2, '.', ''),//ATENÇÃO A API 	" "  " "  " "

			),  

		);

		

		/** INICIO PROCESSO PAGSEGURO */

		//obter uma referência para o caminho das classes PagSeguroLibrary

		$PagSeguroPath = Yii::getPathOfAlias('ext.PagSeguroLibrary');

		// Desligue a biblioteca autoload nativa do Yii

		spl_autoload_unregister(array('YiiBase','autoload'));        

		// Quando desligamos a biblioteca autoload nativa do Yii passamos a usar o autoload do PagSeguroLibrary

		include($PagSeguroPath . DIRECTORY_SEPARATOR . 'PagSeguroLibrary.php');

		//Class PagSeguroPaymentRequest

		$paymentRequest = new PagSeguroPaymentRequest();  

		//Adiciona os itens

		$paymentRequest->setItems($itens);

		//Definindo moeda

		$paymentRequest->setCurrency('BRL');

		// 1- PAC(Encomenda Normal)

		// 2-SEDEX

		// 3-NOT_SPECIFIED(Não especificar tipo de frete)

		$paymentRequest->setShipping(3);

		//Url de redirecionamento

		$paymentRequest->setRedirectURL('URL_DE_RETORNO');

		//Obtendo credenciais do arquivo de configuração

		$credentials = PagSeguroConfig::getAccountCredentials();//credenciais do vendedor

		//$compra_id = App_Lib_Compras::insert($produto);

		$paymentRequest->setReference("00012");//Referencia;

		//Utilizando credenciais definidas no arquivo de configuração

		$url = $paymentRequest->register($credentials);

		//Aqui voltamos a ligar o autoload nativo do Yii

		spl_autoload_register(array('YiiBase', 'autoload'));

		//redireciona comprador para pagina do PagSeguro

		$this->redirect($url);

	}

}



Paga complementar a ajuda do Adriano, vou colocar uma action do um controller, para que você possa resgatar o dados de um pedido, junto com dados do cliente e os itens dos pedidos, assim você consegue montar uma carrinho completo do pagseguro, com quase todos os dados.

E bom quem não tiver usando o composer, que comece a usar, com ele, as atualizações desses pacotes serão sempre atualizadas.

Para quem tiver usando o composer, é so acrescentar "pagseguro/php": "dev-master", no composer.json da sua aplicação, quem não tem o composer instalado pode baixar direto do repositório git do Pagseguro (https://github.com/pagseguro/php)

PagseguroController




public function init() {

        spl_autoload_unregister(array('YiiBase', 'autoload'));

        require_once(Yii::app()->basePath . '/vendors/pagseguro/PagSeguroLibrary.php');

        spl_autoload_register(array('YiiBase', 'autoload'));

    }


    public function actionIndex($id) {




        PagSeguroConfig::setApplicationCharset('UTF-8');


        $paymentRequest = new PagSeguroPaymentRequest();


        $mb_substr = (function_exists("mb_substr")) ? true : false;


        $model = Pedido::model()->findByPk($id);


        /*

         * Dados do cliente

         */


        // Ajuste no nome do comprador para o máximo de 50 caracteres exigido pela API

        $customer_name = trim($model->idCliente->nome);


        if ($mb_substr) {

            $customer_name = mb_substr($customer_name, 0, 50, 'UTF-8');

        } else {

            $customer_name = utf8_encode(substr(utf8_decode($customer_name), 0, 50));

        }


        $paymentRequest->setCurrency('BRL');

        $paymentRequest->setSenderName($customer_name);

        $paymentRequest->setSenderEmail(trim($model->idCliente->email)); // há limitação de 60 caracteres de acordo com a API


        $telefone = preg_replace("/[^0-9]/", '', $model->idCliente->telefone_fixo);


        if (strlen($telefone) == 10) {

            $paymentRequest->setSenderPhone(substr($telefone, 0, 2), substr($telefone, 2, strlen($telefone) - 1));

        }


        /*

         * Frete

         */

        $paymentRequest->setShippingType(3); // 3: Não especificado


        $paymentRequest->setShippingAddress(

                Array(

                    'postalCode' => $model->idCliente->cep,

                    'street' => $model->idCliente->endereco,

                    'number' => $model->idCliente->numero,

                    'complement' => $model->idCliente->complemento,

                    'district' => $model->idCliente->bairro,

                    'city' => $model->idCliente->cidade,

                    'state' => $model->idCliente->estado,

                    'country' => 'BR'

                )

        );


        /*

         * Produtos

         */


        foreach ($model->pedidoItems as $item) {

            // limite de 100 caracteres para a descriço do produto

            if ($mb_substr) {

                $description = mb_substr($item->idProduto->titulo, 0, 100, 'UTF-8');

            } else {

                $description = utf8_encode(substr(utf8_decode($item->idProduto->titulo), 0, 100));

            }


            $item = Array(

                'id' => $item->idProduto->primaryKey,

                'description' => $description,

                'quantity' => $item->quantidade,

                'amount' => $item->valor,

                'weight' => 2 * 1000,

				//'shippingCost' => ($model->envio / count($model->pedido_itens)), //Custo do envio, caso o calculo do correios seja feito pelo projeto

            );


            $paymentRequest->addItem($item);

        }


        // Referência do pedido no PagSeguro

        $paymentRequest->setReference($model->primaryKey . "_pedido");




        // url para redirecionar o comprador ao finalizar o pagamento

        $paymentRequest->setRedirectUrl(Yii::app()->createAbsoluteUrl('pagseguro/success'));


        // obtendo frete, descontos e taxas 

//        $total = number_format($model->envio, 2);

//

//        if ($total > 0) {

//            $item = Array(

//                'id' => 'extra_amount',

//                'description' => $model->descricao_envio,

//                'quantity' => 1,

//                'amount' => $total

//            );

//            $paymentRequest->addItem($item);

//        } else if ($total < 0) {

//            $paymentRequest->setExtraAmount($total);

//        }


        /*

         * Fazendo a chamada para a API de Pagamentos do PagSeguro.

         * Se tiver sucesso, retorna o código (url) de requisição para este pagamento.

         */

        try {

            $credentials = new PagSeguroAccountCredentials('EMAIL_DO_PAGSEGURO', 'TOKEN_DO_PAGSEGURO');

            $url = $paymentRequest->register($credentials);

            $this->redirect($url);

        } catch (PagSeguroServiceException $e) {

            Yii::log('PagSeguro: ' . $e->getMessage(), CLogger::LEVEL_INFO);

            throw new Exception($e->getMessage());

        }

    }