spree_gateway 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +22 -0
  5. data/Gemfile +14 -0
  6. data/LICENSE +26 -0
  7. data/README.md +68 -0
  8. data/Rakefile +14 -0
  9. data/Versionfile +12 -0
  10. data/app/controllers/spree/checkout_controller_decorator.rb +51 -0
  11. data/app/controllers/spree/skrill_status_controller.rb +39 -0
  12. data/app/models/spree/billing_integration/skrill/quick_checkout.rb +52 -0
  13. data/app/models/spree/gateway/authorize_net.rb +18 -0
  14. data/app/models/spree/gateway/authorize_net_cim.rb +134 -0
  15. data/app/models/spree/gateway/balanced_gateway.rb +68 -0
  16. data/app/models/spree/gateway/banwire.rb +16 -0
  17. data/app/models/spree/gateway/beanstream.rb +195 -0
  18. data/app/models/spree/gateway/braintree_gateway.rb +143 -0
  19. data/app/models/spree/gateway/card_save.rb +12 -0
  20. data/app/models/spree/gateway/data_cash.rb +12 -0
  21. data/app/models/spree/gateway/eway.rb +22 -0
  22. data/app/models/spree/gateway/fatzebra.rb +17 -0
  23. data/app/models/spree/gateway/klarna.rb +0 -0
  24. data/app/models/spree/gateway/linkpoint.rb +30 -0
  25. data/app/models/spree/gateway/moneris.rb +13 -0
  26. data/app/models/spree/gateway/pay_junction.rb +18 -0
  27. data/app/models/spree/gateway/pay_pal_gateway.rb +14 -0
  28. data/app/models/spree/gateway/payflow_pro.rb +19 -0
  29. data/app/models/spree/gateway/paymill.rb +15 -0
  30. data/app/models/spree/gateway/pin_gateway.rb +18 -0
  31. data/app/models/spree/gateway/sage_pay.rb +13 -0
  32. data/app/models/spree/gateway/samurai.rb +65 -0
  33. data/app/models/spree/gateway/secure_pay_au.rb +10 -0
  34. data/app/models/spree/gateway/stripe_gateway.rb +94 -0
  35. data/app/models/spree/gateway/usa_epay.rb +11 -0
  36. data/app/models/spree/gateway/worldpay.rb +96 -0
  37. data/app/models/spree/payment_decorator.rb +3 -0
  38. data/app/models/spree/skrill_transaction.rb +21 -0
  39. data/app/views/spree/admin/payments/source_forms/_quickcheckout.html.erb +8 -0
  40. data/app/views/spree/admin/payments/source_views/_quickcheckout.html.erb +39 -0
  41. data/app/views/spree/checkout/payment/_quickcheckout.html.erb +26 -0
  42. data/config/locales/bg.yml +11 -0
  43. data/config/locales/de.yml +11 -0
  44. data/config/locales/en.yml +11 -0
  45. data/config/locales/sv.yml +11 -0
  46. data/config/routes.rb +13 -0
  47. data/db/migrate/20111118164631_create_skrill_transactions.rb +14 -0
  48. data/db/migrate/20121017004102_update_braintree_payment_method_type.rb +9 -0
  49. data/db/migrate/20130213222555_update_stripe_payment_method_type.rb +9 -0
  50. data/db/migrate/20130415222802_update_balanced_payment_method_type.rb +9 -0
  51. data/db/migrate/20131008221012_update_paypal_payment_method_type.rb +9 -0
  52. data/lib/active_merchant/billing/skrill.rb +18 -0
  53. data/lib/generators/spree_gateway/install/install_generator.rb +28 -0
  54. data/lib/spree_gateway.rb +3 -0
  55. data/lib/spree_gateway/engine.rb +41 -0
  56. data/script/rails +5 -0
  57. data/spec/factories/payment_method_factory.rb +4 -0
  58. data/spec/models/gateway/authorize_net_cim_spec.rb +17 -0
  59. data/spec/models/gateway/authorize_net_spec.rb +17 -0
  60. data/spec/models/gateway/balanced_gateway_spec.rb +9 -0
  61. data/spec/models/gateway/banwire_spec.rb +9 -0
  62. data/spec/models/gateway/braintree_gateway_spec.rb +284 -0
  63. data/spec/models/gateway/eway_spec.rb +17 -0
  64. data/spec/models/gateway/fatzebra_spec.rb +47 -0
  65. data/spec/models/gateway/linkpoint_spec.rb +60 -0
  66. data/spec/models/gateway/pay_junction_spec.rb +17 -0
  67. data/spec/models/gateway/payflow_pro_spec.rb +17 -0
  68. data/spec/models/gateway/pin_gateway_spec.rb +57 -0
  69. data/spec/models/gateway/stripe_gateway_spec.rb +122 -0
  70. data/spec/models/gateway/usa_epay_spec.rb +38 -0
  71. data/spec/spec_helper.rb +34 -0
  72. data/spree_gateway.gemspec +26 -0
  73. metadata +91 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1d6164f4cdf0a191ec9230b1b7546f07ffad07a2
4
- data.tar.gz: 51b34f3729462f4d6cb165d46e6f18629fb6f845
3
+ metadata.gz: bafe8ca30672c3d4623c11485ee16f9f7f811f9a
4
+ data.tar.gz: 1d688f69623c2094ae6acb19625c794cf709fa46
5
5
  SHA512:
6
- metadata.gz: a62b868cfe439873de012489893f214fb91437d831b54227e020cd7c1abe4e3a9c765a160a3b2ffbb1eb6cffffce31efc3e3733838562a41c372154b16de901f
7
- data.tar.gz: 6ae51d5ff0b43d1635aac5a39d5dbe4dcc93e83ef398a923d8c5ba87189d67a7e729b2b62ca08b6636dc6f3fd1307a784fbfe2d0c99383b4cb1440b587beb205
6
+ metadata.gz: 4dd05a7bfd1573344b099e458a4b1192cd049477c24ea7f8df5385cc7a363ae77dec23ff73684c85cd4077540409654344964d547df2be96509553b86cd75513
7
+ data.tar.gz: 67c9b0f0a3282139cb31cbee7cbbb24ae9340d0dc5b99fd0b05ffbe3355b044454fa8505319c71c3337193e1dbb377afb76e252073809ba92dd7badc53623a1f
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .project
7
+ tmp
8
+ nbproject
9
+ *.swp
10
+ spec/dummy
11
+ Gemfile.lock
12
+ .rvmrc
13
+ .localeapp
14
+ .coveralls.yml
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/.travis.yml ADDED
@@ -0,0 +1,22 @@
1
+ language: ruby
2
+ before_script:
3
+ - sh -e /etc/init.d/xvfb start
4
+ - export DISPLAY=:99.0
5
+ - bundle exec rake test_app
6
+ env:
7
+ - DB=sqlite
8
+ - DB=mysql
9
+ - DB=postgres
10
+ script:
11
+ - bundle exec rspec spec
12
+ notifications:
13
+ email:
14
+ - ryan@spreecommerce.com
15
+ irc:
16
+ use_notice: true
17
+ skip_join: true
18
+ channels:
19
+ - "irc.freenode.org#spree"
20
+ rvm:
21
+ - 1.9.3
22
+ - 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :test do
4
+ gem 'ffaker'
5
+ gem 'sqlite3'
6
+ gem 'pg'
7
+ gem 'mysql2'
8
+ gem 'pry'
9
+ end
10
+ gem 'braintree'
11
+
12
+ gem 'spree', github: 'spree/spree', branch: '2-0-stable'
13
+
14
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2013 Spree Commerce
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Spree Gateway
2
+
3
+ [![Build Status](https://secure.travis-ci.org/spree/spree_gateway.png?branch=master)](http://travis-ci.org/spree/spree_gateway)
4
+
5
+ Community supported Spree Payment Method Gateways.
6
+
7
+ These can be used with Spree >= 1.0.x (but see note below for necessary changes)
8
+
9
+ http://guides.spreecommerce.com/developer/payments.html
10
+
11
+ ## Installation
12
+
13
+ In your Gemfile:
14
+
15
+ **Spree edge**
16
+
17
+ ```ruby
18
+ gem 'spree'
19
+ gem 'spree_gateway', github: 'spree/spree_gateway'
20
+ ```
21
+
22
+ **Spree 1.3**
23
+
24
+ ```ruby
25
+ gem 'spree', '~> 1.3'
26
+ gem 'spree_gateway', github: 'spree/spree_gateway', branch: '1-3-stable'
27
+ ```
28
+
29
+ **Note:** *Please consult the Versionfile at the root of the repository to determine which branch to use.*
30
+
31
+ Then run from the command line:
32
+
33
+ $ bundle install
34
+ $ rails g spree_gateway:install
35
+
36
+ Finally, make sure to **restart your app**. Navigate to *Configuration > Payment Methods > New Payment Method* in the admin panel and you should see that a bunch of additional gateways have been added to the list.
37
+
38
+ ## Contributing
39
+
40
+ In the spirit of [free software][1], **everyone** is encouraged to help improve this project.
41
+
42
+ Here are some ways *you* can contribute:
43
+
44
+ * by using prerelease versions
45
+ * by reporting [bugs][2]
46
+ * by suggesting new features
47
+ * by writing or editing documentation
48
+ * by writing specifications
49
+ * by writing code (*no patch is too small*: fix typos, add comments, clean up inconsistent whitespace)
50
+ * by refactoring code
51
+ * by resolving [issues][2]
52
+ * by reviewing patches
53
+
54
+ Starting point:
55
+
56
+ * Fork the repo
57
+ * Clone your repo
58
+ * Run `bundle`
59
+ * Run `bundle exec rake test_app` to create the test application in `spec/test_app`
60
+ * Make your changes
61
+ * Ensure specs pass by running `bundle exec rspec spec`
62
+ * Submit your pull request
63
+
64
+ Copyright (c) 2013 Spree Commerce, released under the [New BSD License][3]
65
+
66
+ [1]: http://www.fsf.org/licensing/essays/free-sw.html
67
+ [2]: https://github.com/futhr/spree-dibs/issues
68
+ [3]: https://github.com/spree/spree_gateway/tree/master/LICENSE
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'rake'
2
+ require 'rspec/core/rake_task'
3
+ require 'spree/testing_support/common_rake'
4
+ require 'bundler/gem_tasks'
5
+
6
+ RSpec::Core::RakeTask.new
7
+
8
+ task :default => [:spec]
9
+
10
+ desc "Generates a dummy app for testing"
11
+ task :test_app do
12
+ ENV['LIB_NAME'] = 'spree_gateway'
13
+ Rake::Task['common:test_app'].invoke
14
+ end
data/Versionfile ADDED
@@ -0,0 +1,12 @@
1
+ # This file is used to designate compatibilty with different versions of Spree
2
+ # Please see http://spreecommerce.com/documentation/extensions.html#versionfile for details
3
+
4
+ # Examples
5
+ #
6
+
7
+ "2.1.x" => { :branch => "master" }
8
+ "2.0.x" => { :branch => "2-0-stable" }
9
+ "1.3.x" => { :branch => "1-3-stable" }
10
+ "1.2.x" => { :branch => "1-2-stable" }
11
+ "1.1.x" => { :branch => "1-1-stable" }
12
+ "1.0.x" => { :branch => "1-0-stable" }
@@ -0,0 +1,51 @@
1
+ module Spree
2
+ CheckoutController.class_eval do
3
+ before_filter :confirm_skrill, :only => [:update]
4
+
5
+ def skrill_return
6
+
7
+ unless @order.payments.where(:source_type => 'Spree::SkrillTransaction').present?
8
+ payment_method = PaymentMethod.find(params[:payment_method_id])
9
+ skrill_transaction = SkrillTransaction.new
10
+
11
+ payment = @order.payments.create({:amount => @order.total,
12
+ :source => skrill_transaction,
13
+ :payment_method => payment_method},
14
+ :without_protection => true)
15
+ payment.started_processing!
16
+ payment.pend!
17
+ end
18
+
19
+ @order.update_attributes({:state => "complete", :completed_at => Time.now}, :without_protection => true)
20
+
21
+ until @order.state == "complete"
22
+ if @order.next!
23
+ @order.update!
24
+ state_callback(:after)
25
+ end
26
+ end
27
+
28
+ @order.finalize!
29
+
30
+ flash.notice = Spree.t(:order_processed_successfully)
31
+ redirect_to completion_route
32
+ end
33
+
34
+ def skrill_cancel
35
+ flash[:error] = Spree.t(:payment_has_been_cancelled)
36
+ redirect_to edit_order_path(@order)
37
+ end
38
+
39
+ private
40
+ def confirm_skrill
41
+ return unless (params[:state] == "payment") && params[:order][:payments_attributes]
42
+
43
+ payment_method = PaymentMethod.find(params[:order][:payments_attributes].first[:payment_method_id])
44
+ if payment_method.kind_of?(BillingIntegration::Skrill::QuickCheckout)
45
+ #TODO confirming payment method
46
+ redirect_to edit_order_checkout_url(@order, :state => 'payment'),
47
+ :notice => Spree.t(:complete_skrill_checkout)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,39 @@
1
+ module Spree
2
+ class SkrillStatusController < ApplicationController
3
+ def update
4
+ @order = Order.find_by_number!(params[:order_id])
5
+ payment_method = PaymentMethod.find(params[:payment_method_id])
6
+ skrill_transaction = SkrillTransaction.create_from_postback params
7
+
8
+ payment = @order.payments.where(:state => "pending",
9
+ :payment_method_id => payment_method).first
10
+
11
+ if payment
12
+ payment.source = skrill_transaction
13
+ payment.save
14
+ else
15
+ payment = @order.payments.create(:amount => @order.total,
16
+ :source => skrill_transaction,
17
+ :payment_method => payment_method)
18
+ end
19
+
20
+ payment.started_processing!
21
+
22
+ unless payment.completed?
23
+ case params[:status]
24
+ when "0"
25
+ payment.pend #may already be pending
26
+ when "2" #processed / captured
27
+ payment.complete!
28
+ when "-1", "-2"
29
+ payment.failure!
30
+ else
31
+ raise "Unexpected payment status"
32
+ end
33
+ end
34
+
35
+ render :text => ""
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,52 @@
1
+ module Spree
2
+ class BillingIntegration::Skrill::QuickCheckout < BillingIntegration
3
+ preference :merchant_id, :string
4
+ preference :language, :string, :default => 'EN'
5
+ preference :currency, :string, :default => 'EUR'
6
+ preference :payment_options, :string, :default => 'ACC'
7
+ preference :pay_to_email, :string , :default => 'your@merchant.email_here'
8
+
9
+ attr_accessible :preferred_merchant_id, :preferred_language, :preferred_currency,
10
+ :preferred_payment_options, :preferred_server, :preferred_test_mode,
11
+ :preferred_pay_to_email
12
+
13
+ def provider_class
14
+ ActiveMerchant::Billing::Skrill
15
+ end
16
+
17
+ def redirect_url(order, opts = {})
18
+ opts.merge! self.preferences
19
+
20
+ set_global_options(opts)
21
+
22
+ opts[:detail1_text] = order.number
23
+ opts[:detail1_description] = "Order:"
24
+
25
+ opts[:pay_from_email] = order.email
26
+ opts[:firstname] = order.bill_address.firstname
27
+ opts[:lastname] = order.bill_address.lastname
28
+ opts[:address] = order.bill_address.address1
29
+ opts[:address2] = order.bill_address.address2
30
+ opts[:phone_number] = order.bill_address.phone.gsub(/\D/,'') if order.bill_address.phone
31
+ opts[:city] = order.bill_address.city
32
+ opts[:postal_code] = order.bill_address.zipcode
33
+ opts[:state] = order.bill_address.state.nil? ? order.bill_address.state_name.to_s : order.bill_address.state.abbr
34
+ opts[:country] = order.bill_address.country.name
35
+ opts[:pay_to_email] = self.preferred_pay_to_email
36
+ opts[:hide_login] = 1
37
+ opts[:merchant_fields] = 'platform,order_id,payment_method_id'
38
+ opts[:platform] = 'Spree'
39
+ opts[:order_id] = order.number
40
+
41
+ skrill = self.provider
42
+ skrill.payment_url(opts)
43
+ end
44
+
45
+ private
46
+ def set_global_options(opts)
47
+ opts[:recipient_description] = Spree::Config[:site_name]
48
+ opts[:payment_methods] = self.preferred_payment_options
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ class Gateway::AuthorizeNet < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+
6
+ attr_accessible :preferred_login, :preferred_password
7
+
8
+ def provider_class
9
+ ActiveMerchant::Billing::AuthorizeNetGateway
10
+ end
11
+
12
+ def options_with_test_preference
13
+ options_without_test_preference.merge(:test => self.preferred_test_mode)
14
+ end
15
+
16
+ alias_method_chain :options, :test_preference
17
+ end
18
+ end
@@ -0,0 +1,134 @@
1
+ module Spree
2
+ class Gateway::AuthorizeNetCim < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+ preference :test_mode, :boolean, :default => false
6
+ preference :validate_on_profile_create, :boolean, :default => false
7
+
8
+ attr_accessible :preferred_login, :preferred_password, :preferred_test_mode, :preferred_validate_on_profile_create
9
+
10
+ ActiveMerchant::Billing::Response.class_eval do
11
+ attr_writer :authorization
12
+ end
13
+
14
+ def provider_class
15
+ self.class
16
+ end
17
+
18
+ def options
19
+ # add :test key in the options hash, as that is what the ActiveMerchant::Billing::AuthorizeNetGateway expects
20
+ if self.preferred_test_mode
21
+ self.class.preference :test, :boolean, :default => true
22
+ else
23
+ self.class.remove_preference :test
24
+ end
25
+
26
+ super
27
+ end
28
+
29
+ def authorize(amount, creditcard, gateway_options)
30
+ t_options = { :order => {:invoice_number => gateway_options[:order_id] } }
31
+ create_transaction( amount, creditcard, :auth_only, t_options )
32
+ end
33
+
34
+ def purchase(amount, creditcard, gateway_options)
35
+ create_transaction(amount, creditcard, :auth_capture)
36
+ end
37
+
38
+ def capture(authorization, creditcard, gateway_options)
39
+ create_transaction((authorization.amount * 100).round, creditcard, :prior_auth_capture, :trans_id => authorization.response_code)
40
+ end
41
+
42
+ def credit(amount, creditcard, response_code, gateway_options)
43
+ create_transaction(amount, creditcard, :refund, :trans_id => response_code)
44
+ end
45
+
46
+ def void(response_code, creditcard, gateway_options)
47
+ create_transaction(nil, creditcard, :void, :trans_id => response_code)
48
+ end
49
+
50
+ def payment_profiles_supported?
51
+ true
52
+ end
53
+
54
+ # Create a new CIM customer profile ready to accept a payment
55
+ def create_profile(payment)
56
+ if payment.source.gateway_customer_profile_id.nil?
57
+ profile_hash = create_customer_profile(payment)
58
+ payment.source.update_attributes(:gateway_customer_profile_id => profile_hash[:customer_profile_id], :gateway_payment_profile_id => profile_hash[:customer_payment_profile_id])
59
+ end
60
+ end
61
+
62
+ # simpler form
63
+ def create_profile_from_card(card)
64
+ if card.gateway_customer_profile_id.nil?
65
+ profile_hash = create_customer_profile(card)
66
+ card.update_attributes(:gateway_customer_profile_id => profile_hash[:customer_profile_id], :gateway_payment_profile_id => profile_hash[:customer_payment_profile_id])
67
+ end
68
+ end
69
+
70
+ private
71
+ # Create a transaction on a creditcard
72
+ # Set up a CIM profile for the card if one doesn't exist
73
+ # Valid transaction_types are :auth_only, :capture_only and :auth_capture
74
+ def create_transaction(amount, creditcard, transaction_type, options = {})
75
+ #create_profile(creditcard, creditcard.gateway_options)
76
+ creditcard.save
77
+ if amount
78
+ amount = "%.2f" % (amount / 100.0) # This gateway requires formated decimal, not cents
79
+ end
80
+ transaction_options = {
81
+ :type => transaction_type,
82
+ :amount => amount,
83
+ :customer_profile_id => creditcard.gateway_customer_profile_id,
84
+ :customer_payment_profile_id => creditcard.gateway_payment_profile_id,
85
+ }.update(options)
86
+ t = cim_gateway.create_customer_profile_transaction(:transaction => transaction_options)
87
+ logger.debug("\nAuthorize Net CIM Transaction")
88
+ logger.debug(" transaction_options: #{transaction_options.inspect}")
89
+ logger.debug(" response: #{t.inspect}\n")
90
+ t
91
+ end
92
+
93
+ # Create a new CIM customer profile ready to accept a payment
94
+ def create_customer_profile(payment)
95
+ options = options_for_create_customer_profile(payment)
96
+ response = cim_gateway.create_customer_profile(options)
97
+ if response.success?
98
+ { :customer_profile_id => response.params['customer_profile_id'],
99
+ :customer_payment_profile_id => response.params['customer_payment_profile_id_list'].values.first }
100
+ else
101
+ payment.send(:gateway_error, response)
102
+ end
103
+ end
104
+
105
+ def options_for_create_customer_profile(payment)
106
+ if payment.is_a? CreditCard
107
+ info = { :bill_to => generate_address_hash(payment.address), :payment => { :credit_card => payment } }
108
+ else
109
+ info = { :bill_to => generate_address_hash(payment.order.bill_address),
110
+ :payment => { :credit_card => payment.source } }
111
+ end
112
+ validation_mode = preferred_validate_on_profile_create ? preferred_server.to_sym : :none
113
+
114
+ { :profile => { :merchant_customer_id => "#{Time.now.to_f}",
115
+ #:ship_to_list => generate_address_hash(creditcard.checkout.ship_address),
116
+ :email => payment.order.email,
117
+ :payment_profiles => info },
118
+ :validation_mode => validation_mode }
119
+ end
120
+
121
+ # As in PaymentGateway but with separate name fields
122
+ def generate_address_hash(address)
123
+ return {} if address.nil?
124
+ {:first_name => address.firstname, :last_name => address.lastname, :address1 => address.address1, :address2 => address.address2, :city => address.city,
125
+ :state => address.state_text, :zip => address.zipcode, :country => address.country.iso, :phone_number => address.phone}
126
+ end
127
+
128
+ def cim_gateway
129
+ ActiveMerchant::Billing::Base.gateway_mode = preferred_server.to_sym
130
+ gateway_options = options
131
+ ActiveMerchant::Billing::AuthorizeNetCimGateway.new(gateway_options)
132
+ end
133
+ end
134
+ end