spree_gateway 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +23 -0
  5. data/Gemfile +5 -0
  6. data/Guardfile +9 -0
  7. data/LICENSE.md +26 -0
  8. data/README.md +71 -0
  9. data/Rakefile +15 -0
  10. data/Versionfile +7 -0
  11. data/app/assets/javascripts/spree/frontend/spree_gateway.js +3 -0
  12. data/app/assets/javascripts/store/gateway/stripe.js.coffee +58 -0
  13. data/app/assets/javascripts/store/spree_gateway.js +2 -0
  14. data/app/assets/stylesheets/spree/frontend/spree_gateway.css +3 -0
  15. data/app/controllers/spree/checkout_controller_decorator.rb +51 -0
  16. data/app/controllers/spree/skrill_status_controller.rb +39 -0
  17. data/app/models/spree/billing_integration/skrill/quick_checkout.rb +48 -0
  18. data/app/models/spree/gateway/authorize_net.rb +16 -0
  19. data/app/models/spree/gateway/authorize_net_cim.rb +132 -0
  20. data/app/models/spree/gateway/balanced_gateway.rb +67 -0
  21. data/app/models/spree/gateway/banwire.rb +15 -0
  22. data/app/models/spree/gateway/beanstream.rb +193 -0
  23. data/app/models/spree/gateway/braintree_gateway.rb +147 -0
  24. data/app/models/spree/gateway/card_save.rb +10 -0
  25. data/app/models/spree/gateway/data_cash.rb +10 -0
  26. data/app/models/spree/gateway/eway.rb +20 -0
  27. data/app/models/spree/gateway/fatzebra.rb +15 -0
  28. data/app/models/spree/gateway/linkpoint.rb +28 -0
  29. data/app/models/spree/gateway/maxipago.rb +14 -0
  30. data/app/models/spree/gateway/moneris.rb +10 -0
  31. data/app/models/spree/gateway/pay_junction.rb +16 -0
  32. data/app/models/spree/gateway/pay_pal_gateway.rb +12 -0
  33. data/app/models/spree/gateway/payflow_pro.rb +17 -0
  34. data/app/models/spree/gateway/paymill.rb +12 -0
  35. data/app/models/spree/gateway/pin_gateway.rb +15 -0
  36. data/app/models/spree/gateway/sage_pay.rb +11 -0
  37. data/app/models/spree/gateway/samurai.rb +63 -0
  38. data/app/models/spree/gateway/secure_pay_au.rb +10 -0
  39. data/app/models/spree/gateway/stripe_gateway.rb +103 -0
  40. data/app/models/spree/gateway/usa_epay.rb +9 -0
  41. data/app/models/spree/gateway/worldpay.rb +91 -0
  42. data/app/models/spree/skrill_transaction.rb +19 -0
  43. data/app/views/spree/admin/log_entries/_braintree.html.erb +31 -0
  44. data/app/views/spree/admin/log_entries/_stripe.html.erb +28 -0
  45. data/app/views/spree/admin/payments/source_forms/_quickcheckout.html.erb +8 -0
  46. data/app/views/spree/admin/payments/source_forms/_stripe.html.erb +1 -0
  47. data/app/views/spree/admin/payments/source_views/_quickcheckout.html.erb +39 -0
  48. data/app/views/spree/admin/payments/source_views/_stripe.html.erb +1 -0
  49. data/app/views/spree/checkout/payment/_quickcheckout.html.erb +26 -0
  50. data/app/views/spree/checkout/payment/_stripe.html.erb +21 -0
  51. data/config/initializers/savon.rb +3 -0
  52. data/config/locales/bg.yml +11 -0
  53. data/config/locales/de.yml +11 -0
  54. data/config/locales/en.yml +30 -0
  55. data/config/locales/sv.yml +11 -0
  56. data/config/routes.rb +13 -0
  57. data/db/migrate/20111118164631_create_skrill_transactions.rb +14 -0
  58. data/db/migrate/20121017004102_update_braintree_payment_method_type.rb +9 -0
  59. data/db/migrate/20130213222555_update_stripe_payment_method_type.rb +9 -0
  60. data/db/migrate/20130415222802_update_balanced_payment_method_type.rb +9 -0
  61. data/db/migrate/20131008221012_update_paypal_payment_method_type.rb +9 -0
  62. data/db/migrate/20131112133401_migrate_stripe_preferences.rb +8 -0
  63. data/lib/active_merchant/billing/skrill.rb +18 -0
  64. data/lib/generators/spree_gateway/install/install_generator.rb +28 -0
  65. data/lib/spree_gateway.rb +4 -0
  66. data/lib/spree_gateway/engine.rb +35 -0
  67. data/script/rails +7 -0
  68. data/spec/controllers/spree/checkout_controller_spec.rb +13 -0
  69. data/spec/controllers/spree/skrill_status_controller_spec.rb +8 -0
  70. data/spec/factories/payment_method_factory.rb +6 -0
  71. data/spec/factories/skrill_transaction_factory.rb +10 -0
  72. data/spec/features/stripe_checkout_spec.rb +82 -0
  73. data/spec/lib/active_merchant/billing_skrill_spec.rb +18 -0
  74. data/spec/models/billing_integration/skrill_quick_checkout_spec.rb +11 -0
  75. data/spec/models/gateway/authorize_net_cim_spec.rb +29 -0
  76. data/spec/models/gateway/authorize_net_spec.rb +23 -0
  77. data/spec/models/gateway/balanced_gateway_spec.rb +17 -0
  78. data/spec/models/gateway/banwire_spec.rb +11 -0
  79. data/spec/models/gateway/beanstream_spec.rb +17 -0
  80. data/spec/models/gateway/braintree_gateway_spec.rb +319 -0
  81. data/spec/models/gateway/card_save_spec.rb +11 -0
  82. data/spec/models/gateway/data_cache_spec.rb +11 -0
  83. data/spec/models/gateway/eway_spec.rb +29 -0
  84. data/spec/models/gateway/fatzebra_spec.rb +51 -0
  85. data/spec/models/gateway/linkpoint_spec.rb +62 -0
  86. data/spec/models/gateway/maxipago_spec.rb +17 -0
  87. data/spec/models/gateway/moneris_spec.rb +11 -0
  88. data/spec/models/gateway/pay_junction_spec.rb +23 -0
  89. data/spec/models/gateway/pay_pal_spec.rb +11 -0
  90. data/spec/models/gateway/payflow_pro_spec.rb +23 -0
  91. data/spec/models/gateway/paymill_spec.rb +11 -0
  92. data/spec/models/gateway/pin_gateway_spec.rb +56 -0
  93. data/spec/models/gateway/sage_pay_spec.rb +11 -0
  94. data/spec/models/gateway/samurai_spec.rb +17 -0
  95. data/spec/models/gateway/secure_pay_au_spec.rb +11 -0
  96. data/spec/models/gateway/stripe_gateway_spec.rb +117 -0
  97. data/spec/models/gateway/usa_epay_spec.rb +49 -0
  98. data/spec/models/gateway/worldpay_spec.rb +11 -0
  99. data/spec/models/savon_spec.rb +9 -0
  100. data/spec/models/skrill_transaction_spec.rb +9 -0
  101. data/spec/spec_helper.rb +49 -0
  102. data/spree_gateway.gemspec +40 -0
  103. metadata +140 -5
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ class Gateway::Eway < Gateway
3
+ preference :login, :string
4
+
5
+ # Note: EWay supports purchase method only (no authorize method).
6
+ def auto_capture?
7
+ true
8
+ end
9
+
10
+ def provider_class
11
+ ActiveMerchant::Billing::EwayGateway
12
+ end
13
+
14
+ def options_with_test_preference
15
+ options_without_test_preference.merge(:test => self.preferred_test_mode)
16
+ end
17
+
18
+ alias_method_chain :options, :test_preference
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ class Gateway::Fatzebra < Gateway
3
+ preference :username, :string, default: "TEST"
4
+ preference :token, :string, default: "TEST"
5
+
6
+ def provider_class
7
+ ActiveMerchant::Billing::FatZebraGateway
8
+ end
9
+
10
+ # Currently no auth/capture, but coming soon...
11
+ def auto_capture?
12
+ true
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ module Spree
2
+ class Gateway::Linkpoint < Gateway
3
+ preference :login, :string
4
+ preference :pem, :text
5
+
6
+ def provider_class
7
+ ActiveMerchant::Billing::LinkpointGateway
8
+ end
9
+
10
+ [:authorize, :purchase, :capture, :void, :credit].each do |method|
11
+ define_method(method) do |*args|
12
+ options = add_discount_to_subtotal(args.extract_options!)
13
+ provider.public_send(method, *args << options)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ # Linkpoint ignores the discount, but it will return an error if the
20
+ # chargetotal is different from the sum of the subtotal, tax and
21
+ # shipping totals.
22
+ def add_discount_to_subtotal(options)
23
+ subtotal = options.fetch(:subtotal)
24
+ discount = options.fetch(:discount)
25
+ options.merge(subtotal: subtotal + discount, discount: 0)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ class Gateway::Maxipago < Gateway
3
+ preference :login, :string # ID
4
+ preference :password, :string # KEY
5
+
6
+ def provider_class
7
+ ActiveMerchant::Billing::MaxipagoGateway
8
+ end
9
+
10
+ def auto_capture?
11
+ true
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ class Gateway::Moneris < Gateway
3
+ preference :login, :string
4
+ preference :password, :password
5
+
6
+ def provider_class
7
+ ActiveMerchant::Billing::MonerisGateway
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ class Gateway::PayJunction < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+
6
+ def provider_class
7
+ ActiveMerchant::Billing::PayJunctionGateway
8
+ end
9
+
10
+ def options_with_test_preference
11
+ options_without_test_preference.merge(:test => self.preferred_test_mode)
12
+ end
13
+
14
+ alias_method_chain :options, :test_preference
15
+ end
16
+ end
@@ -0,0 +1,12 @@
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
+ def provider_class
9
+ ActiveMerchant::Billing::PaypalGateway
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ class Gateway::PayflowPro < Gateway
3
+ preference :login, :string
4
+ preference :password, :password
5
+
6
+ def provider_class
7
+ ActiveMerchant::Billing::PayflowGateway
8
+ end
9
+
10
+ def options_with_test_preference
11
+ options_without_test_preference.merge(:test => self.preferred_test_mode)
12
+ end
13
+
14
+ alias_method_chain :options, :test_preference
15
+
16
+ end
17
+ end
@@ -0,0 +1,12 @@
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
+ def provider_class
9
+ ActiveMerchant::Billing::PaymillGateway
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ class Gateway::PinGateway < Gateway
3
+ preference :api_key, :string
4
+ preference :currency, :string, :default => 'AUD'
5
+
6
+ def provider_class
7
+ ActiveMerchant::Billing::PinGateway
8
+ end
9
+
10
+ # Pin does not appear to support authorizing transactions yet
11
+ def auto_capture?
12
+ true
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ class Gateway::SagePay < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+ preference :account, :string
6
+
7
+ def provider_class
8
+ ActiveMerchant::Billing::SagePayGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,63 @@
1
+ module Spree
2
+ class Gateway::Samurai < Gateway
3
+ preference :login, :string
4
+ preference :password, :string
5
+ preference :processor_token, :string
6
+
7
+ def provider_class
8
+ ActiveMerchant::Billing::SamuraiGateway
9
+ end
10
+
11
+ def payment_profiles_supported?
12
+ true
13
+ end
14
+
15
+ def purchase(money, creditcard, gateway_options)
16
+ gateway_options[:billing_reference] = gateway_options[:order_id]
17
+ gateway_options[:customer_reference] = gateway_options[:customer]
18
+ gateway_options[:description] = "Spree Order"
19
+ provider.purchase(money, creditcard.gateway_customer_profile_id, gateway_options)
20
+ end
21
+
22
+ def authorize(money, creditcard, gateway_options)
23
+ gateway_options[:billing_reference] = gateway_options[:order_id]
24
+ gateway_options[:customer_reference] = gateway_options[:customer]
25
+ gateway_options[:description] = "Spree Order"
26
+ provider.authorize(money, creditcard.gateway_customer_profile_id, gateway_options)
27
+ end
28
+
29
+ def capture(authorization, creditcard, gateway_options)
30
+ gateway_options[:billing_reference] = gateway_options[:order_id]
31
+ gateway_options[:customer_reference] = gateway_options[:customer]
32
+ gateway_options[:description] = "Spree Order"
33
+ provider.capture(nil, authorization.response_code, {})
34
+ end
35
+
36
+ def credit(money, creditcard, response_code, gateway_options)
37
+ provider.credit(money, response_code, {})
38
+ end
39
+
40
+ def void(response_code, gateway_options)
41
+ provider.void(response_code, {})
42
+ end
43
+
44
+ def create_profile(payment)
45
+ return unless payment.source.gateway_customer_profile_id.nil?
46
+
47
+ options = {}
48
+ options[:email] = payment.order.email
49
+ options[:address] = {}
50
+ options[:address][:address1] = payment.order.bill_address.address1
51
+ options[:address][:address2] = payment.order.bill_address.address2
52
+ options[:address][:city] = payment.order.bill_address.city
53
+ options[:address][:state] = payment.order.bill_address.state.abbr
54
+ options[:address][:zip] = payment.order.bill_address.zipcode
55
+ response = provider.store(payment.source, options)
56
+ if response.success?
57
+ payment.source.update_attributes!(:gateway_customer_profile_id => response.params['payment_method_token'])
58
+ else
59
+ payment.send(:gateway_error, response.message)
60
+ end
61
+ end
62
+ end
63
+ 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::SecurePayAuGateway
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,103 @@
1
+ module Spree
2
+ class Gateway::StripeGateway < Gateway
3
+ preference :secret_key, :string
4
+ preference :publishable_key, :string
5
+
6
+ def method_type
7
+ 'stripe'
8
+ end
9
+
10
+ def provider_class
11
+ ActiveMerchant::Billing::StripeGateway
12
+ end
13
+
14
+ def payment_profiles_supported?
15
+ true
16
+ end
17
+
18
+ def purchase(money, creditcard, gateway_options)
19
+ provider.purchase(*options_for_purchase_or_auth(money, creditcard, gateway_options))
20
+ end
21
+
22
+ def authorize(money, creditcard, gateway_options)
23
+ provider.authorize(*options_for_purchase_or_auth(money, creditcard, gateway_options))
24
+ end
25
+
26
+ def capture(payment, creditcard, gateway_options)
27
+ provider.capture((payment.amount * 100).round, payment.response_code, gateway_options)
28
+ end
29
+
30
+ def credit(money, creditcard, response_code, gateway_options)
31
+ provider.refund(money, response_code, {})
32
+ end
33
+
34
+ def void(response_code, creditcard, gateway_options)
35
+ provider.void(response_code, {})
36
+ end
37
+
38
+ def create_profile(payment)
39
+ return unless payment.source.gateway_customer_profile_id.nil?
40
+ options = {
41
+ email: payment.order.email,
42
+ login: preferred_secret_key,
43
+ }.merge! address_for(payment)
44
+
45
+ response = provider.store(payment.source, options)
46
+ if response.success?
47
+ payment.source.update_attributes!({
48
+ :gateway_customer_profile_id => response.params['id'],
49
+ :gateway_payment_profile_id => response.params['default_card']
50
+ })
51
+ else
52
+ payment.send(:gateway_error, response.message)
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ # In this gateway, what we call 'secret_key' is the 'login'
59
+ def options
60
+ options = super
61
+ options.merge(:login => preferred_secret_key)
62
+ end
63
+
64
+
65
+ def options_for_purchase_or_auth(money, creditcard, gateway_options)
66
+ options = {}
67
+ options[:description] = "Spree Order ID: #{gateway_options[:order_id]}"
68
+ options[:currency] = gateway_options[:currency]
69
+
70
+ if customer = creditcard.gateway_customer_profile_id
71
+ options[:customer] = customer
72
+ end
73
+ if token_or_card_id = creditcard.gateway_payment_profile_id
74
+ # The Stripe ActiveMerchant gateway supports passing the token directly as the creditcard parameter
75
+ # The Stripe ActiveMerchant gateway supports passing the customer_id and credit_card id
76
+ # https://github.com/Shopify/active_merchant/issues/770
77
+ creditcard = token_or_card_id
78
+ end
79
+ return money, creditcard, options
80
+ end
81
+
82
+ def address_for(payment)
83
+ {}.tap do |options|
84
+ if address = payment.order.bill_address
85
+ options.merge!(address: {
86
+ address1: address.address1,
87
+ address2: address.address2,
88
+ city: address.city,
89
+ zip: address.zipcode
90
+ })
91
+
92
+ if country = address.country
93
+ options[:address].merge!(country: country.name)
94
+ end
95
+
96
+ if state = address.state
97
+ options[:address].merge!(state: state.name)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class Gateway::UsaEpay < Gateway
3
+ preference :login, :string
4
+
5
+ def provider_class
6
+ ActiveMerchant::Billing::UsaEpayGateway
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,91 @@
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
+ def provider_class
16
+ ActiveMerchant::Billing::WorldpayGateway
17
+ end
18
+
19
+ def purchase(money, credit_card, options = {})
20
+ provider = credit_card_provider(credit_card, options)
21
+ provider.purchase(money, credit_card, options)
22
+ end
23
+
24
+ def authorize(money, credit_card, options = {})
25
+ provider = credit_card_provider(credit_card, options)
26
+ provider.authorize(money, credit_card, options)
27
+ end
28
+
29
+ def capture(money, authorization, options = {})
30
+ provider = credit_card_provider(auth_credit_card(authorization), options)
31
+ provider.capture(money, authorization, options)
32
+ end
33
+
34
+ def refund(money, authorization, options = {})
35
+ provider = credit_card_provider(auth_credit_card(authorization), options)
36
+ provider.refund(money, authorization, options)
37
+ end
38
+
39
+ def credit(money, authorization, options = {})
40
+ refund(money, authorization, options)
41
+ end
42
+
43
+ def void(authorization, options = {})
44
+ provider = credit_card_provider(auth_credit_card(authorization), options)
45
+ provider.void(authorization, options)
46
+ end
47
+
48
+ private
49
+
50
+ def options_for_card(credit_card, options)
51
+ options[:login] = login_for_card(credit_card)
52
+ options = options().merge( options )
53
+ end
54
+
55
+ def auth_credit_card(authorization)
56
+ Spree::Payment.find_by_response_code(authorization).source
57
+ end
58
+
59
+ def credit_card_provider(credit_card, options = {})
60
+ gateway_options = options_for_card(credit_card, options)
61
+ gateway_options.delete :login if gateway_options.has_key?(:login) and gateway_options[:login].nil?
62
+ gateway_options[:currency] = self.preferred_currency
63
+ gateway_options[:inst_id] = self.preferred_installation_id
64
+ ActiveMerchant::Billing::Base.gateway_mode = gateway_options[:server].to_sym
65
+ @provider = provider_class.new(gateway_options)
66
+ end
67
+
68
+ def login_for_card(card)
69
+ case card.brand
70
+ when 'american_express'
71
+ choose_login preferred_american_express_login
72
+ when 'discover'
73
+ choose_login preferred_discover_login
74
+ when 'jcb'
75
+ choose_login preferred_jcb_login
76
+ when 'maestro'
77
+ choose_login preferred_maestro_login
78
+ when 'master'
79
+ choose_login preferred_mastercard_login
80
+ when 'visa'
81
+ choose_login preferred_visa_login
82
+ else
83
+ preferred_login
84
+ end
85
+ end
86
+
87
+ def choose_login(login)
88
+ return login ? login : preferred_login
89
+ end
90
+ end
91
+ end