payola-payments 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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);