Paypal NVP API con Codeigniter

Las tiendas online son uno de los productos más usados en desarrollo web, pero suele ser lo que más dolores de cabeza da debido al pago por tarjeta de crédito. Afortunadamente, Paypal ofrece la posibilidad de pagar mediante tarjeta de crédito. Para ello, Paypal dispone de una API NVP muy cómoda de usar.

Para los usuarios de Codeigniter existe una librería que nos facilita toda la tarea. En el controlador primero debemos indicar el SetExpressCheckout que prepara la transacción. Cuando aceptemos el OK de la llamada se redireccionará a Paypal para que el usuario pueda realizar la compra, que devolverá la llamada a una URL nuestra y en ese caso, cogiendo los datos devueltos por Paypal podremos confirmar la transacción:

define('PAYPAL_URL', 'https://www.sandbox.paypal.com/webscr&cmd=_express-checkout&token=');

class Demo extends Controller {

    function Demo()
    {
        parent::Controller();
    }

    function index() {
    $this->paypal_api_lib->add_nvp('RETURNURL', 'http://servidor/demo/ok');
    $this->paypal_api_lib->add_nvp('CANCELURL', 'http://servidor/demo/cancel');
    $this->paypal_api_lib->add_nvp('NOSHIPPING', '0');
    $this->paypal_api_lib->add_nvp('ALLOWNOTE', '1');
    $this->paypal_api_lib->add_nvp('SOLUTIONTYPE', 'Sole'); // esto es lo que no obliga a que se tenga que tener cuenta Paypal
    $this->paypal_api_lib->add_nvp('LANDINGPAGE', 'Billing');
    $this->paypal_api_lib->add_nvp('AMT', '69.00');
    $this->paypal_api_lib->add_nvp('NOSHIPPING', '2');
    $this->paypal_api_lib->add_nvp('HDRIMG', 'http://servidor/logo.gif');
    $this->paypal_api_lib->add_nvp('CURRENCYCODE', 'EUR');
    $this->paypal_api_lib->add_nvp('L_NAME0', 'Librito');
    $this->paypal_api_lib->add_nvp('L_AMT0', '59.00');
    
    $this->load->library('session');
    $sesion = array('paypalAmount'=>'69.00');
    $this->session->set_userdata($sesion);

    if($this->paypal_api_lib->send_api_call('SetExpressCheckout')){
      if (strtoupper($this->paypal_api_lib->nvp_data["ACK"]) =="SUCCESS") {
                    $token = urldecode($this->paypal_api_lib->nvp_data["TOKEN"]);
                    $payPalURL = PAYPAL_URL.$token;
                    header("Location: ".$payPalURL);
          exit();
      }
    }
    paypal_errors(); 
  }
    
  function ok() {
    $this->load->library('session');

    $this->paypal_api_lib->add_nvp('TOKEN', $_REQUEST['token']);
    $this->paypal_api_lib->add_nvp('PAYERID', $_REQUEST['PayerID']);
    $this->paypal_api_lib->add_nvp('PAYMENTACTION', 'Sale');
    $this->paypal_api_lib->add_nvp('AMT', $this->session->userdata('paypalAmount'));
    $this->paypal_api_lib->add_nvp('CURRENCYCODE', 'EUR');
    $this->paypal_api_lib->add_nvp('IPADDRESS', $_SERVER['SERVER_NAME']);

    if($this->paypal_api_lib->send_api_call('DoExpressCheckoutPayment')) {
      var_dump($this->paypal_api_lib->nvp_data);
    } else {
      paypal_errors();
    }
  }

}

CI PayPal NVP Library

|

Nueva AWS SDK for PHP

La gente de Amazon ha sacado una nueva SDK PHP para AWS que puede ser usada para acceder a los servicios que ofrece: Amazon Elastic Compute Cloud (EC2), the Amazon Simple Storage Service (S3), Amazon CloudFront, Amazon CloudWatch, Amazon SimpleDB, Amazon Simple Notification Service (SNS), Amazon Simple Queue Service (SQS) y Amazon Identify and Access Management (IAM).

Post original

Curiosa creación de objetos en PHP

Recuerda mucho a Javascript y frameworks tipo jQuery, para ello utiliza métodos encadenados y un objeto genérico:


// Define a new class
$animal = $class->new()
  ->def('init', function($t, $name) {
    $t->name = $name;
  })
  ->def('speak', function($t) {
    echo "My name is $t->name\n";
  });

// Extend a class
$dog = $animal->extend()
  ->def('speak', function($t) {
    echo "My name is $t->name, I have just met you and I love you, SQUIRREL!\n";
  })
  ->def('bark', function($t) {
    echo "Woof!\n";
  });

Para poder realizar esto se necesita crear la clase Obj:

class Obj {
  public function __construct($methods=array()) {
    $this->methods = $methods;
  }

  public function method($name) {
    if (!isset($this->methods[$name]))
      throw new BadMethodCallException();
    return $this->methods[$name];
  }

  public function fn($name, $fn) {
    $this->methods[$name] = $fn;
    return $this;
  }

  public function __call($name, $args) {
    return call_user_func_array(
      $this->method($name),
      array_merge(array($this), $args)
    );
  }
}

// Allow chaining method calls off the constructor..
function Obj($methods=array())
{
return new Obj($methods);
}

PHP Object Oriented Programming Reinvented

Vía / PHPDeveloper.org

Carga asíncrona de scripts en Webkit

Webkit está implementando en la última versión la carga de scripts de forma asíncrona, para ello hace uso de los atributos async y defer. Esta carga de scripts se realiza sin detener el renderizado del HTML y añade el evento onLoad para ejecutar un método cuando acabe de cargarse:


La diferencia entre async y defer es que async se ejecuta a la primera oportunidad después de que finalice la carga y antes de que se ejecute el evento load del objeto window, por lo que con bastante posibilidad el script se ejecute asíncronamente y no en el orden en el que se muestra en al página. Los scripts defer se ejecutarán en el orden en el que se indica en la página, pero empezará despues del parseo completo pero antes de que ocurra el evento DOMContentLoaded del objeto document.

Running scripts in WebKit

Vía / CSS-Tricks

Obtener URLs para usuarios en Codeigniter

Codeigniter tiene una método para tratar con las URLs: http://dominio/controlador/metodo/param1/param2/… El problema viene cuando nuestra aplicación necesita URLs diferentes, como las de Twitter u otra red social, que son del tipo http://dominio/username.

Para ello primero se debe cambiar el archivo routes.php de la configuración:

//Excluir estos controladores cuando se generan las URLs
$route['(login|oauth|site|search)(.*)'] = '$1$2';  
 
//Las URLs de los usuarios
$route['[a-zA-Z0-9]+/(add|edit)'] = 'users/$1';
$route['[a-zA-Z0-9]+'] = 'users/profile';

Después habrá que modificar el .htaccess para usar APP_PATH:

RewriteEngine On
 
RewriteBase /
 
RewriteCond %{ENV:REDIRECT_APP_PATH} !^$
RewriteRule ^(.*)$ - [E=APP_PATH:%{ENV:REDIRECT_APP_PATH}]
 
RewriteCond %{ENV:APP_PATH} ^$
RewriteRule ^(.*)$ - [E=APP_PATH:/$1]
 
RewriteCond $1 !^(index\.php|img|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

Y por último modificar el config.php para indicar que debe usar el APP_PATH:

$config['uri_protocol']    = "APP_PATH";
 
$config['enable_query_strings'] = TRUE;

Codeigniter Vanity URLs

Vía / PHPDeveloper.org

|

HTML5′s “email” and “url” Input Types

I’ve already covered some subtle HTML5 improvements like placeholder, prefetching, and web storage.  Today I want to introduce a few new INPUT element types:  email and url.  Let’s take a very basic look at these new INPUT types and discuss their advantages.The SyntaxThe syntax is as basic as a text input;  instead, you set the type to “email” or “ …

Post original