Skip to content

Instantly share code, notes, and snippets.

@diguinhorocks
Created April 29, 2012 09:45
Show Gist options
  • Save diguinhorocks/2549058 to your computer and use it in GitHub Desktop.
Save diguinhorocks/2549058 to your computer and use it in GitHub Desktop.
PaypalRequest Class (Express Checkout)
<?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&ccedil;&atilde;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'];
}
}
<?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();
@suissa
Copy link

suissa commented May 5, 2012

Tabulação de 4 ficaria mais suave ;D

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment