Cómo usar Paypal en Ruby on Rails

Para el desarrollo de la nueva versión de endeve, nuestra herramienta de gestión online de facturas, hemos estado analizando diferentes pasarelas de pago y sus interfaces con Ruby on Rails. Una de ellas ha sido, por supuesto Paypal, la pasarela más utilizada por los cibernautas a día de hoy. La cuestión es: ¿es sencillo el uso de Paypal con Rails? Ahí va la respuesta.

Lo primero que debes hacer es instalar el plugin Active Merchant, un regalo a la comunidad de los fundadores de la conocida Shopify, y que desde su aparición se ha convertido en la componente de conexión con pasarelas de pago más utilizada en Rails. Lo puedes instalar vía github:

script/plugin install git://github.com/Shopify/active_merchant.git

A continuación, debes abrirte una cuenta en Sandbox, el programa de desarrolladores de Paypal. Crea una cuenta de desarrollador, conéctate y da de alta dos cuentas de prueba: una como vendedor y otra como comprador.

Es importante que estés conectado a tu cuenta en Sandbox mientras haces tus pruebas. De otra forma, el entorno de pruebas no funcionará.

Pasemos ahora a la codificación en Rails. Lo primero que debes hacer es asegurarte que tu aplicación está ejecutándose en modo pruebas, usando Sandbox y no la infraestructura original de Paypal. Añade las siguientes líneas en tu fichero config/environment.rb:

# Ensure the gateway is in test mode
ActiveMerchant::Billing::Base.gateway_mode = :test
ActiveMerchant::Billing::Base.integration_mode = :test
ActiveMerchant::Billing::PaypalGateway.pem_file =  File.read('/paypal/paypal_cert.pem')

Para obtener los certificados de Paypal y crear nuestros propios certificados, necesitas conectarte a Sandbox con tu cuenta de vendedor. Accede a la sección “Perfil > Configuración de pago certificado”, descárgate el certificado público de Paypal y almacénalo en una carpeta a tu elección dentro de tu aplicación. Te recomendamos crear una carpeta exclusiva para todos estos certificados en el directorio raíz de la aplicación.

Ahora vamos a crear nuestros propios certificados. En Linux o Mac OSX lo puedes hacer de la siguiente manera:

openssl genrsa -out my-prvkey.pem 1024
openssl req -new -key my-prvkey.pem -x509 -days 365 -out my-pubcert.pem

El primer comando nos permite crear una clave privada, mientras que el segundo nos ayuda a crear un nuevo certificado público. Pon ambos ficheros en la carpeta donde tienes el certificado de Paypal.

Ahora regresa a tu cuenta de vendedor en Sandbox y sube tu certificado público en la sección “Perfil > Configuración de pago certificado”. Toma nota del identificador que Paypal asigna a tu certificado. Lo necesitarás después para configurar tu pasarela de pago.

A continuación vamos a programar el módulo que se encargará de gestionar todas las comunicaciones encriptadas con Paypal. Crea el fichero lib/crypto42.rb con el siguiente código:

module Crypto42
class Button
def initialize(data)
my_cert_file = Dir.getwd + "/paypal/my-pubcert.pem"
my_key_file = Dir.getwd + "/paypal/my-prvkey.pem"
paypal_cert_file = Dir.getwd + "/paypal/paypal_cert.pem"

IO.popen("/usr/bin/openssl smime -sign -signer #{my_cert_file} -inkey #{my_key_file} -outform der -nodetach -binary | /usr/bin/openssl smime -encrypt -des3 -binary -outform pem #{paypal_cert_file}", 'r+') do |pipe|
data.each { |x,y| pipe << "#{x}=#{y}n" }
pipe.close_write
@data = pipe.read
end
end

def self.from_hash(hs)
self.new hs
end

def get_encrypted_text
return @data
end

end #end button
end #end module

Ahora tenemos el siguiente escenario: el cliente llega a un punto de nuestra web donde le vamos a posibilitar el pago a través de Paypal. Normalmente lo haremos con un botón o enlace a Paypal, que contiene todos los parámetros necesarios para efectuar un pago a través de la pasarela. Cuando seleccione esa opción, será redirigido automáticamente a la página de pago.

Para crear ese botón personalizado con los datos del pago, tenemos que añadir el siguiente código en el controlador que eligamos:


require 'crypto24'
class AccountsController < ApplicationController
include ActiveMerchant::Billing::Integrations

... different user functions ...

#place order is for a specific job
def place_order
@job = Job.find(params[:job_id])
fetch_decrypted(@job)

if @logged_user.credits > 0
render(:action => "confirm_order")
return
else
#place order will have our paypal buttons
render(:action => "place_order")
return
end

rescue ActiveRecord::RecordNotFound
flash[:alert] = "Buying credits for fun?"
redirect_to :action => "profile"
end

...

private
def fetch_decrypted

#los parámetros que podemos pasar a Paypal están definidos en la documentación de la plataforma que encontrarás en el área para desarrolladores

decrypted = {
"cert_id" => "identificador de nuestro certificado paypal",
"cmd" => "_xclick",
"business" => "correo electrónico de nuestra cuenta paypal",
"item_name" => "nombre del artículo",
"item_number" => "1",
"amount" => "75"
"currency_code" => "EUR",
"country" => "ES",
"no_note" => "1",
"no_shipping" => "1",
"return" => "dirección de retorno después del pago"
}

@encrypted_basic = Crypto42::Button.from_hash(decrypted).get_encrypted_text
@action_url = ENV['RAILS_ENV'] == "production" ? "https://www.paypal.com/us/cgi-bin/webscr" : "https://www.sandbox.paypal.com/us/cgi-bin/webscr"
end

Y en la vista asociada donde quieres poner el botón debes tener el siguiente código:

<form action="<%= @action_url %>" method="post">
<input type="hidden" name="cmd" value="_s-xclick" />
<input type="hidden" name="encrypted" value="<%= @encrypted_basic %>" />
<input type="image" src="/images/btn_buynow_SM.jpg" name="submit" alt="3 credits">
</form>

Como puedes comprobar, en el controlador creamos el código necesario para hacer la llamada a Paypal (con los parámetros que estimemos necesarios) y en la vista posicionamos el código creado en forma de formulario.

Y eso es todo. Ahora toca jugar y hacer todas las pruebas que se te ocurran ;-)

4 Comentarios

Avatar del autor Raul, el 3 de Agosto de 2010, a las 3 de Agosto de 2010h. (GMT), dijo:

wooooww y como seria para windows?

Avatar del autor Yadira, el 3 de Agosto de 2010, a las 3 de Agosto de 2010h. (GMT), dijo:

Interesante muchas gracias por esta informacion que bueno que me encontre con esta pagina, ya me estaba dando por vencido en eso de vender con paypal, graicas de nuevo….

Avatar del autor admin, el 3 de Agosto de 2010, a las 3 de Agosto de 2010h. (GMT), dijo:

Exactamente igual a como lo contamos en el artículo.

Avatar del autor Luis, el 25 de Febrero de 2011, a las 25 de Febrero de 2011h. (GMT), dijo:

Muchas gracias, me ha resultado de gran utilidad

Añade tu comentario