pay 2.7.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pay might be problematic. Click here for more details.

Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -715
  3. data/app/controllers/pay/webhooks/braintree_controller.rb +10 -3
  4. data/app/controllers/pay/webhooks/paddle_controller.rb +7 -8
  5. data/app/controllers/pay/webhooks/stripe_controller.rb +6 -3
  6. data/app/jobs/pay/{email_sync_job.rb → customer_sync_job.rb} +3 -4
  7. data/app/models/pay/application_record.rb +1 -5
  8. data/app/models/pay/charge.rb +54 -17
  9. data/app/models/pay/customer.rb +87 -0
  10. data/app/models/pay/merchant.rb +19 -0
  11. data/app/models/pay/payment_method.rb +41 -0
  12. data/app/models/pay/subscription.rb +42 -30
  13. data/app/models/pay/webhook.rb +36 -0
  14. data/app/views/layouts/pay/application.html.erb +2 -3
  15. data/app/views/pay/payments/show.html.erb +108 -81
  16. data/app/views/pay/user_mailer/receipt.html.erb +2 -2
  17. data/app/views/pay/user_mailer/refund.html.erb +2 -2
  18. data/config/locales/en.yml +1 -1
  19. data/db/migrate/1_create_pay_tables.rb +72 -0
  20. data/lib/generators/active_record/templates/billable_migration.rb +1 -0
  21. data/lib/pay/attributes.rb +74 -0
  22. data/lib/pay/billable/sync_customer.rb +30 -0
  23. data/lib/pay/braintree/billable.rb +133 -110
  24. data/lib/pay/braintree/payment_method.rb +42 -0
  25. data/lib/pay/braintree/subscription.rb +9 -12
  26. data/lib/pay/braintree/webhooks/subscription_canceled.rb +1 -1
  27. data/lib/pay/braintree/webhooks/subscription_charged_successfully.rb +4 -4
  28. data/lib/pay/braintree/webhooks/subscription_charged_unsuccessfully.rb +1 -1
  29. data/lib/pay/braintree/webhooks/subscription_expired.rb +1 -1
  30. data/lib/pay/braintree/webhooks/subscription_trial_ended.rb +2 -2
  31. data/lib/pay/braintree/webhooks/subscription_went_active.rb +1 -1
  32. data/lib/pay/braintree/webhooks/subscription_went_past_due.rb +1 -1
  33. data/lib/pay/braintree.rb +3 -2
  34. data/lib/pay/engine.rb +6 -1
  35. data/lib/pay/fake_processor/billable.rb +45 -21
  36. data/lib/pay/fake_processor/payment_method.rb +21 -0
  37. data/lib/pay/fake_processor/subscription.rb +11 -8
  38. data/lib/pay/fake_processor.rb +2 -1
  39. data/lib/pay/nano_id.rb +13 -0
  40. data/lib/pay/paddle/billable.rb +18 -48
  41. data/lib/pay/paddle/charge.rb +5 -5
  42. data/lib/pay/paddle/payment_method.rb +60 -0
  43. data/lib/pay/paddle/response.rb +0 -0
  44. data/lib/pay/paddle/subscription.rb +49 -8
  45. data/lib/pay/paddle/webhooks/subscription_cancelled.rb +6 -3
  46. data/lib/pay/paddle/webhooks/subscription_created.rb +1 -40
  47. data/lib/pay/paddle/webhooks/subscription_payment_refunded.rb +3 -3
  48. data/lib/pay/paddle/webhooks/subscription_payment_succeeded.rb +26 -28
  49. data/lib/pay/paddle/webhooks/subscription_updated.rb +2 -2
  50. data/lib/pay/paddle.rb +7 -3
  51. data/lib/pay/payment.rb +1 -1
  52. data/lib/pay/receipts.rb +35 -7
  53. data/lib/pay/stripe/billable.rb +75 -76
  54. data/lib/pay/stripe/charge.rb +44 -17
  55. data/lib/pay/stripe/merchant.rb +10 -10
  56. data/lib/pay/stripe/payment_method.rb +61 -0
  57. data/lib/pay/stripe/subscription.rb +55 -22
  58. data/lib/pay/stripe/webhooks/account_updated.rb +2 -3
  59. data/lib/pay/stripe/webhooks/charge_refunded.rb +1 -1
  60. data/lib/pay/stripe/webhooks/charge_succeeded.rb +2 -2
  61. data/lib/pay/stripe/webhooks/checkout_session_async_payment_succeeded.rb +3 -1
  62. data/lib/pay/stripe/webhooks/checkout_session_completed.rb +3 -1
  63. data/lib/pay/stripe/webhooks/customer_deleted.rb +7 -15
  64. data/lib/pay/stripe/webhooks/customer_updated.rb +10 -3
  65. data/lib/pay/stripe/webhooks/payment_action_required.rb +2 -2
  66. data/lib/pay/stripe/webhooks/payment_intent_succeeded.rb +6 -8
  67. data/lib/pay/stripe/webhooks/payment_method_attached.rb +15 -0
  68. data/lib/pay/stripe/webhooks/payment_method_detached.rb +12 -0
  69. data/lib/pay/stripe/webhooks/payment_method_updated.rb +10 -4
  70. data/lib/pay/stripe/webhooks/subscription_created.rb +1 -1
  71. data/lib/pay/stripe/webhooks/subscription_deleted.rb +2 -1
  72. data/lib/pay/stripe/webhooks/subscription_renewing.rb +12 -2
  73. data/lib/pay/stripe.rb +6 -3
  74. data/lib/pay/version.rb +1 -1
  75. data/lib/pay/webhooks/delegator.rb +4 -0
  76. data/lib/pay/webhooks/process_job.rb +9 -0
  77. data/lib/pay/webhooks.rb +1 -0
  78. data/lib/pay.rb +7 -78
  79. data/lib/tasks/pay.rake +20 -0
  80. metadata +23 -36
  81. data/app/models/pay.rb +0 -5
  82. data/db/migrate/20170205020145_create_pay_subscriptions.rb +0 -17
  83. data/db/migrate/20170727235816_create_pay_charges.rb +0 -18
  84. data/db/migrate/20190816015720_add_status_to_pay_subscriptions.rb +0 -14
  85. data/db/migrate/20200603134434_add_data_to_pay_models.rb +0 -6
  86. data/db/migrate/20210309004259_add_data_to_pay_billable.rb +0 -10
  87. data/db/migrate/20210406215234_add_currency_to_pay_charges.rb +0 -5
  88. data/db/migrate/20210406215506_add_application_fee_to_pay_models.rb +0 -7
  89. data/lib/pay/billable/sync_email.rb +0 -40
  90. data/lib/pay/billable.rb +0 -172
@@ -4,12 +4,19 @@ module Pay
4
4
  class CustomerUpdated
5
5
  def call(event)
6
6
  object = event.data.object
7
- billable = Pay.find_billable(processor: :stripe, processor_id: object.id)
7
+ pay_customer = Pay::Customer.find_by(processor: :stripe, processor_id: object.id)
8
8
 
9
9
  # Couldn't find user, we can skip
10
- return unless billable.present?
10
+ return unless pay_customer.present?
11
11
 
12
- Pay::Stripe::Billable.new(billable).sync_card_from_stripe
12
+ # Sync default card
13
+ if (payment_method_id = pay_customer.customer.invoice_settings.default_payment_method)
14
+ Pay::Stripe::PaymentMethod.sync(payment_method_id, {stripe_account: event.account}.compact)
15
+
16
+ else
17
+ # No default payment method set
18
+ pay_customer.payment_methods.update_all(default: false)
19
+ end
13
20
  end
14
21
  end
15
22
  end
@@ -8,9 +8,9 @@ module Pay
8
8
 
9
9
  object = event.data.object
10
10
 
11
- subscription = Pay.subscription_model.find_by(processor: :stripe, processor_id: object.subscription)
11
+ subscription = Pay::Subscription.find_by_processor_and_id(:stripe, object.subscription)
12
12
  return if subscription.nil?
13
- billable = subscription.owner
13
+ billable = subscription.customer.owner
14
14
 
15
15
  notify_user(billable, event.data.object.payment_intent, subscription)
16
16
  end
@@ -2,17 +2,15 @@ module Pay
2
2
  module Stripe
3
3
  module Webhooks
4
4
  class PaymentIntentSucceeded
5
+ # This webhook does NOT send notifications because stripe sends both
6
+ # `charge.succeeded` and `payment_intent.succeeded` events.
7
+ #
8
+ # We use `charge.succeeded` as the single place to send notifications
9
+
5
10
  def call(event)
6
11
  object = event.data.object
7
12
  object.charges.data.each do |charge|
8
- pay_charge = Pay::Stripe::Charge.sync(charge.id)
9
- notify_user(pay_charge.owner, pay_charge) if pay_charge
10
- end
11
- end
12
-
13
- def notify_user(billable, charge)
14
- if Pay.send_emails && charge.respond_to?(:receipt)
15
- Pay::UserMailer.with(billable: billable, charge: charge).receipt.deliver_later
13
+ Pay::Stripe::Charge.sync(charge.id, stripe_account: event.try(:account))
16
14
  end
17
15
  end
18
16
  end
@@ -0,0 +1,15 @@
1
+ module Pay
2
+ module Stripe
3
+ module Webhooks
4
+ class PaymentMethodAttached
5
+ def call(event)
6
+ object = event.data.object
7
+ pay_customer = Pay::Customer.find_by(processor: :stripe, processor_id: object.customer)
8
+ return unless pay_customer
9
+
10
+ pay_customer.save_payment_method(object, default: false)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module Pay
2
+ module Stripe
3
+ module Webhooks
4
+ class PaymentMethodDetached
5
+ def call(event)
6
+ object = event.data.object
7
+ Pay::PaymentMethod.find_by_processor_and_id(:stripe, object.id)&.destroy
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -4,12 +4,18 @@ module Pay
4
4
  class PaymentMethodUpdated
5
5
  def call(event)
6
6
  object = event.data.object
7
- billable = Pay.find_billable(processor: :stripe, processor_id: object.customer)
8
7
 
9
- # Couldn't find user, we can skip
10
- return unless billable.present?
8
+ if object.customer
9
+ pay_customer = Pay::Customer.find_by(processor: :stripe, processor_id: object.customer)
11
10
 
12
- Pay::Stripe::Billable.new(billable).sync_card_from_stripe
11
+ # Couldn't find user, we can skip
12
+ return unless pay_customer.present?
13
+
14
+ Pay::Stripe::PaymentMethod.sync(object.id, stripe_account: event.try(:account))
15
+ else
16
+ # If customer was removed, we should delete the payment method if it exists
17
+ Pay::PaymentMethod.find_by_processor_and_id(:stripe, object.id)&.destroy
18
+ end
13
19
  end
14
20
  end
15
21
  end
@@ -3,7 +3,7 @@ module Pay
3
3
  module Webhooks
4
4
  class SubscriptionCreated
5
5
  def call(event)
6
- Pay::Stripe::Subscription.sync(event.data.object.id)
6
+ Pay::Stripe::Subscription.sync(event.data.object.id, stripe_account: event.try(:account))
7
7
  end
8
8
  end
9
9
  end
@@ -3,7 +3,8 @@ module Pay
3
3
  module Webhooks
4
4
  class SubscriptionDeleted
5
5
  def call(event)
6
- Pay::Stripe::Subscription.sync(event.data.object.id)
6
+ # Canceled subscriptions are still accessible via the API, so we can sync their details
7
+ Pay::Stripe::Subscription.sync(event.data.object.id, stripe_account: event.try(:account))
7
8
  end
8
9
  end
9
10
  end
@@ -2,13 +2,23 @@ module Pay
2
2
  module Stripe
3
3
  module Webhooks
4
4
  class SubscriptionRenewing
5
+ # Handles `invoice.upcoming` webhook from Stripe
6
+ # Occurs X number of days before a subscription is scheduled to create an invoice that is automatically charged—where X is determined by your subscriptions settings. Note: The received Invoice object will not have an invoice ID.
7
+
5
8
  def call(event)
6
9
  # Event is of type "invoice" see:
7
10
  # https://stripe.com/docs/api/invoices/object
8
- subscription = Pay.subscription_model.find_by(processor: :stripe, processor_id: event.data.object.subscription)
11
+ subscription = Pay::Subscription.find_by_processor_and_id(:stripe, event.data.object.subscription)
9
12
  return unless subscription
10
13
 
11
- notify_user(subscription.owner, subscription, Time.zone.at(event.data.object.next_payment_attempt))
14
+ # Stripe subscription items all have the same interval
15
+ price = event.data.object.lines.data.first.price
16
+ return unless price.type == "recurring"
17
+
18
+ interval = price.recurring.interval
19
+ return unless interval == "year"
20
+
21
+ notify_user(subscription.customer.owner, subscription, Time.zone.at(event.data.object.next_payment_attempt))
12
22
  end
13
23
 
14
24
  def notify_user(billable, subscription, date)
data/lib/pay/stripe.rb CHANGED
@@ -2,9 +2,10 @@ module Pay
2
2
  module Stripe
3
3
  autoload :Billable, "pay/stripe/billable"
4
4
  autoload :Charge, "pay/stripe/charge"
5
- autoload :Subscription, "pay/stripe/subscription"
6
5
  autoload :Error, "pay/stripe/error"
7
6
  autoload :Merchant, "pay/stripe/merchant"
7
+ autoload :PaymentMethod, "pay/stripe/payment_method"
8
+ autoload :Subscription, "pay/stripe/subscription"
8
9
 
9
10
  module Webhooks
10
11
  autoload :AccountUpdated, "pay/stripe/webhooks/account_updated"
@@ -16,6 +17,8 @@ module Pay
16
17
  autoload :CustomerUpdated, "pay/stripe/webhooks/customer_updated"
17
18
  autoload :PaymentActionRequired, "pay/stripe/webhooks/payment_action_required"
18
19
  autoload :PaymentIntentSucceeded, "pay/stripe/webhooks/payment_intent_succeeded"
20
+ autoload :PaymentMethodAttached, "pay/stripe/webhooks/payment_method_attached"
21
+ autoload :PaymentMethodDetached, "pay/stripe/webhooks/payment_method_detached"
19
22
  autoload :PaymentMethodUpdated, "pay/stripe/webhooks/payment_method_updated"
20
23
  autoload :SubscriptionCreated, "pay/stripe/webhooks/subscription_created"
21
24
  autoload :SubscriptionDeleted, "pay/stripe/webhooks/subscription_deleted"
@@ -81,10 +84,10 @@ module Pay
81
84
  events.subscribe "stripe.customer.deleted", Pay::Stripe::Webhooks::CustomerDeleted.new
82
85
 
83
86
  # If a customer's payment source was deleted in Stripe, we should update as well
84
- events.subscribe "stripe.payment_method.attached", Pay::Stripe::Webhooks::PaymentMethodUpdated.new
87
+ events.subscribe "stripe.payment_method.attached", Pay::Stripe::Webhooks::PaymentMethodAttached.new
85
88
  events.subscribe "stripe.payment_method.updated", Pay::Stripe::Webhooks::PaymentMethodUpdated.new
86
89
  events.subscribe "stripe.payment_method.card_automatically_updated", Pay::Stripe::Webhooks::PaymentMethodUpdated.new
87
- events.subscribe "stripe.payment_method.detached", Pay::Stripe::Webhooks::PaymentMethodUpdated.new
90
+ events.subscribe "stripe.payment_method.detached", Pay::Stripe::Webhooks::PaymentMethodDetached.new
88
91
 
89
92
  # If an account is updated in stripe, we should update it as well
90
93
  events.subscribe "stripe.account.updated", Pay::Stripe::Webhooks::AccountUpdated.new
data/lib/pay/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pay
2
- VERSION = "2.7.1"
2
+ VERSION = "3.0.2"
3
3
  end
@@ -35,6 +35,10 @@ module Pay
35
35
  backend.instrument name_with_namespace(type), event
36
36
  end
37
37
 
38
+ def listening?(type)
39
+ backend.notifier.listening? name_with_namespace(type)
40
+ end
41
+
38
42
  # Strips down to event data only
39
43
  class NotificationAdapter
40
44
  def initialize(subscriber)
@@ -0,0 +1,9 @@
1
+ module Pay
2
+ module Webhooks
3
+ class ProcessJob < ApplicationJob
4
+ def perform(pay_webhook)
5
+ pay_webhook.process!
6
+ end
7
+ end
8
+ end
9
+ end
data/lib/pay/webhooks.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module Pay
2
2
  module Webhooks
3
3
  autoload :Delegator, "pay/webhooks/delegator"
4
+ autoload :ProcessJob, "pay/webhooks/process_job"
4
5
 
5
6
  class << self
6
7
  delegate :configure, :instrument, to: :delegator
data/lib/pay.rb CHANGED
@@ -4,9 +4,9 @@ require "pay/errors"
4
4
  require "pay/adapter"
5
5
 
6
6
  module Pay
7
- autoload :Billable, "pay/billable"
7
+ autoload :Attributes, "pay/attributes"
8
8
  autoload :Env, "pay/env"
9
- autoload :Merchant, "pay/merchant"
9
+ autoload :NanoId, "pay/nano_id"
10
10
  autoload :Payment, "pay/payment"
11
11
  autoload :Receipts, "pay/receipts"
12
12
 
@@ -18,27 +18,15 @@ module Pay
18
18
 
19
19
  autoload :Webhooks, "pay/webhooks"
20
20
 
21
- # Define who owns the subscription
22
- mattr_accessor :billable_class
23
- mattr_accessor :billable_table
24
- mattr_accessor :braintree_gateway
21
+ module Billable
22
+ autoload :SyncCustomer, "pay/billable/sync_customer"
23
+ end
25
24
 
26
- @@billable_class = "User"
27
- @@billable_table = @@billable_class.tableize
25
+ mattr_accessor :braintree_gateway
28
26
 
29
27
  mattr_accessor :model_parent_class
30
28
  @@model_parent_class = "ApplicationRecord"
31
29
 
32
- mattr_accessor :chargeable_class
33
- mattr_accessor :chargeable_table
34
- @@chargeable_class = "Pay::Charge"
35
- @@chargeable_table = "pay_charges"
36
-
37
- mattr_accessor :subscription_class
38
- mattr_accessor :subscription_table
39
- @@subscription_class = "Pay::Subscription"
40
- @@subscription_table = "pay_subscriptions"
41
-
42
30
  # Business details for receipts
43
31
  mattr_accessor :application_name
44
32
  mattr_accessor :business_address
@@ -54,6 +42,7 @@ module Pay
54
42
 
55
43
  mattr_accessor :default_product_name
56
44
  @@default_product_name = "default"
45
+
57
46
  mattr_accessor :default_plan_name
58
47
  @@default_plan_name = "default"
59
48
 
@@ -64,66 +53,6 @@ module Pay
64
53
  yield self
65
54
  end
66
55
 
67
- def self.billable_models
68
- Pay::Billable.includers
69
- end
70
-
71
- def self.merchant_models
72
- Pay::Merchant.includers
73
- end
74
-
75
- def self.find_merchant(account_key, account_value)
76
- merchant_models.each do |model|
77
- case Pay::Adapter.current_adapter
78
- when "postgresql"
79
- return model.find_by("pay_data @> ?", {account_key.to_sym => account_value}.to_json)
80
- when "mysql2"
81
- return model.find_by("JSON_CONTAINS(pay_data, ?)", {account_key.to_sym => account_value}.to_json)
82
- when "sqlite3"
83
- return model.find_by("json_extract(pay_data, ?) =?", "$.#{account_key}", account_value)
84
- else
85
- model.find_by(pay_data: {account_key.to_sym => account_value})
86
- end
87
- end
88
- nil
89
- end
90
-
91
- def self.find_billable(processor:, processor_id:)
92
- billable_models.each do |model|
93
- if (record = model.find_by(processor: processor, processor_id: processor_id))
94
- return record
95
- end
96
- end
97
-
98
- nil
99
- end
100
-
101
- def self.user_model
102
- ActiveSupport::Deprecation.warn("Pay.user_model is deprecated and will be removed in v3. Instead, use `Pay.billable_models` now to support more than one billable model.")
103
-
104
- if Rails.application.config.cache_classes
105
- @@user_model ||= billable_class.constantize
106
- else
107
- billable_class.constantize
108
- end
109
- end
110
-
111
- def self.charge_model
112
- if Rails.application.config.cache_classes
113
- @@charge_model ||= chargeable_class.constantize
114
- else
115
- chargeable_class.constantize
116
- end
117
- end
118
-
119
- def self.subscription_model
120
- if Rails.application.config.cache_classes
121
- @@subscription_model ||= subscription_class.constantize
122
- else
123
- subscription_class.constantize
124
- end
125
- end
126
-
127
56
  def self.receipts_supported?
128
57
  charge_model.respond_to?(:receipt) &&
129
58
  application_name.present? &&
@@ -0,0 +1,20 @@
1
+ namespace :pay do
2
+ namespace :payment_methods do
3
+ desc "Sync default payment methods for Pay::Customers"
4
+ task sync_default: :environment do
5
+ Pay::Customer.find_each do |pay_customer|
6
+ puts "Syncing Pay::Customer ##{pay_customer.id}: #{pay_customer.processor.titleize} #{pay_customer.processor_id}"
7
+ case pay_customer.processor
8
+ when "braintree"
9
+ payment_method = pay_customer.customer.payment_methods.find(&:default?)
10
+ Pay::Braintree::PaymentMethod.sync(payment_method.token, object: payment_method) if payment_method
11
+ when "stripe"
12
+ payment_method_id = pay_customer.customer.invoice_settings.default_payment_method
13
+ Pay::Stripe::PaymentMethod.sync(payment_method_id) if payment_method_id
14
+ when "paddle"
15
+ Pay::Paddle::PaymentMethod.sync(pay_customer)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pay
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.1
4
+ version: 3.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Charnes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-06-22 00:00:00.000000000 Z
12
+ date: 2021-09-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -17,34 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '4.2'
20
+ version: 6.0.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '4.2'
28
- - !ruby/object:Gem::Dependency
29
- name: minitest-rails
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: '6'
35
- - - "<"
36
- - !ruby/object:Gem::Version
37
- version: '7.0'
38
- type: :development
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- version: '6'
45
- - - "<"
46
- - !ruby/object:Gem::Version
47
- version: '7.0'
27
+ version: 6.0.0
48
28
  - !ruby/object:Gem::Dependency
49
29
  name: mocha
50
30
  requirement: !ruby/object:Gem::Requirement
@@ -122,13 +102,16 @@ files:
122
102
  - app/controllers/pay/webhooks/stripe_controller.rb
123
103
  - app/helpers/pay/application_helper.rb
124
104
  - app/jobs/pay/application_job.rb
125
- - app/jobs/pay/email_sync_job.rb
105
+ - app/jobs/pay/customer_sync_job.rb
126
106
  - app/mailers/pay/application_mailer.rb
127
107
  - app/mailers/pay/user_mailer.rb
128
- - app/models/pay.rb
129
108
  - app/models/pay/application_record.rb
130
109
  - app/models/pay/charge.rb
110
+ - app/models/pay/customer.rb
111
+ - app/models/pay/merchant.rb
112
+ - app/models/pay/payment_method.rb
131
113
  - app/models/pay/subscription.rb
114
+ - app/models/pay/webhook.rb
132
115
  - app/views/layouts/pay/application.html.erb
133
116
  - app/views/pay/payments/show.html.erb
134
117
  - app/views/pay/stripe/_checkout_button.html.erb
@@ -138,13 +121,7 @@ files:
138
121
  - app/views/pay/user_mailer/subscription_renewing.html.erb
139
122
  - config/locales/en.yml
140
123
  - config/routes.rb
141
- - db/migrate/20170205020145_create_pay_subscriptions.rb
142
- - db/migrate/20170727235816_create_pay_charges.rb
143
- - db/migrate/20190816015720_add_status_to_pay_subscriptions.rb
144
- - db/migrate/20200603134434_add_data_to_pay_models.rb
145
- - db/migrate/20210309004259_add_data_to_pay_billable.rb
146
- - db/migrate/20210406215234_add_currency_to_pay_charges.rb
147
- - db/migrate/20210406215506_add_application_fee_to_pay_models.rb
124
+ - db/migrate/1_create_pay_tables.rb
148
125
  - lib/generators/active_record/billable_generator.rb
149
126
  - lib/generators/active_record/merchant_generator.rb
150
127
  - lib/generators/active_record/templates/billable_migration.rb
@@ -156,13 +133,14 @@ files:
156
133
  - lib/generators/pay/views_generator.rb
157
134
  - lib/pay.rb
158
135
  - lib/pay/adapter.rb
159
- - lib/pay/billable.rb
160
- - lib/pay/billable/sync_email.rb
136
+ - lib/pay/attributes.rb
137
+ - lib/pay/billable/sync_customer.rb
161
138
  - lib/pay/braintree.rb
162
139
  - lib/pay/braintree/authorization_error.rb
163
140
  - lib/pay/braintree/billable.rb
164
141
  - lib/pay/braintree/charge.rb
165
142
  - lib/pay/braintree/error.rb
143
+ - lib/pay/braintree/payment_method.rb
166
144
  - lib/pay/braintree/subscription.rb
167
145
  - lib/pay/braintree/webhooks/subscription_canceled.rb
168
146
  - lib/pay/braintree/webhooks/subscription_charged_successfully.rb
@@ -178,12 +156,16 @@ files:
178
156
  - lib/pay/fake_processor/billable.rb
179
157
  - lib/pay/fake_processor/charge.rb
180
158
  - lib/pay/fake_processor/error.rb
159
+ - lib/pay/fake_processor/payment_method.rb
181
160
  - lib/pay/fake_processor/subscription.rb
182
161
  - lib/pay/merchant.rb
162
+ - lib/pay/nano_id.rb
183
163
  - lib/pay/paddle.rb
184
164
  - lib/pay/paddle/billable.rb
185
165
  - lib/pay/paddle/charge.rb
186
166
  - lib/pay/paddle/error.rb
167
+ - lib/pay/paddle/payment_method.rb
168
+ - lib/pay/paddle/response.rb
187
169
  - lib/pay/paddle/subscription.rb
188
170
  - lib/pay/paddle/webhooks/signature_verifier.rb
189
171
  - lib/pay/paddle/webhooks/subscription_cancelled.rb
@@ -198,6 +180,7 @@ files:
198
180
  - lib/pay/stripe/charge.rb
199
181
  - lib/pay/stripe/error.rb
200
182
  - lib/pay/stripe/merchant.rb
183
+ - lib/pay/stripe/payment_method.rb
201
184
  - lib/pay/stripe/subscription.rb
202
185
  - lib/pay/stripe/webhooks/account_updated.rb
203
186
  - lib/pay/stripe/webhooks/charge_refunded.rb
@@ -208,6 +191,8 @@ files:
208
191
  - lib/pay/stripe/webhooks/customer_updated.rb
209
192
  - lib/pay/stripe/webhooks/payment_action_required.rb
210
193
  - lib/pay/stripe/webhooks/payment_intent_succeeded.rb
194
+ - lib/pay/stripe/webhooks/payment_method_attached.rb
195
+ - lib/pay/stripe/webhooks/payment_method_detached.rb
211
196
  - lib/pay/stripe/webhooks/payment_method_updated.rb
212
197
  - lib/pay/stripe/webhooks/subscription_created.rb
213
198
  - lib/pay/stripe/webhooks/subscription_deleted.rb
@@ -216,6 +201,8 @@ files:
216
201
  - lib/pay/version.rb
217
202
  - lib/pay/webhooks.rb
218
203
  - lib/pay/webhooks/delegator.rb
204
+ - lib/pay/webhooks/process_job.rb
205
+ - lib/tasks/pay.rake
219
206
  homepage: https://github.com/pay-rails/pay
220
207
  licenses:
221
208
  - MIT
@@ -235,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
222
  - !ruby/object:Gem::Version
236
223
  version: '0'
237
224
  requirements: []
238
- rubygems_version: 3.2.15
225
+ rubygems_version: 3.2.22
239
226
  signing_key:
240
227
  specification_version: 4
241
228
  summary: Payments engine for Ruby on Rails