Search code examples
ruby-on-railsrubypaypalactivemerchant

Paypal Express Checkout in Rails3


This issue is about: ActiveMerchant + PaypalExpressCheckout + Rails 3.2

I've been trying to build a Paypal Express Checkout on my Rails 3.2 app. Most of the tutorials out there are outdated so I followed a few then read the Paypal Express Checkout integration guide. I've already set up my Sandobx and my paypal informations.

When I try to process the payment by clicking on my "Buy now" link from my view:

<%= link_to image_tag('http://img36.imageshack.us/img36/249/buttonpaypal.png'),
action: 'checkout', controller: 'orders'%>

I am getting the following error:

This transaction is invalid. Please return to the recipient's website to complete
you transaction using their regular checkout flow.

Return to merchant
At this time, we are unable to process your request. Please return to and try
another option.

--- My Controller:

class OrdersController < ApplicationController
  include ActiveMerchant::Billing 
  def checkout
   setup_response = ::GATEWAY.setup_purchase(2000,
        :ip                => request.remote_ip,
        :return_url        => url_for('confirm'),
        :cancel_return_url => url_for(root_path)
   ) 
  redirect_to ::GATEWAY.redirect_url_for(setup_response.token)
 end
end

--- My Initializer ActiveMerchant.rb:

 ActiveMerchant::Billing::Base.mode = :test
  ::GATEWAY = ActiveMerchant::Billing::PaypalExpressGateway.new(
  :login => "I_PUT_MY_EMAIL_HERE",
  :password => "I_PUT_MY_PASS_HERE",
  :signature => "I_PUT_MY_SIGNATURE_HERE",
  :allow_guest_checkout => true
 )

--- My routes: routes.rb:

 resources :orders do
   # Im not sure why 'get :checkout' by itself doesn't work.
   get :checkout, :on => :new
   get :confirm
   get :complete
 end

get "pages/index"

This is the gist: https://gist.github.com/11be6cef6a97632343b9

Can anyone point me to a 'recent' tutorial or help me figure out what I am doing wrong here?


Solution

  • The easiest way is to do as follow:

    1.) You must create a paypal test account.

    2.) Create a Cart Model:

    $ rails g model Cart purchased_at:datetime
    

    3.) In your Cart Model Type:

    class Cart < ActiveRecord::Base
    
      def paypal_url(return_url)
    
        values = {
          # get it form your http://sandbox.paypal.com account
          :business => 'ENTER_THE_SELLER_PAYPAL_EMAIL_ADDRESS',
          :cmd => '_cart',
          :upload => 1,
          :return => return_url,
          :invoice => id
        }
        # These values set up the details for the item on paypal.
           values.merge!({
            # The amount is in cents
            "amount_1" => ENTER_AN_AMOUNT_HERE,
            "item_name_1" => ENTER_THE_ITEM_NAME_HERE,
            "item_number_1" => 1,
            "quantity_1" => 1
          })
    
        "https://www.sandbox.paypal.com/cgi-bin/webscr?" + values.to_query
    
      end
    end
    

    4.) On the appllication_controller.rb file add this

      def current_cart
         session[:cart_id] ||= Cart.create!.id
         @current_cart ||= Cart.find(session[:cart_id])
       end
    

    5.) On your the view where you want the checkout button add this:

    # 'products_url' is just the url where you would like to redirect
    # the user after the transaction
    <%= link_to 'Buy with PAYPAL', @cart.paypal_url(products_url) %>
    

    6.) On the controller show action of the view where you want the checkout add this:

    def show
      ...
      @cart = current_cart
    end
    

    Thats it! This is a PaypalExpressCheckout without a 'real' Cart since I built this Cart without using a Line Item. But you could add a Line Item to it following the Railscast #141 Paypal Basics http://railscasts.com/episodes/141-paypal-basics