webtopay 1.2.1 → 1.6.0
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 +7 -0
- data/.gitignore +1 -0
- data/README.md +145 -0
- data/lib/webtopay.rb +5 -3
- data/lib/webtopay/exception.rb +11 -1
- data/lib/webtopay/payment.rb +45 -0
- data/lib/webtopay/response.rb +198 -0
- data/lib/webtopay/version.rb +1 -1
- data/lib/webtopay_controller.rb +14 -19
- data/lib/webtopay_helper.rb +19 -15
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/controllers/payments_controller.rb +11 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +23 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/webtopay.rb +4 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +61 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/lib/webtopay/payment_spec.rb +31 -0
- data/spec/lib/webtopay/response_spec.rb +57 -0
- data/spec/lib/webtopay_controller_spec.rb +19 -0
- data/spec/spec_helper.rb +59 -0
- data/webtopay.gemspec +10 -3
- metadata +195 -47
- data/README +0 -71
- data/lib/webtopay/api.rb +0 -407
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# Configure Rails Envinronment
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
4
|
+
|
5
|
+
require 'rspec/rails'
|
6
|
+
require 'factory_girl_rails'
|
7
|
+
require 'database_cleaner'
|
8
|
+
|
9
|
+
ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
|
10
|
+
|
11
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
12
|
+
# in spec/support/ and its subdirectories.
|
13
|
+
Dir[File.join(ENGINE_RAILS_ROOT, "spec/support/**/*.rb")].each {|f| require f }
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.include FactoryGirl::Syntax::Methods
|
17
|
+
|
18
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
19
|
+
|
20
|
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
21
|
+
config.fixture_path = "#{::Rails.root}/spec/fixtures/"
|
22
|
+
|
23
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
24
|
+
# examples within a transaction, remove the following line or assign false
|
25
|
+
# instead of true.
|
26
|
+
config.use_transactional_fixtures = false
|
27
|
+
|
28
|
+
# If true, the base class of anonymous controllers will be inferred
|
29
|
+
# automatically. This will be the default behavior in future versions of
|
30
|
+
# rspec-rails.
|
31
|
+
config.infer_base_class_for_anonymous_controllers = true
|
32
|
+
|
33
|
+
# Run specs in random order to surface order dependencies. If you find an
|
34
|
+
# order dependency and want to debug it, you can fix the order by providing
|
35
|
+
# the seed, which is printed after each run.
|
36
|
+
# --seed 1234
|
37
|
+
config.order = "random"
|
38
|
+
|
39
|
+
config.before :suite do
|
40
|
+
DatabaseCleaner.strategy = :transaction
|
41
|
+
DatabaseCleaner.clean_with :truncation
|
42
|
+
end
|
43
|
+
#
|
44
|
+
#config.before js: true do
|
45
|
+
# DatabaseCleaner.strategy = :truncation
|
46
|
+
#end
|
47
|
+
#
|
48
|
+
#config.after js: true do
|
49
|
+
# DatabaseCleaner.strategy = :transaction
|
50
|
+
#end
|
51
|
+
#
|
52
|
+
config.before do
|
53
|
+
DatabaseCleaner.start
|
54
|
+
end
|
55
|
+
#
|
56
|
+
config.after do
|
57
|
+
DatabaseCleaner.clean
|
58
|
+
end
|
59
|
+
end
|
data/webtopay.gemspec
CHANGED
@@ -6,9 +6,9 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "webtopay"
|
7
7
|
s.version = Webtopay::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Laurynas Butkus", "Kristijonas Urbaitis"]
|
10
|
-
s.email = ["laurynas.butkus@gmail.com", "kristis@micro.lt"]
|
11
|
-
s.homepage = "https://github.com/
|
9
|
+
s.authors = ["Povilas Jurčys", "Laurynas Butkus", "Kristijonas Urbaitis"]
|
10
|
+
s.email = ["bloomrain@gmail.com", "laurynas.butkus@gmail.com", "kristis@micro.lt"]
|
11
|
+
s.homepage = "https://github.com/bloomrain/webtopay"
|
12
12
|
s.summary = %q{Provides integration with http://www.webtopay.com (mokejimai.lt) payment system}
|
13
13
|
s.description = %q{Verifies webtopay.com (mokejimai.lt) payment data transfer}
|
14
14
|
|
@@ -18,5 +18,12 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_development_dependency "sqlite3", '~> 1.3', '>= 1.3.8'
|
23
|
+
s.add_development_dependency "rails", '~> 4.0', '>= 4.0.0'
|
24
|
+
s.add_development_dependency 'factory_girl_rails', '~> 4.3', '>= 4.3.0'
|
25
|
+
s.add_development_dependency 'database_cleaner', '~> 1.2', '>= 1.2.0'
|
26
|
+
s.add_development_dependency "rspec", '~> 2.14', '>= 2.14.1'
|
27
|
+
s.add_development_dependency "rspec-rails", '~> 2.14', '>= 2.14.1'
|
21
28
|
end
|
22
29
|
|
metadata
CHANGED
@@ -1,81 +1,229 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: webtopay
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 2
|
9
|
-
- 1
|
10
|
-
version: 1.2.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.6.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
7
|
+
- Povilas Jurčys
|
13
8
|
- Laurynas Butkus
|
14
9
|
- Kristijonas Urbaitis
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
13
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: sqlite3
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.3.8
|
25
|
+
type: :development
|
26
|
+
prerelease: false
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - "~>"
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '1.3'
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.3.8
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rails
|
37
|
+
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '4.0'
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 4.0.0
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - "~>"
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '4.0'
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 4.0.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: factory_girl_rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '4.3'
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 4.3.0
|
65
|
+
type: :development
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - "~>"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '4.3'
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 4.3.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: database_cleaner
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '1.2'
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.2.0
|
85
|
+
type: :development
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '1.2'
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 1.2.0
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rspec
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '2.14'
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 2.14.1
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '2.14'
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: 2.14.1
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
name: rspec-rails
|
117
|
+
requirement: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - "~>"
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '2.14'
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.14.1
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.14'
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: 2.14.1
|
22
135
|
description: Verifies webtopay.com (mokejimai.lt) payment data transfer
|
23
|
-
email:
|
136
|
+
email:
|
137
|
+
- bloomrain@gmail.com
|
24
138
|
- laurynas.butkus@gmail.com
|
25
139
|
- kristis@micro.lt
|
26
140
|
executables: []
|
27
|
-
|
28
141
|
extensions: []
|
29
|
-
|
30
142
|
extra_rdoc_files: []
|
31
|
-
|
32
|
-
|
33
|
-
- .gitignore
|
143
|
+
files:
|
144
|
+
- ".gitignore"
|
34
145
|
- Gemfile
|
35
146
|
- MIT-LICENSE
|
36
|
-
- README
|
147
|
+
- README.md
|
37
148
|
- Rakefile
|
38
149
|
- init.rb
|
39
150
|
- lib/webtopay.rb
|
40
|
-
- lib/webtopay/api.rb
|
41
151
|
- lib/webtopay/configuration.rb
|
42
152
|
- lib/webtopay/exception.rb
|
153
|
+
- lib/webtopay/payment.rb
|
154
|
+
- lib/webtopay/response.rb
|
43
155
|
- lib/webtopay/version.rb
|
44
156
|
- lib/webtopay_controller.rb
|
45
157
|
- lib/webtopay_helper.rb
|
158
|
+
- spec/dummy/README.rdoc
|
159
|
+
- spec/dummy/Rakefile
|
160
|
+
- spec/dummy/app/assets/images/.keep
|
161
|
+
- spec/dummy/app/assets/javascripts/application.js
|
162
|
+
- spec/dummy/app/assets/stylesheets/application.css
|
163
|
+
- spec/dummy/app/controllers/application_controller.rb
|
164
|
+
- spec/dummy/app/controllers/concerns/.keep
|
165
|
+
- spec/dummy/app/controllers/payments_controller.rb
|
166
|
+
- spec/dummy/app/helpers/application_helper.rb
|
167
|
+
- spec/dummy/app/mailers/.keep
|
168
|
+
- spec/dummy/app/models/.keep
|
169
|
+
- spec/dummy/app/models/concerns/.keep
|
170
|
+
- spec/dummy/app/views/layouts/application.html.erb
|
171
|
+
- spec/dummy/bin/bundle
|
172
|
+
- spec/dummy/bin/rails
|
173
|
+
- spec/dummy/bin/rake
|
174
|
+
- spec/dummy/config.ru
|
175
|
+
- spec/dummy/config/application.rb
|
176
|
+
- spec/dummy/config/boot.rb
|
177
|
+
- spec/dummy/config/database.yml
|
178
|
+
- spec/dummy/config/environment.rb
|
179
|
+
- spec/dummy/config/environments/development.rb
|
180
|
+
- spec/dummy/config/environments/production.rb
|
181
|
+
- spec/dummy/config/environments/test.rb
|
182
|
+
- spec/dummy/config/initializers/backtrace_silencers.rb
|
183
|
+
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
184
|
+
- spec/dummy/config/initializers/inflections.rb
|
185
|
+
- spec/dummy/config/initializers/mime_types.rb
|
186
|
+
- spec/dummy/config/initializers/secret_token.rb
|
187
|
+
- spec/dummy/config/initializers/session_store.rb
|
188
|
+
- spec/dummy/config/initializers/webtopay.rb
|
189
|
+
- spec/dummy/config/initializers/wrap_parameters.rb
|
190
|
+
- spec/dummy/config/locales/en.yml
|
191
|
+
- spec/dummy/config/routes.rb
|
192
|
+
- spec/dummy/db/test.sqlite3
|
193
|
+
- spec/dummy/lib/assets/.keep
|
194
|
+
- spec/dummy/log/.keep
|
195
|
+
- spec/dummy/public/404.html
|
196
|
+
- spec/dummy/public/422.html
|
197
|
+
- spec/dummy/public/500.html
|
198
|
+
- spec/dummy/public/favicon.ico
|
199
|
+
- spec/lib/webtopay/payment_spec.rb
|
200
|
+
- spec/lib/webtopay/response_spec.rb
|
201
|
+
- spec/lib/webtopay_controller_spec.rb
|
202
|
+
- spec/spec_helper.rb
|
46
203
|
- webtopay.gemspec
|
47
|
-
homepage: https://github.com/
|
204
|
+
homepage: https://github.com/bloomrain/webtopay
|
48
205
|
licenses: []
|
49
|
-
|
206
|
+
metadata: {}
|
50
207
|
post_install_message:
|
51
208
|
rdoc_options: []
|
52
|
-
|
53
|
-
require_paths:
|
209
|
+
require_paths:
|
54
210
|
- lib
|
55
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
-
|
57
|
-
requirements:
|
211
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
58
213
|
- - ">="
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
version: "0"
|
64
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
217
|
+
requirements:
|
67
218
|
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
|
70
|
-
segments:
|
71
|
-
- 0
|
72
|
-
version: "0"
|
219
|
+
- !ruby/object:Gem::Version
|
220
|
+
version: '0'
|
73
221
|
requirements: []
|
74
|
-
|
75
222
|
rubyforge_project: webtopay
|
76
|
-
rubygems_version:
|
223
|
+
rubygems_version: 2.2.0
|
77
224
|
signing_key:
|
78
|
-
specification_version:
|
79
|
-
summary: Provides integration with http://www.webtopay.com (mokejimai.lt) payment
|
225
|
+
specification_version: 4
|
226
|
+
summary: Provides integration with http://www.webtopay.com (mokejimai.lt) payment
|
227
|
+
system
|
80
228
|
test_files: []
|
81
|
-
|
229
|
+
has_rdoc:
|
data/README
DELETED
@@ -1,71 +0,0 @@
|
|
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
|
data/lib/webtopay/api.rb
DELETED
@@ -1,407 +0,0 @@
|
|
1
|
-
require 'digest/md5'
|
2
|
-
require 'openssl'
|
3
|
-
require 'open-uri'
|
4
|
-
|
5
|
-
module WebToPay
|
6
|
-
class Api
|
7
|
-
VERSION = "1.2"
|
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+= sprintf("%03d", val.length) + val.downcase
|
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
|