pay_me 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +111 -0
- data/Rakefile +33 -0
- data/app/controllers/pay_me/api/v1/invoices_controller.rb +30 -0
- data/app/controllers/pay_me/api/v1/stripe_plans_controller.rb +35 -0
- data/app/controllers/pay_me/application_controller.rb +10 -0
- data/app/helpers/pay_me/application_helper.rb +4 -0
- data/app/subscribers/pay_me/customer_subscriber.rb +42 -0
- data/app/subscribers/pay_me/plan_subscriber.rb +38 -0
- data/app/subscribers/pay_me/subscription_subscriber.rb +50 -0
- data/app/subscribers/pay_me/webhook_event_subscriber.rb +11 -0
- data/config/routes.rb +11 -0
- data/db/migrate/20160725204454_create_pay_me_subscriptions.rb +16 -0
- data/db/migrate/20161011170659_create_pay_me_plans.rb +8 -0
- data/db/migrate/20171030174731_add_quantity_to_pay_me_subscription.rb +6 -0
- data/db/migrate/20171130192525_create_pay_me_customers.rb +11 -0
- data/db/migrate/20180116193943_remove_customerable_from_subscriptions.rb +11 -0
- data/db/migrate/20180215235017_add_past_due_to_subscriptions.rb +5 -0
- data/lib/generators/pay_me/controllers/controllers_generator.rb +11 -0
- data/lib/generators/pay_me/controllers/templates/subscriptions_controller.rb +12 -0
- data/lib/generators/pay_me/install_generator.rb +39 -0
- data/lib/generators/pay_me/migrate_to_customer_model/USAGE +8 -0
- data/lib/generators/pay_me/migrate_to_customer_model/migrate_to_customer_model_generator.rb +9 -0
- data/lib/generators/pay_me/migrate_to_customer_model/templates/migration.rb.erb +64 -0
- data/lib/generators/pay_me/models/models_generator.rb +13 -0
- data/lib/generators/pay_me/models/templates/customer.rb +14 -0
- data/lib/generators/pay_me/models/templates/plan.rb +14 -0
- data/lib/generators/pay_me/models/templates/subscription.rb +14 -0
- data/lib/generators/pay_me/policies/policies_generator.rb +11 -0
- data/lib/generators/pay_me/policies/templates/subscription_policy.rb +34 -0
- data/lib/generators/pay_me/templates/pay_me_initializer.rb +17 -0
- data/lib/pay_me.rb +28 -0
- data/lib/pay_me/active_record.rb +6 -0
- data/lib/pay_me/concerns/controllers/customerable.rb +116 -0
- data/lib/pay_me/concerns/models/customerable.rb +54 -0
- data/lib/pay_me/concerns/models/stripe_customerable.rb +24 -0
- data/lib/pay_me/concerns/models/stripe_plannable.rb +31 -0
- data/lib/pay_me/concerns/models/stripe_subscribable.rb +43 -0
- data/lib/pay_me/configuration.rb +27 -0
- data/lib/pay_me/engine.rb +8 -0
- data/lib/pay_me/models.rb +4 -0
- data/lib/pay_me/railtie.rb +2 -0
- data/lib/pay_me/route_helpers.rb +21 -0
- data/lib/pay_me/services/customer.rb +141 -0
- data/lib/pay_me/version.rb +3 -0
- data/lib/pay_me/view_models/charge.rb +48 -0
- data/lib/tasks/pay_me_tasks.rake +4 -0
- data/lib/tasks/stripe.rake +22 -0
- data/test/controllers/pay_me/api/v1/invoices_controller_test.rb +82 -0
- data/test/controllers/pay_me/api/v1/plans_controller_test.rb +62 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/api/v1/users_controller.rb +10 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/pay_me/api/v1/subscriptions_controller.rb +12 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/pay_me/customer.rb +5 -0
- data/test/dummy/app/models/pay_me/plan.rb +5 -0
- data/test/dummy/app/models/pay_me/subscription.rb +5 -0
- data/test/dummy/app/models/user.rb +8 -0
- data/test/dummy/app/policies/pay_me/subscription_policy.rb +34 -0
- data/test/dummy/app/serializers/pay_me/subscription_serializer.rb +3 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +25 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/pay_me.rb +17 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +10 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/migrate/20160630181300_create_pay_me_users.rb +12 -0
- data/test/dummy/db/migrate/20180118001940_api_me_migrate_to_customer_model.rb +9 -0
- data/test/dummy/db/schema.rb +53 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/integration/customer_test.rb +395 -0
- data/test/lib/generators/pay_me/pay_me/migrate_to_customer_model_generator_test.rb +16 -0
- data/test/models/pay_me/customer_test.rb +9 -0
- data/test/models/pay_me/subscription_test.rb +9 -0
- data/test/models/pay_me/user_test.rb +6 -0
- data/test/pay_me_test.rb +7 -0
- data/test/support/concerns/api_test_helper.rb +15 -0
- data/test/support/concerns/stripe_helpers.rb +25 -0
- data/test/test_helper.rb +52 -0
- data/test/unit/concerns/customerable.rb +21 -0
- data/test/unit/models/customerable_test.rb +18 -0
- data/test/unit/services/customer_test.rb +75 -0
- data/test/unit/stubs/customerable.rb +28 -0
- data/test/unit/stubs/customerable_test.rb +16 -0
- data/test/webhooks/customer_webhook_test.rb +74 -0
- data/test/webhooks/plan_webhook_test.rb +74 -0
- metadata +288 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
class RemoveCustomerableFromSubscriptions < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
add_reference(:pay_me_subscriptions, :customer, index: true)
|
4
|
+
remove_reference(:pay_me_subscriptions, :customerable, polymorphic: true)
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
remove_reference(:pay_me_subscriptions, :customer, index: true)
|
9
|
+
add_reference(:pay_me_subscriptions, :customerable, polymorphic: true)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module PayMe
|
2
|
+
module Generators
|
3
|
+
class ControllersGenerator < ::Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def create_subscription_controller
|
7
|
+
copy_file 'subscriptions_controller.rb', 'app/controllers/pay_me/api/v1/subscriptions_controller.rb'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module PayMe
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path("../templates", __FILE__)
|
5
|
+
|
6
|
+
def update_secrets
|
7
|
+
if yes? "Add pay_me to secrets.yml?"
|
8
|
+
secrets = [
|
9
|
+
" stripe_publishable_key: <%= ENV['STRIPE_PUBLISHABLE_KEY'] %>",
|
10
|
+
" stripe_secret_key: <%= ENV['STRIPE_SECRET_KEY'] %>",
|
11
|
+
" stripe_webhook_secret: <%= ENV['STRIPE_WEBHOOK_SECRET'] %>",
|
12
|
+
" stripe_signing_secret: <%= ENV['STRIPE_SIGNING_SECRET'] %>"
|
13
|
+
].map{|s| s + "\n"}.join
|
14
|
+
insert_into_file "config/secrets.yml", secrets, after: "development:\n", force: true
|
15
|
+
insert_into_file "config/secrets.yml", secrets, after: "test:\n", force: true
|
16
|
+
insert_into_file "config/secrets.yml", secrets, after: "production:\n", force: true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def copy_initializer
|
21
|
+
template "pay_me_initializer.rb", "config/initializers/pay_me.rb"
|
22
|
+
end
|
23
|
+
|
24
|
+
def run_generators
|
25
|
+
rake 'pay_me:install:migrations'
|
26
|
+
generate 'pay_me:controllers'
|
27
|
+
generate 'pay_me:models'
|
28
|
+
generate 'pay_me:policies'
|
29
|
+
generate 'serializer pay_me/subscription subscription_id is_active past_due stripe_plan_id quantity coupon_id created_at updated_at'
|
30
|
+
end
|
31
|
+
|
32
|
+
def mount_engine_routes
|
33
|
+
if yes? "Add pay_me to routes.rb?"
|
34
|
+
route 'mount PayMe::Engine => PayMe.configuration.mount_path'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Description:
|
2
|
+
Explain the generator
|
3
|
+
|
4
|
+
Example:
|
5
|
+
rails generate migrate_to_customer_model <customerable_model>
|
6
|
+
|
7
|
+
This will create:
|
8
|
+
A migration to migrate from the former customerable model polymorphism to the new customer base model for polymorphism. See upgrade instructions for details.
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
class PayMe::MigrateToCustomerModelGenerator < ActiveRecord::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def create_migration_file
|
7
|
+
migration_template "migration.rb.erb", "#{Rails.root.join('db', 'migrate', 'api_me_migrate_to_customer_model.rb')}"
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration
|
2
|
+
# This migration moves from storing a polymorphic relationship on subscriptions
|
3
|
+
# to a belongs_to relationship on a model that should be associated with a
|
4
|
+
# customer and a concrete customer model. I.E a user belongs to a customer.
|
5
|
+
# If your app had previous multiple different customerable models,
|
6
|
+
# update this migration to add this reference to each of those and have
|
7
|
+
# it migrate the data correctly.
|
8
|
+
#
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# !!!
|
12
|
+
# TODO: DELETE THE remove_customerable_from_subscriptions MIGRATION
|
13
|
+
# created from `rails api_me::install:migrations` command, this migration is meant
|
14
|
+
# for applications that are installing this engine for the first time.
|
15
|
+
# !!!
|
16
|
+
|
17
|
+
class Subscription < ActiveRecord::Base
|
18
|
+
self.table_name = "pay_me_subscriptions"
|
19
|
+
|
20
|
+
belongs_to :customer, class_name: "<%= migration_class_name %>::Customer"
|
21
|
+
belongs_to :customerable, class_name: "<%= migration_class_name %>::<%= class_name %>", polymorphic: true
|
22
|
+
end
|
23
|
+
|
24
|
+
class Customer < ActiveRecord::Base
|
25
|
+
self.table_name = "pay_me_customers"
|
26
|
+
|
27
|
+
has_one <%= plural_name.singularize %>, class_name: "<%= migration_class_name %>::Customer"
|
28
|
+
has_many :subscriptions, class_name: "<%= migration_class_name %>::Subscription"
|
29
|
+
end
|
30
|
+
|
31
|
+
class <%= class_name %> < ActiveRecord::Base
|
32
|
+
self.table_name = <%= plural_name %>
|
33
|
+
|
34
|
+
belongs_to :customer, class_name: "<%= migration_class_name %>::Customer"
|
35
|
+
end
|
36
|
+
|
37
|
+
def up
|
38
|
+
add_reference(:<%= plural_name %>, :pay_me_customers, index: true)
|
39
|
+
add_reference(:pay_me_subscriptions, :customer, index: true)
|
40
|
+
|
41
|
+
<%= class_name %>.find_each do |customerable|
|
42
|
+
customer = Customer.create!(customerable.customer_id)
|
43
|
+
customerable.customer = customer
|
44
|
+
customerable.save!
|
45
|
+
end
|
46
|
+
|
47
|
+
remove_reference(:pay_me_subscriptions, :customerable, polymorphic: true)
|
48
|
+
end
|
49
|
+
|
50
|
+
def down
|
51
|
+
add_reference(:pay_me_subscriptions, :customerable, polymorphic: true, index: true)
|
52
|
+
|
53
|
+
<%= class_name %>.find_each do |customer|
|
54
|
+
customerable = customer.<%= plural_name.singularize %>
|
55
|
+
customer.subscriptions.each do |subscription|
|
56
|
+
subscription.customerable = customerable
|
57
|
+
subscription.save!
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
remove_reference(:pay_me_subscriptions, :customer)
|
62
|
+
remove_reference(:<%= plural_name %>, :pay_me_customers)
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module PayMe
|
2
|
+
module Generators
|
3
|
+
class ModelsGenerator < ::Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def create_stripe_models
|
7
|
+
copy_file 'customer.rb', 'app/models/pay_me/customer.rb'
|
8
|
+
copy_file 'plan.rb', 'app/models/pay_me/plan.rb'
|
9
|
+
copy_file 'subscription.rb', 'app/models/pay_me/subscription.rb'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module PayMe
|
2
|
+
class Customer < ActiveRecord::Base
|
3
|
+
include PayMe::Concerns::Models::StripeCustomerable
|
4
|
+
|
5
|
+
def self.created_webhook!(stripe_customer)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.updated_webhook!(stripe_customer)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.deleted_webhook!(stripe_customer)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module PayMe
|
2
|
+
class Plan < ActiveRecord::Base
|
3
|
+
include PayMe::Concerns::Models::StripePlannable
|
4
|
+
|
5
|
+
def self.created_webhook!(stripe_plan)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.updated_webhook!(stripe_plan)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.deleted_webhook!(stripe_plan)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module PayMe
|
2
|
+
class Subscription < ActiveRecord::Base
|
3
|
+
include PayMe::Concerns::Models::StripeSubscribable
|
4
|
+
|
5
|
+
def self.created_webhook!(stripe_subscription)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.updated_webhook!(stripe_subscription)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.deleted_webhook!(stripe_subscription)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module PayMe
|
2
|
+
module Generators
|
3
|
+
class PoliciesGenerator < ::Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def create_subscription_poliocy
|
7
|
+
copy_file 'subscription_policy.rb', 'app/policies/pay_me/subscription_policy.rb'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module PayMe
|
2
|
+
class SubscriptionPolicy < ApplicationPolicy
|
3
|
+
###
|
4
|
+
# Add the policy
|
5
|
+
###
|
6
|
+
# def create?
|
7
|
+
# record.owner_id == current_user.id || super
|
8
|
+
# end
|
9
|
+
|
10
|
+
# def show?
|
11
|
+
# true
|
12
|
+
# end
|
13
|
+
|
14
|
+
# def update?
|
15
|
+
# create?
|
16
|
+
# end
|
17
|
+
|
18
|
+
# def destroy?
|
19
|
+
# record.owner_id == current_user.id || super
|
20
|
+
# end
|
21
|
+
|
22
|
+
# def accept?
|
23
|
+
# current_user
|
24
|
+
# end
|
25
|
+
|
26
|
+
# def decline?
|
27
|
+
# current_user
|
28
|
+
# end
|
29
|
+
|
30
|
+
# def permitted_attributes
|
31
|
+
# [:email, :accepted, :meta]
|
32
|
+
# end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "stripe"
|
2
|
+
Rails.configuration.stripe = {
|
3
|
+
publishable_key: Rails.application.secrets.stripe_publishable_key,
|
4
|
+
secret_key: Rails.application.secrets.stripe_secret_key
|
5
|
+
}
|
6
|
+
|
7
|
+
Stripe.api_key = Rails.application.secrets.stripe_secret_key
|
8
|
+
|
9
|
+
StripeEvent.configure do |events|
|
10
|
+
events.all PayMe::WebhookEventSubscriber.new(Rails.logger)
|
11
|
+
events.subscribe 'customer.subscription.', PayMe::SubscriptionSubscriber.new(Rails.logger)
|
12
|
+
events.subscribe 'customer.', PayMe::CustomerSubscriber.new(Rails.logger)
|
13
|
+
events.subscribe 'plan.', PayMe::PlanSubscriber.new(Rails.logger)
|
14
|
+
end
|
15
|
+
|
16
|
+
StripeEvent.authentication_secret = Rails.application.secrets.stripe_webhook_secret
|
17
|
+
StripeEvent.signing_secret = Rails.application.secrets.stripe_signing_secret
|
data/lib/pay_me.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'pay_me/engine'
|
2
|
+
require 'pay_me/version'
|
3
|
+
require 'pay_me/configuration'
|
4
|
+
require 'stripe_event'
|
5
|
+
|
6
|
+
module PayMe
|
7
|
+
extend self
|
8
|
+
|
9
|
+
module Concerns
|
10
|
+
module Controllers
|
11
|
+
autoload :Customerable, 'pay_me/concerns/controllers/customerable'
|
12
|
+
end
|
13
|
+
|
14
|
+
module Models
|
15
|
+
autoload :StripeCustomerable, 'pay_me/concerns/models/stripe_customerable'
|
16
|
+
autoload :StripePlannable, 'pay_me/concerns/models/stripe_plannable'
|
17
|
+
autoload :StripeSubscribable, 'pay_me/concerns/models/stripe_subscribable'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def configure
|
22
|
+
yield configuration
|
23
|
+
end
|
24
|
+
|
25
|
+
def configuration
|
26
|
+
Configuration.instance
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'stripe'
|
2
|
+
require 'pay_me/services/customer'
|
3
|
+
require 'pay_me/view_models/charge'
|
4
|
+
|
5
|
+
module PayMe
|
6
|
+
module Concerns
|
7
|
+
module Controllers
|
8
|
+
module Customerable
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
rescue_from Stripe::StripeError, Stripe::CardError do |e|
|
13
|
+
Rails.logger.debug "ERROR: #{e}"
|
14
|
+
render status: :unprocessable_entity, json: {
|
15
|
+
stripe_code: e.code, reason: e.message, message: e.message, errors: [e.message]
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def charge
|
20
|
+
charge = create_stripe_charge
|
21
|
+
render status: 201, json: { charge_id: charge.id }
|
22
|
+
end
|
23
|
+
|
24
|
+
def subscribe
|
25
|
+
resource = find_resource
|
26
|
+
@subscription = resource.subscribe(**subscription_params)
|
27
|
+
customer = resource.stripe_customer
|
28
|
+
render status: 201, json: {
|
29
|
+
subscription: @subscription.as_json.tap { |i| i.store('stripe_id', i.delete('id')) },
|
30
|
+
default_source: customer.default_source.blank? ? nil : customer.sources.retrieve(customer.default_source)
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def update_subscription
|
35
|
+
resource = find_resource
|
36
|
+
@subscription = resource.update_subscription(coupon_id: params[:coupon_id], quantity: params[:quantity])
|
37
|
+
if @subscription.blank?
|
38
|
+
render status: 404, json: @subscription.as_json
|
39
|
+
else
|
40
|
+
render status: 200, json: @subscription.as_json
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def cancel_subscription
|
45
|
+
resource = find_resource
|
46
|
+
@subscription = resource.cancel_subscription(cancel_immediately: params[:cancel_now])
|
47
|
+
if @subscription.blank?
|
48
|
+
render status: 404, json: @subscription.as_json
|
49
|
+
else
|
50
|
+
render status: 200, json: @subscription.as_json
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def invoices
|
55
|
+
resource = find_resource
|
56
|
+
invoices = PayMe.configuration.stripe_invoice_class.list(
|
57
|
+
customer: resource.stripe_customer_id
|
58
|
+
)
|
59
|
+
|
60
|
+
render status: 200, json: {
|
61
|
+
invoices: invoices.map do |invoice|
|
62
|
+
invoice.as_json.tap do |i|
|
63
|
+
i.store('stripe_id', i.delete('id'))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def update_default_source
|
70
|
+
resource = find_resource
|
71
|
+
resource.add_default_payment_source(params["source_id"])
|
72
|
+
customer = PayMe.configuration.stripe_customer_class.retrieve(resource.stripe_customer_id)
|
73
|
+
render status: 200, json: { customer: customer, default_source: customer.default_source.blank? ? nil : customer.sources.retrieve(customer.default_source) }
|
74
|
+
end
|
75
|
+
|
76
|
+
def default_source
|
77
|
+
resource = find_resource
|
78
|
+
unless resource.customer_id
|
79
|
+
resource.customer_service.customer
|
80
|
+
end
|
81
|
+
customer = PayMe.configuration.stripe_customer_class.retrieve(resource.stripe_customer_id)
|
82
|
+
render status: 200, json: {
|
83
|
+
customer: customer,
|
84
|
+
default_source: customer.default_source.blank? ? nil : customer.sources.retrieve(customer.default_source)
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
def charge_params
|
89
|
+
{
|
90
|
+
amount: params[:amount],
|
91
|
+
currency: params[:currency],
|
92
|
+
description: params[:description],
|
93
|
+
source: params[:source]
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def subscription_params
|
98
|
+
{
|
99
|
+
plan_id: params[:plan_id],
|
100
|
+
coupon_id: params[:coupon_id],
|
101
|
+
quantity: params[:quantity],
|
102
|
+
source: params[:source]
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
def create_stripe_charge
|
107
|
+
resource = find_resource
|
108
|
+
PayMe::ViewModels::Charge.new(
|
109
|
+
charge_params.merge(customerable: resource)
|
110
|
+
).charge
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|