veritrans 2.0.0 → 2.0.2
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 +2 -1
- data/.travis.yml +5 -0
- data/CHANGELOG.md +14 -0
- data/Gemfile +0 -2
- data/Gemfile.lock +109 -55
- data/README.md +29 -8
- data/Rakefile +7 -0
- data/api_reference.md +11 -6
- data/lib/generators/templates/assets/credit_card_form.js +2 -2
- data/lib/generators/templates/payments_controller.rb +3 -4
- data/lib/veritrans.rb +2 -10
- data/lib/veritrans/cli.rb +1 -12
- data/lib/veritrans/client.rb +16 -7
- data/lib/veritrans/config.rb +72 -7
- data/lib/veritrans/core_extensions.rb +32 -0
- data/lib/veritrans/version.rb +1 -1
- data/license.txt +0 -0
- data/spec/cli_spec.rb +0 -4
- data/spec/rails_plugin_spec.rb +212 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/veritrans_client_spec.rb +32 -0
- data/spec/veritrans_config_spec.rb +12 -1
- data/veritrans.gemspec +3 -0
- metadata +62 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 931d9054ff90cd1ba889f74542f676b54d6fd46b
|
|
4
|
+
data.tar.gz: df6815a8f4c46a28feb241a7ddc0c335aeecdcf9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: db0a441e12e6a7c4ccf3a89481503007337ef5577c520413dca0f4ed327b55269f86becaa80a32c33578471aabfa24174537e804cbdac88473287b9aa5b2efa2
|
|
7
|
+
data.tar.gz: 179e13bdcaae50bfc3b8e1723ba87fe347033d84eedb8ab6d505e5cbae336df28c515004e2fbc888a3d4c4660f9d11e43f555d4028d8cf6fc52c3286673949ce
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
### Version 2.0.2 (date: 20 Feb 2014)
|
|
2
|
+
|
|
3
|
+
* Add feature to add default http options, via Veritrans.config.http_options
|
|
4
|
+
* Start writing documentation in RDoc format
|
|
5
|
+
|
|
6
|
+
### Version 2.0.1 (date: 20 Jan 2014)
|
|
7
|
+
|
|
8
|
+
* Fix confusing json format, we don't have it anymore.
|
|
9
|
+
* Add testing for rails generator
|
|
10
|
+
* Disable logging in sample form generated by plugin
|
|
11
|
+
|
|
12
|
+
### Version 2.0.0 (date: 12 Dec 2014)
|
|
13
|
+
|
|
14
|
+
* Complete rewrite from version 1.* to support new API version
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,92 +1,139 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
veritrans (2.0.
|
|
4
|
+
veritrans (2.0.2)
|
|
5
5
|
excon (~> 0.20)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
actionmailer (4.
|
|
11
|
-
actionpack (= 4.
|
|
12
|
-
actionview (= 4.
|
|
10
|
+
actionmailer (4.2.0)
|
|
11
|
+
actionpack (= 4.2.0)
|
|
12
|
+
actionview (= 4.2.0)
|
|
13
|
+
activejob (= 4.2.0)
|
|
13
14
|
mail (~> 2.5, >= 2.5.4)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
16
|
+
actionpack (4.2.0)
|
|
17
|
+
actionview (= 4.2.0)
|
|
18
|
+
activesupport (= 4.2.0)
|
|
19
|
+
rack (~> 1.6.0)
|
|
18
20
|
rack-test (~> 0.6.2)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
22
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.1)
|
|
23
|
+
actionview (4.2.0)
|
|
24
|
+
activesupport (= 4.2.0)
|
|
21
25
|
builder (~> 3.1)
|
|
22
26
|
erubis (~> 2.7.0)
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
|
28
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.1)
|
|
29
|
+
activejob (4.2.0)
|
|
30
|
+
activesupport (= 4.2.0)
|
|
31
|
+
globalid (>= 0.3.0)
|
|
32
|
+
activemodel (4.2.0)
|
|
33
|
+
activesupport (= 4.2.0)
|
|
25
34
|
builder (~> 3.1)
|
|
26
|
-
activerecord (4.
|
|
27
|
-
activemodel (= 4.
|
|
28
|
-
activesupport (= 4.
|
|
29
|
-
arel (~>
|
|
30
|
-
activesupport (4.
|
|
31
|
-
i18n (~> 0.
|
|
35
|
+
activerecord (4.2.0)
|
|
36
|
+
activemodel (= 4.2.0)
|
|
37
|
+
activesupport (= 4.2.0)
|
|
38
|
+
arel (~> 6.0)
|
|
39
|
+
activesupport (4.2.0)
|
|
40
|
+
i18n (~> 0.7)
|
|
32
41
|
json (~> 1.7, >= 1.7.7)
|
|
33
42
|
minitest (~> 5.1)
|
|
34
|
-
thread_safe (~> 0.
|
|
43
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
|
35
44
|
tzinfo (~> 1.1)
|
|
36
|
-
addressable (2.3.
|
|
37
|
-
arel (
|
|
45
|
+
addressable (2.3.7)
|
|
46
|
+
arel (6.0.0)
|
|
38
47
|
builder (3.2.2)
|
|
48
|
+
capybara (2.4.4)
|
|
49
|
+
mime-types (>= 1.16)
|
|
50
|
+
nokogiri (>= 1.3.3)
|
|
51
|
+
rack (>= 1.0.0)
|
|
52
|
+
rack-test (>= 0.5.4)
|
|
53
|
+
xpath (~> 2.0)
|
|
54
|
+
cliver (0.3.2)
|
|
39
55
|
crack (0.4.2)
|
|
40
56
|
safe_yaml (~> 1.0.0)
|
|
57
|
+
cucumber (1.3.19)
|
|
58
|
+
builder (>= 2.1.2)
|
|
59
|
+
diff-lcs (>= 1.1.3)
|
|
60
|
+
gherkin (~> 2.12)
|
|
61
|
+
multi_json (>= 1.7.5, < 2.0)
|
|
62
|
+
multi_test (>= 0.1.2)
|
|
41
63
|
diff-lcs (1.2.5)
|
|
42
64
|
erubis (2.7.0)
|
|
43
|
-
excon (0.
|
|
65
|
+
excon (0.44.2)
|
|
66
|
+
gherkin (2.12.2)
|
|
67
|
+
multi_json (~> 1.3)
|
|
68
|
+
globalid (0.3.3)
|
|
69
|
+
activesupport (>= 4.1.0)
|
|
44
70
|
hike (1.2.3)
|
|
45
|
-
i18n (0.
|
|
46
|
-
json (1.8.
|
|
47
|
-
|
|
71
|
+
i18n (0.7.0)
|
|
72
|
+
json (1.8.2)
|
|
73
|
+
loofah (2.0.1)
|
|
74
|
+
nokogiri (>= 1.5.9)
|
|
75
|
+
mail (2.6.3)
|
|
48
76
|
mime-types (>= 1.16, < 3)
|
|
49
77
|
mime-types (2.4.3)
|
|
50
|
-
|
|
78
|
+
mini_portile (0.6.2)
|
|
79
|
+
minitest (5.5.1)
|
|
51
80
|
multi_json (1.10.1)
|
|
52
|
-
|
|
53
|
-
|
|
81
|
+
multi_test (0.1.2)
|
|
82
|
+
nokogiri (1.6.6.2)
|
|
83
|
+
mini_portile (~> 0.6.0)
|
|
84
|
+
poltergeist (1.6.0)
|
|
85
|
+
capybara (~> 2.1)
|
|
86
|
+
cliver (~> 0.3.1)
|
|
87
|
+
multi_json (~> 1.0)
|
|
88
|
+
websocket-driver (>= 0.2.0)
|
|
89
|
+
rack (1.6.0)
|
|
90
|
+
rack-test (0.6.3)
|
|
54
91
|
rack (>= 1.0)
|
|
55
|
-
rails (4.
|
|
56
|
-
actionmailer (= 4.
|
|
57
|
-
actionpack (= 4.
|
|
58
|
-
actionview (= 4.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
92
|
+
rails (4.2.0)
|
|
93
|
+
actionmailer (= 4.2.0)
|
|
94
|
+
actionpack (= 4.2.0)
|
|
95
|
+
actionview (= 4.2.0)
|
|
96
|
+
activejob (= 4.2.0)
|
|
97
|
+
activemodel (= 4.2.0)
|
|
98
|
+
activerecord (= 4.2.0)
|
|
99
|
+
activesupport (= 4.2.0)
|
|
62
100
|
bundler (>= 1.3.0, < 2.0)
|
|
63
|
-
railties (= 4.
|
|
64
|
-
sprockets-rails
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
101
|
+
railties (= 4.2.0)
|
|
102
|
+
sprockets-rails
|
|
103
|
+
rails-deprecated_sanitizer (1.0.3)
|
|
104
|
+
activesupport (>= 4.2.0.alpha)
|
|
105
|
+
rails-dom-testing (1.0.5)
|
|
106
|
+
activesupport (>= 4.2.0.beta, < 5.0)
|
|
107
|
+
nokogiri (~> 1.6.0)
|
|
108
|
+
rails-deprecated_sanitizer (>= 1.0.1)
|
|
109
|
+
rails-html-sanitizer (1.0.1)
|
|
110
|
+
loofah (~> 2.0)
|
|
111
|
+
railties (4.2.0)
|
|
112
|
+
actionpack (= 4.2.0)
|
|
113
|
+
activesupport (= 4.2.0)
|
|
68
114
|
rake (>= 0.8.7)
|
|
69
115
|
thor (>= 0.18.1, < 2.0)
|
|
70
|
-
rake (10.
|
|
71
|
-
rspec (3.
|
|
72
|
-
rspec-core (~> 3.
|
|
73
|
-
rspec-expectations (~> 3.
|
|
74
|
-
rspec-mocks (~> 3.
|
|
75
|
-
rspec-core (3.
|
|
76
|
-
rspec-support (~> 3.
|
|
77
|
-
rspec-expectations (3.
|
|
116
|
+
rake (10.4.2)
|
|
117
|
+
rspec (3.2.0)
|
|
118
|
+
rspec-core (~> 3.2.0)
|
|
119
|
+
rspec-expectations (~> 3.2.0)
|
|
120
|
+
rspec-mocks (~> 3.2.0)
|
|
121
|
+
rspec-core (3.2.0)
|
|
122
|
+
rspec-support (~> 3.2.0)
|
|
123
|
+
rspec-expectations (3.2.0)
|
|
124
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
125
|
+
rspec-support (~> 3.2.0)
|
|
126
|
+
rspec-mocks (3.2.0)
|
|
78
127
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
79
|
-
rspec-support (~> 3.
|
|
80
|
-
rspec-
|
|
81
|
-
rspec-support (~> 3.1.0)
|
|
82
|
-
rspec-support (3.1.2)
|
|
128
|
+
rspec-support (~> 3.2.0)
|
|
129
|
+
rspec-support (3.2.1)
|
|
83
130
|
safe_yaml (1.0.4)
|
|
84
|
-
sprockets (2.
|
|
131
|
+
sprockets (2.12.3)
|
|
85
132
|
hike (~> 1.2)
|
|
86
133
|
multi_json (~> 1.0)
|
|
87
134
|
rack (~> 1.0)
|
|
88
135
|
tilt (~> 1.1, != 1.3.0)
|
|
89
|
-
sprockets-rails (2.2.
|
|
136
|
+
sprockets-rails (2.2.4)
|
|
90
137
|
actionpack (>= 3.0)
|
|
91
138
|
activesupport (>= 3.0)
|
|
92
139
|
sprockets (>= 2.8, < 4.0)
|
|
@@ -96,14 +143,21 @@ GEM
|
|
|
96
143
|
tzinfo (1.2.2)
|
|
97
144
|
thread_safe (~> 0.1)
|
|
98
145
|
vcr (2.9.3)
|
|
99
|
-
webmock (1.20.
|
|
146
|
+
webmock (1.20.4)
|
|
100
147
|
addressable (>= 2.3.6)
|
|
101
148
|
crack (>= 0.3.2)
|
|
149
|
+
websocket-driver (0.5.2)
|
|
150
|
+
websocket-extensions (>= 0.1.0)
|
|
151
|
+
websocket-extensions (0.1.2)
|
|
152
|
+
xpath (2.0.0)
|
|
153
|
+
nokogiri (~> 1.3)
|
|
102
154
|
|
|
103
155
|
PLATFORMS
|
|
104
156
|
ruby
|
|
105
157
|
|
|
106
158
|
DEPENDENCIES
|
|
159
|
+
cucumber
|
|
160
|
+
poltergeist
|
|
107
161
|
rails
|
|
108
162
|
rspec (>= 2.9.0)
|
|
109
163
|
vcr
|
data/README.md
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
# Veritrans ruby library
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
$ gem install veritrans
|
|
3
|
+
[](http://badge.fury.io/rb/veritrans)
|
|
4
|
+
[](https://travis-ci.org/veritrans/veritrans-ruby)
|
|
6
5
|
|
|
7
6
|
## How to use (Rails)
|
|
8
7
|
|
|
9
|
-
### Add veritrans to Gemfile
|
|
8
|
+
### Add gem veritrans to Gemfile
|
|
10
9
|
|
|
11
10
|
```ruby
|
|
12
11
|
gem 'veritrans'
|
|
@@ -69,6 +68,7 @@ File: "app/views/shared/_veritrans_include.erb"
|
|
|
69
68
|
```
|
|
70
69
|
|
|
71
70
|
Payment form:
|
|
71
|
+
|
|
72
72
|
```html
|
|
73
73
|
<form action="/charge_vtdirect" method="post" id="card_form">
|
|
74
74
|
<input type="hidden" name="token_id" id="card_token">
|
|
@@ -177,7 +177,7 @@ For every transaction success and failed we will send you HTTP POST notification
|
|
|
177
177
|
|
|
178
178
|
First you should set callback url in our dashboard https://my.sandbox.veritrans.co.id/settings/vtweb_configuration
|
|
179
179
|
|
|
180
|
-
|
|
180
|
+
For testing in development phase please read our [Testing webhooks tutorial](https://github.com/Paxa/veritrans-ruby/blob/new_api/testing_webhooks.md) and [command line tool](#command-line-tool)
|
|
181
181
|
|
|
182
182
|
|
|
183
183
|
For rails:
|
|
@@ -188,7 +188,10 @@ match "/payments/receive_webhook" => "payments#receive_webhook", via: [:post]
|
|
|
188
188
|
|
|
189
189
|
# app/controllers/payments_controller.rb
|
|
190
190
|
def receive_webhook
|
|
191
|
-
|
|
191
|
+
post_body = request.body.read
|
|
192
|
+
callback_params = Veritrans.decode_notification_json(post_body)
|
|
193
|
+
|
|
194
|
+
verified_data = Veritrans.status(callback_params['transaction_id'])
|
|
192
195
|
|
|
193
196
|
if verified_data.status_code != 404
|
|
194
197
|
puts "--- Transaction callback ---"
|
|
@@ -206,6 +209,8 @@ def receive_webhook
|
|
|
206
209
|
end
|
|
207
210
|
```
|
|
208
211
|
|
|
212
|
+
----
|
|
213
|
+
|
|
209
214
|
#### Veritrans::Events
|
|
210
215
|
|
|
211
216
|
Other option to handle callbacks is our rack-based handler
|
|
@@ -231,12 +236,12 @@ end
|
|
|
231
236
|
|
|
232
237
|
#### Logging
|
|
233
238
|
|
|
234
|
-
By default gem veritrans will show information via rails' logger. And in addition save important information to `RAILS_APP/
|
|
239
|
+
By default gem veritrans will show information via rails' logger. And in addition save important information to `RAILS_APP/log/veritrans.log`
|
|
235
240
|
|
|
236
241
|
It's configurable.
|
|
237
242
|
|
|
238
243
|
```ruby
|
|
239
|
-
Veritrans.logger =
|
|
244
|
+
Veritrans.logger = Rails.logger
|
|
240
245
|
Veritrans.file_logger = Logger.new("/my/important_logs/veritrans.log")
|
|
241
246
|
```
|
|
242
247
|
|
|
@@ -247,6 +252,22 @@ Veritrans.file_logger = Logger.new("/my/important_logs/veritrans.log")
|
|
|
247
252
|
* Received http notifications
|
|
248
253
|
* Errors and exception while processing http notifications
|
|
249
254
|
|
|
255
|
+
----
|
|
256
|
+
|
|
257
|
+
#### Command line tool
|
|
258
|
+
|
|
259
|
+
**Installation**
|
|
260
|
+
|
|
261
|
+
$ gem install veritrans
|
|
262
|
+
|
|
263
|
+
**Usage**
|
|
264
|
+
|
|
265
|
+
Testing http notification:
|
|
266
|
+
|
|
267
|
+
$ veritrans testhook http://localhost:3000/vt_events
|
|
268
|
+
$ veritrans testhook -o my-order-1 -c ~/path/to/veritrans.yml http://localhost:3000/vt_events
|
|
269
|
+
|
|
270
|
+
|
|
250
271
|
|
|
251
272
|
#### Get help
|
|
252
273
|
|
data/Rakefile
CHANGED
|
@@ -5,3 +5,10 @@ task :default => :spec
|
|
|
5
5
|
desc "Run Specs"
|
|
6
6
|
require 'rspec/core/rake_task'
|
|
7
7
|
RSpec::Core::RakeTask.new(:spec)
|
|
8
|
+
|
|
9
|
+
desc "Generate documentation with sdoc"
|
|
10
|
+
task :doc do
|
|
11
|
+
Bundler.with_clean_env do
|
|
12
|
+
exec %{sdoc -i ./*.md ./lib/*.rb ./lib/veritrans/*.rb -m "Veritrans Ruby Library"}
|
|
13
|
+
end
|
|
14
|
+
end
|
data/api_reference.md
CHANGED
|
@@ -49,7 +49,9 @@ please use our [documentation](http://docs.veritrans.co.id/sandbox/introduction.
|
|
|
49
49
|
</table>
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
<a name="charge"></a>
|
|
53
|
+
|
|
54
|
+
### Charge
|
|
53
55
|
|
|
54
56
|
Actually make transaction. But for vt-web create a redirect url, and for vt-link creates payment page
|
|
55
57
|
|
|
@@ -134,7 +136,8 @@ q.success? # => true
|
|
|
134
136
|
```
|
|
135
137
|
|
|
136
138
|
|
|
137
|
-
|
|
139
|
+
<a name="status"></a>
|
|
140
|
+
### Status
|
|
138
141
|
|
|
139
142
|
Return current status of transaction.
|
|
140
143
|
|
|
@@ -158,7 +161,8 @@ q.data == {
|
|
|
158
161
|
```
|
|
159
162
|
|
|
160
163
|
|
|
161
|
-
|
|
164
|
+
<a name="cancel"></a>
|
|
165
|
+
### Cancel
|
|
162
166
|
|
|
163
167
|
Cancel transaction, before it was settled. For credit card payments you can cancel it before we trigger settlement in bank.
|
|
164
168
|
Usually we do settlement next day after payment happen, about 4pm.
|
|
@@ -185,7 +189,8 @@ q.data == {
|
|
|
185
189
|
```
|
|
186
190
|
|
|
187
191
|
|
|
188
|
-
|
|
192
|
+
<a name="approve"></a>
|
|
193
|
+
### Approve
|
|
189
194
|
|
|
190
195
|
Some transactions marked as challenge. If challenge you can approve it or cancel it. Usual way is to use our dashboard web interface,
|
|
191
196
|
but you also can do it programatically, via API
|
|
@@ -208,8 +213,8 @@ q.data == {
|
|
|
208
213
|
}
|
|
209
214
|
```
|
|
210
215
|
|
|
211
|
-
|
|
212
|
-
###
|
|
216
|
+
<a name="capture"></a>
|
|
217
|
+
### Capture
|
|
213
218
|
|
|
214
219
|
This API method is only for merchants who have pre-authorise feature (can be requested) and have pre-authorise payments.
|
|
215
220
|
|
|
@@ -25,8 +25,8 @@ $(document).ready(function () {
|
|
|
25
25
|
button.val("Processing ...");
|
|
26
26
|
|
|
27
27
|
Veritrans.token(VT_createTokenData, function (data) {
|
|
28
|
-
console.log('Get token response:');
|
|
29
|
-
console.log(data);
|
|
28
|
+
// console.log('Get token response:');
|
|
29
|
+
// console.log(data);
|
|
30
30
|
|
|
31
31
|
// if we get redirect_url then it's 3d-secure transaction
|
|
32
32
|
// so we need to open that page
|
|
@@ -32,14 +32,13 @@ class PaymentsController < ApplicationController
|
|
|
32
32
|
|
|
33
33
|
def receive_webhook
|
|
34
34
|
post_body = request.body.read
|
|
35
|
-
callback_params = Veritrans.decode_notification_json(post_body)
|
|
36
35
|
|
|
37
36
|
Veritrans.file_logger.info("Callback for order: " +
|
|
38
|
-
"#{
|
|
37
|
+
"#{params[:order_id]} #{params[:transaction_status]}\n" +
|
|
39
38
|
post_body + "\n"
|
|
40
39
|
)
|
|
41
40
|
|
|
42
|
-
verified_data = Veritrans.status(
|
|
41
|
+
verified_data = Veritrans.status(params["transaction_id"])
|
|
43
42
|
|
|
44
43
|
if verified_data.status_code != 404
|
|
45
44
|
puts "--- Transaction callback ---"
|
|
@@ -53,7 +52,7 @@ class PaymentsController < ApplicationController
|
|
|
53
52
|
render text: "ok"
|
|
54
53
|
else
|
|
55
54
|
Veritrans.file_logger.info("Callback verification failed for order: " +
|
|
56
|
-
"#{
|
|
55
|
+
"#{params[:order_id]} #{params[:transaction_status]}}\n" +
|
|
57
56
|
verified_data.body + "\n"
|
|
58
57
|
)
|
|
59
58
|
|
data/lib/veritrans.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'veritrans/version'
|
|
2
|
+
require 'veritrans/core_extensions'
|
|
2
3
|
require 'veritrans/config'
|
|
3
4
|
require 'veritrans/client'
|
|
4
5
|
require 'veritrans/api'
|
|
@@ -66,17 +67,8 @@ module Veritrans
|
|
|
66
67
|
Veritrans::Events if defined?(Veritrans::Events)
|
|
67
68
|
end
|
|
68
69
|
|
|
69
|
-
# Note: Veritrans sending notification data as json, encoded twice
|
|
70
|
-
# so we should call JSON.parse twice
|
|
71
70
|
def decode_notification_json(input)
|
|
72
|
-
|
|
73
|
-
# ruby's JSON library can't excpect only hash or array. To decode string I wrap it in array.
|
|
74
|
-
request_data = Veritrans::Client._json_decode('[' + input + ']').first
|
|
75
|
-
return Veritrans::Client._json_decode(request_data)
|
|
76
|
-
else
|
|
77
|
-
# in case we will make it in expected way later
|
|
78
|
-
return Veritrans::Client._json_decode(input)
|
|
79
|
-
end
|
|
71
|
+
return Veritrans::Client._json_decode(input)
|
|
80
72
|
end
|
|
81
73
|
|
|
82
74
|
end
|
data/lib/veritrans/cli.rb
CHANGED
|
@@ -2,17 +2,6 @@ require 'json'
|
|
|
2
2
|
require 'securerandom'
|
|
3
3
|
require 'logger'
|
|
4
4
|
|
|
5
|
-
class Hash
|
|
6
|
-
def except!(*keys)
|
|
7
|
-
keys.each { |key| delete(key) }
|
|
8
|
-
self
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def except(*keys)
|
|
12
|
-
dup.except!(*keys)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
5
|
module Veritrans
|
|
17
6
|
module CLI
|
|
18
7
|
# can't find order
|
|
@@ -134,7 +123,7 @@ module Veritrans
|
|
|
134
123
|
data = data.except(:fraud_status, :masked_card).merge(order_data)
|
|
135
124
|
end
|
|
136
125
|
|
|
137
|
-
JSON.
|
|
126
|
+
JSON.pretty_generate(data)
|
|
138
127
|
end
|
|
139
128
|
|
|
140
129
|
def colorize(str, color_code)
|
data/lib/veritrans/client.rb
CHANGED
|
@@ -70,10 +70,12 @@ module Veritrans
|
|
|
70
70
|
method = method.to_s.upcase
|
|
71
71
|
logger.info "Veritrans: #{method} #{url} #{_json_encode(params)}"
|
|
72
72
|
|
|
73
|
+
default_options = config.http_options || {}
|
|
74
|
+
|
|
73
75
|
# Add authentication and content type
|
|
74
76
|
# Docs http://docs.veritrans.co.id/sandbox/introduction.html
|
|
75
|
-
|
|
76
|
-
:
|
|
77
|
+
request_options = {
|
|
78
|
+
:path => URI.parse(url).path,
|
|
77
79
|
:headers => {
|
|
78
80
|
:Authorization => auth_header || basic_auth_header(config.server_key),
|
|
79
81
|
:Accept => "application/json",
|
|
@@ -83,18 +85,25 @@ module Veritrans
|
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
if method == "GET"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
request_options[:query] = URI.encode_www_form(params)
|
|
89
|
+
else
|
|
90
|
+
request_options[:body] = _json_encode(params)
|
|
88
91
|
end
|
|
89
92
|
|
|
93
|
+
connection_options = {
|
|
94
|
+
read_timeout: 40,
|
|
95
|
+
write_timeout: 40,
|
|
96
|
+
connect_timeout: 40
|
|
97
|
+
}.deep_merge(default_options)
|
|
98
|
+
|
|
90
99
|
s_time = Time.now
|
|
91
|
-
request = Excon.new(url,
|
|
100
|
+
request = Excon.new(url, connection_options)
|
|
92
101
|
|
|
93
|
-
response = request.send(method.downcase.to_sym,
|
|
102
|
+
response = request.send(method.downcase.to_sym, request_options)
|
|
94
103
|
|
|
95
104
|
logger.info "Veritrans: got #{(Time.now - s_time).round(3)} sec #{response.status} #{response.body}"
|
|
96
105
|
|
|
97
|
-
Result.new(response, url,
|
|
106
|
+
Result.new(response, url, request_options, Time.now - s_time)
|
|
98
107
|
|
|
99
108
|
rescue Excon::Errors::SocketError => error
|
|
100
109
|
logger.info "PAPI: socket error, can not connect"
|
data/lib/veritrans/config.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'yaml'
|
|
2
|
+
require 'excon'
|
|
2
3
|
|
|
3
4
|
module Veritrans
|
|
4
5
|
|
|
@@ -7,30 +8,90 @@ module Veritrans
|
|
|
7
8
|
|
|
8
9
|
@api_host = "https://api.sandbox.veritrans.co.id"
|
|
9
10
|
|
|
11
|
+
##
|
|
12
|
+
# Merhcant's Client key, used to make getToken request. (only for VT-Direct)
|
|
13
|
+
#
|
|
14
|
+
# Can be found in merchant portal: Settings -> Access Keys
|
|
15
|
+
#
|
|
16
|
+
def client_key=(value)
|
|
17
|
+
@client_key = value
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
10
21
|
def client_key
|
|
11
22
|
@client_key
|
|
12
23
|
end
|
|
13
24
|
|
|
14
|
-
|
|
15
|
-
|
|
25
|
+
##
|
|
26
|
+
# Merhcant's Server key, used to sign every http API call.
|
|
27
|
+
#
|
|
28
|
+
# Can be found in merchant portal: Settings -> Access Keys
|
|
29
|
+
#
|
|
30
|
+
def server_key=(value)
|
|
31
|
+
@server_key = value
|
|
16
32
|
end
|
|
17
33
|
|
|
18
34
|
def server_key
|
|
19
35
|
@server_key
|
|
20
36
|
end
|
|
21
37
|
|
|
22
|
-
|
|
23
|
-
|
|
38
|
+
##
|
|
39
|
+
# API Server hostname, this allow to switch between production and sandbox
|
|
40
|
+
#
|
|
41
|
+
# Should be "https://api.sandbox.veritrans.co.id" or "https://api.veritrans.co.id"
|
|
42
|
+
#
|
|
43
|
+
# Default is "https://api.sandbox.veritrans.co.id"
|
|
44
|
+
#
|
|
45
|
+
def api_host=(value)
|
|
46
|
+
@api_host = value
|
|
24
47
|
end
|
|
25
48
|
|
|
26
49
|
def api_host
|
|
27
50
|
@api_host
|
|
28
51
|
end
|
|
29
52
|
|
|
30
|
-
|
|
31
|
-
|
|
53
|
+
##
|
|
54
|
+
# This will override http request settings for api calls.
|
|
55
|
+
# http_options should be hash, it will be merged with connection options for every request.
|
|
56
|
+
#
|
|
57
|
+
# Full list of options: https://github.com/excon/excon/blob/master/lib/excon/constants.rb
|
|
58
|
+
#
|
|
59
|
+
# For unsupported key it will raise ArgumentError
|
|
60
|
+
#
|
|
61
|
+
# Veritrans.config.http_options = {tcp_nodelay: true, ssl_version: 'TLSv1'}
|
|
62
|
+
#
|
|
63
|
+
def http_options=(options)
|
|
64
|
+
unless options.is_a?(Hash)
|
|
65
|
+
raise ArgumentError, "http_options should be a hash"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Validate allowed keys
|
|
69
|
+
diff = options.keys.map(&:to_sym) - Excon::VALID_CONNECTION_KEYS
|
|
70
|
+
if diff.size > 0
|
|
71
|
+
raise ArgumentError,
|
|
72
|
+
"http_options contain unsupported keys: #{diff.inspect}\n" +
|
|
73
|
+
"Supported keys are: #{Excon::VALID_CONNECTION_KEYS.inspect}"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
@http_options = options
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def http_options
|
|
80
|
+
@http_options
|
|
32
81
|
end
|
|
33
82
|
|
|
83
|
+
##
|
|
84
|
+
# Loads YAML file and assign config values
|
|
85
|
+
#
|
|
86
|
+
# Supports #section in filename to choose one section.
|
|
87
|
+
# If you are using Rails, it will try to use Rails.env as a section name
|
|
88
|
+
#
|
|
89
|
+
# Available config keys: server_key, client_key, api_host, http_options
|
|
90
|
+
#
|
|
91
|
+
# Veritrans.setup do
|
|
92
|
+
# config.load_yml "#{Rails.root.to_s}/config/veritrans.yml#development"
|
|
93
|
+
# end
|
|
94
|
+
#
|
|
34
95
|
def load_config(filename)
|
|
35
96
|
yml_file, yml_section = filename.to_s.split('#')
|
|
36
97
|
config_data = YAML.load(File.read(yml_file))
|
|
@@ -45,7 +106,11 @@ module Veritrans
|
|
|
45
106
|
alias :load_yml :load_config
|
|
46
107
|
|
|
47
108
|
def inspect
|
|
48
|
-
"<Veritrans::Config
|
|
109
|
+
"<Veritrans::Config " +
|
|
110
|
+
"@api_host=#{@api_host.inspect} " +
|
|
111
|
+
"@server_key=#{@server_key.inspect} " +
|
|
112
|
+
"@client_key=#{@client_key.inspect} " +
|
|
113
|
+
"@http_options=#{@http_options.inspect}>"
|
|
49
114
|
end
|
|
50
115
|
|
|
51
116
|
private
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# This is replacement for Hash#deep_merge in acive_support
|
|
2
|
+
# when acive_support not loaded
|
|
3
|
+
|
|
4
|
+
class Hash #:nodoc:
|
|
5
|
+
|
|
6
|
+
unless method_defined?(:deep_merge)
|
|
7
|
+
def deep_merge(second)
|
|
8
|
+
merger = proc { |key, v1, v2|
|
|
9
|
+
if Hash === v1 && Hash === v2
|
|
10
|
+
v1.merge(v2, &merger)
|
|
11
|
+
else
|
|
12
|
+
[:undefined, nil, :nil].include?(v2) ? v1 : v2
|
|
13
|
+
end
|
|
14
|
+
}
|
|
15
|
+
self.merge(second, &merger)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
unless method_defined?(:except!)
|
|
20
|
+
def except!(*keys)
|
|
21
|
+
keys.each { |key| delete(key) }
|
|
22
|
+
self
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
unless method_defined?(:except)
|
|
27
|
+
def except(*keys)
|
|
28
|
+
dup.except!(*keys)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
data/lib/veritrans/version.rb
CHANGED
data/license.txt
CHANGED
|
File without changes
|
data/spec/cli_spec.rb
CHANGED
|
@@ -15,8 +15,6 @@ describe Veritrans do
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
data = ActiveSupport::JSON.decode(@request.body)
|
|
18
|
-
data.class.should == String
|
|
19
|
-
data = ActiveSupport::JSON.decode(data)
|
|
20
18
|
|
|
21
19
|
data["status_code"].should == "200"
|
|
22
20
|
data["status_message"].should == "Veritrans payment notification"
|
|
@@ -74,8 +72,6 @@ describe Veritrans do
|
|
|
74
72
|
end
|
|
75
73
|
|
|
76
74
|
data = ActiveSupport::JSON.decode(@request.body)
|
|
77
|
-
data.class.should == String
|
|
78
|
-
data = ActiveSupport::JSON.decode(data)
|
|
79
75
|
|
|
80
76
|
data["status_code"].should == "200"
|
|
81
77
|
data["status_message"].should == "Veritrans payment notification"
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'open3'
|
|
3
|
+
require 'shellwords'
|
|
4
|
+
require 'socket'
|
|
5
|
+
|
|
6
|
+
describe "Rails plugin", vcr: false do
|
|
7
|
+
include Capybara::DSL
|
|
8
|
+
|
|
9
|
+
RAILS_VER = "4.1.9"
|
|
10
|
+
APP_DIR = "plugin_test"
|
|
11
|
+
PLUGIN_DIR = File.expand_path("..", File.dirname(__FILE__))
|
|
12
|
+
|
|
13
|
+
before :all do
|
|
14
|
+
FileUtils.mkdir_p("#{PLUGIN_DIR}/tmp")
|
|
15
|
+
#Capybara::Screenshot.instance_variable_set(:@capybara_root, "#{PLUGIN_DIR}/tmp")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def capture_stdout(&block)
|
|
19
|
+
original_stdout = $stdout
|
|
20
|
+
$stdout = fake = StringIO.new
|
|
21
|
+
begin
|
|
22
|
+
yield
|
|
23
|
+
ensure
|
|
24
|
+
$stdout = original_stdout
|
|
25
|
+
end
|
|
26
|
+
fake.string
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def run_cmd(cmd, cli_args = [])
|
|
30
|
+
full_cmd = ([cmd] + cli_args).join.strip
|
|
31
|
+
|
|
32
|
+
stdout_str, stderr_str, status = Open3.capture3(full_cmd)
|
|
33
|
+
|
|
34
|
+
if status != 0
|
|
35
|
+
puts "CMD: #{full_cmd}"
|
|
36
|
+
puts "FAILED"
|
|
37
|
+
puts stderr_str
|
|
38
|
+
|
|
39
|
+
exit 1
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#puts stdout_str
|
|
43
|
+
|
|
44
|
+
return stdout_str
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def install_rails_in_tmp
|
|
48
|
+
@rails_dir = Dir.mktmpdir()
|
|
49
|
+
@app_abs_path = "#{@rails_dir}/#{APP_DIR}"
|
|
50
|
+
|
|
51
|
+
Dir.chdir(@rails_dir) do
|
|
52
|
+
Bundler.with_clean_env do
|
|
53
|
+
ENV["RAILS_ENV"] = "development"
|
|
54
|
+
find_or_install_rails
|
|
55
|
+
generate_rails_app
|
|
56
|
+
generate_plugin_things
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def find_or_install_rails
|
|
62
|
+
response = run_cmd('gem list \^rails\$ -q')
|
|
63
|
+
if response =~ /[^\d]#{RAILS_VER}[^\d]/
|
|
64
|
+
return true
|
|
65
|
+
else
|
|
66
|
+
run_cmd("gem install rails -v #{RAILS_VER} --no-ri --no-rdoc")
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def generate_rails_app
|
|
71
|
+
gen = "rails _#{RAILS_VER}_ new #{APP_DIR} -B -G --skip-spring -d sqlite3 --skip-turbolinks --skip-test-unit --no-rc"
|
|
72
|
+
run_cmd(gen)
|
|
73
|
+
|
|
74
|
+
gemfile_content = "
|
|
75
|
+
source 'https://rubygems.org'
|
|
76
|
+
|
|
77
|
+
gem 'rails', '#{RAILS_VER}'
|
|
78
|
+
gem 'sqlite3'
|
|
79
|
+
gem 'turbolinks'
|
|
80
|
+
gem 'jquery-rails'
|
|
81
|
+
gem 'veritrans', path: '#{PLUGIN_DIR}'
|
|
82
|
+
".gsub(/^\s+/, '')
|
|
83
|
+
|
|
84
|
+
File.open("#{@app_abs_path}/Gemfile", "w") {|f| f.write(gemfile_content) }
|
|
85
|
+
|
|
86
|
+
Dir.chdir(@app_abs_path) do
|
|
87
|
+
run_cmd("bundle")
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def generate_plugin_things
|
|
92
|
+
Dir.chdir(@app_abs_path) do
|
|
93
|
+
run_cmd("rails g veritrans:install")
|
|
94
|
+
run_cmd("rails g veritrans:payment_form")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
config_content = "
|
|
98
|
+
development:
|
|
99
|
+
client_key: VT-client-NArmatJZqzsmTmzR
|
|
100
|
+
server_key: VT-server-9Htb-RxXkg7-7hznSCCjxvoY
|
|
101
|
+
api_host: https://api.sandbox.veritrans.co.id
|
|
102
|
+
"
|
|
103
|
+
|
|
104
|
+
File.open("#{@app_abs_path}/config/veritrans.yml", "w") {|f| f.write(config_content) }
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def run_rails_app
|
|
108
|
+
@rails_port = find_open_port
|
|
109
|
+
|
|
110
|
+
Bundler.with_clean_env do
|
|
111
|
+
ENV["RAILS_ENV"] = "development"
|
|
112
|
+
Dir.chdir(@app_abs_path) do
|
|
113
|
+
run_cmd("./bin/rails server -d -p #{@rails_port} --bind 127.0.0.1")
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
Capybara.app_host = "http://localhost:#{@rails_port}"
|
|
118
|
+
|
|
119
|
+
#puts "RAILS_DIR: #{@app_abs_path}"
|
|
120
|
+
|
|
121
|
+
while true
|
|
122
|
+
begin
|
|
123
|
+
run_cmd("curl #{Capybara.app_host}/payments/new > /dev/null")
|
|
124
|
+
break
|
|
125
|
+
rescue Object => error
|
|
126
|
+
p error
|
|
127
|
+
puts "Retry"
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def stop_rails_app
|
|
133
|
+
Dir.chdir(@app_abs_path) do
|
|
134
|
+
if File.exist?("./tmp/pids/server.pid")
|
|
135
|
+
run_cmd("kill `cat tmp/pids/server.pid`")
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def find_open_port
|
|
141
|
+
socket = Socket.new(:INET, :STREAM, 0)
|
|
142
|
+
socket.bind(Addrinfo.tcp("127.0.0.1", 0))
|
|
143
|
+
return socket.local_address.ip_port
|
|
144
|
+
ensure
|
|
145
|
+
socket.close
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
after do
|
|
149
|
+
stop_rails_app
|
|
150
|
+
FileUtils.remove_entry_secure(@rails_dir) if @rails_dir
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it "should tests plugin" do
|
|
154
|
+
# PREPARE APP
|
|
155
|
+
install_rails_in_tmp
|
|
156
|
+
run_rails_app
|
|
157
|
+
|
|
158
|
+
# CREATE PAYMENT 1
|
|
159
|
+
visit "/payments/new"
|
|
160
|
+
|
|
161
|
+
click_button "Pay via VT-Direct"
|
|
162
|
+
|
|
163
|
+
# Waiting for get token request in javascript...
|
|
164
|
+
Timeout.timeout(30.seconds) do
|
|
165
|
+
loop do
|
|
166
|
+
break if current_path != "/payments/new"
|
|
167
|
+
sleep 0.1
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
Timeout.timeout(10.seconds) do
|
|
172
|
+
loop do
|
|
173
|
+
break if page.body =~ /<body>/
|
|
174
|
+
sleep 0.1
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
if page.body =~ /too many transactions/
|
|
179
|
+
page.should have_content("Merchant has sent too many transactions to the same card number")
|
|
180
|
+
else
|
|
181
|
+
page.should have_content("Success, Credit Card transaction is successful")
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
created_order_id = ActiveSupport::JSON.decode(find("pre").text)["order_id"]
|
|
185
|
+
#Capybara::Screenshot.screenshot_and_open_image
|
|
186
|
+
|
|
187
|
+
# CREATE PAYMENT 2
|
|
188
|
+
visit "/payments/new"
|
|
189
|
+
click_link "Pay via VT-Web"
|
|
190
|
+
|
|
191
|
+
page.should have_content("Payment is securely processed by Veritrans")
|
|
192
|
+
#Capybara::Screenshot.screenshot_and_open_image
|
|
193
|
+
|
|
194
|
+
# TEST CALLBACK FOR WRONG DATA
|
|
195
|
+
stub_const("CONFIG", {})
|
|
196
|
+
result1 = capture_stdout do
|
|
197
|
+
Veritrans::CLI.test_webhook(["#{Capybara.app_host}/payments/receive_webhook"])
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
result1.should =~ /status: 404/
|
|
201
|
+
|
|
202
|
+
# TEST CALLBACK FOR CORRECT DATA
|
|
203
|
+
stub_const("CONFIG", {order: created_order_id, config_path: "#{@app_abs_path}/config/veritrans.yml"})
|
|
204
|
+
result2 = capture_stdout do
|
|
205
|
+
Veritrans::CLI.test_webhook(["#{Capybara.app_host}/payments/receive_webhook"])
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
result2.should =~ /status: 200/
|
|
209
|
+
result2.should =~ /body: ok/
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -10,6 +10,19 @@ require 'rails'
|
|
|
10
10
|
require 'webmock/rspec'
|
|
11
11
|
require 'vcr'
|
|
12
12
|
|
|
13
|
+
require 'capybara/rspec'
|
|
14
|
+
require 'capybara/poltergeist'
|
|
15
|
+
|
|
16
|
+
Capybara.configure do |config|
|
|
17
|
+
config.javascript_driver = :poltergeist
|
|
18
|
+
config.default_driver = :poltergeist
|
|
19
|
+
config.app_host = ""
|
|
20
|
+
config.run_server = false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
GEM_ROOT = File.expand_path("../..", __FILE__)
|
|
24
|
+
ENV['RAILS_ENV'] = 'development'
|
|
25
|
+
|
|
13
26
|
VCR.configure do |c|
|
|
14
27
|
c.cassette_library_dir = 'spec/fixtures'
|
|
15
28
|
c.hook_into :webmock # or :fakeweb
|
|
@@ -26,4 +39,14 @@ RSpec.configure do |config|
|
|
|
26
39
|
config.mock_with :rspec do |c|
|
|
27
40
|
c.syntax = [:should, :expect]
|
|
28
41
|
end
|
|
42
|
+
|
|
43
|
+
config.around(:each) do |example|
|
|
44
|
+
if example.metadata[:vcr] === false
|
|
45
|
+
WebMock.allow_net_connect!
|
|
46
|
+
VCR.turned_off { example.run }
|
|
47
|
+
WebMock.disable_net_connect!
|
|
48
|
+
else
|
|
49
|
+
example.run
|
|
50
|
+
end
|
|
51
|
+
end
|
|
29
52
|
end
|
|
@@ -8,6 +8,38 @@ describe Veritrans do
|
|
|
8
8
|
end
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
+
it "should use Veritrans.http_options", vcr: false do
|
|
12
|
+
Veritrans::Config.stub(:http_options) do
|
|
13
|
+
{ omit_default_port: true }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
api_request = nil
|
|
17
|
+
stub_request(:any, /.*/).to_return(lambda { |request|
|
|
18
|
+
api_request = request
|
|
19
|
+
{body: request.body}
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
result = Veritrans.request_with_logging(:get, Veritrans.config.api_host + "/ping", {})
|
|
23
|
+
|
|
24
|
+
api_request.headers["Host"].should == "api.sandbox.veritrans.co.id"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should use Veritrans.http_options to attach hedaers", vcr: false do
|
|
28
|
+
Veritrans::Config.stub(:http_options) do
|
|
29
|
+
{ headers: { "X-Rspec" => "ok" } }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
api_request = nil
|
|
33
|
+
stub_request(:any, /.*/).to_return(lambda { |request|
|
|
34
|
+
api_request = request
|
|
35
|
+
{body: request.body}
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
result = Veritrans.request_with_logging(:get, Veritrans.config.api_host + "/ping", {})
|
|
39
|
+
|
|
40
|
+
api_request.headers["X-Rspec"].should == "ok"
|
|
41
|
+
end
|
|
42
|
+
|
|
11
43
|
it "should send charge vt-web request" do
|
|
12
44
|
VCR.use_cassette('charge_vtweb') do
|
|
13
45
|
result = Veritrans.charge('vtweb', transaction: { order_id: Time.now.to_s, gross_amount: 100_000 } )
|
|
@@ -45,4 +45,15 @@ describe Veritrans::Config do
|
|
|
45
45
|
data.should == {"client_key" => "test_client_key", "server_key" => "test_server_key"}
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
it "should validate http_params type" do
|
|
49
|
+
expect {
|
|
50
|
+
Veritrans.config.http_options = nil
|
|
51
|
+
}.to raise_error(ArgumentError, "http_options should be a hash")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should validate http_params type" do
|
|
55
|
+
expect {
|
|
56
|
+
Veritrans.config.http_options = {foo: "bar", tcp_nodelay: true}
|
|
57
|
+
}.to raise_error(ArgumentError, /http_options contain unsupported keys: \[:foo\]/)
|
|
58
|
+
end
|
|
59
|
+
end
|
data/veritrans.gemspec
CHANGED
|
@@ -20,4 +20,7 @@ Gem::Specification.new do |s|
|
|
|
20
20
|
s.add_development_dependency "rspec", ">= 2.9.0"
|
|
21
21
|
s.add_development_dependency "rails"
|
|
22
22
|
s.add_development_dependency 'webmock'
|
|
23
|
+
s.add_development_dependency 'vcr'
|
|
24
|
+
s.add_development_dependency 'cucumber'
|
|
25
|
+
s.add_development_dependency "poltergeist"
|
|
23
26
|
end
|
metadata
CHANGED
|
@@ -1,69 +1,111 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: veritrans
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Veritrans Dev Team
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2015-02-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: excon
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - ~>
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: '0.20'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - ~>
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '0.20'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rspec
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: 2.9.0
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: 2.9.0
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rails
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - ">="
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
47
|
version: '0'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- -
|
|
52
|
+
- - ">="
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: webmock
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
|
-
- -
|
|
59
|
+
- - ">="
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
61
|
version: '0'
|
|
62
62
|
type: :development
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
|
-
- -
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: vcr
|
|
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: cucumber
|
|
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: poltergeist
|
|
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
|
+
- - ">="
|
|
67
109
|
- !ruby/object:Gem::Version
|
|
68
110
|
version: '0'
|
|
69
111
|
description:
|
|
@@ -74,8 +116,10 @@ executables:
|
|
|
74
116
|
extensions: []
|
|
75
117
|
extra_rdoc_files: []
|
|
76
118
|
files:
|
|
77
|
-
- .gitignore
|
|
78
|
-
- .rspec
|
|
119
|
+
- ".gitignore"
|
|
120
|
+
- ".rspec"
|
|
121
|
+
- ".travis.yml"
|
|
122
|
+
- CHANGELOG.md
|
|
79
123
|
- Gemfile
|
|
80
124
|
- Gemfile.lock
|
|
81
125
|
- README.md
|
|
@@ -102,6 +146,7 @@ files:
|
|
|
102
146
|
- lib/veritrans/cli.rb
|
|
103
147
|
- lib/veritrans/client.rb
|
|
104
148
|
- lib/veritrans/config.rb
|
|
149
|
+
- lib/veritrans/core_extensions.rb
|
|
105
150
|
- lib/veritrans/events.rb
|
|
106
151
|
- lib/veritrans/result.rb
|
|
107
152
|
- lib/veritrans/version.rb
|
|
@@ -123,6 +168,7 @@ files:
|
|
|
123
168
|
- spec/fixtures/events_test_real_txn.yml
|
|
124
169
|
- spec/fixtures/status_fail.yml
|
|
125
170
|
- spec/fixtures/status_success.yml
|
|
171
|
+
- spec/rails_plugin_spec.rb
|
|
126
172
|
- spec/spec_helper.rb
|
|
127
173
|
- spec/veritrans_client_spec.rb
|
|
128
174
|
- spec/veritrans_config_spec.rb
|
|
@@ -139,18 +185,19 @@ require_paths:
|
|
|
139
185
|
- lib
|
|
140
186
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
187
|
requirements:
|
|
142
|
-
- -
|
|
188
|
+
- - ">="
|
|
143
189
|
- !ruby/object:Gem::Version
|
|
144
190
|
version: '0'
|
|
145
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
192
|
requirements:
|
|
147
|
-
- -
|
|
193
|
+
- - ">="
|
|
148
194
|
- !ruby/object:Gem::Version
|
|
149
195
|
version: '0'
|
|
150
196
|
requirements: []
|
|
151
197
|
rubyforge_project:
|
|
152
|
-
rubygems_version: 2.
|
|
198
|
+
rubygems_version: 2.4.4
|
|
153
199
|
signing_key:
|
|
154
200
|
specification_version: 4
|
|
155
201
|
summary: Veritrans ruby library
|
|
156
202
|
test_files: []
|
|
203
|
+
has_rdoc:
|