payola-payments 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +200 -0
  3. data/LICENSE +6 -0
  4. data/README.md +80 -0
  5. data/Rakefile +5 -4
  6. data/app/assets/javascripts/payola/application.js +3 -3
  7. data/app/assets/javascripts/payola/checkout_button.js +29 -19
  8. data/app/assets/javascripts/payola/subscription_checkout_button.js +7 -1
  9. data/app/assets/javascripts/payola/subscription_form_onestep.js +27 -0
  10. data/app/assets/stylesheets/payola/application.css +4 -4
  11. data/app/controllers/concerns/payola/affiliate_behavior.rb +1 -1
  12. data/app/controllers/concerns/payola/status_behavior.rb +1 -1
  13. data/app/controllers/payola/application_controller.rb +8 -0
  14. data/app/controllers/payola/cards_controller.rb +14 -14
  15. data/app/controllers/payola/customers_controller.rb +11 -12
  16. data/app/controllers/payola/subscriptions_controller.rb +16 -8
  17. data/app/controllers/payola/transactions_controller.rb +1 -1
  18. data/app/models/concerns/payola/plan.rb +2 -1
  19. data/app/models/payola/subscription.rb +5 -0
  20. data/app/services/payola/cancel_subscription.rb +6 -5
  21. data/app/services/payola/change_subscription_plan.rb +3 -1
  22. data/app/services/payola/change_subscription_quantity.rb +1 -1
  23. data/app/services/payola/create_sale.rb +12 -2
  24. data/app/services/payola/create_subscription.rb +1 -1
  25. data/app/services/payola/start_subscription.rb +9 -1
  26. data/app/services/payola/update_customer.rb +1 -1
  27. data/app/views/payola/subscriptions/_change_plan.html.erb +2 -0
  28. data/app/views/payola/subscriptions/_checkout.html.erb +1 -1
  29. data/app/views/payola/transactions/_checkout.html.erb +4 -2
  30. data/config/locales/en.yml +17 -0
  31. data/db/migrate/20151205004838_change_tax_percent_format_in_payola_subscriptions.rb +9 -0
  32. data/lib/payola.rb +6 -0
  33. data/lib/payola/version.rb +1 -1
  34. data/spec/concerns/plan_spec.rb +16 -4
  35. data/spec/controllers/payola/cards_controller_spec.rb +92 -8
  36. data/spec/controllers/payola/customers_controller_spec.rb +47 -4
  37. data/spec/controllers/payola/subscriptions_controller_spec.rb +59 -46
  38. data/spec/controllers/payola/transactions_controller_spec.rb +33 -30
  39. data/spec/dummy/Rakefile +1 -1
  40. data/spec/dummy/app/assets/javascripts/application.js +3 -3
  41. data/spec/dummy/app/assets/stylesheets/application.css +4 -4
  42. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  43. data/spec/dummy/app/views/layouts/application.html.erb +27 -11
  44. data/spec/dummy/bin/rails +1 -1
  45. data/spec/dummy/config.ru +2 -1
  46. data/spec/dummy/config/application.rb +1 -2
  47. data/spec/dummy/config/boot.rb +2 -2
  48. data/spec/dummy/config/environment.rb +1 -1
  49. data/spec/dummy/config/environments/development.rb +1 -37
  50. data/spec/dummy/config/environments/production.rb +1 -82
  51. data/spec/dummy/config/environments/rails_4/development.rb +37 -0
  52. data/spec/dummy/config/environments/rails_4/production.rb +82 -0
  53. data/spec/dummy/config/environments/rails_4/test.rb +45 -0
  54. data/spec/dummy/config/environments/rails_5/development.rb +54 -0
  55. data/spec/dummy/config/environments/rails_5/production.rb +86 -0
  56. data/spec/dummy/config/environments/rails_5/test.rb +44 -0
  57. data/spec/dummy/config/environments/test.rb +1 -45
  58. data/spec/dummy/config/initializers/assets.rb +3 -0
  59. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -1
  60. data/spec/dummy/config/initializers/new_framework_defaults.rb +26 -0
  61. data/spec/dummy/config/secrets.yml +1 -1
  62. data/spec/dummy/config/spring.rb +8 -0
  63. data/spec/dummy/db/schema.rb +9 -12
  64. data/spec/dummy/db/test.sqlite3 +0 -0
  65. data/spec/dummy/log/test.log +134732 -0
  66. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  67. data/spec/dummy/public/apple-touch-icon.png +0 -0
  68. data/spec/models/payola/env_wrapper_spec.rb +13 -0
  69. data/spec/models/payola/sale_spec.rb +7 -7
  70. data/spec/models/payola/subscription_spec.rb +8 -3
  71. data/spec/payola_spec.rb +8 -8
  72. data/spec/services/payola/cancel_subscription_spec.rb +20 -4
  73. data/spec/services/payola/change_subscription_plan_spec.rb +2 -1
  74. data/spec/services/payola/change_subscription_quantity_spec.rb +23 -7
  75. data/spec/services/payola/charge_card_spec.rb +30 -25
  76. data/spec/services/payola/invoice_failed_spec.rb +1 -0
  77. data/spec/services/payola/invoice_paid_spec.rb +1 -0
  78. data/spec/services/payola/start_subscription_spec.rb +15 -0
  79. data/spec/spec_helper.rb +4 -2
  80. data/spec/support/http_methods_with_keyword_args.rb +21 -0
  81. data/spec/support/params_helper.rb +9 -0
  82. data/spec/worker_spec.rb +2 -2
  83. metadata +41 -13
  84. data/config/database.yml.ci +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 09b8e76fdaef1aec8962ac64e436a9b578fd78af
4
- data.tar.gz: bc890a26821355bbb8d58b9e98814ab0f4e609a8
3
+ metadata.gz: 23ef9ea875996e25766aa0560f06183bd084aeea
4
+ data.tar.gz: 735177781079c4dc153e9373ebfd8c6c1751dc8c
5
5
  SHA512:
6
- metadata.gz: 0716e1222343a26dae355bfed19b2b817f42141cb707573b00599930f01bde231f0ee4b2a3f7eb0d625b755121778bc86641aab08a7a147d4b26d16ae6358dcb
7
- data.tar.gz: 95d657b2c1e81e7c5dcbf565008145cc26cd4ed6ab9ae25536a43f7431448943b557559fc623b852ac04e7d499dd691d135f656e5989a1b4ea4ca7a272280864
6
+ metadata.gz: 81f1013db2d2ee0593cba32fdcc170ab0f35b5e849bdb815260b25c3811cfd5537a3654ee4e21ed879d44a11c24fbcd5a1ff7c83aa1cadea1de53867aaa4a8c9
7
+ data.tar.gz: 52d25e3d2ad2ffb3b44226dfc77ab92caaa1783d4657ebd48d994c11760998bed702c7a758e2c89c613bafe572f98855857980787d6b641be70cf2bae70b14fd
@@ -0,0 +1,200 @@
1
+ # Payola Changelog
2
+
3
+ Payola adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ All notable changes to Payola will be documented in this file.
6
+
7
+ ## v1.5.0 - 2016-10-27
8
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.4.0...v1.5.0)
9
+
10
+ ### Security
11
+ - Raise error if `payola_can_modify_customer/subscription?` unimplemented. #246
12
+
13
+ ### Enhancements
14
+ - Unpegged Stripe gem and stripe-ruby-mock. #255
15
+ - Take optional `stripe_customer_id` when creating a sale. #183
16
+ - Clean up error target HTML attributes. #198
17
+ - Update `cancel_at_period_end` in `CancelSubscription` service. #200
18
+ - Synchronize subscription amount and currency fields with Stripe. #202
19
+ - Send the `plan_id` along with the form submission. #206
20
+ - Set a customer's payment source if nil. #210
21
+ - Maintain the active coupon code on a subscription. #211
22
+ - Disallow deleting a plan if it has any related subscriptions. #221
23
+ - Flash message i18n. #229
24
+ - Rails 5.0 support. #232
25
+ - Add client side validation to subscription_form_onestep.js. #262
26
+
27
+ ### Bug Fixes
28
+ - Stop setting `Stripe.api_key` directly in `CancelSubscription` service. #201
29
+ - Convert tax_percent from integer to decimal (at most two decimal places). #189
30
+ - Submit all subscription options for existing stripe customers. #207
31
+ - Update subscription quantity when a subscription is changed. #218
32
+ - Fix flash message typo 'Successfully'. #228
33
+ - Make tax percentage migration reversible. #242
34
+ - Call `instrument_quantity_changed` from `ChangeSubscriptionQuantity`. #250
35
+ - Fix api_key String spec errors with stripe-ruby-mock 2.3.1. #261
36
+ - Ensure ENV keys are seen as Strings by recent stripe-ruby versions. #265
37
+
38
+ ## v1.4.0 - 2016-01-28
39
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.3.2...v1.4.0)
40
+
41
+ ### Enhancements
42
+ - Add a wrapper for the error function to pass xhr.responseJSON to checkout
43
+ buttons.
44
+ - Support free trials and plans by allowing subscription creation without
45
+ credit card. #144, #145
46
+ - Support cancelling subscription at period end. #146
47
+ - Trigger `error` event on Payola HTML elements when an error occurs. #147
48
+ - Allows coupon to be applied to changing subscription, and turns off prorating
49
+ in that scenario per Stripe instructions. #150
50
+ - Support for subscription creation with trial_end and optional stripeToken. #151
51
+ - Add config option to determine whether to create plans in Stripe. #156
52
+ - Allow `Plan#trial_period_days` attribute to remain optional. #160
53
+ - Accept tax percentage for subscriptions. #167
54
+ - Functionality to manage multiple cards and update customer attributes. Includes optional authorization check `payola_can_modify_customer?`. #168
55
+ - Optionally include checkout.stripe.com assets with `include_stripe_checkout_assets`. #169
56
+ - Improve support for subscription `at_period_end`. #165
57
+ - Support reusing existing Stripe customer for subscriptions. #170
58
+ - Listen for customer.subscription.deleted webhooks and cancel the associated subscription. #172
59
+ - Show plan interval in description instead of hardcoding to 'month'. #176
60
+ - Support coupons in `subscriptions/_checkout` partial. #179
61
+ - Allow sales to be refunded on the client side. #181
62
+ - Introduce `return_to` to support custom return paths after customer/card actions. #180
63
+ - `StartSubscription` no longer requires Stripe token for free plans. #190
64
+ - Turbolinks compatibility. #191
65
+
66
+ ### Bug Fixes
67
+ - Disable only Payola-related submit button(s) on page. #113
68
+ - Fix jQuery XHR JSON error handling. #159
69
+ - Ensure Payola.create_stripe_plans global gets set back to true. #164
70
+ - Registration form no longer uses hardcoded `/users` path. #171
71
+ - Remove debugging output in javascripts. #177
72
+ - Remove weird copy of StartSubscription service specs. #178
73
+ - Only cancel subscription in `SubscriptionDeleted` if it can be canceled. #186
74
+
75
+ ## v1.3.2 - 2015-05-18
76
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.3.1...v1.3.2)
77
+
78
+ - Lock stripe-ruby-mock to v2.1.0 to work around test issues
79
+ - Properly bubble subscription errors up to the user
80
+ - Handle card declines
81
+ - Add bitcoin option to checkout button
82
+ - Move the Payola Pro message out of initializers
83
+
84
+ ## v1.3.1 - 2015-03-18
85
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.3.0...v1.3.1)
86
+
87
+ - Fix a problem when creating subscription invoice payments
88
+ - Peg Stripe gem at 1.20.1 pending a fix to rebelidealist/stripe-ruby-mock#203
89
+
90
+ ## v1.3.0 - 2015-02-28
91
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.2.7...v1.3.0)
92
+
93
+ - Support Stripe API version 2015-02-18
94
+
95
+ ## v1.2.7 - 2015-02-28
96
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.2.6...v1.2.7)
97
+
98
+ - Fix Javascript error handling for one-step subscriptions
99
+ - Add some docs about events and turbolinks incompatibility
100
+ - Support namespaced models for plans
101
+
102
+ ## v1.2.6 - 2015-01-26
103
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.2.5...v1.2.6)
104
+
105
+ - Fix Javascript error handling for subscriptions
106
+
107
+ ## v1.2.5 - 2015-01-25
108
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.2.4...v1.2.5)
109
+
110
+ - Capure all attributes from Stripe when starting a subscription
111
+ - Allow for use of Checkout for Subscriptions
112
+ - Only re-use active or canceled subscriptions
113
+ - Make plan creation idempotent
114
+
115
+ ## v1.2.4 - 2015-01-06
116
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.2.3...v1.2.4)
117
+
118
+ - Fix regressions in v1.2.3
119
+
120
+ ## v1.2.3 - 2015-01-03
121
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.2.2...v1.2.3)
122
+
123
+ - Add support for Rails 4.2
124
+ - Re-use customers and create invoice items for setup fees
125
+ - Add an active flag on `Payola::Coupon`
126
+ - Fix load-order problems
127
+ - Add support for subscription quantities
128
+ - Properly handle form errors
129
+
130
+ ## v1.2.2 - 2014-11-29
131
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.2.1...v1.2.2)
132
+
133
+ - Optionally invert subscription controller flow
134
+ - Fix the CSRF token behavior
135
+
136
+ ## v1.2.1 - 2014-11-20
137
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.2.0...v1.2.1)
138
+
139
+ - Make guid generator overrideable
140
+ - Bumped minimum version of AASM to 4.0
141
+ - Fixed a bug with the auto emails not working for webhook events
142
+ - Code cleanup
143
+ - Test coverage improvements
144
+
145
+ ## v1.2.0 - 2014-11-17
146
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.1.4...v1.2.0)
147
+
148
+ - Subscriptions
149
+
150
+ ## v1.1.4 - 2014-11-07
151
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.1.3...v1.1.4)
152
+
153
+ - Pass the created customer to `additional_charge_attributes`
154
+ - Add Payola Pro license
155
+
156
+ ## v1.1.3 - 2014-11-07
157
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.1.2...v1.1.3)
158
+
159
+ - Add options for requesting billing and shipping addresses via Checkout
160
+ - Add a callable to add additional attributes to a Stripe::Charge
161
+ - Only talk about PDFs if PDFs are enabled
162
+
163
+ ## v1.1.2 - 2014-11-06
164
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.1.1...v1.1.2)
165
+
166
+ - Default the `From` address on receipt emails to `Payola.support_email`
167
+
168
+ ## v1.1.1 - 2014-11-03
169
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.1.0...v1.1.1)
170
+
171
+ - ActiveJob can't serialize a class or a symbol so we have to `to_s` them
172
+
173
+ ## v1.1.0 - 2014-11-03
174
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.0.8...v1.1.0)
175
+
176
+ - Add customizable mailers
177
+ - Pass currency through properly and add a `default_currency` config option
178
+ - Use data attributes to set up the checkout button instead of a JS snippet
179
+ - Add a polymorphic `owner` association on `Payola::Sale`.
180
+ - Allow the price to be overridden on the Checkout form
181
+
182
+ ## v1.0.8 - 2014-10-27
183
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.0.7...v1.0.8)
184
+
185
+ - Add basic support for custom forms
186
+ - Allow passing signed data from checkout button into the charge verifier
187
+ - Correctly pass the price into the Checkout button, which allows the `{{amount}}` macro to work properly
188
+ - I18n the formatted_price helper
189
+
190
+ ## v1.0.7 - 2014-10-21
191
+ [Full Changelog](https://github.com/peterkeen/payola/compare/v1.0.6...v1.0.7)
192
+
193
+ - Add support for ActiveJob workers
194
+ - Document how to set Stripe keys
195
+ - Add a callback to fetch the publishable key
196
+ - Unpin the Rails version to allow anything >= 4.1
197
+ - Allow Payola to be mounted anywhere, as long as it has 'as: :payola' in the mount spec
198
+
199
+ ## v1.0.6 - 2014-10-19
200
+ - First public release
data/LICENSE ADDED
@@ -0,0 +1,6 @@
1
+ Copyright (c) Cora Street Press LLC
2
+
3
+ Payola is an Open Source project licensed under the terms of
4
+ the LGPLv3 license. Please see <http://www.gnu.org/licenses/lgpl-3.0.html>
5
+ for license text.
6
+
@@ -0,0 +1,80 @@
1
+ # Payola
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/payola-payments.svg)](http://badge.fury.io/rb/payola-payments) [![CircleCI](https://circleci.com/gh/peterkeen/payola.svg?style=shield)](https://circleci.com/gh/peterkeen/payola) [![Code Climate](https://codeclimate.com/github/peterkeen/payola/badges/gpa.svg)](https://codeclimate.com/github/peterkeen/payola) [![Test Coverage](https://codeclimate.com/github/peterkeen/payola/badges/coverage.svg)](https://codeclimate.com/github/peterkeen/payola) [![Dependency Status](https://gemnasium.com/peterkeen/payola.svg)](https://gemnasium.com/peterkeen/payola)
4
+
5
+ Payments with Stripe for your Rails application.
6
+
7
+ ## What does this do?
8
+
9
+ Payola is a drop-in Rails engine that lets you sell one or more products by just including a module in your models. It includes:
10
+
11
+ * An easy to embed, easy to customize, async Stripe Checkout button
12
+ * Asynchronous payments, usable with any background processing system
13
+ * Full webhook integration
14
+ * Easy extension hooks for adding your own functionality
15
+ * Customizable emails
16
+
17
+ To see Payola in action, check out the site for [Mastering Modern Payments: Using Stripe with Rails](https://www.masteringmodernpayments.com). Read the book to find out the whys behind Payola's design.
18
+
19
+ ## Installation
20
+
21
+ Add Payola to your Gemfile:
22
+
23
+ ```ruby
24
+ gem 'payola-payments'
25
+ ```
26
+
27
+ Run the installer:
28
+
29
+ ```bash
30
+ $ rails g payola:install
31
+ $ rake db:migrate
32
+ ```
33
+
34
+ (**Note**: do not run `rake payola:install:migrations`. Payola's migrations live inside the gem and do not get copied into your application.)
35
+
36
+ Optionally, tell Stripe about your application. Add this as a webhook in your [Stripe dashboard](https://dashboard.stripe.com/account/webhooks):
37
+
38
+ ```
39
+ https://your.website.example.com/payola/events
40
+ ```
41
+
42
+ ### Disable Turbolinks
43
+
44
+ Payola does not currently play nice with turbolinks. Disable it by removing the turbolinks include in your `application.js`.
45
+
46
+ ## Additional Setup Resources
47
+
48
+
49
+ [One-time payments](https://github.com/peterkeen/payola/wiki/One-time-payments)
50
+
51
+ [Configuration options](https://github.com/peterkeen/payola/wiki/Configuration-options)
52
+
53
+ [Subscriptions](https://github.com/peterkeen/payola/wiki/Subscriptions)
54
+
55
+ ## TODO
56
+
57
+ * Multiple subscriptions per customer
58
+ * Affiliate tracking
59
+ * Easy metered billing
60
+
61
+ ## License
62
+
63
+ Please see the LICENSE file for licensing details.
64
+
65
+ ## Changelog
66
+
67
+ Please see [CHANGELOG.md](CHANGELOG.md).
68
+
69
+ ## Contributing
70
+
71
+ 1. Fork the project
72
+ 2. Make your changes, including tests that exercise the code
73
+ 3. Summarize your changes in [CHANGELOG.md](CHANGELOG.md)
74
+ 4. Make a pull request
75
+
76
+ Version announcements happen on the [Payola Payments Google group](https://groups.google.com/forum/#!forum/payola-payments) and [@payolapayments](https://twitter.com/payolapayments).
77
+
78
+ ## Author
79
+
80
+ Pete Keen, [@zrail](https://twitter.com/zrail), [https://www.petekeen.net](https://www.petekeen.net)
data/Rakefile CHANGED
@@ -10,14 +10,15 @@ RDoc::Task.new(:rdoc) do |rdoc|
10
10
  rdoc.rdoc_dir = 'rdoc'
11
11
  rdoc.title = 'Payola'
12
12
  rdoc.options << '--line-numbers'
13
- rdoc.rdoc_files.include('README.rdoc')
13
+ rdoc.rdoc_files.include('README.md')
14
14
  rdoc.rdoc_files.include('lib/**/*.rb')
15
15
  end
16
16
 
17
17
  APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
18
  load 'rails/tasks/engine.rake'
19
19
 
20
- Bundler::GemHelper.install_tasks
20
+ load 'rails/tasks/statistics.rake'
21
+ require 'bundler/gem_tasks'
21
22
 
22
23
  Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
23
24
 
@@ -25,6 +26,6 @@ require 'rspec/core'
25
26
  require 'rspec/core/rake_task'
26
27
 
27
28
  desc "Run all specs in spec directory (excluding plugin specs)"
28
- RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
29
+ RSpec::Core::RakeTask.new(spec: 'app:db:test:prepare')
29
30
 
30
- task :default => :spec
31
+ task default: :spec
@@ -2,12 +2,12 @@
2
2
  // listed below.
3
3
  //
4
4
  // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
- // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
6
  //
7
7
  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
- // compiled file.
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
9
  //
10
- // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
11
  // about supported directives.
12
12
  //
13
13
  //= require_tree .
@@ -10,24 +10,30 @@ var PayolaCheckout = {
10
10
  var form = button.parent('form');
11
11
  var options = form.data();
12
12
 
13
- var handler = StripeCheckout.configure({
14
- key: options.publishable_key,
15
- image: options.product_image_path,
16
- token: function(token) { PayolaCheckout.tokenHandler(token, options); },
17
- name: options.name,
18
- description: options.description,
19
- amount: options.price,
20
- panelLabel: options.panel_label,
21
- allowRememberMe: options.allow_remember_me,
22
- zipCode: options.verify_zip_code,
23
- billingAddress: options.billing_address,
24
- shippingAddress: options.shipping_address,
25
- currency: options.currency,
26
- bitcoin: options.bitcoin,
27
- email: options.email || undefined
28
- });
13
+ if (options.stripe_customer_id) {
14
+ // If an existing Stripe customer id is specified, don't open the Stripe Checkout - just AJAX submit the form
15
+ PayolaCheckout.submitForm(form.attr('action'), { stripe_customer_id: options.stripe_customer_id }, options);
16
+ } else {
17
+ // Open a Stripe Checkout to collect the customer's billing details
18
+ var handler = StripeCheckout.configure({
19
+ key: options.publishable_key,
20
+ image: options.product_image_path,
21
+ token: function(token) { PayolaCheckout.tokenHandler(token, options); },
22
+ name: options.name,
23
+ description: options.description,
24
+ amount: options.price,
25
+ panelLabel: options.panel_label,
26
+ allowRememberMe: options.allow_remember_me,
27
+ zipCode: options.verify_zip_code,
28
+ billingAddress: options.billing_address,
29
+ shippingAddress: options.shipping_address,
30
+ currency: options.currency,
31
+ bitcoin: options.bitcoin,
32
+ email: options.email || undefined
33
+ });
29
34
 
30
- handler.open();
35
+ handler.open();
36
+ }
31
37
  },
32
38
 
33
39
  tokenHandler: function(token, options) {
@@ -38,13 +44,17 @@ var PayolaCheckout = {
38
44
  form.append($('<input type="hidden" name="signed_custom_fields">').val(options.signed_custom_fields));
39
45
  }
40
46
 
47
+ PayolaCheckout.submitForm(form.attr('action'), form.serialize(), options);
48
+ },
49
+
50
+ submitForm: function(url, data, options) {
41
51
  $(".payola-checkout-button").prop("disabled", true);
42
52
  $(".payola-checkout-button-text").hide();
43
53
  $(".payola-checkout-button-spinner").show();
44
54
  $.ajax({
45
55
  type: "POST",
46
- url: options.base_path + "/buy/" + options.product_class + "/" + options.product_permalink,
47
- data: form.serialize(),
56
+ url: url,
57
+ data: data,
48
58
  success: function(data) { PayolaCheckout.poll(data.guid, 60, options); },
49
59
  error: function(data) { PayolaCheckout.showError(jQuery.parseJSON(data.responseText).error, options); }
50
60
  });
@@ -12,7 +12,12 @@ var PayolaSubscriptionCheckout = {
12
12
 
13
13
  if (options.stripe_customer_id) {
14
14
  // If an existing Stripe customer id is specified, don't open the Stripe Checkout - just AJAX submit the form
15
- PayolaSubscriptionCheckout.submitForm(form.attr('action'), { stripe_customer_id: options.stripe_customer_id }, options);
15
+ PayolaSubscriptionCheckout.submitForm(form.attr('action'), {
16
+ stripe_customer_id: options.stripe_customer_id,
17
+ coupon: options.coupon,
18
+ tax_percent: options.tax_percent,
19
+ signed_custom_fields: options.signed_custom_fields || undefined
20
+ }, options);
16
21
  } else {
17
22
  // Open a Stripe Checkout to collect the customer's billing details
18
23
  var handler = StripeCheckout.configure({
@@ -39,6 +44,7 @@ var PayolaSubscriptionCheckout = {
39
44
  var form = $("#" + options.form_id);
40
45
  form.append($('<input type="hidden" name="stripeToken">').val(token.id));
41
46
  form.append($('<input type="hidden" name="stripeEmail">').val(token.email));
47
+ form.append($('<input type="hidden" name="plan_id">').val(options.plan_id));
42
48
  form.append($('<input type="hidden" name="quantity">').val(options.quantity));
43
49
  form.append($('<input type="hidden" name="coupon">').val(options.coupon));
44
50
  form.append($('<input type="hidden" name="tax_percent">').val(options.tax_percent));
@@ -6,6 +6,10 @@ var PayolaOnestepSubscriptionForm = {
6
6
  },
7
7
 
8
8
  handleSubmit: function(form) {
9
+ if (!PayolaOnestepSubscriptionForm.validateForm(form)) {
10
+ return false;
11
+ }
12
+
9
13
  $(form).find(':submit').prop('disabled', true);
10
14
  $('.payola-spinner').show();
11
15
  Stripe.card.createToken(form, function(status, response) {
@@ -14,6 +18,29 @@ var PayolaOnestepSubscriptionForm = {
14
18
  return false;
15
19
  },
16
20
 
21
+ validateForm: function(form) {
22
+ var cardNumber = $( "input[data-stripe='number']" ).val();
23
+ if (!Stripe.card.validateCardNumber(cardNumber)) {
24
+ PayolaOnestepSubscriptionForm.showError(form, 'The card number is not a valid credit card number.');
25
+ return false;
26
+ }
27
+
28
+ var expMonth = $("[data-stripe='exp_month']").val();
29
+ var expYear = $("[data-stripe='exp_year']").val();
30
+ if (!Stripe.card.validateExpiry(expMonth, expYear)) {
31
+ PayolaOnestepSubscriptionForm.showError(form, "Your card's expiration month/year is invalid.");
32
+ return false;
33
+ }
34
+
35
+ var cvc = $( "input[data-stripe='cvc']" ).val();
36
+ if(!Stripe.card.validateCVC(cvc)) {
37
+ PayolaOnestepSubscriptionForm.showError(form, "Your card's security code is invalid.");
38
+ return false;
39
+ }
40
+
41
+ return true;
42
+ },
43
+
17
44
  stripeResponseHandler: function(form, status, response) {
18
45
  if (response.error) {
19
46
  PayolaOnestepSubscriptionForm.showError(form, response.error.message);