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 ;-)

Añade tu comentario