spree_paytm 1.0.3 → 1.0.3.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ccdad1b2faa8861c5222590131efa7507ef98867
4
- data.tar.gz: e79c2c411fc1e50047cb4b38c25110e5949fe028
3
+ metadata.gz: 38167e662039d87cffc9a6655a3ef94692e5fa8e
4
+ data.tar.gz: f8a13c5a1830f110978499c256ac8a7d2b3f6e10
5
5
  SHA512:
6
- metadata.gz: 0501b35880fd9569268b4f0ce13de0bea964da046f792d3fad42f132767065856bb692dcd4b4fb268a890e2a7eeb7b4498bf5a4f5a4f24387635e42a7c149171
7
- data.tar.gz: e5347a074109af5b95f84fbad0e7bee24560d44f3cb2e294b12aecc77c2bd1070f62fc0cd219e8e8d4aab97e20e9f9a4b76c7e35a76e5792b1ba0d777d3c676d
6
+ metadata.gz: fc3c8af7963373d1e57ea4c73392485ed0a355e3a76a93f3f62eddd4565bb0979291871207ccce99b6a787b15c0c66b7b07ed7f28e8892fbcbb756195a37936e
7
+ data.tar.gz: d7670c97fd210aaed15e0e6aa34a39733fef055192c681a1efdc3117d14c64a4194a8ab127e39fcdb0ac26277afd5e9b54b58845e232b41b58c149dd39ad36e5
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ coverage
6
+ results.xml
7
+ Gemfile.lock
8
+ tmp
9
+ pkg
10
+ spec/dummy
11
+ rspec.failures
12
+ .rvmrc
13
+ .idea
14
+ .ruby-version
15
+ .ruby-gemset
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # spree_paytm
2
+ Paytm payment gateway integration for spree
3
+
4
+ For live demo please [click here](http://spree-paytm-demo.herokuapp.com/)
5
+
6
+ You can also look at demo source code at [https://github.com/monika-khatri/spree-paytm-demo](https://github.com/monika-khatri/spree-paytm-demo)
7
+
8
+
9
+ ## Installation
10
+
11
+ 1. Add this extension to your Gemfile with this line:
12
+
13
+ gem 'spree_paytm', :github => 'monika-khatri/spree_paytm'
14
+
15
+ 2. Install the gem using Bundler:
16
+
17
+ bundle install
18
+
19
+ 3. Restart your server
20
+
21
+ 4. Add new payment method with provider
22
+
23
+ Spree::Gateway::Paytm
24
+
25
+ 5. Set all credentials from your paytm sandbox account. If you don't have it you can use from [Paytm Discussion Forum](http://paywithpaytm.com/developer/discussion/topic/sandbox-test-credentials-for-testing-paytm-solutions/)
26
+
27
+ 6. Set CALLBACK_URL to http://HOSTNAME/paytm/confirm in you sandbox web application. In case you are using test credentials from above link you can set CALLBACK_URL by overriding index method of app/controller/spree/paytm_controller.rb
28
+
29
+ @param_list['CALLBACK_URL'] = 'http://HOSTNAME/paytm/confirm'
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/packagetask'
5
+ require 'rubygems/package_task'
6
+
7
+ desc 'Generates a dummy app for testing'
8
+ task :test_app do
9
+ ENV['LIB_NAME'] = 'spree_paytm'
10
+ Rake::Task['extension:test_app'].invoke
11
+ end
12
+
13
+ require 'rspec/core'
14
+ require 'rspec/core/rake_task'
15
+ require 'rspec-rerun/tasks'
16
+ require 'spree/testing_support/extension_rake'
17
+
18
+ RSpec::Core::RakeTask.new(:spec) do |t|
19
+ t.fail_on_error = false
20
+ end
21
+
22
+ desc "Run RSpec with code coverage"
23
+ task :coverage do
24
+ ENV['COVERAGE'] = 'true'
25
+ Rake::Task["spec"].execute
26
+ end
27
+ task :default => 'rspec-rerun:spec'
28
+
29
+
30
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,70 @@
1
+ module Spree
2
+ class PaytmController < StoreController
3
+ protect_from_forgery only: :index
4
+
5
+ def index
6
+ payment_method = Spree::PaymentMethod.find(params[:payment_method_id])
7
+ order = current_order
8
+ @param_list = Hash.new
9
+ @param_list['MID'] = payment_method.preferred_merchant_id
10
+ @param_list['INDUSTRY_TYPE_ID'] = payment_method.preferred_industry_type_id
11
+ @param_list['CHANNEL_ID'] = payment_method.preferred_channel_id
12
+ @param_list['WEBSITE'] = payment_method.preferred_website
13
+ if @param_list.values.select{ |value| value unless value.present? }.present?
14
+ flash.error = Spree.t('paytm.paytm_payment_failed')
15
+ redirect_to checkout_state_path(order.state) and return
16
+ else
17
+ @param_list['REQUEST_TYPE'] = payment_method.request_type
18
+ @param_list['ORDER_ID'] = payment_method.txnid(order)
19
+ @param_list['TXN_AMOUNT'] = order.total.to_s
20
+ if(address = current_order.bill_address || current_order.ship_address)
21
+ phone = address.phone
22
+ end
23
+ #if user is not loggedin, Passing phone as customer id
24
+ cust_id = spree_current_user.nil? ? phone : spree_current_user.id
25
+ @param_list['CUST_ID'] = "CUST-#{cust_id}-ORDER-#{payment_method.txnid(order)}"
26
+ @param_list['MOBILE_NO'] = phone
27
+ @param_list['EMAIL'] = order.email
28
+
29
+ checksum = payment_method.new_pg_checksum(@param_list)
30
+ @param_list['CHECKSUMHASH'] = checksum
31
+ @paytm_txn_url = payment_method.txn_url
32
+ end
33
+ end
34
+
35
+ def confirm
36
+ payment_method = Spree::PaymentMethod.find_by(type: Spree::Gateway::Paytm)
37
+ checksum_hash = params["CHECKSUMHASH"]
38
+ params.delete("CHECKSUMHASH")
39
+ @status = params["STATUS"]
40
+ @orderid = params["ORDERID"]
41
+ @order = current_order || Spree::Order.find_by(number: @orderid.split("-").last)
42
+ @payment = @order.payments.create!(
43
+ source: Spree::PaytmCheckout.create(
44
+ checksum: checksum_hash,
45
+ order_id: @orderid,
46
+ txn_id: params['TXNID']
47
+ ),
48
+ payment_method: payment_method,
49
+ amount: @order.total,
50
+ response_code: params['RESPCODE']
51
+ )
52
+ if @status == "TXN_SUCCESS"
53
+ @order.next
54
+ @message = Spree.t(:order_processed_successfully)
55
+ @current_order = nil
56
+ flash.notice = Spree.t(:order_processed_successfully)
57
+ flash['order_completed'] = true
58
+ @error = false
59
+ @redirect_path = order_path(@order)
60
+ else
61
+ @payment.state = "failed"
62
+ @payment.save
63
+ @order.update_attributes(payment_state: "failed")
64
+ @error = true
65
+ @message = "There was an error processing your payment"
66
+ @redirect_path = checkout_state_path(@order.state)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,248 @@
1
+ module Spree
2
+ class Gateway::Paytm < Gateway
3
+ preference :merchant_id, :string
4
+ preference :merchant_key, :string
5
+ preference :website, :string
6
+ preference :industry_type_id, :string
7
+ preference :channel_id, :string
8
+ preference :site_url, :string
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 method_type
27
+ "paytm"
28
+ end
29
+
30
+ def purchase(amount, source, gateway_options={})
31
+ ActiveMerchant::Billing::Response.new(true, "paytm success")
32
+ end
33
+
34
+ def txnid(order)
35
+ "#{order.id.to_s}-#{SecureRandom.random_number(100000)}-#{order.number.to_s}"
36
+ end
37
+
38
+ def refund_url
39
+ 'https://' + domain + '/oltp/HANDLER_INTERNAL/REFUND'
40
+ end
41
+
42
+ def status_query_url
43
+ 'https://' + domain + '/oltp/HANDLER_INTERNAL/TXNSTATUS'
44
+ end
45
+
46
+ def txn_url
47
+ 'https://' + domain + '/oltp-web/processTransaction'
48
+ end
49
+
50
+ def request_type
51
+ 'DEFAULT' #or SUBSCRIBE
52
+ end
53
+ ### function returns dictionary of encrypted data ###
54
+ ### accepts a dictionary with data and key to encrypt with ###
55
+ ### can accept multiple key value pairs in the dictionary ###
56
+ def new_pg_encrypt(params)
57
+ if (params.class != Hash) || (params.keys == [])
58
+ return false
59
+ end
60
+
61
+ encrypted_data = Hash[]
62
+ key = preferred_merchant_key
63
+ keys = params.keys
64
+ aes = OpenSSL::Cipher::Cipher.new("aes-128-cbc")
65
+ begin
66
+ keys.each do |k|
67
+ data = params[k]
68
+ aes.encrypt
69
+ aes.key = key
70
+ aes.iv = '@@@@&&&&####$$$$'
71
+ encrypted_k = aes.update(k.to_s) + aes.final
72
+ encrypted_k = Base64.encode64(encrypted_k.to_s)
73
+ aes.encrypt
74
+ aes.key = key
75
+ aes.iv = '@@@@&&&&####$$$$'
76
+ encrypted_data[encrypted_k] = aes.update(data.to_s) + aes.final
77
+ encrypted_data[encrypted_k] = Base64.encode64(encrypted_data[encrypted_k])
78
+ end
79
+ rescue Exception => e
80
+ return false
81
+ end
82
+ return encrypted_data
83
+ end
84
+
85
+ ### function returns a single encrypted value ###
86
+ ### input data -> value to be encrypted ###
87
+ def new_pg_encrypt_variable(data)
88
+ aes = OpenSSL::Cipher::Cipher.new("aes-128-cbc")
89
+ aes.encrypt
90
+ aes.key = preferred_merchant_key
91
+ aes.iv = '@@@@&&&&####$$$$'
92
+ encrypted_data = nil
93
+ begin
94
+ encrypted_data = aes.update(data.to_s) + aes.final
95
+ encrypted_data = Base64.encode64(encrypted_data)
96
+ rescue Exception => e
97
+ return false
98
+ end
99
+ return encrypted_data
100
+ end
101
+
102
+
103
+ ### function returns dictionary of decrypted data ###
104
+ ### accepts a dictionary with data and key to decrypt with ###
105
+ ### can accept multiple key value pairs in the dictionary ###
106
+ def new_pg_decrypt(params)
107
+ if (params.class != Hash) || (params.keys == [])
108
+ return false
109
+ end
110
+
111
+ decrypted_data = Hash[]
112
+ key = preferred_merchant_key
113
+ keys = params.keys
114
+ aes = OpenSSL::Cipher::Cipher.new("aes-128-cbc")
115
+ begin
116
+ keys.each do |k|
117
+ data = params[k]
118
+ aes.decrypt
119
+ aes.key = key
120
+ aes.iv = '@@@@&&&&####$$$$'
121
+ decrypted_k = Base64.decode64(k.to_s)
122
+ decrypted_k = aes.update(decrypted_k.to_s) + aes.final
123
+ if data.empty?
124
+ decrypted_data[decrypted_k] = ""
125
+ next
126
+ end
127
+ aes.decrypt
128
+ aes.key = key
129
+ aes.iv = '@@@@&&&&####$$$$'
130
+ data = Base64.decode64(data)
131
+ decrypted_data[decrypted_k] = aes.update(data) + aes.final
132
+ end
133
+ rescue Exception => e
134
+ return false
135
+ end
136
+ return decrypted_data
137
+ end
138
+
139
+
140
+ ### function returns a single decrypted value ###
141
+ ### input data -> value to be decrypted ###
142
+ def new_pg_decrypt_variable(data)
143
+ aes = OpenSSL::Cipher::Cipher.new("aes-128-cbc")
144
+ aes.decrypt
145
+ aes.key = preferred_merchant_key
146
+ aes.iv = '@@@@&&&&####$$$$'
147
+ decrypted_data = nil
148
+ begin
149
+ decrypted_data = Base64.decode64(data.to_s)
150
+ decrypted_data = aes.update(decrypted_data) + aes.final
151
+ rescue Exception => e
152
+ return false
153
+ end
154
+ return decrypted_data
155
+ end
156
+
157
+
158
+ def new_pg_generate_salt(length)
159
+ salt = SecureRandom.urlsafe_base64(length*(3.0/4.0))
160
+ return salt.to_s
161
+ end
162
+
163
+
164
+ ### function returns checksum of given key value pairs ###
165
+ ### accepts a hash with key value pairs ###
166
+ ### calculates sha256 checksum of given values ###
167
+ def new_pg_checksum(params, salt_length = 4)
168
+ if params.class != Hash
169
+ return false
170
+ end
171
+ key = preferred_merchant_key
172
+ salt = new_pg_generate_salt(salt_length)
173
+ keys = params.keys
174
+ str = nil
175
+ keys = keys.sort
176
+ keys.each do |k|
177
+ if str.nil?
178
+ str = params[k].to_s
179
+ next
180
+ end
181
+ str = str + '|' + params[k].to_s
182
+ end
183
+ str = str + '|' + salt
184
+ check_sum = Digest::SHA256.hexdigest(str)
185
+ check_sum = check_sum + salt
186
+ ### encrypting checksum ###
187
+ check_sum = new_pg_encrypt_variable(check_sum)
188
+ return check_sum
189
+ end
190
+
191
+
192
+ ### function returns checksum of given key value pairs (must contain the :checksum key) ###
193
+ ### accepts a hash with key value pairs ###
194
+ ### calculates sha256 checksum of given values ###
195
+ ### returns true if checksum is consistent ###
196
+ ### returns false in case of inconsistency ###
197
+ def new_pg_verify_checksum(params, check_sum, salt_length = 4)
198
+
199
+ if params.class != Hash
200
+ return false
201
+ end
202
+
203
+ if check_sum.nil? || check_sum.empty?
204
+ return false
205
+ end
206
+ key = preferred_merchant_key
207
+ generated_check_sum = nil
208
+ check_sum = new_pg_decrypt_variable(check_sum)
209
+
210
+ if check_sum == false
211
+ return false
212
+ end
213
+ begin
214
+ salt = check_sum[(check_sum.length-salt_length), (check_sum.length)]
215
+ keys = params.keys
216
+ str = nil
217
+ keys = keys.sort
218
+ keys.each do |k|
219
+ if str.nil?
220
+ str = params[k].to_s
221
+ next
222
+ end
223
+ str = str + '|' + params[k].to_s
224
+ end
225
+ str = str + '|' + salt
226
+ generated_check_sum = Digest::SHA256.hexdigest(str)
227
+ generated_check_sum = generated_check_sum + salt
228
+ rescue Exception => e
229
+ return false
230
+ end
231
+
232
+ if check_sum == generated_check_sum
233
+ return true
234
+ else
235
+ return false
236
+ end
237
+ end
238
+
239
+ private
240
+ def domain
241
+ domain = 'secure.paytm.in'
242
+ if (preferred_test_mode == true)
243
+ domain = 'pguat.paytm.com'
244
+ end
245
+ domain
246
+ end
247
+ end
248
+ end
@@ -0,0 +1,4 @@
1
+ module Spree
2
+ class PaytmCheckout < ActiveRecord::Base
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ <%= link_to("Pay with Paytm", paytm_proceed_url(:payment_method_id => payment_method.id), :method => :post, :id => "paytm_button", class: "btn btn-md btn-primary pull-right") %>
2
+
3
+ <% param_prefix = "payment_source[#{payment_method.id}]" %>
@@ -0,0 +1,18 @@
1
+ <h1>
2
+ <b>HOLDON!</b>
3
+ While we connect you back to merchant's site
4
+ </h1>
5
+ <% if @error.present? %>
6
+ <p class="error">
7
+ <%= @message %>
8
+ </p>
9
+ <% end %>
10
+
11
+ <script>
12
+
13
+ $(document).ready(function(){
14
+ setTimeout(function(){
15
+ window.location.replace("<%= @redirect_path %>");
16
+ }, 5000);
17
+ })
18
+ </script>
@@ -0,0 +1,13 @@
1
+ <h4>Processing ...</h4>
2
+ <form id="checkout_form" name="checkout_form" method="post" action="<%= @paytm_txn_url %>">
3
+ <% @param_list.each do |name, value| %>
4
+ <input type="hidden" name="<%= name %>" value="<%= value %>" >
5
+ <% end %>
6
+ </form>
7
+ <script type="text/javascript">
8
+ // self executing function
9
+ (function () {
10
+ // auto submit form
11
+ document.getElementById("checkout_form").submit();
12
+ })();
13
+ </script>
@@ -0,0 +1,4 @@
1
+ en:
2
+ spree:
3
+ paytm:
4
+ paytm_payment_failed: "Paytm failed. Security header is not valid"
data/config/routes.rb ADDED
@@ -0,0 +1,5 @@
1
+ Spree::Core::Engine.add_routes do
2
+ post '/paytm', :to => "paytm#index", :as => :paytm_proceed
3
+ post '/paytm/confirm', :to => "paytm#confirm", :as => :paytm_confirm
4
+ post '/paytm/cancel', :to => "paytm#cancel", :as => :paytm_cancel
5
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSpreePaytmCheckouts < ActiveRecord::Migration
2
+ def change
3
+ create_table :spree_paytm_checkouts do |t|
4
+ t.string :checksum
5
+ t.string :txn_id
6
+ t.string :order_id
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module SpreePaytm
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ class_option :auto_run_migrations, :type => :boolean, :default => false
6
+
7
+ def add_migrations
8
+ run 'bundle exec rake railties:install:migrations FROM=spree_paytm'
9
+ end
10
+
11
+ def run_migrations
12
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
13
+ if run_migrations
14
+ run 'bundle exec rake db:migrate'
15
+ else
16
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ module SpreePaytm
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_paytm'
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
+ config.to_prepare &method(:activate).to_proc
21
+
22
+ initializer "spree.gateway",
23
+ after: "spree.register.payment_methods" do |app|
24
+ app.config.spree.payment_methods << Spree::Gateway::Paytm
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module SpreePaytm
2
+ VERSION = '1.0.3.1'
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'spree_core'
2
+ require 'spree_paytm/engine'
3
+
4
+ module SpreePaytm
5
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ require 'spree_paytm/version'
6
+ Gem::Specification.new do |s|
7
+ s.platform = Gem::Platform::RUBY
8
+ s.name = 'spree_paytm'
9
+ s.version = SpreePaytm::VERSION
10
+ s.summary = 'Paytm integration into spree application.'
11
+ s.description = s.summary
12
+ s.required_ruby_version = '>= 2.1.0'
13
+
14
+ s.author = 'Monika Khatri'
15
+ s.email = 'monika.khatri.d@gmail.com'
16
+ s.homepage = 'https://github.com/monika-khatri/spree-paytm'
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- spec/*`.split("\n")
20
+ s.require_path = 'lib'
21
+ s.requirements << 'none'
22
+
23
+ s.add_dependency 'spree_core', '~> 3.0'
24
+
25
+ s.add_development_dependency 'capybara'
26
+ s.add_development_dependency 'coffee-rails'
27
+ s.add_development_dependency 'database_cleaner'
28
+ s.add_development_dependency 'factory_girl'
29
+ s.add_development_dependency 'ffaker'
30
+ s.add_development_dependency 'rspec-rails'
31
+ s.add_development_dependency 'rspec-rerun'
32
+ s.add_development_dependency 'sass-rails'
33
+ s.add_development_dependency 'selenium-webdriver'
34
+ s.add_development_dependency 'simplecov'
35
+ s.add_development_dependency 'pry'
36
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_paytm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Monika Khatri
@@ -24,12 +24,184 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: capybara
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
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: coffee-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: database_cleaner
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: factory_girl
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: ffaker
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-rerun
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sass-rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: selenium-webdriver
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: pry
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
27
181
  description: Paytm integration into spree application.
28
182
  email: monika.khatri.d@gmail.com
29
183
  executables: []
30
184
  extensions: []
31
185
  extra_rdoc_files: []
32
- files: []
186
+ files:
187
+ - ".gitignore"
188
+ - README.md
189
+ - Rakefile
190
+ - app/controllers/spree/paytm_controller.rb
191
+ - app/models/spree/gateway/paytm.rb
192
+ - app/models/spree/paytm_checkout.rb
193
+ - app/views/spree/admin/payments/source_views/_paytm.html.erb
194
+ - app/views/spree/checkout/payment/_paytm.html.erb
195
+ - app/views/spree/paytm/confirm.html.erb
196
+ - app/views/spree/paytm/index.html.erb
197
+ - config/locales/en.yml
198
+ - config/routes.rb
199
+ - db/migrate/20170113062328_create_spree_paytm_checkouts.rb
200
+ - lib/generators/spree_paytm/install/install_generator.rb
201
+ - lib/spree_paytm.rb
202
+ - lib/spree_paytm/engine.rb
203
+ - lib/spree_paytm/version.rb
204
+ - spree_paytm.gemspec
33
205
  homepage: https://github.com/monika-khatri/spree-paytm
34
206
  licenses: []
35
207
  metadata: {}
@@ -41,7 +213,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
41
213
  requirements:
42
214
  - - ">="
43
215
  - !ruby/object:Gem::Version
44
- version: '0'
216
+ version: 2.1.0
45
217
  required_rubygems_version: !ruby/object:Gem::Requirement
46
218
  requirements:
47
219
  - - ">="