spree_gateway 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,22 @@
1
+ module Spree
2
+ class Gateway::Eway < Gateway
3
+ preference :login, :string
4
+
5
+ attr_accessible :preferred_login
6
+
7
+ # Note: EWay supports purchase method only (no authorize method).
8
+ def auto_capture?
9
+ true
10
+ end
11
+
12
+ def provider_class
13
+ ActiveMerchant::Billing::EwayGateway
14
+ end
15
+
16
+ def options_with_test_preference
17
+ options_without_test_preference.merge(:test => self.preferred_test_mode)
18
+ end
19
+
20
+ alias_method_chain :options, :test_preference
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ class Gateway::Fatzebra < Gateway
3
+ preference :username, :string, default: "TEST"
4
+ preference :token, :string, default: "TEST"
5
+
6
+ attr_accessible :preferred_username, :preferred_token
7
+
8
+ def provider_class
9
+ ActiveMerchant::Billing::FatZebraGateway
10
+ end
11
+
12
+ # Currently no auth/capture, but coming soon...
13
+ def auto_capture?
14
+ true
15
+ end
16
+ end
17
+ end
File without changes
@@ -0,0 +1,30 @@
1
+ module Spree
2
+ class Gateway::Linkpoint < Gateway
3
+ preference :login, :string
4
+ preference :pem, :text
5
+
6
+ attr_accessible :preferred_login, :preferred_pem
7
+
8
+ def provider_class
9
+ ActiveMerchant::Billing::LinkpointGateway
10
+ end
11
+
12
+ [:authorize, :purchase, :capture, :void, :credit].each do |method|
13
+ define_method(method) do |*args|
14
+ options = add_discount_to_subtotal(args.extract_options!)
15
+ provider.public_send(method, *args << options)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ # Linkpoint ignores the discount, but it will return an error if the
22
+ # chargetotal is different from the sum of the subtotal, tax and
23
+ # shipping totals.
24
+ def add_discount_to_subtotal(options)
25
+ subtotal = options.fetch(:subtotal)
26
+ discount = options.fetch(:discount)
27
+ options.merge(subtotal: subtotal + discount, discount: 0)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ class Gateway::Moneris < Gateway
3
+ preference :login, :string
4
+ preference :password, :password
5
+
6
+ attr_accessible :preferred_login, :preferred_password
7
+
8
+ def provider_class
9
+ ActiveMerchant::Billing::MonerisGateway
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ class Gateway::PayJunction < 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::PayJunctionGateway
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,14 @@
1
+ module Spree
2
+ class Gateway::PayPalGateway < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+ preference :signature, :string
6
+ preference :currency_code, :string
7
+
8
+ attr_accessible :preferred_login, :preferred_password, :preferred_signature, :preferred_currency_code
9
+
10
+ def provider_class
11
+ ActiveMerchant::Billing::PaypalGateway
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ class Gateway::PayflowPro < Gateway
3
+ preference :login, :string
4
+ preference :password, :password
5
+
6
+ attr_accessible :preferred_login, :preferred_password
7
+
8
+ def provider_class
9
+ ActiveMerchant::Billing::PayflowGateway
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
+
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ class Gateway::Paymill < Gateway
3
+
4
+ preference :public_key, :string
5
+ preference :private_key, :string
6
+ preference :currency, :string, :default => 'GBP'
7
+
8
+ attr_accessible :preferred_public_key, :preferred_private_key, :preferred_currency
9
+
10
+
11
+ def provider_class
12
+ ActiveMerchant::Billing::PaymillGateway
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ class Gateway::PinGateway < Gateway
3
+ preference :api_key, :string
4
+ preference :currency, :string, :default => 'AUD'
5
+
6
+ attr_accessible :preferred_api_key, :preferred_currency
7
+
8
+
9
+ def provider_class
10
+ ActiveMerchant::Billing::PinGateway
11
+ end
12
+
13
+ # Pin does not appear to support authorizing transactions yet
14
+ def auto_capture?
15
+ true
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ class Gateway::SagePay < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+ preference :account, :string
6
+
7
+ attr_accessible :preferred_login, :preferred_password, :preferred_account
8
+
9
+ def provider_class
10
+ ActiveMerchant::Billing::SagePayGateway
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,65 @@
1
+ module Spree
2
+ class Gateway::Samurai < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+ preference :processor_token, :string
6
+
7
+ attr_accessible :preferred_login, :preferred_password, :preferred_processor_token
8
+
9
+ def provider_class
10
+ ActiveMerchant::Billing::SamuraiGateway
11
+ end
12
+
13
+ def payment_profiles_supported?
14
+ true
15
+ end
16
+
17
+ def purchase(money, creditcard, gateway_options)
18
+ gateway_options[:billing_reference] = gateway_options[:order_id]
19
+ gateway_options[:customer_reference] = gateway_options[:customer]
20
+ gateway_options[:description] = "Spree Order"
21
+ provider.purchase(money, creditcard.gateway_customer_profile_id, gateway_options)
22
+ end
23
+
24
+ def authorize(money, creditcard, gateway_options)
25
+ gateway_options[:billing_reference] = gateway_options[:order_id]
26
+ gateway_options[:customer_reference] = gateway_options[:customer]
27
+ gateway_options[:description] = "Spree Order"
28
+ provider.authorize(money, creditcard.gateway_customer_profile_id, gateway_options)
29
+ end
30
+
31
+ def capture(authorization, creditcard, gateway_options)
32
+ gateway_options[:billing_reference] = gateway_options[:order_id]
33
+ gateway_options[:customer_reference] = gateway_options[:customer]
34
+ gateway_options[:description] = "Spree Order"
35
+ provider.capture(nil, authorization.response_code, {})
36
+ end
37
+
38
+ def credit(money, creditcard, response_code, gateway_options)
39
+ provider.credit(money, response_code, {})
40
+ end
41
+
42
+ def void(response_code, gateway_options)
43
+ provider.void(response_code, {})
44
+ end
45
+
46
+ def create_profile(payment)
47
+ return unless payment.source.gateway_customer_profile_id.nil?
48
+
49
+ options = {}
50
+ options[:email] = payment.order.email
51
+ options[:address] = {}
52
+ options[:address][:address1] = payment.order.bill_address.address1
53
+ options[:address][:address2] = payment.order.bill_address.address2
54
+ options[:address][:city] = payment.order.bill_address.city
55
+ options[:address][:state] = payment.order.bill_address.state.abbr
56
+ options[:address][:zip] = payment.order.bill_address.zipcode
57
+ response = provider.store(payment.source, options)
58
+ if response.success?
59
+ payment.source.update_attributes!(:gateway_customer_profile_id => response.params['payment_method_token'])
60
+ else
61
+ payment.send(:gateway_error, response.message)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ class Gateway::SecurePayAU < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+
6
+ def provider_class
7
+ ActiveMerchant::Billing::SecurePayAU
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,94 @@
1
+ module Spree
2
+ class Gateway::StripeGateway < Gateway
3
+ preference :login, :string
4
+
5
+ attr_accessible :preferred_login, :preferred_currency
6
+
7
+ def provider_class
8
+ ActiveMerchant::Billing::StripeGateway
9
+ end
10
+
11
+ def payment_profiles_supported?
12
+ true
13
+ end
14
+
15
+ def purchase(money, creditcard, gateway_options)
16
+ provider.purchase(*options_for_purchase_or_auth(money, creditcard, gateway_options))
17
+ end
18
+
19
+ def authorize(money, creditcard, gateway_options)
20
+ provider.authorize(*options_for_purchase_or_auth(money, creditcard, gateway_options))
21
+ end
22
+
23
+ def capture(payment, creditcard, gateway_options)
24
+ provider.capture((payment.amount * 100).round, payment.response_code, gateway_options)
25
+ end
26
+
27
+ def credit(money, creditcard, response_code, gateway_options)
28
+ provider.refund(money, response_code, {})
29
+ end
30
+
31
+ def void(response_code, creditcard, gateway_options)
32
+ provider.void(response_code, {})
33
+ end
34
+
35
+ def create_profile(payment)
36
+ return unless payment.source.gateway_customer_profile_id.nil?
37
+
38
+ options = {
39
+ email: payment.order.email,
40
+ login: preferred_login
41
+ }.merge! address_for(payment)
42
+
43
+ response = provider.store(payment.source, options)
44
+ if response.success?
45
+ payment.source.update_attributes!({
46
+ :gateway_customer_profile_id => response.params['id'],
47
+ :gateway_payment_profile_id => response.params['default_card']
48
+ })
49
+ else
50
+ payment.send(:gateway_error, response.message)
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def options_for_purchase_or_auth(money, creditcard, gateway_options)
57
+ options = {}
58
+ options[:description] = "Spree Order ID: #{gateway_options[:order_id]}"
59
+ options[:currency] = gateway_options[:currency]
60
+
61
+ if customer = creditcard.gateway_customer_profile_id
62
+ options[:customer] = customer
63
+ end
64
+ if token_or_card_id = creditcard.gateway_payment_profile_id
65
+ # The Stripe ActiveMerchant gateway supports passing the token directly as the creditcard parameter
66
+ # The Stripe ActiveMerchant gateway supports passing the customer_id and credit_card id
67
+ # https://github.com/Shopify/active_merchant/issues/770
68
+ creditcard = token_or_card_id
69
+ end
70
+ return money, creditcard, options
71
+ end
72
+
73
+ def address_for(payment)
74
+ {}.tap do |options|
75
+ if address = payment.order.bill_address
76
+ options.merge!(address: {
77
+ address1: address.address1,
78
+ address2: address.address2,
79
+ city: address.city,
80
+ zip: address.zipcode
81
+ })
82
+
83
+ if country = address.country
84
+ options[:address].merge!(country: country.name)
85
+ end
86
+
87
+ if state = address.state
88
+ options[:address].merge!(state: state.name)
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ class Gateway::UsaEpay < Gateway
3
+ preference :login, :string
4
+
5
+ attr_accessible :preferred_login, :gateway_payment_profile_id
6
+
7
+ def provider_class
8
+ ActiveMerchant::Billing::UsaEpayGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,96 @@
1
+ module Spree
2
+ class Gateway::Worldpay < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+ preference :currency, :string, :default => 'GBP'
6
+ preference :installation_id, :string
7
+
8
+ preference :american_express_login, :string
9
+ preference :discover_login, :string
10
+ preference :jcb_login, :string
11
+ preference :mastercard_login, :string
12
+ preference :maestro_login, :string
13
+ preference :visa_login, :string
14
+
15
+ attr_accessible :preferred_login, :preferred_password, :preferred_currency,
16
+ :preferred_installation_id, :preferred_american_express_login,
17
+ :preferred_discover_login, :preferred_jcb_login, :preferred_maestro_login,
18
+ :preferred_mastercard_login, :preferred_visa_login
19
+
20
+ def provider_class
21
+ ActiveMerchant::Billing::WorldpayGateway
22
+ end
23
+
24
+ def purchase(money, credit_card, options = {})
25
+ provider = credit_card_provider(credit_card, options)
26
+ provider.purchase(money, credit_card, options)
27
+ end
28
+
29
+ def authorize(money, credit_card, options = {})
30
+ provider = credit_card_provider(credit_card, options)
31
+ provider.authorize(money, credit_card, options)
32
+ end
33
+
34
+ def capture(money, authorization, options = {})
35
+ provider = credit_card_provider(auth_credit_card(authorization), options)
36
+ provider.capture(money, authorization, options)
37
+ end
38
+
39
+ def refund(money, authorization, options = {})
40
+ provider = credit_card_provider(auth_credit_card(authorization), options)
41
+ provider.refund(money, authorization, options)
42
+ end
43
+
44
+ def credit(money, authorization, options = {})
45
+ refund(money, authorization, options)
46
+ end
47
+
48
+ def void(authorization, options = {})
49
+ provider = credit_card_provider(auth_credit_card(authorization), options)
50
+ provider.void(authorization, options)
51
+ end
52
+
53
+ private
54
+
55
+ def options_for_card(credit_card, options)
56
+ options[:login] = login_for_card(credit_card)
57
+ options = options().merge( options )
58
+ end
59
+
60
+ def auth_credit_card(authorization)
61
+ Spree::Payment.find_by_response_code(authorization).source
62
+ end
63
+
64
+ def credit_card_provider(credit_card, options = {})
65
+ gateway_options = options_for_card(credit_card, options)
66
+ gateway_options.delete :login if gateway_options.has_key?(:login) and gateway_options[:login].nil?
67
+ gateway_options[:currency] = self.preferred_currency
68
+ gateway_options[:inst_id] = self.preferred_installation_id
69
+ ActiveMerchant::Billing::Base.gateway_mode = gateway_options[:server].to_sym
70
+ @provider = provider_class.new(gateway_options)
71
+ end
72
+
73
+ def login_for_card(card)
74
+ case card.brand
75
+ when 'american_express'
76
+ choose_login preferred_american_express_login
77
+ when 'discover'
78
+ choose_login preferred_discover_login
79
+ when 'jcb'
80
+ choose_login preferred_jcb_login
81
+ when 'maestro'
82
+ choose_login preferred_maestro_login
83
+ when 'master'
84
+ choose_login preferred_mastercard_login
85
+ when 'visa'
86
+ choose_login preferred_visa_login
87
+ else
88
+ preferred_login
89
+ end
90
+ end
91
+
92
+ def choose_login(login)
93
+ return login ? login : preferred_login
94
+ end
95
+ end
96
+ end