archetype_spree_gateway 3.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +39 -0
  5. data/Gemfile +9 -0
  6. data/Guardfile +9 -0
  7. data/LICENSE.md +26 -0
  8. data/README.md +105 -0
  9. data/Rakefile +15 -0
  10. data/app/models/spree/billing_integration.rb +21 -0
  11. data/app/models/spree/check.rb +41 -0
  12. data/app/models/spree/gateway/authorize_net.rb +45 -0
  13. data/app/models/spree/gateway/authorize_net_cim.rb +213 -0
  14. data/app/models/spree/gateway/balanced_gateway.rb +64 -0
  15. data/app/models/spree/gateway/banwire.rb +15 -0
  16. data/app/models/spree/gateway/beanstream.rb +193 -0
  17. data/app/models/spree/gateway/braintree_gateway.rb +184 -0
  18. data/app/models/spree/gateway/card_save.rb +10 -0
  19. data/app/models/spree/gateway/cyber_source.rb +10 -0
  20. data/app/models/spree/gateway/data_cash.rb +10 -0
  21. data/app/models/spree/gateway/epay.rb +10 -0
  22. data/app/models/spree/gateway/eway.rb +18 -0
  23. data/app/models/spree/gateway/eway_rapid.rb +14 -0
  24. data/app/models/spree/gateway/maxipago.rb +14 -0
  25. data/app/models/spree/gateway/migs.rb +11 -0
  26. data/app/models/spree/gateway/moneris.rb +10 -0
  27. data/app/models/spree/gateway/pay_junction.rb +14 -0
  28. data/app/models/spree/gateway/pay_pal_gateway.rb +12 -0
  29. data/app/models/spree/gateway/payflow_pro.rb +15 -0
  30. data/app/models/spree/gateway/paymill.rb +12 -0
  31. data/app/models/spree/gateway/payu_polska_gateway.rb +24 -0
  32. data/app/models/spree/gateway/pin_gateway.rb +60 -0
  33. data/app/models/spree/gateway/quickpay.rb +9 -0
  34. data/app/models/spree/gateway/sage_pay.rb +11 -0
  35. data/app/models/spree/gateway/secure_pay_au.rb +10 -0
  36. data/app/models/spree/gateway/spreedly_core_gateway.rb +11 -0
  37. data/app/models/spree/gateway/stripe_ach_gateway.rb +60 -0
  38. data/app/models/spree/gateway/stripe_apple_pay_gateway.rb +10 -0
  39. data/app/models/spree/gateway/stripe_elements_gateway.rb +61 -0
  40. data/app/models/spree/gateway/stripe_gateway.rb +151 -0
  41. data/app/models/spree/gateway/usa_epay_transaction.rb +9 -0
  42. data/app/models/spree/gateway/worldpay.rb +91 -0
  43. data/app/models/spree/payu_polska.rb +41 -0
  44. data/app/models/spree_gateway/apple_pay_order_decorator.rb +20 -0
  45. data/app/models/spree_gateway/apple_pay_payment_decorator.rb +9 -0
  46. data/app/models/spree_gateway/credit_card_decorator.rb +10 -0
  47. data/app/models/spree_gateway/order_decorator.rb +28 -0
  48. data/app/models/spree_gateway/payment_decorator.rb +36 -0
  49. data/app/views/spree/checkout/_payment_confirm.html.erb +39 -0
  50. data/app/views/spree/checkout/_payu.html +12 -0
  51. data/config/initializers/inflections.rb +3 -0
  52. data/config/initializers/spree_permitted_attributes.rb +5 -0
  53. data/config/locales/bg.yml +4 -0
  54. data/config/locales/de.yml +4 -0
  55. data/config/locales/en.yml +47 -0
  56. data/config/locales/sv.yml +4 -0
  57. data/config/routes.rb +19 -0
  58. data/db/migrate/20200317135551_add_spree_check_payment_source.rb +22 -0
  59. data/db/migrate/20200422114908_add_intent_key_to_payment.rb +5 -0
  60. data/lib/active_merchant/billing/stripe_gateway_decorator.rb +33 -0
  61. data/lib/controllers/spree/api/v2/storefront/intents_controller.rb +45 -0
  62. data/lib/controllers/spree/apple_pay_domain_verification_controller.rb +11 -0
  63. data/lib/generators/spree_gateway/install/install_generator.rb +19 -0
  64. data/lib/spree_frontend/controllers/spree/checkout_controller_decorator.rb +19 -0
  65. data/lib/spree_gateway/engine.rb +80 -0
  66. data/lib/spree_gateway/version.rb +5 -0
  67. data/lib/spree_gateway.rb +4 -0
  68. data/lib/views/backend/spree/admin/log_entries/_braintree.html.erb +31 -0
  69. data/lib/views/backend/spree/admin/log_entries/_stripe.html.erb +28 -0
  70. data/lib/views/backend/spree/admin/payments/source_forms/_quickcheckout.html.erb +8 -0
  71. data/lib/views/backend/spree/admin/payments/source_forms/_stripe.html.erb +79 -0
  72. data/lib/views/backend/spree/admin/payments/source_forms/_stripe_ach.html.erb +86 -0
  73. data/lib/views/backend/spree/admin/payments/source_forms/_stripe_apple_pay.html.erb +0 -0
  74. data/lib/views/backend/spree/admin/payments/source_forms/_stripe_elements.html.erb +79 -0
  75. data/lib/views/backend/spree/admin/payments/source_views/_stripe.html.erb +1 -0
  76. data/lib/views/backend/spree/admin/payments/source_views/_stripe_ach.html.erb +21 -0
  77. data/lib/views/backend/spree/admin/payments/source_views/_stripe_apple_pay.html.erb +1 -0
  78. data/lib/views/backend/spree/admin/payments/source_views/_stripe_elements.html.erb +1 -0
  79. data/lib/views/frontend/spree/checkout/payment/_stripe.html.erb +86 -0
  80. data/lib/views/frontend/spree/checkout/payment/_stripe_ach.html.erb +81 -0
  81. data/lib/views/frontend/spree/checkout/payment/_stripe_ach_verify.html.erb +16 -0
  82. data/lib/views/frontend/spree/checkout/payment/_stripe_additional_info.html.erb +16 -0
  83. data/lib/views/frontend/spree/checkout/payment/_stripe_apple_pay.html.erb +109 -0
  84. data/lib/views/frontend/spree/checkout/payment/_stripe_elements.html.erb +110 -0
  85. data/script/rails +7 -0
  86. data/spec/factories/check_factory.rb +10 -0
  87. data/spec/features/admin/stripe_elements_payment_spec.rb +100 -0
  88. data/spec/features/stripe_checkout_spec.rb +130 -0
  89. data/spec/features/stripe_elements_3ds_checkout_spec.rb +225 -0
  90. data/spec/models/gateway/authorize_net_cim_spec.rb +29 -0
  91. data/spec/models/gateway/authorize_net_spec.rb +23 -0
  92. data/spec/models/gateway/balanced_gateway_spec.rb +17 -0
  93. data/spec/models/gateway/banwire_spec.rb +11 -0
  94. data/spec/models/gateway/beanstream_spec.rb +17 -0
  95. data/spec/models/gateway/braintree_gateway_spec.rb +420 -0
  96. data/spec/models/gateway/card_save_spec.rb +11 -0
  97. data/spec/models/gateway/cyber_source_spec.rb +11 -0
  98. data/spec/models/gateway/data_cash_spec.rb +11 -0
  99. data/spec/models/gateway/epay_spec.rb +11 -0
  100. data/spec/models/gateway/eway_rapid_spec.rb +23 -0
  101. data/spec/models/gateway/eway_spec.rb +29 -0
  102. data/spec/models/gateway/maxipago_spec.rb +17 -0
  103. data/spec/models/gateway/moneris_spec.rb +11 -0
  104. data/spec/models/gateway/pay_junction_spec.rb +23 -0
  105. data/spec/models/gateway/pay_pal_spec.rb +11 -0
  106. data/spec/models/gateway/payflow_pro_spec.rb +23 -0
  107. data/spec/models/gateway/paymill_spec.rb +11 -0
  108. data/spec/models/gateway/pin_gateway_spec.rb +54 -0
  109. data/spec/models/gateway/quickpay_spec.rb +11 -0
  110. data/spec/models/gateway/sage_pay_spec.rb +11 -0
  111. data/spec/models/gateway/secure_pay_au_spec.rb +11 -0
  112. data/spec/models/gateway/stripe_ach_gateway_spec.rb +186 -0
  113. data/spec/models/gateway/stripe_gateway_spec.rb +199 -0
  114. data/spec/models/gateway/usa_epay_transaction_spec.rb +49 -0
  115. data/spec/models/gateway/worldpay_spec.rb +11 -0
  116. data/spec/models/spree/order_spec.rb +79 -0
  117. data/spec/requests/apple_pay_domain_verification.rb +45 -0
  118. data/spec/requests/spree/api/v2/storefront/intents_controller_spec.rb +198 -0
  119. data/spec/spec_helper.rb +10 -0
  120. data/spec/support/order_walktrough.rb +73 -0
  121. data/spec/support/wait_for_stripe.rb +27 -0
  122. data/spec/support/within_stripe_3ds_popup.rb +10 -0
  123. data/spree_gateway.gemspec +37 -0
  124. metadata +277 -0
data/config/routes.rb ADDED
@@ -0,0 +1,19 @@
1
+ # we need to add this route to the root Rails application because Spree can
2
+ # be mounted to some path eg. /shop and Apple Pay expects to access this file
3
+ # via https://example.com/.well-known/apple-developer-merchantid-domain-association
4
+ Rails.application.routes.draw do
5
+ get '/.well-known/apple-developer-merchantid-domain-association' => 'spree/apple_pay_domain_verification#show'
6
+ end
7
+
8
+ Spree::Core::Engine.add_routes do
9
+ namespace :api, defaults: { format: 'json' } do
10
+ namespace :v2 do
11
+ namespace :storefront do
12
+ namespace :intents do
13
+ post :payment_confirmation_data
14
+ post :handle_response
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ class AddSpreeCheckPaymentSource < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :spree_checks do |t|
4
+ t.references :payment_method
5
+ t.references :user
6
+ t.string 'account_holder_name'
7
+ t.string 'account_holder_type'
8
+ t.string 'routing_number'
9
+ t.string 'account_number'
10
+ t.string 'account_type', default: 'checking'
11
+ t.string 'status'
12
+ t.string 'last_digits'
13
+ t.string 'gateway_customer_profile_id'
14
+ t.string 'gateway_payment_profile_id'
15
+
16
+ t.datetime 'created_at', null: false
17
+ t.datetime 'updated_at', null: false
18
+ t.datetime 'deleted_at'
19
+ end
20
+ add_index :spree_payment_methods, :id
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ class AddIntentKeyToPayment < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :spree_payments, :intent_client_key, :string
4
+ end
5
+ end
@@ -0,0 +1,33 @@
1
+ module ActiveMerchant
2
+ module Billing
3
+ module StripeGatewayDecorator
4
+ def verify(source, **options)
5
+ customer = source.gateway_customer_profile_id
6
+ bank_account_token = source.gateway_payment_profile_id
7
+
8
+ commit(:post, "customers/#{CGI.escape(customer)}/sources/#{bank_account_token}/verify", amounts: options[:amounts])
9
+ end
10
+
11
+ def retrieve(source, **options)
12
+ customer = source.gateway_customer_profile_id
13
+ bank_account_token = source.gateway_payment_profile_id
14
+ commit(:get, "customers/#{CGI.escape(customer)}/bank_accounts/#{bank_account_token}")
15
+ end
16
+
17
+ private
18
+
19
+ def headers(options = {})
20
+ headers = super
21
+ headers['User-Agent'] = headers['X-Stripe-Client-User-Agent']
22
+ headers
23
+ end
24
+
25
+ def add_customer_data(post, options)
26
+ super
27
+ post[:payment_user_agent] = "SpreeGateway/#{SpreeGateway.version}"
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ ActiveMerchant::Billing::StripeGateway.prepend(ActiveMerchant::Billing::StripeGatewayDecorator)
@@ -0,0 +1,45 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class IntentsController < ::Spree::Api::V2::BaseController
6
+ include Spree::Api::V2::Storefront::OrderConcern
7
+
8
+ def payment_confirmation_data
9
+ spree_authorize! :update, spree_current_order, order_token
10
+
11
+ if spree_current_order.intents?
12
+ spree_current_order.process_payments!
13
+ spree_current_order.reload
14
+ last_valid_payment = spree_current_order.payments.valid.where.not(intent_client_key: nil).last
15
+
16
+ if last_valid_payment.present?
17
+ client_secret = last_valid_payment.intent_client_key
18
+ publishable_key = last_valid_payment.payment_method&.preferred_publishable_key
19
+ return render json: { client_secret: client_secret, pk_key: publishable_key }, status: :ok
20
+ end
21
+ end
22
+
23
+ render_error_payload(I18n.t('spree.no_payment_authorization_needed'))
24
+ end
25
+
26
+ def handle_response
27
+ if params['response']['error']
28
+ invalidate_payment
29
+ render_error_payload(params['response']['error']['message'])
30
+ else
31
+ render_serialized_payload { { message: I18n.t('spree.payment_successfully_authorized') } }
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def invalidate_payment
38
+ payment = spree_current_order.payments.find_by!(response_code: params['response']['error']['payment_intent']['id'])
39
+ payment.update(state: 'failed', intent_client_key: nil)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ class ApplePayDomainVerificationController < ::ActionController::Base
3
+ def show
4
+ gateway = Spree::Gateway::StripeApplePayGateway.active.last
5
+
6
+ raise ActiveRecord::RecordNotFound unless gateway
7
+
8
+ render plain: gateway.preferred_domain_verification_certificate
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module SpreeGateway
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :migrate, type: :boolean, default: true, banner: 'Migrate the database'
5
+
6
+ def add_migrations
7
+ run 'bundle exec rake railties:install:migrations FROM=spree_gateway'
8
+ end
9
+
10
+ def run_migrations
11
+ if options[:migrate]
12
+ run 'bundle exec rake db:migrate VERBOSE=false'
13
+ else
14
+ puts "Skiping rake db:migrate, don't forget to run it!"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module CheckoutControllerDecorator
3
+ def self.prepended(base)
4
+ base.before_action :process_payments_and_set_keys, only: :edit, if: proc { params[:state] == 'payment_confirm' }
5
+ end
6
+
7
+ def process_payments_and_set_keys
8
+ @order.tap do |order|
9
+ order.process_payments!
10
+ order.reload.payments.valid.where.not(intent_client_key: nil).last.tap do |payment|
11
+ @client_secret = payment.intent_client_key
12
+ @pk_key = payment.payment_method.preferred_publishable_key
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ ::Spree::CheckoutController.prepend Spree::CheckoutControllerDecorator
@@ -0,0 +1,80 @@
1
+ module SpreeGateway
2
+ class Engine < Rails::Engine
3
+ engine_name 'spree_gateway'
4
+
5
+ config.autoload_paths += %W(#{config.root}/lib)
6
+
7
+ initializer "spree.gateway.payment_methods", :after => "spree.register.payment_methods" do |app|
8
+ app.config.spree.payment_methods << Spree::Gateway::AuthorizeNet
9
+ app.config.spree.payment_methods << Spree::Gateway::AuthorizeNetCim
10
+ app.config.spree.payment_methods << Spree::Gateway::BalancedGateway
11
+ app.config.spree.payment_methods << Spree::Gateway::Banwire
12
+ app.config.spree.payment_methods << Spree::Gateway::Beanstream
13
+ app.config.spree.payment_methods << Spree::Gateway::BraintreeGateway
14
+ app.config.spree.payment_methods << Spree::Gateway::CardSave
15
+ app.config.spree.payment_methods << Spree::Gateway::CyberSource
16
+ app.config.spree.payment_methods << Spree::Gateway::DataCash
17
+ app.config.spree.payment_methods << Spree::Gateway::Epay
18
+ app.config.spree.payment_methods << Spree::Gateway::Eway
19
+ app.config.spree.payment_methods << Spree::Gateway::EwayRapid
20
+ app.config.spree.payment_methods << Spree::Gateway::Maxipago
21
+ app.config.spree.payment_methods << Spree::Gateway::Migs
22
+ app.config.spree.payment_methods << Spree::Gateway::Moneris
23
+ app.config.spree.payment_methods << Spree::Gateway::PayJunction
24
+ app.config.spree.payment_methods << Spree::Gateway::PayPalGateway
25
+ app.config.spree.payment_methods << Spree::Gateway::PayflowPro
26
+ app.config.spree.payment_methods << Spree::Gateway::Paymill
27
+ app.config.spree.payment_methods << Spree::Gateway::PinGateway
28
+ app.config.spree.payment_methods << Spree::Gateway::Quickpay
29
+ app.config.spree.payment_methods << Spree::Gateway::SagePay
30
+ app.config.spree.payment_methods << Spree::Gateway::SecurePayAU
31
+ app.config.spree.payment_methods << Spree::Gateway::SpreedlyCoreGateway
32
+ app.config.spree.payment_methods << Spree::Gateway::StripeGateway
33
+ app.config.spree.payment_methods << Spree::Gateway::StripeElementsGateway
34
+ app.config.spree.payment_methods << Spree::Gateway::StripeApplePayGateway
35
+ app.config.spree.payment_methods << Spree::Gateway::StripeAchGateway
36
+ app.config.spree.payment_methods << Spree::Gateway::UsaEpayTransaction
37
+ app.config.spree.payment_methods << Spree::Gateway::Worldpay
38
+ app.config.spree.payment_methods << Spree::Gateway::PayuPolskaGateway
39
+ end
40
+
41
+ def self.activate
42
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/spree/*_decorator*.rb')) do |c|
43
+ Rails.application.config.cache_classes ? require(c) : load(c)
44
+ end
45
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/spree_gateway/*_decorator*.rb')) do |c|
46
+ Rails.application.config.cache_classes ? require(c) : load(c)
47
+ end
48
+ Dir.glob(File.join(File.dirname(__FILE__), '../../lib/active_merchant/**/*_decorator*.rb')) do |c|
49
+ Rails.application.config.cache_classes ? require(c) : load(c)
50
+ end
51
+
52
+ if self.frontend_available?
53
+ Dir.glob(File.join(File.dirname(__FILE__), '../../lib/spree_frontend/controllers/spree/*_decorator*.rb')) do |c|
54
+ Rails.application.config.cache_classes ? require(c) : load(c)
55
+ end
56
+ end
57
+ end
58
+
59
+ def self.backend_available?
60
+ @@backend_available ||= ::Rails::Engine.subclasses.map(&:instance).map{ |e| e.class.to_s }.include?('Spree::Backend::Engine')
61
+ end
62
+
63
+ def self.frontend_available?
64
+ @@frontend_available ||= ::Rails::Engine.subclasses.map(&:instance).map{ |e| e.class.to_s }.include?('Spree::Frontend::Engine')
65
+ end
66
+
67
+ if self.backend_available?
68
+ paths["app/views"] << "lib/views/backend"
69
+ end
70
+
71
+ paths['app/controllers'] << 'lib/controllers'
72
+
73
+ if self.frontend_available?
74
+ paths["app/controllers"] << "lib/spree_frontend/controllers"
75
+ paths["app/views"] << "lib/views/frontend"
76
+ end
77
+
78
+ config.to_prepare &method(:activate).to_proc
79
+ end
80
+ end
@@ -0,0 +1,5 @@
1
+ module SpreeGateway
2
+ def self.version
3
+ '3.9.5'
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ require 'spree_core'
2
+ require 'spree_gateway/engine'
3
+ require 'spree_gateway/version'
4
+ require 'spree_extension'
@@ -0,0 +1,31 @@
1
+ <% transaction = entry.parsed_details.params['braintree_transaction'] %>
2
+ <tr>
3
+ <td><%= Spree.t(:message, :scope => [:log_entry, :braintree]) %></td>
4
+ <td><%= entry.parsed_details.message %></td>
5
+ </tr>
6
+ <% if transaction %>
7
+ <tr>
8
+ <td><%= Spree.t(:status, :scope => [:log_entry, :braintree]) %></td>
9
+ <td><%= transaction['status'] %></td>
10
+ </tr>
11
+ <tr>
12
+ <td><%= Spree.t(:cc_token, :scope => [:log_entry, :braintree]) %></td>
13
+ <td><%= transaction['credit_card_details']['token'] %></td>
14
+ </tr>
15
+ <tr>
16
+ <td><%= Spree.t(:customer_id, :scope => [:log_entry, :braintree]) %></td>
17
+ <td><%= transaction['customer_details']['id'] %></td>
18
+ </tr>
19
+ <% end %>
20
+ <tr>
21
+ <td><%= Spree.t(:cvv_result, :scope => [:log_entry, :braintree]) %></td>
22
+ <td><%= entry.parsed_details.cvv_result['message'].to_s %></td>
23
+ </tr>
24
+ <tr>
25
+ <td><%= Spree.t(:avs_result_title, :scope => [:log_entry, :braintree]) %></td>
26
+ <td>
27
+ <%= Spree.t(:message, :scope => [:log_entry, :braintree, :avs_result]) %>: <%= entry.parsed_details.avs_result['message'] %><br>
28
+ <%= Spree.t(:street_match, :scope => [:log_entry, :braintree, :avs_result]) %>: <%= entry.parsed_details.avs_result['street_match'] %><br>
29
+ <%= Spree.t(:postal_match, :scope => [:log_entry, :braintree, :avs_result]) %>: <%= entry.parsed_details.avs_result['postal_match'] %>
30
+ </td>
31
+ </tr>
@@ -0,0 +1,28 @@
1
+ <tr>
2
+ <td><%= Spree.t(:message, :scope => [:log_entry, :stripe]) %></td>
3
+ <td><%= entry.parsed_details.message %></td>
4
+ </tr>
5
+ <tr>
6
+ <td><%= Spree.t(:charge_id, :scope => [:log_entry, :stripe]) %></td>
7
+ <td><%= entry.parsed_details.params['id'] %></td>
8
+ </tr>
9
+ <% if card = entry.parsed_details.params['card'] %>
10
+ <tr>
11
+ <td><%= Spree.t(:card_id, :scope => [:log_entry, :stripe]) %></td>
12
+ <td><%= card['id'] %></td>
13
+ </tr>
14
+
15
+ <tr>
16
+ <td><%= Spree.t(:cvc_check, :scope => [:log_entry, :stripe]) %></td>
17
+ <td><%= card['cvc_check'] %></td>
18
+ </tr>
19
+
20
+ <tr>
21
+ <td><%= Spree.t(:address_zip_check, :scope => [:log_entry, :stripe]) %></td>
22
+ <td><%= card['address_zip_check'] %></td>
23
+ </tr>
24
+ <% end %>
25
+ <tr>
26
+ <td><%= Spree.t(:cvv_result, :scope => [:log_entry, :stripe]) %></td>
27
+ <td><%= entry.parsed_details.cvv_result['message'].to_s %></td>
28
+ </tr>
@@ -0,0 +1,8 @@
1
+ <% content_for :head do %>
2
+ <script type="text/javascript">
3
+ jQuery(document).ready(function(){
4
+ $("label:contains('<%= payment_method.name %>')").hide();
5
+ $("label:contains('<%= payment_method.name %>') input").disable();
6
+ });
7
+ </script>
8
+ <% end %>
@@ -0,0 +1,79 @@
1
+ <%= render "spree/admin/payments/source_forms/gateway", payment_method: payment_method, previous_cards: payment_method.reusable_sources(@order) %>
2
+
3
+ <script type="text/javascript" src="https://js.stripe.com/v2/"></script>
4
+ <script type="text/javascript">
5
+ Stripe.setPublishableKey("<%= payment_method.preferred_publishable_key %>");
6
+ </script>
7
+
8
+ <script>
9
+ var mapCC, stripeResponseHandler;
10
+
11
+ mapCC = function(ccType) {
12
+ if (ccType === 'MasterCard') {
13
+ return 'mastercard';
14
+ } else if (ccType === 'Visa') {
15
+ return 'visa';
16
+ } else if (ccType === 'American Express') {
17
+ return 'amex';
18
+ } else if (ccType === 'Discover') {
19
+ return 'discover';
20
+ } else if (ccType === 'Diners Club') {
21
+ return 'dinersclub';
22
+ } else if (ccType === 'JCB') {
23
+ return 'jcb';
24
+ }
25
+ };
26
+ stripeResponseHandler = function(status, response) {
27
+ var paymentMethodId, token;
28
+ if (response.error) {
29
+ $('#stripeError').html(response.error.message);
30
+ var param_map = {
31
+ number: '#card_number',
32
+ exp_month: '#card_expiry',
33
+ exp_year: '#card_expiry',
34
+ cvc: '#card_code'
35
+ }
36
+ if (response.error.param) {
37
+ errorField = Spree.stripePaymentMethod.find(param_map[response.error.param])
38
+ errorField.addClass('error');
39
+ errorField.parent().addClass('has-error');
40
+ }
41
+ return $('#stripeError').show();
42
+ } else {
43
+ Spree.stripePaymentMethod.find('#card_number<%= payment_method.id %>, #card_expiry<%= payment_method.id %>, #card_code<%= payment_method.id %>').prop("disabled", true);
44
+ Spree.stripePaymentMethod.find(".ccType").prop("disabled", false);
45
+ Spree.stripePaymentMethod.find(".ccType").val(mapCC(response.card.brand));
46
+ token = response['id'];
47
+ paymentMethodId = Spree.stripePaymentMethod.prop('id').split("_")[2];
48
+ Spree.stripePaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][gateway_payment_profile_id]' value='" + token + "'/>");
49
+ Spree.stripePaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][last_digits]' value='" + response.card.last4 + "'/>");
50
+ Spree.stripePaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][month]' value='" + response.card.exp_month + "'/>");
51
+ Spree.stripePaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][year]' value='" + response.card.exp_year + "'/>");
52
+ return Spree.stripePaymentMethod.parents("form").trigger('submit');
53
+ }
54
+ };
55
+
56
+ window.addEventListener('DOMContentLoaded', function() {
57
+ Spree.stripePaymentMethod = $('#payment_method_' + <%= payment_method.id %>);
58
+
59
+ Spree.ready(function() {
60
+ Spree.stripePaymentMethod.prepend("<div id='stripeError' class='errorExplanation alert alert-danger' style='display:none'></div>");
61
+ return $('#new_payment [data-hook=buttons]').click(function() {
62
+ var expiration, params;
63
+ $('#stripeError').hide();
64
+ Spree.stripePaymentMethod.find('#card_number, #card_expiry, #card_code').removeClass('error');
65
+ if (Spree.stripePaymentMethod.is(':visible')) {
66
+ expiration = $('.cardExpiry:visible').payment('cardExpiryVal');
67
+ params = $.extend({
68
+ number: $('.cardNumber:visible').val(),
69
+ cvc: $('.cardCode:visible').val(),
70
+ exp_month: expiration.month || 0,
71
+ exp_year: expiration.year || 0
72
+ }, Spree.stripeAdditionalInfo);
73
+ Stripe.card.createToken(params, stripeResponseHandler);
74
+ return false;
75
+ }
76
+ });
77
+ });
78
+ });
79
+ </script>
@@ -0,0 +1,86 @@
1
+ <fieldset data-id="bank_transfer">
2
+ <div id="bank_transfer_form<%= payment_method.id %>" class="margint" data-hook>
3
+ <% param_prefix = "payment_source[#{payment_method.id}]" %>
4
+
5
+ <div data-hook="account_holder_name" class="form-group">
6
+ <%= label_tag "account_holder_name#{payment_method.id}", raw(Spree.t('stripe.ach.account_holder_name') + required_span_tag) %>
7
+ <%= text_field_tag "#{param_prefix}[account_holder_name]", '', class: 'required form-control', id: "account_holder_name#{payment_method.id}" %>
8
+ </div>
9
+
10
+ <div data-hook="account_holder_type">
11
+ <%= label_tag "account_holder_type#{payment_method.id}", raw(Spree.t('stripe.ach.account_holder_type') + required_span_tag) %>
12
+ <%= select_tag "#{param_prefix}[account_holder_type]", options_for_select(%w(Individual Company)), {id: "account_holder_type#{payment_method.id}", class: 'required form-control'} %>
13
+ </div>
14
+
15
+ <div data-hook="routing_number">
16
+ <%= label_tag "routing_number#{payment_method.id}", raw(Spree.t('stripe.ach.routing_number') + required_span_tag)%>
17
+ <%= text_field_tag "#{param_prefix}[routing_number]", '', class: 'required form-control', id: "routing_number#{payment_method.id}", maxlength: 9 %>
18
+ </div>
19
+ <div data-hook="account_number">
20
+ <%= label_tag "account_number#{payment_method.id}", raw(Spree.t('stripe.ach.account_number') + required_span_tag) %>
21
+ <%= text_field_tag "#{param_prefix}[account_number]", '', class: 'required form-control', id: "account_number#{payment_method.id}" %>
22
+ </div>
23
+ <div data-hook="account_number">
24
+ <%= label_tag "verify_account_number#{payment_method.id}", raw(Spree.t('stripe.ach.verify_account_number') + required_span_tag) %>
25
+ <%= text_field_tag "#{param_prefix}[verify_account_number]", '', class: 'required form-control', id: "verify_account_number#{payment_method.id}" %>
26
+ </div>
27
+ </div>
28
+ </fieldset>
29
+
30
+ <script type="text/javascript" src="https://js.stripe.com/v3/"></script>
31
+ <script type="text/javascript">
32
+ var stripe = Stripe("<%= payment_method.preferred_publishable_key %>");
33
+ </script>
34
+
35
+ <script>
36
+ stripeResponseHandler = function(response) {
37
+ var token, paymentMethodId;
38
+ if (response.error) {
39
+ $('#stripeError').html(response.error.message);
40
+ const param_map = {
41
+ account_holder_name: '#account_holder_name',
42
+ account_holder_type: '#account_holder_type',
43
+ account_number: '#account_number',
44
+ routing_number: '#routing_number'
45
+ }
46
+ if (response.error.param){
47
+ errorField = Spree.stripePaymentMethod.find(param_map[response.error.param])
48
+ errorField.addClass('error');
49
+ errorField.parent().addClass('has-error');
50
+ }
51
+ return $('#stripeError').show();
52
+ } else {
53
+ Spree.stripePaymentMethod.find('#account_holder_name, #account_holder_type, #account_number, #routing_number').prop("disabled", true);
54
+ token = response.token['id'];
55
+ paymentMethodId = Spree.stripePaymentMethod.prop('id').split("_")[2];
56
+ Spree.stripePaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][gateway_payment_profile_id]' value='" + token + "'/>");
57
+ return Spree.stripePaymentMethod.parents("form").trigger('submit');
58
+ }
59
+ };
60
+
61
+ window.addEventListener('DOMContentLoaded', function() {
62
+ Spree.stripePaymentMethod = $('#payment_method_' + <%= payment_method.id %>);
63
+
64
+ Spree.ready(function() {
65
+ Spree.stripePaymentMethod.prepend("<div id='stripeError' class='errorExplanation alert alert-danger' style='display:none'></div>");
66
+ return $('#new_payment [data-hook=buttons]').click(function() {
67
+ var params;
68
+ $('#stripeError').hide();
69
+ Spree.stripePaymentMethod.find('#account_holder_name, #account_holder_type, #account_number, #routing_number').removeClass('error');
70
+ if (Spree.stripePaymentMethod.is(':visible')) {
71
+ params = $.extend({
72
+ country: 'US',
73
+ currency: 'usd',
74
+ account_holder_name: $('.account_holder_name:visible').val(),
75
+ account_holder_type: $('.account_holder_type:visible').val(),
76
+ routing_number: $('.routing_number:visible').val(),
77
+ account_number: $('.account_number:visible').val()
78
+ }, Spree.stripeAdditionalInfo);
79
+ stripe.createToken('bank_account', params).then(stripeResponseHandler);
80
+ return false;
81
+ }
82
+ });
83
+ });
84
+ });
85
+ </script>
86
+
@@ -0,0 +1,79 @@
1
+ <%= render "spree/admin/payments/source_forms/gateway", payment_method: payment_method, previous_cards: payment_method.reusable_sources(@order) %>
2
+
3
+ <script type="text/javascript" src="https://js.stripe.com/v2/"></script>
4
+ <script type="text/javascript">
5
+ Stripe.setPublishableKey("<%= payment_method.preferred_publishable_key %>");
6
+ </script>
7
+
8
+ <script>
9
+ var mapCC, stripeElementResponseHandler;
10
+
11
+ mapCC = function(ccType) {
12
+ if (ccType === 'MasterCard') {
13
+ return 'mastercard';
14
+ } else if (ccType === 'Visa') {
15
+ return 'visa';
16
+ } else if (ccType === 'American Express') {
17
+ return 'amex';
18
+ } else if (ccType === 'Discover') {
19
+ return 'discover';
20
+ } else if (ccType === 'Diners Club') {
21
+ return 'dinersclub';
22
+ } else if (ccType === 'JCB') {
23
+ return 'jcb';
24
+ }
25
+ };
26
+ stripeElementResponseHandler = function(status, response) {
27
+ var paymentMethodId, token;
28
+ if (response.error) {
29
+ $('#stripeError').html(response.error.message);
30
+ var param_map = {
31
+ number: '#card_number',
32
+ exp_month: '#card_expiry',
33
+ exp_year: '#card_expiry',
34
+ cvc: '#card_code'
35
+ }
36
+ if (response.error.param) {
37
+ errorField = Spree.stripeElementsPaymentMethod.find(param_map[response.error.param])
38
+ errorField.addClass('error');
39
+ errorField.parent().addClass('has-error');
40
+ }
41
+ return $('#stripeError').show();
42
+ } else {
43
+ Spree.stripeElementsPaymentMethod.find('#card_number<%= payment_method.id %>, #card_expiry<%= payment_method.id %>, #card_code<%= payment_method.id %>').prop("disabled", true);
44
+ Spree.stripeElementsPaymentMethod.find(".ccType").prop("disabled", false);
45
+ Spree.stripeElementsPaymentMethod.find(".ccType").val(mapCC(response.card.brand));
46
+ token = response['id'];
47
+ paymentMethodId = Spree.stripeElementsPaymentMethod.prop('id').split("_")[2];
48
+ Spree.stripeElementsPaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][gateway_payment_profile_id]' value='" + token + "'/>");
49
+ Spree.stripeElementsPaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][last_digits]' value='" + response.card.last4 + "'/>");
50
+ Spree.stripeElementsPaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][month]' value='" + response.card.exp_month + "'/>");
51
+ Spree.stripeElementsPaymentMethod.append("<input type='hidden' class='stripeToken' name='payment_source[" + paymentMethodId + "][year]' value='" + response.card.exp_year + "'/>");
52
+ return Spree.stripeElementsPaymentMethod.parents("form").trigger('submit');
53
+ }
54
+ };
55
+
56
+ window.addEventListener('DOMContentLoaded', function() {
57
+ Spree.stripeElementsPaymentMethod = $('#payment_method_' + <%= payment_method.id %>);
58
+
59
+ Spree.ready(function() {
60
+ Spree.stripeElementsPaymentMethod.prepend("<div id='stripeError' class='errorExplanation alert alert-danger' style='display:none'></div>");
61
+ return $('#new_payment [data-hook=buttons]').click(function() {
62
+ var expiration, params;
63
+ $('#stripeError').hide();
64
+ Spree.stripeElementsPaymentMethod.find('#card_number, #card_expiry, #card_code').removeClass('error');
65
+ if (Spree.stripeElementsPaymentMethod.is(':visible')) {
66
+ expiration = $('.cardExpiry:visible').payment('cardExpiryVal');
67
+ params = $.extend({
68
+ number: $('.cardNumber:visible').val(),
69
+ cvc: $('.cardCode:visible').val(),
70
+ exp_month: expiration.month || 0,
71
+ exp_year: expiration.year || 0
72
+ }, Spree.stripeAdditionalInfo);
73
+ Stripe.card.createToken(params, stripeElementResponseHandler);
74
+ return false;
75
+ }
76
+ });
77
+ });
78
+ });
79
+ </script>
@@ -0,0 +1 @@
1
+ <%= render "spree/admin/payments/source_views/gateway", payment: payment %>
@@ -0,0 +1,21 @@
1
+ <fieldset data-hook="bank_transfer">
2
+ <legend><%= Spree.t(:bank_transfer) %></legend>
3
+ <table class="table table-condensed table-bordered">
4
+ <tr>
5
+ <th width="20%"><%= Spree.t('stripe.ach.account_holder_name') %>:</th>
6
+ <td><%= payment.source.account_holder_name %></td>
7
+ </tr>
8
+ <tr>
9
+ <th><%= Spree.t('stripe.ach.account_holder_type') %>:</th>
10
+ <td><%= payment.source.account_holder_type %></td>
11
+ </tr>
12
+ <tr>
13
+ <th><%= Spree.t('stripe.ach.routing_number') %>:</th>
14
+ <td><%= payment.source.routing_number %></td>
15
+ </tr>
16
+ <tr>
17
+ <th><%= Spree.t('stripe.ach.account_number') %>:</th>
18
+ <td><%= payment.source.account_number %></td>
19
+ </tr>
20
+ </table>
21
+ </fieldset>
@@ -0,0 +1 @@
1
+ <%= render "spree/admin/payments/source_views/gateway", payment: payment %>
@@ -0,0 +1 @@
1
+ <%= render "spree/admin/payments/source_views/gateway", payment: payment %>