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
- if @order.success?
%p The transaction is successfully completed
- else
%p The transaction failed
Blog Logo

Sandip Ransing


Published

Image

Fun On Rails

Journal of a Web Developer #ruby #rails #JS

Back to Overview