nma-webtopay 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in webtopay.gemspec
4
+ gemspec
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Kristijonas Urbaitis
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,71 @@
1
+ WebToPay
2
+ ===========
3
+
4
+ It is a plugin which could be very useful on working with https://www.webtopay.com/ (https://www.mokejimai.lt/) billing system.
5
+ The main function of this plugin is protection against forgeries that could be done by sending required parameters to the application and getting services without paying for free.
6
+ This plugin could be integrated with both billing types - MACRO (VISA, MasterCard, banks etc.) and MICRO (SMS, phone calls etc.).
7
+
8
+ *It works with OpenSSL so be sure that you have installed all necessary libs or modules on your system.
9
+
10
+ Installation
11
+ ===========
12
+
13
+ cd your_application
14
+ ./script/plugin install git://github.com/kristis/webtopay.git
15
+
16
+ Configuration
17
+ ===========
18
+ Create initializer
19
+ config/initializers/webtopay.rb
20
+
21
+ WebToPay.configure do |config|
22
+ config.project_id = 00000
23
+ config.sign_password = 'your sign password'
24
+ end
25
+
26
+ Examples
27
+ ===========
28
+
29
+ These code slices will protect your controller actions, which work with webtopay.com billing, against forgeries.
30
+
31
+ ****** Usage for MICRO and MACRO billing on controller:
32
+
33
+ [........]
34
+
35
+ webtopay :activate_user, :confirm_cart # You can add here as many actions as you want
36
+
37
+ def activate_user
38
+ # write here code which do some stuff
39
+ render :text => "Your user has been successfully activated. Thank you!" # it sends SMS answer
40
+ end
41
+
42
+ def confirm_cart
43
+ # write here code which do some stuff
44
+ render :text => "ok" # it sends successful answer to webtopay.com crawler
45
+ end
46
+
47
+ [........]
48
+
49
+ ****** You can also use helper method to generate required form for MACRO billing query:
50
+
51
+ [........]
52
+
53
+ <% macro_form :test => 1, :orderid => 123, :amount => 2000, :payment => 'vb', :country => 'lt', :paytext => "Billing for XX at the website XXX" do %>
54
+ Select paying method: <%= select_tag(:payment, options_for_select(['', 'vb', 'hanza', 'nord', 'snoras'])) %>
55
+ <%= submit_tag "test paying" %>
56
+ <% end %>
57
+
58
+ [........]
59
+
60
+ * Attention!!! Be sure that you have set required option, which let sending test requests, at your webtopay.com account settings at first if you want to use test requests.
61
+ * You can add into the helper options additional parameters or remove them according to technical specifications at https://www.webtopay.com/ .
62
+
63
+ TODO
64
+ ===========
65
+
66
+ 1. Write more clear documentation with real examples
67
+ 2. Write unit tests for each billing method (requires some testing data from https://www.webtopay.com/)
68
+ 3. Add more settings for controller filters
69
+
70
+ ===========
71
+ Copyright (c) 2009 Kristijonas Urbaitis, released under the MIT license
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'nma-webtopay'
2
+
@@ -0,0 +1,20 @@
1
+ require 'webtopay/exception'
2
+ require 'webtopay/configuration'
3
+ require 'webtopay/api'
4
+ require 'webtopay_controller'
5
+ require 'webtopay_helper'
6
+
7
+ module WebToPay
8
+ class << self
9
+ attr_accessor :config
10
+
11
+ def configure
12
+ self.config ||= Configuration.new
13
+ yield(config)
14
+ end
15
+ end
16
+ end
17
+
18
+ ActionController::Base.send(:include, WebToPayController)
19
+ ActionView::Base.send(:include, WebToPayHelper)
20
+
@@ -0,0 +1,407 @@
1
+ require 'digest/md5'
2
+ require 'openssl'
3
+ require 'open-uri'
4
+
5
+ module WebToPay
6
+ class Api
7
+ VERSION = "1.4"
8
+ PREFIX = "wp_"
9
+ CERT_PATH = "http://downloads.webtopay.com/download/public.key"
10
+
11
+ # Array structure:
12
+ # * name – request item name.
13
+ # * maxlen – max allowed value for item.
14
+ # * required – is this item is required.
15
+ # * user – if true, user can set value of this item, if false
16
+ # item value is generated.
17
+ # * isrequest – if true, item will be included in request array, if
18
+ # false, item only be used internaly and will not be
19
+ # included in outgoing request array.
20
+ # * regexp – regexp to test item value.
21
+ REQUEST_SPECS = [ [ :projectid, 11, true, true, true, /^\d+$/ ],
22
+ [ :orderid, 40, true, true, true, '' ],
23
+ [ :lang, 3, false, true, true, /^[a-z]{3}$/i ],
24
+ [ :amount, 11, false, true, true, /^\d+$/ ],
25
+ [ :currency, 3, false, true, true, /^[a-z]{3}$/i ],
26
+ [ :accepturl, 255, true, true, true, '' ],
27
+ [ :cancelurl, 255, true, true, true, '' ],
28
+ [ :callbackurl, 255, true, true, true, '' ],
29
+ [ :payment, 20, false, true, true, '' ],
30
+ [ :country, 2, false, true, true, /^[a-z]{2}$/i ],
31
+ [ :paytext, 255, false, true, true, '' ],
32
+ [ :p_firstname, 255, false, true, true, '' ],
33
+ [ :p_lastname, 255, false, true, true, '' ],
34
+ [ :p_email, 255, false, true, true, '' ],
35
+ [ :p_street, 255, false, true, true, '' ],
36
+ [ :p_city, 255, false, true, true, '' ],
37
+ [ :p_state, 20, false, true, true, '' ],
38
+ [ :p_zip, 20, false, true, true, '' ],
39
+ [ :p_countrycode, 2, false, true, true, /^[a-z]{2}$/i ],
40
+ [ :sign, 255, true, false, true, '' ],
41
+ [ :sign_password, 255, true, true, false, '' ],
42
+ [ :test, 1, false, true, true, /^[01]$/ ],
43
+ [ :version, 9, true, false, true, /^\d+\.\d+$/ ] ]
44
+
45
+ # Array structure:
46
+ # * name – request item name.
47
+ # * maxlen – max allowed value for item.
48
+ # * required – is this item is required in response.
49
+ # * mustcheck – this item must be checked by user.
50
+ # * isresponse – if false, item must not be included in response array.
51
+ # * regexp – regexp to test item value.
52
+ MAKRO_RESPONSE_SPECS = [
53
+ [ :projectid, 11, true, true, true, /^\d+$/ ],
54
+ [ :orderid, 40, false, false, true, '' ],
55
+ [ :lang, 3, false, false, true, /^[a-z]{3}$/i ],
56
+ [ :amount, 11, false, false, true, /^\d+$/ ],
57
+ [ :currency, 3, false, false, true, /^[a-z]{3}$/i ],
58
+ [ :payment, 20, false, false, true, '' ],
59
+ [ :country, 2, false, false, true, /^[a-z]{2}$/i ],
60
+ [ :paytext, 0, false, false, true, '' ],
61
+ [ :_ss2, 0, true, false, true, '' ],
62
+ [ :_ss1, 0, false, false, true, '' ],
63
+ [ :name, 255, false, false, true, '' ],
64
+ [ :surename, 255, false, false, true, '' ],
65
+ [ :status, 255, false, false, true, '' ],
66
+ [ :error, 20, false, false, true, '' ],
67
+ [ :test, 1, false, false, true, /^[01]$/ ],
68
+ [ :p_email, 0, false, false, true, '' ],
69
+ [ :payamount, 0, false, false, true, '' ],
70
+ [ :paycurrency, 0, false, false, true, '' ],
71
+ [ :version, 9, true, false, true, /^\d+\.\d+$/ ],
72
+ [ :sign_password, 255, false, true, false, '' ] ]
73
+
74
+ # Specification array for mikro response.
75
+ #
76
+ # Array structure:
77
+ # * name – request item name.
78
+ # * maxlen – max allowed value for item.
79
+ # * required – is this item is required in response.
80
+ # * mustcheck – this item must be checked by user.
81
+ # * isresponse – if false, item must not be included in response array.
82
+ # * regexp – regexp to test item value.
83
+ MIKRO_RESPONSE_SPECS = [
84
+ [ :to, 0, true, false, true, '' ],
85
+ [ :sms, 0, true, false, true, '' ],
86
+ [ :from, 0, true, false, true, '' ],
87
+ [ :operator, 0, true, false, true, '' ],
88
+ [ :amount, 0, true, false, true, '' ],
89
+ [ :currency, 0, true, false, true, '' ],
90
+ [ :country, 0, true, false, true, '' ],
91
+ [ :id, 0, true, false, true, '' ],
92
+ [ :_ss2, 0, true, false, true, '' ],
93
+ [ :_ss1, 0, true, false, true, '' ],
94
+ [ :test, 0, true, false, true, '' ],
95
+ [ :key, 0, true, false, true, '' ],
96
+ #[ :version, 9, true, false, true, /^\d+\.\d+$/ ]
97
+ ]
98
+
99
+ # Checks user given request data array.
100
+ #
101
+ # If any errors occurs, WebToPay::Exception will be raised.
102
+ #
103
+ # This method returns validated request array. Returned array contains
104
+ # only those items from data, that are needed.
105
+ #
106
+ def self.check_request_data(data)
107
+ request = {}
108
+ data.symbolize_keys!
109
+
110
+ REQUEST_SPECS.each do |spec|
111
+ name, maxlen, required, user, isrequest, regexp = spec
112
+
113
+ next unless user
114
+
115
+ name = name.to_sym
116
+
117
+ if required && data[name].nil?
118
+ e = Exception.new self._("'%s' is required but missing.", name)
119
+ e.code = Exception::E_MISSING
120
+ e.field_name = name
121
+ raise e
122
+ end
123
+
124
+ unless data[name].to_s.empty?
125
+ if (maxlen && data[name].to_s.length > maxlen)
126
+ e = Exception.new self._("'%s' value '%s' is too long, %d characters allowed.",
127
+ name, data[name], maxlen)
128
+ e.code = Exception::E_MAXLEN
129
+ e.field_name = name
130
+ raise e
131
+ end
132
+
133
+ if ('' != regexp && !data[name].to_s.match(regexp))
134
+ e = Exception.new self._("'%s' value '%s' is invalid.", name, data[name])
135
+ e.code = Exception::E_REGEXP
136
+ e.field_name = name
137
+ raise e
138
+ end
139
+ end
140
+
141
+ if isrequest && !data[name].nil?
142
+ request[name] = data[name]
143
+ end
144
+ end
145
+
146
+ return request
147
+ end
148
+
149
+ # Puts signature on request data hash
150
+ def self.sign_request(request, password)
151
+ fields = [ :projectid, :orderid, :lang, :amount, :currency,
152
+ :accepturl, :cancelurl, :callbackurl, :payment, :country,
153
+ :p_firstname, :p_lastname, :p_email, :p_street,
154
+ :p_city, :p_state, :p_zip, :p_countrycode, :test,
155
+ :version ]
156
+
157
+ request.symbolize_keys!
158
+
159
+ data = ''
160
+
161
+ fields.each do |key|
162
+ val = request[key].to_s
163
+
164
+ unless val.strip.blank?
165
+ data+= val
166
+ end
167
+ end
168
+
169
+ request[:sign] = Digest::MD5.hexdigest(data + password)
170
+
171
+ return request
172
+ end
173
+
174
+ # Builds request data array.
175
+ #
176
+ # This method checks all given data and generates correct request data
177
+ # array or raises WebToPayException on failure.
178
+ #
179
+ # Method accepts single parameter $data of array type. All possible array
180
+ # keys are described here:
181
+ # https://www.mokejimai.lt/makro_specifikacija.html
182
+ def self.build_request(data)
183
+ data.symbolize_keys!
184
+
185
+ request = self.check_request_data(data)
186
+ request[:version] = self::VERSION
187
+ request = self.sign_request(request, data[:sign_password])
188
+
189
+ return request
190
+ end
191
+
192
+ # Checks and validates response from WebToPay server.
193
+ #
194
+ # This function accepts both mikro and makro responses.
195
+ #
196
+ # First parameter usualy should by params hash
197
+ #
198
+ # Description about response can be found here:
199
+ # makro: https://www.mokejimai.lt/makro_specifikacija.html
200
+ # mikro: https://www.mokejimai.lt/mikro_mokejimu_specifikacija_SMS.html
201
+ #
202
+ # If response is not correct, WebToPay::Exception will be raised.
203
+ def self.check_response(query, user_data = {})
204
+ @@verified = false;
205
+
206
+ response = self.query_to_response(query)
207
+ response = self.get_prefixed(response, self::PREFIX)
208
+ response.symbolize_keys!
209
+
210
+ # *get* response type (makro|mikro)
211
+ type, specs = self.get_specs_for_response(response)
212
+
213
+ self.check_response_data(response, user_data, specs)
214
+ @@verified = 'RESPONSE';
215
+
216
+ # *check* response
217
+ if :makro == type && response[:version] != self::VERSION
218
+ e = Exception.new(self._('Incompatible library and response versions: ' +
219
+ 'libwebtopay %s, response %s', self::VERSION, response[:version]))
220
+ e.code = Exception::E_INVALID
221
+ raise e
222
+ end
223
+
224
+ if :makro == type
225
+ @@verified = 'RESPONSE VERSION ' + response[:version] + ' OK'
226
+ end
227
+
228
+ orderid = :makro == type ? response[:orderid] : response[:id]
229
+ password = user_data[:sign_password]
230
+
231
+ if self.check_response_cert(query)
232
+ @@verified = 'SS2 public.key'
233
+ end
234
+
235
+ # *check* status
236
+ if :makro == type && 1 != response[:status].to_i
237
+ e = Exception.new(self._('Returned transaction status is %d, successful status ' +
238
+ 'should be 1.', response[:status]))
239
+ e.code = Exception::E_INVALID
240
+ raise e
241
+ end
242
+
243
+ return response
244
+ end
245
+
246
+ def self.check_response_data(response, mustcheck_data, specs)
247
+ resp_keys = []
248
+
249
+ response.symbolize_keys!
250
+ mustcheck_data.symbolize_keys!
251
+
252
+ specs.each do |spec|
253
+ name, maxlen, required, mustcheck, is_response, regexp = spec
254
+
255
+ if required && response[name].nil?
256
+ e = Exception.new(self._("'%s' is required but missing.", name))
257
+ e.code = Exception::E_MISSING
258
+ e.field_name = name
259
+ raise e
260
+ end
261
+
262
+ if mustcheck
263
+ if mustcheck_data[name].nil?
264
+ e = Exception.new(self._("'%s' must exists in array of second " +
265
+ "parameter of checkResponse() method.", name))
266
+ e.code = Exception::E_USER_PARAMS
267
+ e.field_name = name
268
+ raise e
269
+ end
270
+
271
+ if is_response
272
+ if response[name].to_s != mustcheck_data[name].to_s
273
+ e = Exception.new(self._("'%s' yours and requested value is not " +
274
+ "equal ('%s' != '%s') ",
275
+ name, mustcheck_data[name], response[name]))
276
+ e.code = Exception::E_INVALID
277
+ e.field_name = name
278
+ raise e
279
+ end
280
+ end
281
+ end
282
+
283
+ if !response[name].to_s.empty?
284
+ if maxlen > 0 && response[name].to_s.length > maxlen
285
+ e = Exception.new(self._("'%s' value '%s' is too long, %d characters allowed.",
286
+ name, response[name], maxlen))
287
+ e.code = Exception::E_MAXLEN
288
+ e.field_name = name
289
+ raise e
290
+ end
291
+
292
+ if '' != regexp && !response[name].to_s.match(regexp)
293
+ e = new WebToPayException(self._("'%s' value '%s' is invalid.",
294
+ name, response[name]))
295
+ e.code = Exception::E_REGEXP
296
+ e.field_name = name
297
+ raise e
298
+ end
299
+ end
300
+
301
+ resp_keys << name unless response[name].nil?
302
+ end
303
+
304
+ # Filter only parameters passed from webtopay
305
+ _response = {}
306
+
307
+ response.keys.each do |key|
308
+ _response[key] = response[key] if resp_keys.include?(key)
309
+ end
310
+
311
+ return _response
312
+ end
313
+
314
+ # Return type and specification of given response array.
315
+ def self.get_specs_for_response(response)
316
+ response.symbolize_keys!
317
+
318
+ if ( !response[:to].nil? && !response[:from].nil? &&
319
+ !response[:sms].nil? && response[:projectid].nil? )
320
+
321
+ type = :mikro
322
+ specs = self::MIKRO_RESPONSE_SPECS
323
+ else
324
+ type = :makro
325
+ specs = self::MAKRO_RESPONSE_SPECS
326
+ end
327
+
328
+ return [ type, specs ]
329
+ end
330
+
331
+ # Check if response certificate is valid
332
+ def self.check_response_cert(query)
333
+ public_key = self.get_public_key
334
+
335
+ if (!public_key)
336
+ e = Exception.new(self._('Can\'t get openssl public key for %s', cert))
337
+ e.code = Exception::E_INVALID
338
+ raise e
339
+ end
340
+
341
+ res = self.query_to_response(query)
342
+ res = self.get_prefixed(res, PREFIX).symbolize_keys
343
+ keys = self.get_query_keys(query)
344
+ skip = [ :_ss2, :controller, :action ]
345
+ _SS2 = ''
346
+
347
+ keys.each do |key|
348
+ if !skip.include?(key)
349
+ _SS2 << res[key].to_s + '|'
350
+ end
351
+ end
352
+
353
+ if !public_key.verify(OpenSSL::Digest::SHA1.new, Base64.decode64(res[:_ss2]), _SS2)
354
+ e = Exception.new(self._('Can\'t verify SS2'))
355
+ e.code = Exception::E_INVALID
356
+ raise e
357
+ end
358
+
359
+ return true
360
+ end
361
+
362
+ def self.get_public_key
363
+ OpenSSL::X509::Certificate.new(open(CERT_PATH).read).public_key
364
+ end
365
+
366
+ def self.get_prefixed(data, prefix)
367
+ return data if prefix.to_s.blank?
368
+
369
+ ret = {}
370
+ reg = /^#{prefix}/
371
+
372
+ data.stringify_keys!
373
+
374
+ data.each_pair do |key, val|
375
+ if key.length > prefix.length && key.match(reg)
376
+ ret[key.gsub(reg, '')] = val
377
+ end
378
+ end
379
+
380
+ return ret
381
+ end
382
+
383
+ def self.query_to_response(query)
384
+ response = {}
385
+
386
+ query.split(/&/).each do |item|
387
+ key, val = item.split(/\=/)
388
+ response[key] = CGI.unescape(val.to_s)
389
+ end
390
+
391
+ return response
392
+ end
393
+
394
+ def self.get_query_keys(query)
395
+ query.split(/&/).collect { |i| i.split(/\=/).first.gsub(/^#{PREFIX}/, '').to_sym }
396
+ end
397
+
398
+ # I18n support.
399
+ def self._(*args)
400
+ if args.length > 1
401
+ return send(:sprintf, *args)
402
+ else
403
+ return args[0]
404
+ end
405
+ end
406
+ end
407
+ end
@@ -0,0 +1,6 @@
1
+ module WebToPay
2
+ class Configuration
3
+ attr_accessor :project_id
4
+ attr_accessor :sign_password
5
+ end
6
+ end
@@ -0,0 +1,26 @@
1
+ module WebToPay
2
+ class Exception < ::Exception
3
+ # Missing field.
4
+ E_MISSING = 1
5
+
6
+ # Invalid field value.
7
+ E_INVALID = 2
8
+
9
+ # Max length exceeded.
10
+ E_MAXLEN = 3
11
+
12
+ # Regexp for field value doesn't match.
13
+ E_REGEXP = 4
14
+
15
+ # Missing or invalid user given parameters.
16
+ E_USER_PARAMS = 5
17
+
18
+ # Logging errors
19
+ E_LOG = 6
20
+
21
+ # SMS answer errors
22
+ E_SMS_ANSWER = 7
23
+
24
+ attr_accessor :code, :field_name
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ module Webtopay
2
+ VERSION = "1.2.1"
3
+ end
4
+
@@ -0,0 +1,35 @@
1
+ module WebToPayController
2
+ module ClassMethods
3
+ def webtopay(*actions)
4
+ before_filter :webtopay_check
5
+ write_inheritable_array(:actions, actions)
6
+
7
+ attr_reader :webtopay_response
8
+ end
9
+ end
10
+
11
+ def self.included(controller)
12
+ controller.extend(ClassMethods)
13
+ end
14
+
15
+ protected
16
+
17
+ def webtopay_required?
18
+ (self.class.read_inheritable_attribute(:actions) || []).include?(action_name.to_sym)
19
+ end
20
+
21
+ def webtopay_check
22
+ if webtopay_required?
23
+ begin
24
+
25
+ @webtopay_response = WebToPay::Api.check_response(request.query_string, {
26
+ :projectid => WebToPay.config.project_id,
27
+ :sign_password => WebToPay.config.sign_password
28
+ })
29
+
30
+ rescue WebToPay::Exception => e
31
+ render :text => e.message, :status => 500
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ module WebToPayHelper
2
+ def macro_form(params, &block)
3
+ fields = {:orderid => "1", :lang => 'LIT', :amount => 0, :currency => 'LTL',
4
+ :accepturl => 'http://google.com', :cancelurl => 'http://yahoo.com', :callbackurl => 'http://yourdomain.com',
5
+ :projectid => WebToPay.config.project_id,
6
+ :sign_password => WebToPay.config.sign_password,
7
+ :test => 0}
8
+
9
+ fields.merge!(params)
10
+
11
+ request = WebToPay::Api.build_request(fields)
12
+
13
+ concat "<form action=\"https://www.mokejimai.lt/pay/\" method=\"post\" style=\"padding:0px;margin:0px\">".html_safe
14
+ request.each_pair {|k,v| concat hidden_field_tag(k, v) if !v.nil? }
15
+ yield if block_given?
16
+ concat "</form>".html_safe
17
+ end
18
+ end
19
+
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "webtopay/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "nma-webtopay"
7
+ s.version = Webtopay::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Nacionaline Moksleiviu Akademija"]
10
+ s.email = ["dev@nmakademija.lt"]
11
+ s.homepage = "https://github.com/nmakademija/webtopay"
12
+ s.summary = %q{Provides integration with http://www.webtopay.com (mokejimai.lt) payment system}
13
+ s.description = %q{Verifies webtopay.com (mokejimai.lt) payment data transfer}
14
+
15
+ s.rubyforge_project = "nma-webtopay"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
22
+
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nma-webtopay
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nacionaline Moksleiviu Akademija
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-05 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Verifies webtopay.com (mokejimai.lt) payment data transfer
15
+ email:
16
+ - dev@nmakademija.lt
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - MIT-LICENSE
24
+ - README
25
+ - Rakefile
26
+ - init.rb
27
+ - lib/webtopay.rb
28
+ - lib/webtopay/api.rb
29
+ - lib/webtopay/configuration.rb
30
+ - lib/webtopay/exception.rb
31
+ - lib/webtopay/version.rb
32
+ - lib/webtopay_controller.rb
33
+ - lib/webtopay_helper.rb
34
+ - webtopay.gemspec
35
+ homepage: https://github.com/nmakademija/webtopay
36
+ licenses: []
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project: nma-webtopay
55
+ rubygems_version: 1.8.10
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: Provides integration with http://www.webtopay.com (mokejimai.lt) payment
59
+ system
60
+ test_files: []