solidus_razorpay 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +9 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +28 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +57 -0
  11. data/Rakefile +14 -0
  12. data/app/assets/images/PayWithRzp.png +0 -0
  13. data/app/assets/images/solidus-razorpay.gif +0 -0
  14. data/app/assets/javascripts/solidus/frontend/checkout.js +1 -0
  15. data/app/assets/javascripts/solidus/frontend/jquery-1.12.4.min.js +5 -0
  16. data/app/assets/javascripts/solidus/frontend/jquery.blockUI.js +620 -0
  17. data/app/assets/stylesheets/solidus/razorpay.scss +13 -0
  18. data/app/controllers/solidus_razorpay/razorpay_controller.rb +37 -0
  19. data/app/models/application_record.rb +3 -0
  20. data/app/models/solidus_razorpay/checkout.rb +4 -0
  21. data/app/models/solidus_razorpay/order_decorator.rb +70 -0
  22. data/app/models/solidus_razorpay/razorpay_gateway.rb +41 -0
  23. data/app/views/spree/admin/payments/source_views/_razorpay.html.erb +0 -0
  24. data/app/views/spree/checkout/payment/_razorpay.html.erb +55 -0
  25. data/app/views/spree/razorpay/create.html.erb +0 -0
  26. data/bin/console +14 -0
  27. data/bin/setup +8 -0
  28. data/config/routes.rb +3 -0
  29. data/db/migrate/20210703184926_create_solidus_razorpay_checkouts.rb +18 -0
  30. data/lib/generators/solidus_razorpay/install/install_generator.rb +43 -0
  31. data/lib/solidus_razorpay.rb +7 -0
  32. data/lib/solidus_razorpay/engine.rb +26 -0
  33. data/lib/solidus_razorpay/factories.rb +12 -0
  34. data/lib/solidus_razorpay/version.rb +3 -0
  35. data/solidus_razorpay.gemspec +44 -0
  36. metadata +150 -0
@@ -0,0 +1,13 @@
1
+ .razorpay-payment-button {
2
+ background: url(asset_path('PayWithRzp.png')) center no-repeat;
3
+ background-size: contain;
4
+ box-shadow: none;
5
+ border: none;
6
+ outline: none;
7
+ font-size: 0;
8
+ height: 36px;
9
+ width: 230px;
10
+ padding: 0;
11
+ cursor: pointer;
12
+ margin-top: 30px;
13
+ }
@@ -0,0 +1,37 @@
1
+ module SolidusRazorpay
2
+ class RazorpayController < Spree::StoreController
3
+
4
+ skip_before_action :verify_authenticity_token
5
+
6
+ def create
7
+ response_status = SolidusRazorpay::OrderDecorator.process_razorpayment(razorpay_params, order)
8
+ if response_status == 'captured'
9
+ order.next!
10
+ @message = I18n.t('spree.order_processed_successfully')
11
+ @current_order = nil
12
+ flash.notice = I18n.t('spree.order_processed_successfully')
13
+ flash['order_completed'] = true
14
+ @error = false
15
+ @redirect_path = spree.order_path(order)
16
+ else
17
+ order.update_attribute(:payment_state, 'failed')
18
+ @error = true
19
+ @message = 'There was an error processing your payment'
20
+ @redirect_path = spree.checkout_state_path(order.state)
21
+ end
22
+ rescue Spree::Core::GatewayError, StateMachine::InvalidTransition => ge
23
+ error_message = ge.message
24
+ puts "error_message: #{error_message}"
25
+ end
26
+
27
+ private
28
+
29
+ def razorpay_params
30
+ params.permit(:payment_method_id, :razorpay_payment_id)
31
+ end
32
+
33
+ def order
34
+ @order ||= current_order
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -0,0 +1,4 @@
1
+ module SolidusRazorpay
2
+ class Checkout < ApplicationRecord
3
+ end
4
+ end
@@ -0,0 +1,70 @@
1
+ module SolidusRazorpay::OrderDecorator
2
+
3
+ def amount_in_paise
4
+ (total.to_f * 100).to_i
5
+ end
6
+
7
+ class << self
8
+ def prepended(base)
9
+ base.checkout_flow do
10
+ go_to_state :address
11
+ go_to_state :delivery
12
+ go_to_state :payment
13
+ go_to_state :complete
14
+ end
15
+ end
16
+
17
+ def process_razorpayment(params, order)
18
+ setup_razorpay(payment_method(params[:payment_method_id]))
19
+ razorpay_payment_object = Razorpay::Payment.fetch(params[:razorpay_payment_id])
20
+ payment = payment(order, razorpay_payment_object, payment_method(params[:payment_method_id]))
21
+ if payment_authorized?(razorpay_payment_object)
22
+ razorpay_payment_object.capture({ amount: order.amount_in_paise })
23
+ razorpay_payment_object = Razorpay::Payment.fetch(params[:razorpay_payment_id])
24
+ payment.update(response_code: razorpay_payment_object.status)
25
+ razorpay_payment_object.status
26
+ else
27
+ raise StandardError.new('Unable to capture payment')
28
+ end
29
+ end
30
+
31
+ def payment_method(payment_method_id)
32
+ @payment_method ||= Spree::PaymentMethod.find(payment_method_id)
33
+ end
34
+
35
+ def setup_razorpay(payment_method)
36
+ Razorpay.setup(payment_method.preferences[:key_id], payment_method.preferences[:key_secret])
37
+ end
38
+
39
+ def payment_authorized?(razorpay_payment_object)
40
+ razorpay_payment_object.status == 'authorized'
41
+ end
42
+
43
+ def payment(order, payment_object, payment_method)
44
+ order.payments.create!(
45
+ source: source(order, payment_object),
46
+ payment_method: payment_method,
47
+ amount: order.total,
48
+ response_code: payment_object.status,
49
+ )
50
+ end
51
+
52
+ def source(order, payment_object)
53
+ SolidusRazorpay::Checkout.create(
54
+ order_id: order.id,
55
+ razorpay_payment_id: payment_object.id,
56
+ status: payment_object.status,
57
+ payment_method: payment_object.method,
58
+ card_id: payment_object.card_id,
59
+ bank: payment_object.bank,
60
+ wallet: payment_object.wallet,
61
+ vpa: payment_object.vpa,
62
+ email: payment_object.email,
63
+ contact: payment_object.contact,
64
+ )
65
+ end
66
+ end
67
+
68
+ private_class_method :setup_razorpay, :payment, :source, :payment_authorized?, :payment_method
69
+ end
70
+ ::Spree::Order.prepend(SolidusRazorpay::OrderDecorator)
@@ -0,0 +1,41 @@
1
+ module SolidusRazorpay
2
+ class RazorpayGateway < ::Spree::PaymentMethod
3
+ preference :key_id, :string
4
+ preference :key_secret, :string
5
+ preference :merchant_name, :string
6
+ preference :merchant_description, :text
7
+ preference :merchant_address, :string
8
+ preference :theme_color, :string, default: '#F37254'
9
+
10
+ def supports?(source)
11
+ true
12
+ end
13
+
14
+ def provider_class
15
+ self
16
+ end
17
+
18
+ def provider
19
+ self
20
+ end
21
+
22
+ def auto_capture?
23
+ true
24
+ end
25
+
26
+ def partial_name
27
+ 'razorpay'
28
+ end
29
+ alias_method :method_type, :partial_name
30
+
31
+ def purchase(amount, transaction_details, gateway_options={})
32
+ ActiveMerchant::Billing::Response.new(true, 'razorpay success')
33
+ end
34
+
35
+ def request_type
36
+ 'DEFAULT'
37
+ end
38
+ end
39
+ end
40
+
41
+
@@ -0,0 +1,55 @@
1
+ <%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js" %>
2
+ <%= javascript_include_tag "https://checkout.razorpay.com/v1/checkout.js" %>
3
+ <%= javascript_include_tag "http://malsup.github.io/jquery.blockUI.js" %>
4
+
5
+ <div id='razorpay' class='btn razorpay-payment-button pull-right'>
6
+ Pay by Razorpay
7
+ </div>
8
+
9
+ <div id='blockUI-message' style='display: none;'>
10
+ <h1>
11
+ <b>HOLDON!</b>
12
+ While we connect you back to merchant's site.
13
+ </h1>
14
+ </div>
15
+
16
+ <script type='text/javascript'>
17
+ $(document).ready(function(){
18
+ $('#razorpay').click(function() {
19
+ var options = {
20
+ 'key': "<%= payment_method.preferences[:key_id] %>",
21
+ 'amount': "<%= current_order.amount_in_paise %>",
22
+ 'name': "<%= payment_method.preferences[:merchant_name] %>",
23
+ 'description': "<%= payment_method.preferences[:merchant_description] %>",
24
+ 'handler': function (response){
25
+ $(document).ajaxStart(function() {
26
+ $.blockUI({ message: $('#blockUI-message') });
27
+ });
28
+ $.ajax({
29
+ type: 'POST',
30
+ url: '/solidus_razorpay/razorpay',
31
+ data: { payment_method_id: "<%= payment_method.id %>", razorpay_payment_id: response.razorpay_payment_id },
32
+ dataType: 'html'
33
+ }).done(function(data){
34
+ $.blockUI({ message: $('#blockUI-message') });
35
+ setTimeout(function(){
36
+ window.location.replace("/orders/<%= current_order.number %>");
37
+ }, 5000);
38
+ });
39
+ },
40
+ 'prefill': {
41
+ 'name': "<%= spree_current_user.try(:email) %>",
42
+ 'email': "<%= spree_current_user.try(:email) %>"
43
+ },
44
+ 'notes': {
45
+ 'address': "<%= payment_method.preferences[:merchant_address] %>"
46
+ },
47
+ 'theme': {
48
+ 'color': "<%= payment_method.preferences[:theme_color] %>"
49
+ }
50
+ };
51
+ var rzp1 = new Razorpay(options);
52
+ rzp1.open();
53
+ });
54
+ });
55
+ </script>
File without changes
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "solidus_razorpay"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ SolidusRazorpay::Engine.routes.draw do
2
+ resources :razorpay, only: :create
3
+ end
@@ -0,0 +1,18 @@
1
+ class CreateSolidusRazorpayCheckouts < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :solidus_razorpay_checkouts do |t|
4
+ t.string :order_id
5
+ t.string :razorpay_payment_id
6
+ t.string :status
7
+ t.string :payment_method
8
+ t.string :card_id
9
+ t.string :bank
10
+ t.string :wallet
11
+ t.string :vpa
12
+ t.string :email
13
+ t.string :contact
14
+
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ module SolidusRazorpay
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ class_option :auto_run_migrations, type: :boolean, default: false
6
+
7
+ def add_javascripts
8
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require solidus/frontend/jquery-1.12.4.min.js\n"
9
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require solidus/frontend/checkout.js\n"
10
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require solidus/frontend/jquery.blockUI.js\n"
11
+ end
12
+
13
+ def add_stylesheets
14
+ if File.exists?('vendor/assets/stylesheets/spree/frontend/all.css')
15
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require solidus/razorpay\n", :before => /\*\//, :verbose => true
16
+ elsif File.exists?('vendor/assets/stylesheets/spree/frontend/all.css.scss')
17
+ append_file 'vendor/assets/stylesheets/spree/frontend/all.css.scss', "\n@import 'solidus/razorpay'\n"
18
+ elsif File.exists?('vendor/assets/stylesheets/spree/frontend/all.scss')
19
+ append_file 'vendor/assets/stylesheets/spree/frontend/all.scss', "\n@import 'solidus/razorpay'\n"
20
+ end
21
+ end
22
+
23
+ def mount_engine
24
+ insert_into_file File.join('config', 'routes.rb'), after: "Rails.application.routes.draw do\n" do
25
+ "mount SolidusRazorpay::Engine, at: '/solidus_razorpay'\n"
26
+ end
27
+ end
28
+
29
+ def add_migrations
30
+ run 'bundle exec rake railties:install:migrations FROM=solidus_razorpay'
31
+ end
32
+
33
+ def run_migrations
34
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
35
+ if run_migrations
36
+ run 'bundle exec rake db:migrate'
37
+ else
38
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,7 @@
1
+ require 'solidus_core'
2
+ require 'solidus_razorpay/engine'
3
+ require 'razorpay'
4
+
5
+ module SolidusRazorpay
6
+ class Error < StandardError; end
7
+ end
@@ -0,0 +1,26 @@
1
+ module SolidusRazorpay
2
+ class Engine < Rails::Engine
3
+ require 'solidus_core'
4
+ isolate_namespace SolidusRazorpay
5
+ engine_name 'solidus_razorpay'
6
+
7
+ config.autoload_paths += %W(#{config.root}/lib)
8
+
9
+ # use rspec for tests
10
+ config.generators do |g|
11
+ g.test_framework :rspec
12
+ end
13
+
14
+ def self.activate
15
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
16
+ Rails.configuration.cache_classes ? require(c) : load(c)
17
+ end
18
+ end
19
+
20
+ initializer 'spree.gateway.payment_methods', after: 'spree.register.payment_methods' do |app|
21
+ app.config.spree.payment_methods << SolidusRazorpay::RazorpayGateway
22
+ end
23
+
24
+ config.to_prepare &method(:activate).to_proc
25
+ end
26
+ end
@@ -0,0 +1,12 @@
1
+ module SolidusRazorpay::Factories
2
+ FactoryBot.define do
3
+ # Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
4
+ #
5
+ # Example adding this to your spec_helper will load these Factories for use:
6
+ # require 'solidus_razorpay/factories'
7
+
8
+ Dir[Dir.pwd + '/spec/factories/**/*'].each do |factory|
9
+ require File.expand_path(factory)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module SolidusRazorpay
2
+ VERSION = '1.1.0'
3
+ end
@@ -0,0 +1,44 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "solidus_razorpay/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "solidus_razorpay"
8
+ spec.version = SolidusRazorpay::VERSION
9
+ spec.authors = ["Neeraj Kumar"]
10
+ spec.email = ["neeraj.kumar@gmail.com"]
11
+
12
+ spec.summary = %q{Razorpay integration into solidus application.}
13
+ spec.description = spec.summary
14
+ spec.homepage = 'https://github.com/neerajkumar/solidus-razorpay'
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata["allowed_push_host"] = 'https://rubygems.org'
21
+
22
+ spec.metadata["homepage_uri"] = spec.homepage
23
+ spec.metadata["source_code_uri"] = spec.homepage
24
+ else
25
+ raise "RubyGems 2.0 or newer is required to protect against " \
26
+ "public gem pushes."
27
+ end
28
+
29
+ # Specify which files should be added to the gem when it is released.
30
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
31
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
32
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
33
+ end
34
+ spec.bindir = "exe"
35
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
36
+ spec.require_paths = ["lib"]
37
+
38
+ spec.add_dependency 'solidus_core'
39
+ spec.add_dependency 'razorpay'
40
+
41
+ spec.add_development_dependency "bundler", "~> 1.17"
42
+ spec.add_development_dependency "rake", "~> 10.0"
43
+ spec.add_development_dependency "rspec", "~> 3.0"
44
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solidus_razorpay
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Neeraj Kumar
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-07-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: solidus_core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: razorpay
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.17'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.17'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description: Razorpay integration into solidus application.
84
+ email:
85
+ - neeraj.kumar@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".ruby-gemset"
93
+ - ".ruby-version"
94
+ - ".travis.yml"
95
+ - CODE_OF_CONDUCT.md
96
+ - Gemfile
97
+ - LICENSE.txt
98
+ - README.md
99
+ - Rakefile
100
+ - app/assets/images/PayWithRzp.png
101
+ - app/assets/images/solidus-razorpay.gif
102
+ - app/assets/javascripts/solidus/frontend/checkout.js
103
+ - app/assets/javascripts/solidus/frontend/jquery-1.12.4.min.js
104
+ - app/assets/javascripts/solidus/frontend/jquery.blockUI.js
105
+ - app/assets/stylesheets/solidus/razorpay.scss
106
+ - app/controllers/solidus_razorpay/razorpay_controller.rb
107
+ - app/models/application_record.rb
108
+ - app/models/solidus_razorpay/checkout.rb
109
+ - app/models/solidus_razorpay/order_decorator.rb
110
+ - app/models/solidus_razorpay/razorpay_gateway.rb
111
+ - app/views/spree/admin/payments/source_views/_razorpay.html.erb
112
+ - app/views/spree/checkout/payment/_razorpay.html.erb
113
+ - app/views/spree/razorpay/create.html.erb
114
+ - bin/console
115
+ - bin/setup
116
+ - config/routes.rb
117
+ - db/migrate/20210703184926_create_solidus_razorpay_checkouts.rb
118
+ - lib/generators/solidus_razorpay/install/install_generator.rb
119
+ - lib/solidus_razorpay.rb
120
+ - lib/solidus_razorpay/engine.rb
121
+ - lib/solidus_razorpay/factories.rb
122
+ - lib/solidus_razorpay/version.rb
123
+ - solidus_razorpay.gemspec
124
+ homepage: https://github.com/neerajkumar/solidus-razorpay
125
+ licenses:
126
+ - MIT
127
+ metadata:
128
+ allowed_push_host: https://rubygems.org
129
+ homepage_uri: https://github.com/neerajkumar/solidus-razorpay
130
+ source_code_uri: https://github.com/neerajkumar/solidus-razorpay
131
+ post_install_message:
132
+ rdoc_options: []
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ requirements: []
146
+ rubygems_version: 3.0.8
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: Razorpay integration into solidus application.
150
+ test_files: []