read
Authorize Net SIM gateway transaction skips merchant side creditcard details form and directs transaction to be take place on gateway server.
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'># Gemfile
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>gem ‘authorize-net’</div></div></pre></div>
Register for authorize net sandbox account click here
Payment gateway credentials
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'># config/gateway.yml
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>development: &development
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> mode: test
</div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'> login: 9gdLh6T
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'> key: 67fu45xw6VP92LX1
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'>production:
</div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> <<: *development
</div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='10' class='code-highlight-row numbered'><div class='code-highlight-line'>test:
</div></div><div data-line='11' class='code-highlight-row numbered'><div class='code-highlight-line'> <<: *development</div></div></pre></div>
Generate & Migrate Payment Model
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>rails g model payment status : string amount : float transaction_number : string
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>rake db : migrate </div></div></pre></div>
SIM gateway methods extracted and added to payment model
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'># app/models/payment.rb
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>class Payment < ActiveRecord :: Base
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'> PROCESSING , FAILED , SUCCESS = 1 , 2 , 3
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> validates :amount , :presence => true , :numericality => { :greater_than => 0 }
</div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> def self . conf
</div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'> @@gateway_conf ||= YAML . load_file ( Rails . root . join ( 'config/gateway.yml' ) . to_s ) [ Rails . env ]
</div></div><div data-line='10' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='11' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='12' class='code-highlight-row numbered'><div class='code-highlight-line'> def success?
</div></div><div data-line='13' class='code-highlight-row numbered'><div class='code-highlight-line'> self . status == SUCCESS
</div></div><div data-line='14' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='15' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='16' class='code-highlight-row numbered'><div class='code-highlight-line'> ## Authorize :: SIM
</div></div><div data-line='17' class='code-highlight-row numbered'><div class='code-highlight-line'> def setup_transaction ( options = {})
</div></div><div data-line='18' class='code-highlight-row numbered'><div class='code-highlight-line'> options . merge! ( :link_method => AuthorizeNet :: SIM :: HostedReceiptPage :: LinkMethod :: POST )
</div></div><div data-line='19' class='code-highlight-row numbered'><div class='code-highlight-line'> t = AuthorizeNet :: SIM :: Transaction . new (
</div></div><div data-line='20' class='code-highlight-row numbered'><div class='code-highlight-line'> auth [ 'login' ] , auth [ 'key' ] , amount ,
</div></div><div data-line='21' class='code-highlight-row numbered'><div class='code-highlight-line'> :hosted_payment_form => true ,
</div></div><div data-line='22' class='code-highlight-row numbered'><div class='code-highlight-line'> :test => auth [ 'mode' ]
</div></div><div data-line='23' class='code-highlight-row numbered'><div class='code-highlight-line'> )
</div></div><div data-line='24' class='code-highlight-row numbered'><div class='code-highlight-line'> t . set_hosted_payment_receipt ( AuthorizeNet :: SIM :: HostedReceiptPage . new ( options ))
</div></div><div data-line='25' class='code-highlight-row numbered'><div class='code-highlight-line'> return t
</div></div><div data-line='26' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='27' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='28' class='code-highlight-row numbered'><div class='code-highlight-line'> def auth
</div></div><div data-line='29' class='code-highlight-row numbered'><div class='code-highlight-line'> self . class . conf
</div></div><div data-line='30' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='31' class='code-highlight-row numbered'><div class='code-highlight-line'>end </div></div></pre></div>
Payment routes
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>## Callback URL
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>match '/billing/:id/confirm' , :to => 'billing#authorize' , :as => :confirm_billing
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'>## Request URL
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'>match '/billing/:id' , :to => 'billing#checkout' , :as => :billing
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'>match '/billing/:id/thank_you' , :to => 'billing#thank_you' , :as => :thank_you_billing </div></div></pre></div>
Billing controller
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'># app/controllers/billing_controller.rb
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>class BillingController < ApplicationController
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> helper :authorize_net
</div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'> before_filter :get_order , :only => [ :checkout , :authorize , :thank_you ]
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'> def checkout
</div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> # ASSUMPTION order is valid means amount is entered
</div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'> @transaction = @order . setup_transaction (
</div></div><div data-line='10' class='code-highlight-row numbered'><div class='code-highlight-line'> { :link_text => 'Continue' ,
</div></div><div data-line='11' class='code-highlight-row numbered'><div class='code-highlight-line'> :link_url => confirm_billing_url ( @order )})
</div></div><div data-line='12' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='13' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='14' class='code-highlight-row numbered'><div class='code-highlight-line'> ## CALL BACK
</div></div><div data-line='15' class='code-highlight-row numbered'><div class='code-highlight-line'> def authorize
</div></div><div data-line='16' class='code-highlight-row numbered'><div class='code-highlight-line'> resp = AuthorizeNet :: SIM :: Response . new ( params )
</div></div><div data-line='17' class='code-highlight-row numbered'><div class='code-highlight-line'> if resp . approved?
</div></div><div data-line='18' class='code-highlight-row numbered'><div class='code-highlight-line'> @order . status = Payment :: SUCCESS
</div></div><div data-line='19' class='code-highlight-row numbered'><div class='code-highlight-line'> @order . transaction_num = resp . transaction_id
</div></div><div data-line='20' class='code-highlight-row numbered'><div class='code-highlight-line'> else
</div></div><div data-line='21' class='code-highlight-row numbered'><div class='code-highlight-line'> @order . status = Payment :: FAILED
</div></div><div data-line='22' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='23' class='code-highlight-row numbered'><div class='code-highlight-line'> @order . save ( :validate => false )
</div></div><div data-line='24' class='code-highlight-row numbered'><div class='code-highlight-line'> redirect_to thank_you_billing_url ( @order )
</div></div><div data-line='25' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='26' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='27' class='code-highlight-row numbered'><div class='code-highlight-line'> private
</div></div><div data-line='28' class='code-highlight-row numbered'><div class='code-highlight-line'> def auth
</div></div><div data-line='29' class='code-highlight-row numbered'><div class='code-highlight-line'> Payment . conf
</div></div><div data-line='30' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='31' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='32' class='code-highlight-row numbered'><div class='code-highlight-line'> def get_order
</div></div><div data-line='33' class='code-highlight-row numbered'><div class='code-highlight-line'> @order = Payment . find_by_id ( params [ :id ] )
</div></div><div data-line='34' class='code-highlight-row numbered'><div class='code-highlight-line'> @order && @order . valid? || invalid_url
</div></div><div data-line='35' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='36' class='code-highlight-row numbered'><div class='code-highlight-line'>end </div></div></pre></div>
View Forms
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'># app/views/billing/checkout.html.haml
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>= form_for :sim_transaction , :url => AuthorizeNet :: SIM :: Transaction :: Gateway :: TEST , :html => { :id => :authForm } do | f |
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> = sim_fields ( @transaction )
</div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'>:javascript
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'> $(document).ready(function(){
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> $('#authForm').submit();
</div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'> }) </div></div></pre></div>
# app/views/billing/thank_you.html.haml
%p The transaction is successfully completed
%p The transaction failed