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