pay 6.8.0 → 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/pay/webhooks/paddle_billing_controller.rb +51 -0
- data/app/controllers/pay/webhooks/{paddle_controller.rb → paddle_classic_controller.rb} +6 -6
- data/app/mailers/pay/application_mailer.rb +5 -1
- data/app/models/pay/charge.rb +1 -2
- data/app/models/pay/customer.rb +1 -2
- data/app/models/pay/merchant.rb +1 -3
- data/app/models/pay/payment_method.rb +1 -2
- data/app/models/pay/subscription.rb +10 -11
- data/app/models/pay/webhook.rb +10 -5
- data/app/views/pay/payments/show.html.erb +10 -17
- data/config/locales/en.yml +1 -1
- data/config/routes.rb +2 -1
- data/db/migrate/1_create_pay_tables.rb +6 -1
- data/lib/pay/braintree/subscription.rb +12 -2
- data/lib/pay/engine.rb +3 -2
- data/lib/pay/env.rb +1 -7
- data/lib/pay/fake_processor/subscription.rb +11 -1
- data/lib/pay/lemon_squeezy/billable.rb +90 -0
- data/lib/pay/lemon_squeezy/charge.rb +68 -0
- data/lib/pay/{paddle → lemon_squeezy}/error.rb +1 -1
- data/lib/pay/lemon_squeezy/payment_method.rb +40 -0
- data/lib/pay/lemon_squeezy/subscription.rb +185 -0
- data/lib/pay/lemon_squeezy/webhooks/subscription.rb +11 -0
- data/lib/pay/lemon_squeezy/webhooks/transaction_completed.rb +11 -0
- data/lib/pay/lemon_squeezy.rb +138 -0
- data/lib/pay/paddle_billing/billable.rb +90 -0
- data/lib/pay/paddle_billing/charge.rb +68 -0
- data/lib/pay/paddle_billing/error.rb +7 -0
- data/lib/pay/paddle_billing/payment_method.rb +40 -0
- data/lib/pay/paddle_billing/subscription.rb +185 -0
- data/lib/pay/paddle_billing/webhooks/subscription.rb +11 -0
- data/lib/pay/paddle_billing/webhooks/transaction_completed.rb +11 -0
- data/lib/pay/paddle_billing.rb +58 -0
- data/lib/pay/{paddle → paddle_classic}/billable.rb +9 -10
- data/lib/pay/paddle_classic/charge.rb +35 -0
- data/lib/pay/paddle_classic/error.rb +7 -0
- data/lib/pay/{paddle → paddle_classic}/payment_method.rb +4 -4
- data/lib/pay/{paddle → paddle_classic}/subscription.rb +39 -30
- data/lib/pay/{paddle → paddle_classic}/webhooks/signature_verifier.rb +4 -4
- data/lib/pay/{paddle → paddle_classic}/webhooks/subscription_cancelled.rb +5 -4
- data/lib/pay/{paddle → paddle_classic}/webhooks/subscription_created.rb +2 -2
- data/lib/pay/{paddle → paddle_classic}/webhooks/subscription_payment_refunded.rb +2 -2
- data/lib/pay/{paddle → paddle_classic}/webhooks/subscription_payment_succeeded.rb +7 -7
- data/lib/pay/{paddle → paddle_classic}/webhooks/subscription_updated.rb +2 -2
- data/lib/pay/paddle_classic.rb +82 -0
- data/lib/pay/receipts.rb +1 -1
- data/lib/pay/stripe/billable.rb +6 -2
- data/lib/pay/stripe/charge.rb +8 -4
- data/lib/pay/stripe/payment_method.rb +9 -1
- data/lib/pay/stripe/subscription.rb +54 -4
- data/lib/pay/stripe.rb +3 -4
- data/lib/pay/version.rb +1 -1
- data/lib/pay.rb +3 -2
- data/lib/tasks/pay.rake +2 -2
- metadata +33 -17
- data/lib/pay/paddle/charge.rb +0 -35
- data/lib/pay/paddle/response.rb +0 -0
- data/lib/pay/paddle.rb +0 -80
@@ -0,0 +1,82 @@
|
|
1
|
+
module Pay
|
2
|
+
module PaddleClassic
|
3
|
+
autoload :Billable, "pay/paddle_classic/billable"
|
4
|
+
autoload :Charge, "pay/paddle_classic/charge"
|
5
|
+
autoload :Error, "pay/paddle_classic/error"
|
6
|
+
autoload :PaymentMethod, "pay/paddle_classic/payment_method"
|
7
|
+
autoload :Subscription, "pay/paddle_classic/subscription"
|
8
|
+
|
9
|
+
module Webhooks
|
10
|
+
autoload :SignatureVerifier, "pay/paddle_classic/webhooks/signature_verifier"
|
11
|
+
autoload :SubscriptionCreated, "pay/paddle_classic/webhooks/subscription_created"
|
12
|
+
autoload :SubscriptionCancelled, "pay/paddle_classic/webhooks/subscription_cancelled"
|
13
|
+
autoload :SubscriptionPaymentRefunded, "pay/paddle_classic/webhooks/subscription_payment_refunded"
|
14
|
+
autoload :SubscriptionPaymentSucceeded, "pay/paddle_classic/webhooks/subscription_payment_succeeded"
|
15
|
+
autoload :SubscriptionUpdated, "pay/paddle_classic/webhooks/subscription_updated"
|
16
|
+
end
|
17
|
+
|
18
|
+
extend Env
|
19
|
+
|
20
|
+
def self.enabled?
|
21
|
+
return false unless Pay.enabled_processors.include?(:paddle_classic) && defined?(::Paddle)
|
22
|
+
|
23
|
+
Pay::Engine.version_matches?(required: "~> 2.1", current: ::Paddle::VERSION) || (raise "[Pay] paddle gem must be version ~> 2.1")
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.client
|
27
|
+
@client ||= Paddle::Classic::Client.new(
|
28
|
+
vendor_id: vendor_id,
|
29
|
+
vendor_auth_code: vendor_auth_code,
|
30
|
+
sandbox: environment != "production"
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.vendor_id
|
35
|
+
find_value_by_name(:paddle_classic, :vendor_id)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.vendor_auth_code
|
39
|
+
find_value_by_name(:paddle_classic, :vendor_auth_code)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.environment
|
43
|
+
find_value_by_name(:paddle_classic, :environment) || "production"
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.public_key
|
47
|
+
find_value_by_name(:paddle_classic, :public_key)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.public_key_file
|
51
|
+
find_value_by_name(:paddle_classic, :public_key_file)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.public_key_base64
|
55
|
+
find_value_by_name(:paddle_classic, :public_key_base64)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.passthrough(owner:, **options)
|
59
|
+
options.merge(owner_sgid: owner.to_sgid.to_s).to_json
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.parse_passthrough(passthrough)
|
63
|
+
JSON.parse(passthrough)
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.owner_from_passthrough(passthrough)
|
67
|
+
GlobalID::Locator.locate_signed parse_passthrough(passthrough)["owner_sgid"]
|
68
|
+
rescue JSON::ParserError
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.configure_webhooks
|
73
|
+
Pay::Webhooks.configure do |events|
|
74
|
+
events.subscribe "paddle_classic.subscription_created", Pay::PaddleClassic::Webhooks::SubscriptionCreated.new
|
75
|
+
events.subscribe "paddle_classic.subscription_updated", Pay::PaddleClassic::Webhooks::SubscriptionUpdated.new
|
76
|
+
events.subscribe "paddle_classic.subscription_cancelled", Pay::PaddleClassic::Webhooks::SubscriptionCancelled.new
|
77
|
+
events.subscribe "paddle_classic.subscription_payment_succeeded", Pay::PaddleClassic::Webhooks::SubscriptionPaymentSucceeded.new
|
78
|
+
events.subscribe "paddle_classic.subscription_payment_refunded", Pay::PaddleClassic::Webhooks::SubscriptionPaymentRefunded.new
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/pay/receipts.rb
CHANGED
data/lib/pay/stripe/billable.rb
CHANGED
@@ -227,12 +227,16 @@ module Pay
|
|
227
227
|
mode: "payment"
|
228
228
|
}
|
229
229
|
|
230
|
-
#
|
231
|
-
if options[:ui_mode]
|
230
|
+
# Hosted (the default) checkout sessions require a success_url and cancel_url
|
231
|
+
if ["", "hosted"].include? options[:ui_mode].to_s
|
232
232
|
args[:success_url] = merge_session_id_param(options.delete(:success_url) || root_url)
|
233
233
|
args[:cancel_url] = merge_session_id_param(options.delete(:cancel_url) || root_url)
|
234
234
|
end
|
235
235
|
|
236
|
+
if options[:return_url]
|
237
|
+
args[:return_url] = merge_session_id_param(options.delete(:return_url))
|
238
|
+
end
|
239
|
+
|
236
240
|
# Line items are optional
|
237
241
|
if (line_items = options.delete(:line_items))
|
238
242
|
quantity = options.delete(:quantity) || 1
|
data/lib/pay/stripe/charge.rb
CHANGED
@@ -15,12 +15,16 @@ module Pay
|
|
15
15
|
def self.sync(charge_id, object: nil, stripe_account: nil, try: 0, retries: 1)
|
16
16
|
# Skip loading the latest charge details from the API if we already have it
|
17
17
|
object ||= ::Stripe::Charge.retrieve({id: charge_id, expand: ["invoice.total_discount_amounts.discount", "invoice.total_tax_amounts.tax_rate", "refunds"]}, {stripe_account: stripe_account}.compact)
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
if object.customer.blank?
|
19
|
+
Rails.logger.debug "Stripe Charge #{object.id} does not have a customer"
|
20
|
+
return
|
21
|
+
end
|
21
22
|
|
22
23
|
pay_customer = Pay::Customer.find_by(processor: :stripe, processor_id: object.customer)
|
23
|
-
|
24
|
+
if pay_customer.blank?
|
25
|
+
Rails.logger.debug "Pay::Customer #{object.customer} is not in the database while syncing Stripe Charge #{object.id}"
|
26
|
+
return
|
27
|
+
end
|
24
28
|
|
25
29
|
refunds = []
|
26
30
|
object.refunds.auto_paging_each { |refund| refunds << refund }
|
@@ -28,9 +28,16 @@ module Pay
|
|
28
28
|
# Syncs PaymentMethod objects from Stripe
|
29
29
|
def self.sync(id, object: nil, stripe_account: nil, try: 0, retries: 1)
|
30
30
|
object ||= ::Stripe::PaymentMethod.retrieve(id, {stripe_account: stripe_account}.compact)
|
31
|
+
if object.customer.blank?
|
32
|
+
Rails.logger.debug "Stripe PaymentMethod #{object.id} does not have a customer"
|
33
|
+
return
|
34
|
+
end
|
31
35
|
|
32
36
|
pay_customer = Pay::Customer.find_by(processor: :stripe, processor_id: object.customer)
|
33
|
-
|
37
|
+
if pay_customer.blank?
|
38
|
+
Rails.logger.debug "Pay::Customer #{object.customer} is not in the database while syncing Stripe PaymentMethod #{object.id}"
|
39
|
+
return
|
40
|
+
end
|
34
41
|
|
35
42
|
default_payment_method_id = pay_customer.customer.invoice_settings.default_payment_method
|
36
43
|
default = (id == default_payment_method_id)
|
@@ -57,6 +64,7 @@ module Pay
|
|
57
64
|
|
58
65
|
{
|
59
66
|
payment_method_type: payment_method.type,
|
67
|
+
email: details.try(:email), # Link
|
60
68
|
brand: details.try(:brand)&.capitalize,
|
61
69
|
last4: details.try(:last4).to_s,
|
62
70
|
exp_month: details.try(:exp_month).to_s,
|
@@ -10,6 +10,7 @@ module Pay
|
|
10
10
|
:ends_at,
|
11
11
|
:name,
|
12
12
|
:on_trial?,
|
13
|
+
:past_due?,
|
13
14
|
:pause_starts_at,
|
14
15
|
:pause_starts_at?,
|
15
16
|
:processor_id,
|
@@ -28,12 +29,24 @@ module Pay
|
|
28
29
|
:current_period_end,
|
29
30
|
to: :pay_subscription
|
30
31
|
|
32
|
+
def self.sync_from_checkout_session(session_id, stripe_account: nil)
|
33
|
+
checkout_session = ::Stripe::Checkout::Session.retrieve({id: session_id}, {stripe_account: stripe_account}.compact)
|
34
|
+
sync(checkout_session.subscription)
|
35
|
+
end
|
36
|
+
|
31
37
|
def self.sync(subscription_id, object: nil, name: nil, stripe_account: nil, try: 0, retries: 1)
|
32
38
|
# Skip loading the latest subscription details from the API if we already have it
|
33
39
|
object ||= ::Stripe::Subscription.retrieve({id: subscription_id}.merge(expand_options), {stripe_account: stripe_account}.compact)
|
40
|
+
if object.customer.blank?
|
41
|
+
Rails.logger.debug "Stripe Subscription #{object.id} does not have a customer"
|
42
|
+
return
|
43
|
+
end
|
34
44
|
|
35
45
|
pay_customer = Pay::Customer.find_by(processor: :stripe, processor_id: object.customer)
|
36
|
-
|
46
|
+
if pay_customer.blank?
|
47
|
+
Rails.logger.debug "Pay::Customer #{object.customer} is not in the database while syncing Stripe Subscription #{object.id}"
|
48
|
+
return
|
49
|
+
end
|
37
50
|
|
38
51
|
attributes = {
|
39
52
|
application_fee_percent: object.application_fee_percent,
|
@@ -82,6 +95,17 @@ module Pay
|
|
82
95
|
Time.at(object.current_period_end)
|
83
96
|
end
|
84
97
|
|
98
|
+
# Sync payment method if directly attached to subscription
|
99
|
+
if object.default_payment_method
|
100
|
+
if object.default_payment_method.is_a? String
|
101
|
+
Pay::Stripe::PaymentMethod.sync(object.default_payment_method)
|
102
|
+
attributes[:payment_method_id] = object.default_payment_method
|
103
|
+
else
|
104
|
+
Pay::Stripe::PaymentMethod.sync(object.default_payment_method.id, object: object.default_payment_method)
|
105
|
+
attributes[:payment_method_id] = object.default_payment_method.id
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
85
109
|
# Update or create the subscription
|
86
110
|
pay_subscription = pay_customer.subscriptions.find_by(processor_id: object.id)
|
87
111
|
if pay_subscription
|
@@ -123,6 +147,7 @@ module Pay
|
|
123
147
|
def self.expand_options
|
124
148
|
{
|
125
149
|
expand: [
|
150
|
+
"default_payment_method",
|
126
151
|
"pending_setup_intent",
|
127
152
|
"latest_invoice.payment_intent",
|
128
153
|
"latest_invoice.charge",
|
@@ -151,9 +176,28 @@ module Pay
|
|
151
176
|
stripe_sub&.pending_setup_intent&.client_secret || stripe_sub&.latest_invoice&.payment_intent&.client_secret
|
152
177
|
end
|
153
178
|
|
179
|
+
# Sets the default_payment_method on a subscription
|
180
|
+
# Pass an empty string to unset
|
181
|
+
def update_payment_method(id)
|
182
|
+
@stripe_subscription = ::Stripe::Subscription.update(processor_id, {default_payment_method: id}.merge(expand_options), stripe_options)
|
183
|
+
pay_subscription.update(payment_method_id: @stripe_subscription.default_payment_method&.id)
|
184
|
+
rescue ::Stripe::StripeError => e
|
185
|
+
raise Pay::Stripe::Error, e
|
186
|
+
end
|
187
|
+
|
188
|
+
# Marks a subscription to cancel at period end
|
189
|
+
#
|
190
|
+
# If subscription is already past_due, the subscription will be cancelled immediately
|
191
|
+
# To disable this, pass past_due_cancel_now: false
|
154
192
|
def cancel(**options)
|
155
|
-
|
156
|
-
|
193
|
+
return if canceled?
|
194
|
+
|
195
|
+
if past_due? && options.fetch(:past_due_cancel_now, true)
|
196
|
+
cancel_now!
|
197
|
+
else
|
198
|
+
@stripe_subscription = ::Stripe::Subscription.update(processor_id, {cancel_at_period_end: true}.merge(expand_options), stripe_options)
|
199
|
+
pay_subscription.update(ends_at: (on_trial? ? trial_ends_at : Time.at(@stripe_subscription.current_period_end)))
|
200
|
+
end
|
157
201
|
rescue ::Stripe::StripeError => e
|
158
202
|
raise Pay::Stripe::Error, e
|
159
203
|
end
|
@@ -163,6 +207,8 @@ module Pay
|
|
163
207
|
# cancel_now!(prorate: true)
|
164
208
|
# cancel_now!(invoice_now: true)
|
165
209
|
def cancel_now!(**options)
|
210
|
+
return if canceled?
|
211
|
+
|
166
212
|
@stripe_subscription = ::Stripe::Subscription.cancel(processor_id, options.merge(expand_options), stripe_options)
|
167
213
|
pay_subscription.update(ends_at: Time.current, status: :canceled)
|
168
214
|
rescue ::Stripe::StripeError => e
|
@@ -236,8 +282,12 @@ module Pay
|
|
236
282
|
)
|
237
283
|
end
|
238
284
|
|
285
|
+
def resumable?
|
286
|
+
on_grace_period? || paused?
|
287
|
+
end
|
288
|
+
|
239
289
|
def resume
|
240
|
-
unless
|
290
|
+
unless resumable?
|
241
291
|
raise StandardError, "You can only resume subscriptions within their grace period."
|
242
292
|
end
|
243
293
|
|
data/lib/pay/stripe.rb
CHANGED
@@ -30,7 +30,7 @@ module Pay
|
|
30
30
|
|
31
31
|
extend Env
|
32
32
|
|
33
|
-
REQUIRED_VERSION = "~>
|
33
|
+
REQUIRED_VERSION = "~> 10"
|
34
34
|
|
35
35
|
# A list of database model names that include Pay
|
36
36
|
# Used for safely looking up models with client_reference_id
|
@@ -44,7 +44,6 @@ module Pay
|
|
44
44
|
|
45
45
|
def self.setup
|
46
46
|
::Stripe.api_key = private_key
|
47
|
-
::Stripe.api_version ||= "2023-08-16"
|
48
47
|
|
49
48
|
# Used by Stripe to identify Pay for support
|
50
49
|
::Stripe.set_app_info("PayRails", partner_id: "pp_partner_IqhY0UExnJYLxg", version: Pay::VERSION, url: "https://github.com/pay-rails/pay")
|
@@ -123,13 +122,13 @@ module Pay
|
|
123
122
|
|
124
123
|
def self.to_client_reference_id(record)
|
125
124
|
raise ArgumentError, "#{record.class.name} does not include Pay. Allowed models: #{model_names.to_a.join(", ")}" unless model_names.include?(record.class.name)
|
126
|
-
[record.class.name, record.id].join("
|
125
|
+
[record.class.name, record.id].join("_")
|
127
126
|
end
|
128
127
|
|
129
128
|
def self.find_by_client_reference_id(client_reference_id)
|
130
129
|
# If there is a client reference ID, make sure we have a Pay::Customer record
|
131
130
|
# client_reference_id should be in the format of "User/1"
|
132
|
-
model_name, id = client_reference_id.split("
|
131
|
+
model_name, id = client_reference_id.split("_", 2)
|
133
132
|
|
134
133
|
# Only allow model names that use Pay
|
135
134
|
return unless model_names.include?(model_name)
|
data/lib/pay/version.rb
CHANGED
data/lib/pay.rb
CHANGED
@@ -17,7 +17,8 @@ module Pay
|
|
17
17
|
# Payment processors
|
18
18
|
autoload :Braintree, "pay/braintree"
|
19
19
|
autoload :FakeProcessor, "pay/fake_processor"
|
20
|
-
autoload :
|
20
|
+
autoload :PaddleBilling, "pay/paddle_billing"
|
21
|
+
autoload :PaddleClassic, "pay/paddle_classic"
|
21
22
|
autoload :Stripe, "pay/stripe"
|
22
23
|
|
23
24
|
autoload :Webhooks, "pay/webhooks"
|
@@ -55,7 +56,7 @@ module Pay
|
|
55
56
|
@@routes_path = "/pay"
|
56
57
|
|
57
58
|
mattr_accessor :enabled_processors
|
58
|
-
@@enabled_processors = [:stripe, :braintree, :
|
59
|
+
@@enabled_processors = [:stripe, :braintree, :paddle_billing, :paddle_classic]
|
59
60
|
|
60
61
|
mattr_accessor :send_emails
|
61
62
|
@@send_emails = true
|
data/lib/tasks/pay.rake
CHANGED
@@ -20,8 +20,8 @@ def sync_default_payment_method(pay_customer, retries: 2)
|
|
20
20
|
when "stripe"
|
21
21
|
payment_method_id = pay_customer.customer.invoice_settings.default_payment_method
|
22
22
|
Pay::Stripe::PaymentMethod.sync(payment_method_id) if payment_method_id
|
23
|
-
when "
|
24
|
-
Pay::
|
23
|
+
when "paddle_classic"
|
24
|
+
Pay::PaddleClassic::PaymentMethod.sync(pay_customer: pay_customer)
|
25
25
|
end
|
26
26
|
rescue
|
27
27
|
sleep 0.5
|
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:
|
4
|
+
version: 7.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Charnes
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-
|
13
|
+
date: 2023-12-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -44,7 +44,8 @@ files:
|
|
44
44
|
- app/controllers/pay/application_controller.rb
|
45
45
|
- app/controllers/pay/payments_controller.rb
|
46
46
|
- app/controllers/pay/webhooks/braintree_controller.rb
|
47
|
-
- app/controllers/pay/webhooks/
|
47
|
+
- app/controllers/pay/webhooks/paddle_billing_controller.rb
|
48
|
+
- app/controllers/pay/webhooks/paddle_classic_controller.rb
|
48
49
|
- app/controllers/pay/webhooks/stripe_controller.rb
|
49
50
|
- app/helpers/pay/application_helper.rb
|
50
51
|
- app/jobs/pay/application_job.rb
|
@@ -103,20 +104,35 @@ files:
|
|
103
104
|
- lib/pay/fake_processor/merchant.rb
|
104
105
|
- lib/pay/fake_processor/payment_method.rb
|
105
106
|
- lib/pay/fake_processor/subscription.rb
|
107
|
+
- lib/pay/lemon_squeezy.rb
|
108
|
+
- lib/pay/lemon_squeezy/billable.rb
|
109
|
+
- lib/pay/lemon_squeezy/charge.rb
|
110
|
+
- lib/pay/lemon_squeezy/error.rb
|
111
|
+
- lib/pay/lemon_squeezy/payment_method.rb
|
112
|
+
- lib/pay/lemon_squeezy/subscription.rb
|
113
|
+
- lib/pay/lemon_squeezy/webhooks/subscription.rb
|
114
|
+
- lib/pay/lemon_squeezy/webhooks/transaction_completed.rb
|
106
115
|
- lib/pay/nano_id.rb
|
107
|
-
- lib/pay/
|
108
|
-
- lib/pay/
|
109
|
-
- lib/pay/
|
110
|
-
- lib/pay/
|
111
|
-
- lib/pay/
|
112
|
-
- lib/pay/
|
113
|
-
- lib/pay/
|
114
|
-
- lib/pay/
|
115
|
-
- lib/pay/
|
116
|
-
- lib/pay/
|
117
|
-
- lib/pay/
|
118
|
-
- lib/pay/
|
119
|
-
- lib/pay/
|
116
|
+
- lib/pay/paddle_billing.rb
|
117
|
+
- lib/pay/paddle_billing/billable.rb
|
118
|
+
- lib/pay/paddle_billing/charge.rb
|
119
|
+
- lib/pay/paddle_billing/error.rb
|
120
|
+
- lib/pay/paddle_billing/payment_method.rb
|
121
|
+
- lib/pay/paddle_billing/subscription.rb
|
122
|
+
- lib/pay/paddle_billing/webhooks/subscription.rb
|
123
|
+
- lib/pay/paddle_billing/webhooks/transaction_completed.rb
|
124
|
+
- lib/pay/paddle_classic.rb
|
125
|
+
- lib/pay/paddle_classic/billable.rb
|
126
|
+
- lib/pay/paddle_classic/charge.rb
|
127
|
+
- lib/pay/paddle_classic/error.rb
|
128
|
+
- lib/pay/paddle_classic/payment_method.rb
|
129
|
+
- lib/pay/paddle_classic/subscription.rb
|
130
|
+
- lib/pay/paddle_classic/webhooks/signature_verifier.rb
|
131
|
+
- lib/pay/paddle_classic/webhooks/subscription_cancelled.rb
|
132
|
+
- lib/pay/paddle_classic/webhooks/subscription_created.rb
|
133
|
+
- lib/pay/paddle_classic/webhooks/subscription_payment_refunded.rb
|
134
|
+
- lib/pay/paddle_classic/webhooks/subscription_payment_succeeded.rb
|
135
|
+
- lib/pay/paddle_classic/webhooks/subscription_updated.rb
|
120
136
|
- lib/pay/payment.rb
|
121
137
|
- lib/pay/receipts.rb
|
122
138
|
- lib/pay/stripe.rb
|
@@ -168,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
184
|
- !ruby/object:Gem::Version
|
169
185
|
version: '0'
|
170
186
|
requirements: []
|
171
|
-
rubygems_version: 3.4.
|
187
|
+
rubygems_version: 3.4.22
|
172
188
|
signing_key:
|
173
189
|
specification_version: 4
|
174
190
|
summary: Payments engine for Ruby on Rails
|
data/lib/pay/paddle/charge.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module Pay
|
2
|
-
module Paddle
|
3
|
-
class Charge
|
4
|
-
attr_reader :pay_charge
|
5
|
-
|
6
|
-
delegate :processor_id, :customer, to: :pay_charge
|
7
|
-
|
8
|
-
def initialize(pay_charge)
|
9
|
-
@pay_charge = pay_charge
|
10
|
-
end
|
11
|
-
|
12
|
-
def charge
|
13
|
-
return unless customer.subscription
|
14
|
-
payments = PaddlePay::Subscription::Payment.list({subscription_id: customer.subscription.processor_id})
|
15
|
-
charges = payments.select { |p| p[:id].to_s == processor_id }
|
16
|
-
charges.try(:first)
|
17
|
-
rescue ::PaddlePay::PaddlePayError => e
|
18
|
-
raise Pay::Paddle::Error, e
|
19
|
-
end
|
20
|
-
|
21
|
-
def refund!(amount_to_refund)
|
22
|
-
return unless customer.subscription
|
23
|
-
payments = PaddlePay::Subscription::Payment.list({subscription_id: customer.subscription.processor_id, is_paid: 1})
|
24
|
-
if payments.count > 0
|
25
|
-
PaddlePay::Subscription::Payment.refund(payments.last[:id], {amount: amount_to_refund})
|
26
|
-
pay_charge.update(amount_refunded: amount_to_refund)
|
27
|
-
else
|
28
|
-
raise Error, "Payment not found"
|
29
|
-
end
|
30
|
-
rescue ::PaddlePay::PaddlePayError => e
|
31
|
-
raise Pay::Paddle::Error, e
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/pay/paddle/response.rb
DELETED
File without changes
|
data/lib/pay/paddle.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
module Pay
|
2
|
-
module Paddle
|
3
|
-
autoload :Billable, "pay/paddle/billable"
|
4
|
-
autoload :Charge, "pay/paddle/charge"
|
5
|
-
autoload :Error, "pay/paddle/error"
|
6
|
-
autoload :PaymentMethod, "pay/paddle/payment_method"
|
7
|
-
autoload :Subscription, "pay/paddle/subscription"
|
8
|
-
|
9
|
-
module Webhooks
|
10
|
-
autoload :SignatureVerifier, "pay/paddle/webhooks/signature_verifier"
|
11
|
-
autoload :SubscriptionCreated, "pay/paddle/webhooks/subscription_created"
|
12
|
-
autoload :SubscriptionCancelled, "pay/paddle/webhooks/subscription_cancelled"
|
13
|
-
autoload :SubscriptionPaymentRefunded, "pay/paddle/webhooks/subscription_payment_refunded"
|
14
|
-
autoload :SubscriptionPaymentSucceeded, "pay/paddle/webhooks/subscription_payment_succeeded"
|
15
|
-
autoload :SubscriptionUpdated, "pay/paddle/webhooks/subscription_updated"
|
16
|
-
end
|
17
|
-
|
18
|
-
extend Env
|
19
|
-
|
20
|
-
def self.enabled?
|
21
|
-
return false unless Pay.enabled_processors.include?(:paddle) && defined?(::PaddlePay)
|
22
|
-
|
23
|
-
Pay::Engine.version_matches?(required: "~> 0.2", current: ::PaddlePay::VERSION) || (raise "[Pay] paddle gem must be version ~> 0.2")
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.setup
|
27
|
-
::PaddlePay.config.vendor_id = vendor_id
|
28
|
-
::PaddlePay.config.vendor_auth_code = vendor_auth_code
|
29
|
-
::PaddlePay.config.environment = environment
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.vendor_id
|
33
|
-
find_value_by_name(:paddle, :vendor_id)
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.vendor_auth_code
|
37
|
-
find_value_by_name(:paddle, :vendor_auth_code)
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.environment
|
41
|
-
find_value_by_name(:paddle, :environment) || "production"
|
42
|
-
end
|
43
|
-
|
44
|
-
def self.public_key
|
45
|
-
find_value_by_name(:paddle, :public_key)
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.public_key_file
|
49
|
-
find_value_by_name(:paddle, :public_key_file)
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.public_key_base64
|
53
|
-
find_value_by_name(:paddle, :public_key_base64)
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.passthrough(owner:, **options)
|
57
|
-
options.merge(owner_sgid: owner.to_sgid.to_s).to_json
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.parse_passthrough(passthrough)
|
61
|
-
JSON.parse(passthrough)
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.owner_from_passthrough(passthrough)
|
65
|
-
GlobalID::Locator.locate_signed parse_passthrough(passthrough)["owner_sgid"]
|
66
|
-
rescue JSON::ParserError
|
67
|
-
nil
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.configure_webhooks
|
71
|
-
Pay::Webhooks.configure do |events|
|
72
|
-
events.subscribe "paddle.subscription_created", Pay::Paddle::Webhooks::SubscriptionCreated.new
|
73
|
-
events.subscribe "paddle.subscription_updated", Pay::Paddle::Webhooks::SubscriptionUpdated.new
|
74
|
-
events.subscribe "paddle.subscription_cancelled", Pay::Paddle::Webhooks::SubscriptionCancelled.new
|
75
|
-
events.subscribe "paddle.subscription_payment_succeeded", Pay::Paddle::Webhooks::SubscriptionPaymentSucceeded.new
|
76
|
-
events.subscribe "paddle.subscription_payment_refunded", Pay::Paddle::Webhooks::SubscriptionPaymentRefunded.new
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|