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 +4 -4
- data/.gitignore +15 -0
- data/README.md +29 -0
- data/Rakefile +30 -0
- data/app/controllers/spree/paytm_controller.rb +70 -0
- data/app/models/spree/gateway/paytm.rb +248 -0
- data/app/models/spree/paytm_checkout.rb +4 -0
- data/app/views/spree/admin/payments/source_views/_paytm.html.erb +0 -0
- data/app/views/spree/checkout/payment/_paytm.html.erb +3 -0
- data/app/views/spree/paytm/confirm.html.erb +18 -0
- data/app/views/spree/paytm/index.html.erb +13 -0
- data/config/locales/en.yml +4 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20170113062328_create_spree_paytm_checkouts.rb +9 -0
- data/lib/generators/spree_paytm/install/install_generator.rb +21 -0
- data/lib/spree_paytm/engine.rb +27 -0
- data/lib/spree_paytm/version.rb +3 -0
- data/lib/spree_paytm.rb +5 -0
- data/spree_paytm.gemspec +36 -0
- metadata +175 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38167e662039d87cffc9a6655a3ef94692e5fa8e
|
4
|
+
data.tar.gz: f8a13c5a1830f110978499c256ac8a7d2b3f6e10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc3c8af7963373d1e57ea4c73392485ed0a355e3a76a93f3f62eddd4565bb0979291871207ccce99b6a787b15c0c66b7b07ed7f28e8892fbcbb756195a37936e
|
7
|
+
data.tar.gz: d7670c97fd210aaed15e0e6aa34a39733fef055192c681a1efdc3117d14c64a4194a8ab127e39fcdb0ac26277afd5e9b54b58845e232b41b58c149dd39ad36e5
|
data/.gitignore
ADDED
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
|
File without changes
|
@@ -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>
|
data/config/routes.rb
ADDED
@@ -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
|
data/lib/spree_paytm.rb
ADDED
data/spree_paytm.gemspec
ADDED
@@ -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:
|
216
|
+
version: 2.1.0
|
45
217
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
218
|
requirements:
|
47
219
|
- - ">="
|