Created
April 29, 2012 09:45
-
-
Save diguinhorocks/2549058 to your computer and use it in GitHub Desktop.
PaypalRequest Class (Express Checkout)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* | |
* Paypal Request Class. | |
* | |
* Classe que adiciona os produtos e cria a requisição para a API Paypal utilizando o Express Checkout. | |
* | |
* @author R'Santiago. | |
* @license http://opensource.org/licenses/gpl-license.php GNU Public License | |
* @version 1.0 | |
*/ | |
class PaypalRequest { | |
/** | |
* URL da API | |
* | |
* Pode ser sobreescrito se for utilizado a API de produção. | |
* | |
* @var string | |
*/ | |
protected $apiURL = 'https://api-3t.sandbox.paypal.com/nvp'; | |
/** | |
* URL de redirecionamento para o Checkout | |
* | |
* Pode ser sobreescrito se for utilizado a API de produção. | |
* | |
* @var string | |
*/ | |
protected $paypalURL = 'https://www.sandbox.paypal.com/us/cgi-bin/webscr'; | |
/** | |
* atributo que identifica o método de pagamento usado. | |
* | |
* Mantém-se estático. | |
* | |
* @var string | |
*/ | |
protected $cmd = '_express-checkout'; | |
/** | |
* array com as informações da requisição | |
* | |
* @var array | |
*/ | |
protected $data; | |
/** | |
* total da compra. | |
* | |
* @var integer|0 | |
*/ | |
private $totalAmount = 0; | |
/** | |
* token que será gerado após sucesso na requisição. | |
* | |
* @var string | |
*/ | |
private $token; | |
/** | |
* atributo que identifica a instancia da biblioteca cURL que será utilizada na requisição. | |
* | |
* @var string|null | |
*/ | |
private $curl = null; | |
/** | |
* atributo que carregará a resposta da API após a requisição | |
* | |
* @var array | |
*/ | |
private $response = array(); | |
public function __construct(){ | |
$this->data = array( | |
'PAYMENTREQUEST_0_CURRENCYCODE' => 'USD', | |
'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale', | |
'RETURNURL' =>'', | |
'CANCELURL' => '', | |
'METHOD' => 'SetExpressCheckout', | |
'VERSION' => '65', | |
'PWD' => '', | |
'USER' => '', | |
'SIGNATURE' => '' | |
); | |
} | |
/** | |
* Descrição do Produto | |
* | |
* define a descrição do produto. | |
* | |
* @param integer $i a posição do produto na lista | |
* @param string $value a descrição textual do produto | |
* @return PaypalRequest instance | |
*/ | |
public function setDesc($i, $value){ | |
$this->data['L_PAYMENTREQUEST_0_DESC'.$i] = $value; | |
return $this; | |
} | |
/** | |
* Valor do Produto | |
* | |
* define o valor do produto. | |
* | |
* @param integer $i a posição do produto na lista | |
* @param float $value o valor do produto | |
* @return PaypalRequest instance | |
*/ | |
public function setAMT($i, $value){ | |
$this->data['L_PAYMENTREQUEST_0_AMT'.$i] = $value; | |
$this->totalAmount += $value; | |
return $this; | |
} | |
/** | |
* Nome do Produto | |
* | |
* define o nome do produto. | |
* | |
* @param integer $i a posição do produto na lista | |
* @param string $value o nome textual do produto | |
* @return PaypalRequest instance | |
*/ | |
public function setName($i, $value){ | |
$this->data['L_PAYMENTREQUEST_0_NAME'.$i] = $value; | |
return $this; | |
} | |
/** | |
* Quantidade do Produto | |
* | |
* define a quantidade de cada produto | |
* | |
* @param integer $i a posição do produto na lista | |
* @param integer $value a quantidade do produto | |
* @return PaypalRequest instance | |
*/ | |
public function setQTY($i, $value){ | |
$this->data['L_PAYMENTREQUEST_0_QTY'.$i] = $value; | |
$this->totalAmount += (($this->data['L_PAYMENTREQUEST_0_AMT'.$i] * $value) - $this->data['L_PAYMENTREQUEST_0_AMT'.$i]); | |
return $this; | |
} | |
/** | |
* Checkout | |
* | |
* define o total dos produtos adicionados, obtém a resposta da API e cria o redirecionamento | |
* para o checkout do Paypal em caso de sucesso. Em caso de falha exibe um erro. | |
* | |
* @return void | |
*/ | |
public function checkout(){ | |
$this->setTotalAmount(); | |
$response = $this->buildCURLRequest(); | |
if($this->statusRequest($response) == 'Success'): | |
$this->token = $this->response['TOKEN']; | |
$this->paypalRedirect(); | |
else: | |
echo 'falha na transação'; var_dump($this->response); | |
endif; | |
} | |
// PROTECTED --------------------------------------------------------------------------------------/ | |
/** | |
* Valor Total | |
* | |
* define o valor total dos produtos adicionados. | |
* | |
* @return PaypalRequest instance | |
*/ | |
protected function setTotalAmount(){ | |
$this->data['PAYMENTREQUEST_0_AMT'] = $this->totalAmount; | |
return $this; | |
} | |
/** | |
* Checkout Paypal | |
* | |
* faz o redirecionamento para o checkout Paypal. | |
* | |
* @return void | |
*/ | |
protected function paypalRedirect(){ | |
header( 'Location: ' . $this->paypalURL . '?' . http_build_query( $this->buildQuery() ) ); | |
} | |
/** | |
* Construtor da URL para o checkout Paypal | |
* | |
* @return array | |
*/ | |
protected function buildQuery(){ | |
return array( | |
'cmd' => $this->cmd, | |
'token' => $this->token | |
); | |
} | |
/** | |
* Constructor da requisição HTTP | |
* | |
* seta os parametros para a requisição HTTP via cURL e executa. | |
* | |
* @return string | |
*/ | |
protected function buildCURLRequest(){ | |
$this->curl = curl_init(); | |
curl_setopt( $this->curl , CURLOPT_URL , $this->apiURL ); | |
curl_setopt( $this->curl , CURLOPT_SSL_VERIFYPEER , false ); | |
curl_setopt( $this->curl , CURLOPT_RETURNTRANSFER , 1 ); | |
curl_setopt( $this->curl , CURLOPT_POST , 1 ); | |
curl_setopt( $this->curl , CURLOPT_POSTFIELDS , http_build_query( $this->data ) ); | |
$response = urldecode(curl_exec($this->curl)); | |
curl_close($this->curl); | |
return $response; | |
} | |
/** | |
* Status da requisição | |
* | |
* verifica a condição através de uma análise da XML resultante e envia o status da requisição. | |
* | |
* @return string | |
*/ | |
protected function statusRequest($response){ | |
if (preg_match_all( '/(?<name>[^\=]+)\=(?<value>[^&]+)&?/', $response , $matches)): | |
foreach($matches['name'] as $key => $name): | |
$this->response[$name] = $matches['value'][$key]; | |
endforeach; | |
endif; | |
return $this->response['ACK']; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require('PaypalRequest.php'); // requisição da classe PaypalRequest | |
// instanciando a classe de requisição... | |
$request = new PaypalRequest(); | |
//...setando os produtos ... | |
$request->setName(0, 'Iphone4 Simulator PRO') | |
->setDesc(0, 'PRO Version of Iphone 4 Simulator App.') | |
->setAMT(0, 300.00); | |
// ... e realizando o checkout | |
$request->checkout(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Tabulação de 4 ficaria mais suave ;D