gopay 0.1.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.
- data/.gitignore +6 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/README.textile +104 -0
- data/Rakefile +17 -0
- data/config/config.yml +24 -0
- data/config/country_codes.yml +240 -0
- data/gopay.gemspec +24 -0
- data/init.rb +1 -0
- data/lib/gopay.rb +15 -0
- data/lib/gopay/config.rb +62 -0
- data/lib/gopay/crypt.rb +37 -0
- data/lib/gopay/models/base_payment.rb +177 -0
- data/lib/gopay/models/payment_method.rb +25 -0
- data/lib/gopay/railtie.rb +7 -0
- data/lib/gopay/version.rb +3 -0
- data/test/config_test.rb +15 -0
- data/test/crypt_test.rb +31 -0
- data/test/models_test.rb +63 -0
- data/test/test.example.yml +7 -0
- data/test/test_helper.rb +16 -0
- metadata +131 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use gopay
|
data/Gemfile
ADDED
data/README.textile
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
h1. About GoPay
|
2
|
+
|
3
|
+
GoPay is a library making it easy to access "GoPay.cz":http://www.gopay.cz paygate from Ruby.
|
4
|
+
|
5
|
+
h2. Quick Start
|
6
|
+
|
7
|
+
GoPay is distributed primarily via gem, but it can be also placed to "vendor/plugins" as a Rails plugin.
|
8
|
+
|
9
|
+
h2. Configuration
|
10
|
+
|
11
|
+
First, you have to include it in your Gemfile or install manually and require:
|
12
|
+
|
13
|
+
<pre>
|
14
|
+
|
15
|
+
# Gemfile
|
16
|
+
gem 'gopay'
|
17
|
+
|
18
|
+
# Manually
|
19
|
+
gem install gopay
|
20
|
+
require 'gopay'
|
21
|
+
|
22
|
+
</pre>
|
23
|
+
|
24
|
+
GoPay can be configured within a config block (placed in config/initializers/gopay.rb for Rails, for instance):
|
25
|
+
|
26
|
+
<pre>
|
27
|
+
|
28
|
+
GoPay.configure do |config|
|
29
|
+
config.environment = :test
|
30
|
+
config.goid = "XXXXX"
|
31
|
+
config.secret = "XXXXX"
|
32
|
+
config.success_url = "http://example.com/success"
|
33
|
+
config.failed_url = "http://example.com/failed"
|
34
|
+
end
|
35
|
+
|
36
|
+
</pre>
|
37
|
+
|
38
|
+
It can also take a YAML file with configuration:
|
39
|
+
|
40
|
+
<pre>
|
41
|
+
|
42
|
+
# YAML file (config.yml):
|
43
|
+
goid: XXXXX
|
44
|
+
secret: XXXXX
|
45
|
+
success_url: http://www.success_url.cz
|
46
|
+
failed_url: http://www.failed_url.cz
|
47
|
+
|
48
|
+
|
49
|
+
# Ruby:
|
50
|
+
GoPay.configure_from_yaml("config.yml"))
|
51
|
+
|
52
|
+
</pre>
|
53
|
+
|
54
|
+
Such YAML config file can be also placed in Rails config dir (named gopay.yml) - it will be autoloaded.
|
55
|
+
|
56
|
+
h2. Usage
|
57
|
+
|
58
|
+
<pre>
|
59
|
+
# first you have to init a payment
|
60
|
+
payment = GoPay::EshopPayment.new(:variable_symbol => "gopay_test_#{GoPay.configuration.goid}",
|
61
|
+
:total_price_in_cents => 100,
|
62
|
+
:product_name => "productName",
|
63
|
+
:payment_channel => "cz_gp_w"
|
64
|
+
)
|
65
|
+
# and request its creation on paygate:
|
66
|
+
payment.create # =>
|
67
|
+
# #<GoPay::EshopPayment:0x7fa27c0fab88
|
68
|
+
# @last_response=
|
69
|
+
# {:"@xmlns:ns1"=>"urn:AxisEPaymentProvider",
|
70
|
+
# :total_price=>"100",
|
71
|
+
# :variable_symbol=>"gopay_test_8531903182",
|
72
|
+
# :result=>"CALL_COMPLETED",
|
73
|
+
# :payment_channel=>
|
74
|
+
# {:"@xsi:type"=>"soapenc:string",
|
75
|
+
# :"@xmlns:soapenc"=>"http://schemas.xmlsoap.org/soap/encoding/"},
|
76
|
+
# :eshop_go_id=>"8531903182",
|
77
|
+
# :session_state=>"WAITING",
|
78
|
+
# :"@xsi:type"=>"ns1:EPaymentStatus",
|
79
|
+
# :buyer_go_id=>
|
80
|
+
# {:"@xsi:type"=>"soapenc:long",
|
81
|
+
# :"@xmlns:soapenc"=>"http://schemas.xmlsoap.org/soap/encoding/"},
|
82
|
+
# :product_name=>"productName",
|
83
|
+
# :payment_session_id=>"3000523838",
|
84
|
+
# :result_description=>"WAITING",
|
85
|
+
# :url=>"http://www.failed_url.cz",
|
86
|
+
# :encrypted_signature=>
|
87
|
+
# "b653c3b55e981abb29ff9a6b25eb1153abb4d5e888b4675594b636456146c189fba2f81e6303dfa3a5b661f6d58385a0"},
|
88
|
+
# @payment_channel="cz_gp_w",
|
89
|
+
# @payment_session_id="3000523838",
|
90
|
+
# @product_name="productName",
|
91
|
+
# @total_price_in_cents=100,
|
92
|
+
|
93
|
+
# After user gets back to success/failed url, you can check status of payment:
|
94
|
+
payment = GoPay::EshopPayment.new(:variable_symbol => "XXXXX",
|
95
|
+
:total_price_in_cents => price.to_i,
|
96
|
+
:product_name => name,
|
97
|
+
:payment_session_id => payment_session_id,
|
98
|
+
:payment_channels => ["cz_gp_w"])
|
99
|
+
|
100
|
+
payment.actual_session_state # => "PAYMENT_DONE"
|
101
|
+
payment.is_in_state?(GoPay::PAYMENT_DONE) # => true
|
102
|
+
|
103
|
+
</pre>
|
104
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
Rake::TestTask.new(:test) do |t|
|
6
|
+
t.pattern = 'test/*_test.rb'
|
7
|
+
t.ruby_opts << '-I test'
|
8
|
+
t.verbose = true
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
desc "Uninstall, build and install again"
|
13
|
+
task :install_gopay do
|
14
|
+
sh "gem uninstall gopay"
|
15
|
+
sh "gem build gopay.gemspec"
|
16
|
+
sh "gem install gopay"
|
17
|
+
end
|
data/config/config.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
urls:
|
2
|
+
test:
|
3
|
+
full_integration: https://testgw.gopay.cz/gw/pay-full-v2
|
4
|
+
wsdl: https://testgw.gopay.cz/axis/EPaymentServiceV2?wsdl
|
5
|
+
base_integration: https://testgw.gopay.cz/gw/pay-base-v2
|
6
|
+
get_account_statement_url: https://testgw.gopay.cz/gw/services/get-account-statement
|
7
|
+
production:
|
8
|
+
full_integration: https://gate.gopay.cz/gw/pay-full-v2
|
9
|
+
wsdl: https://gate.gopay.cz/axis/EPaymentServiceV2?wsdl
|
10
|
+
base_integration: https://gate.gopay.cz/gw/pay-base-v2
|
11
|
+
get_account_statement_url: https://gate.gopay.cz/gw/services/get-account-statement
|
12
|
+
messages:
|
13
|
+
payment_done: Platba byla úspěšně provedena.<br>Děkujeme Vám za využití našich služeb.
|
14
|
+
canceled: Platba byla zrušena.<br>Opakujte platbu znovu, prosím.
|
15
|
+
timeouted: Platba byla zrušena.<br>Opakujte platbu znovu, prosím.
|
16
|
+
waiting: Platba zatím nebyla provedena. O provedení platby Vás budeme neprodleně informovat pomocí emailu s potvrzením platby. Pokud neobdržíte do následujícího pracovního dne potvrzovací email o platbě, kontaktujte podporu GoPay na emailu podpora@gopay.cz.
|
17
|
+
waiting_offline: Platba zatím nebyla provedena. Na platební bráně GoPay jste získali platební údaje a na Váš email Vám byly zaslány informace k provedení platby. O provedení platby Vás budeme budeme neprodleně informovat pomocí emailu s potvrzením platby.
|
18
|
+
failed: V průběhu platby nastala chyba. Kontaktujte podporu GoPay na emailu podpora@gopay.cz.
|
19
|
+
icons:
|
20
|
+
fast_payment: https://www.gopay.cz/download/PT_rychloplatba.png
|
21
|
+
gift: https://www.gopay.cz/download/PT_daruj.png
|
22
|
+
buynow: https://www.gopay.cz/download/PT_buynow.png
|
23
|
+
donate: https://www.gopay.cz/download/PT_donate.png
|
24
|
+
|
@@ -0,0 +1,240 @@
|
|
1
|
+
CZE: Česká Republika
|
2
|
+
AFG: Afghánistán
|
3
|
+
ALA: Alandské ostrovy
|
4
|
+
ALA: Albánie
|
5
|
+
ALG: Alžírsko
|
6
|
+
AME: Americká Samoa
|
7
|
+
US_: Americké Virginské Ostrovy
|
8
|
+
AGL: Angola
|
9
|
+
ANG: Anguila
|
10
|
+
ATA: Antarktida
|
11
|
+
ANT: Antigua
|
12
|
+
ARG: Argentina
|
13
|
+
ARM: Arménie
|
14
|
+
ARU: Aruba
|
15
|
+
AUS: Austrálie
|
16
|
+
BMS: Bahamy
|
17
|
+
BAH: Bahrajn
|
18
|
+
BAN: Bangladeš
|
19
|
+
BAR: Barbados
|
20
|
+
MYA: Barma
|
21
|
+
BGM: Belgie
|
22
|
+
BEL: Belize
|
23
|
+
BEN: Benin
|
24
|
+
BER: Bermudy
|
25
|
+
BTN: Bhútán
|
26
|
+
BOL: Bolívie
|
27
|
+
BOS: Bosna a hercegovina
|
28
|
+
BOT: Botswana
|
29
|
+
BRA: Brasilia
|
30
|
+
BRI: Britské Virginské Ostrovy
|
31
|
+
BRU: Brunej
|
32
|
+
BUL: Bulharsko
|
33
|
+
BKF: Burkina Faso
|
34
|
+
BUR: Burundi
|
35
|
+
BLR: Bělorusko
|
36
|
+
COT: Břeh slonoviny
|
37
|
+
CHL: Chile
|
38
|
+
CRO: Chorvatsko
|
39
|
+
COO: Cookovy ostrovy
|
40
|
+
DOM: Dominika
|
41
|
+
DRP: Dominikánská Republika
|
42
|
+
DEN: Dánsko
|
43
|
+
DJI: Džibutsko
|
44
|
+
EGY: Egypt
|
45
|
+
ECU: Ekvádor
|
46
|
+
ERI: Eritrea
|
47
|
+
EST: Estonsko
|
48
|
+
ETH: Etiopie
|
49
|
+
FAR: Faerské ostrovy
|
50
|
+
FLK: Falklandy
|
51
|
+
FIJ: Fidži
|
52
|
+
PHI: Filipíny
|
53
|
+
FIN: Finsko
|
54
|
+
FRA: Francie
|
55
|
+
FRE: Francouzká Guayana
|
56
|
+
PYF: Francouzká Polynezie
|
57
|
+
GAB: Gabon
|
58
|
+
GAM: Gambie
|
59
|
+
GHA: Ghana
|
60
|
+
GIB: Gibraltar
|
61
|
+
GRE: Grenada
|
62
|
+
GEO: Gruzia
|
63
|
+
GRL: Grónsko
|
64
|
+
GDL: Guadeloupe
|
65
|
+
GUM: Guam
|
66
|
+
GUA: Guatemala
|
67
|
+
GUY: Guayana
|
68
|
+
GGY: Guernsey
|
69
|
+
GUI: Guinea
|
70
|
+
GBS: Guinea-Bissau
|
71
|
+
HAI: Haiti
|
72
|
+
NED: Holandsko
|
73
|
+
HON: Honduras
|
74
|
+
HKG: Hongkong
|
75
|
+
IND: Indie
|
76
|
+
IDS: Indonésie
|
77
|
+
IRE: Irsko
|
78
|
+
IRA: Irák
|
79
|
+
ICE: Island
|
80
|
+
ITA: Itálie
|
81
|
+
ISR: Izrael
|
82
|
+
JAM: Jamajka
|
83
|
+
JAP: Japonsko
|
84
|
+
YEM: Jemen
|
85
|
+
JEY: Jersey
|
86
|
+
SOU: Jižní Afrika
|
87
|
+
SGS: Jižní Georgie a Jižní Sandwichovy ostrovy
|
88
|
+
SKO: Jižní Korea
|
89
|
+
ATF: Jižní francouzské teritorie
|
90
|
+
JOR: Jordánsko
|
91
|
+
CAY: Kajmanské ostrovy
|
92
|
+
CAM: Kambodža
|
93
|
+
CMR: Kamerun
|
94
|
+
CAN: Kanada
|
95
|
+
CAP: Kapverdské ostrovy
|
96
|
+
QAT: Katar
|
97
|
+
KAZ: Kazachstán
|
98
|
+
KEN: Keňa
|
99
|
+
KIR: Kiribati
|
100
|
+
CCK: Kokosové ostrovy
|
101
|
+
COL: Kolumbie
|
102
|
+
COM: Komorské ostrovy
|
103
|
+
CON: Kongo
|
104
|
+
COD: Konžská Demokratická Republika
|
105
|
+
COS: Kostarika
|
106
|
+
CUB: Kuba
|
107
|
+
KUW: Kuvajt
|
108
|
+
CYP: Kypr
|
109
|
+
KYR: Kyrgystán
|
110
|
+
LAO: Laos
|
111
|
+
LES: Lesotho
|
112
|
+
LEB: Libanon
|
113
|
+
LBY: Libye
|
114
|
+
LIB: Libérie
|
115
|
+
LIE: Lichtenštejnsko
|
116
|
+
LIT: Litva
|
117
|
+
LAT: Lotyšsko
|
118
|
+
LUX: Lucenbursko
|
119
|
+
MAC: Macao
|
120
|
+
MAD: Madagaskar
|
121
|
+
MKD: Makedonie = " FYROM
|
122
|
+
MLW: Malawi
|
123
|
+
MAL: Maledivy
|
124
|
+
MLI: Mali
|
125
|
+
MLS: Malijsie
|
126
|
+
MLT: Malta
|
127
|
+
MOR: Maroko
|
128
|
+
MHL: Marshallovy ostrovy
|
129
|
+
MAR: Martinik
|
130
|
+
MRT: Mauretánie
|
131
|
+
MAU: Mauricius
|
132
|
+
MYT: Mayotte
|
133
|
+
HUN: Maďarsko
|
134
|
+
UMI: Menší odlehlé ostrovy Spojených států
|
135
|
+
MEX: Mexico
|
136
|
+
FSM: Mikronésie
|
137
|
+
MOL: Moldavsko
|
138
|
+
MCO: Monako
|
139
|
+
MON: Mongolsko
|
140
|
+
MTT: Monserat
|
141
|
+
MOZ: Mosambik
|
142
|
+
NAM: Namibie
|
143
|
+
NEP: Nepál
|
144
|
+
NIG: Niger
|
145
|
+
NGR: Nigérie
|
146
|
+
NIC: Nikaragua
|
147
|
+
NIU: Niue
|
148
|
+
NET: Nizozemské Antily
|
149
|
+
NWY: Norsko
|
150
|
+
CDN: Nová Kaledonie
|
151
|
+
GER: Německo
|
152
|
+
OMA: Omán
|
153
|
+
BVT: Ostrov Bouvet
|
154
|
+
HMD: Ostrov Heard a McDonaldovy ostrovy
|
155
|
+
IMN: Ostrov Man
|
156
|
+
NFK: Ostrov Norfolk
|
157
|
+
SJM: Ostrov Svalbard a Jan Mayen
|
158
|
+
TCI: Ostrovy Turks a Caicos
|
159
|
+
PLW: Palauská republika
|
160
|
+
PSE: Palestinian territory
|
161
|
+
PAN: Panama
|
162
|
+
PAP: Papua-Nová Guinea
|
163
|
+
PAR: Paraguay
|
164
|
+
PER: Peru
|
165
|
+
PCN: Pitcairnovy ostrovy
|
166
|
+
POL: Polsko
|
167
|
+
PUE: Portoriko
|
168
|
+
POR: Portugalsko
|
169
|
+
PAK: Pákistán
|
170
|
+
AUT: Rakousko
|
171
|
+
MNE: Republika Černá hora
|
172
|
+
REU: Reunion
|
173
|
+
EQU: Rovníková Guinea
|
174
|
+
ROM: Rumunsko
|
175
|
+
RUS: Rusko
|
176
|
+
RWA: Rwanda
|
177
|
+
EL_: Salvador
|
178
|
+
SAN: San Marino
|
179
|
+
SAU: Saúdiská Arábie
|
180
|
+
SEN: Senegal
|
181
|
+
KOR: Severní Korea
|
182
|
+
SEY: Seychely
|
183
|
+
SIE: Sierra Leone
|
184
|
+
SIN: Singapur
|
185
|
+
SLO: Slovensko
|
186
|
+
SLV: Slovinsko
|
187
|
+
SOM: Somálsko
|
188
|
+
UAE: Spojené Arabské Emiráty
|
189
|
+
UNI: Spojené státy americké
|
190
|
+
MNP: Společenství Severních Marian
|
191
|
+
YUG: Srbská republika
|
192
|
+
SRI: Srí Lanka
|
193
|
+
CEN: Středoafrická Republika
|
194
|
+
SUR: Surinam
|
195
|
+
SHN: Svatá Helena
|
196
|
+
SLU: Svatá Lucie
|
197
|
+
SKN: Svatý Krištof a Nevis
|
198
|
+
SAO: Svatý Tomáš a Princův ostrov
|
199
|
+
ST: Svatý Vincenc a Grenadiny
|
200
|
+
SWA: Svazijsko
|
201
|
+
SUD: Súdán
|
202
|
+
SYR: Sýrie
|
203
|
+
TAN: Tanzanie
|
204
|
+
WLF: Teritorium ostrovů Wallisa a Futuna
|
205
|
+
SPM: Teritoriální společenství Saint-Pierre a Miquelon
|
206
|
+
TWN: Thaj-wan
|
207
|
+
THA: Thajsko
|
208
|
+
TLS: Timor-Leste
|
209
|
+
TOG: Togo
|
210
|
+
TKL: Tokelau
|
211
|
+
TON: Tonga
|
212
|
+
TRI: Trinidad a Tobago
|
213
|
+
TUN: Tunisko
|
214
|
+
TUR: Turecko
|
215
|
+
TKM: Turkmenistán
|
216
|
+
TUV: Tuvalu
|
217
|
+
TAJ: Tádžikistán
|
218
|
+
UGA: Uganda
|
219
|
+
UKR: Ukrajina
|
220
|
+
URU: Uruguay
|
221
|
+
UZB: Uzbekistán
|
222
|
+
VAN: Vanuatu
|
223
|
+
VAT: Vatikán – Svatá stolice
|
224
|
+
GBR: Velká Británie
|
225
|
+
VEN: Venezuela
|
226
|
+
VIE: Vietnam
|
227
|
+
CXR: Vánoční ostrovy
|
228
|
+
ZAM: Zambie
|
229
|
+
ZIM: Zimbabwe
|
230
|
+
ESH: Západní Sahara
|
231
|
+
WES: Západní Samoa
|
232
|
+
AZE: Ázerbádžán
|
233
|
+
IRN: Írán
|
234
|
+
CHA: Čad
|
235
|
+
CHN: Čína
|
236
|
+
GRC: Řecko
|
237
|
+
SOL: Šalomounovy ostrovy
|
238
|
+
SPA: Španělsko
|
239
|
+
SWE: Švédsko
|
240
|
+
SWI: Švýcarsko
|
data/gopay.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "gopay/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "gopay"
|
7
|
+
s.version = GoPay::VERSION
|
8
|
+
s.authors = ["papricek"]
|
9
|
+
s.email = ["patrikjira@gmail.com"]
|
10
|
+
s.homepage = "http://gopay.defactory.net"
|
11
|
+
s.summary = "A little gem making integration of GoPay easy"
|
12
|
+
s.description = "GoPay is a library making it easy to access GoPay http://www.gopay.cz paygate from Ruby. It offers some basic wrapper around soap calls in the form of AR-like models. Its autoconfigurable from Rails."
|
13
|
+
|
14
|
+
s.rubyforge_project = "gopay"
|
15
|
+
|
16
|
+
s.add_dependency("savon")
|
17
|
+
s.add_development_dependency("shoulda")
|
18
|
+
s.add_development_dependency("mocha")
|
19
|
+
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
|
22
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
end
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "gopay"
|
data/lib/gopay.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "pp"
|
2
|
+
|
3
|
+
require "gopay/config"
|
4
|
+
require "gopay/crypt"
|
5
|
+
|
6
|
+
require "gopay/models/payment"
|
7
|
+
require "gopay/models/eshop_payment"
|
8
|
+
require "gopay/models/customer_eshop_payment"
|
9
|
+
require "gopay/models/buyer_payment"
|
10
|
+
require "gopay/models/payment_identity"
|
11
|
+
require "gopay/models/payment_method"
|
12
|
+
|
13
|
+
require "gopay/models/base_payment"
|
14
|
+
|
15
|
+
require "gopay/railtie" if defined?(::Rails) && ::Rails::VERSION::MAJOR >= 3
|
data/lib/gopay/config.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module GoPay
|
4
|
+
|
5
|
+
BASE_PATH = File.expand_path("../../../", __FILE__)
|
6
|
+
STATUSES = {:created => "CREATED", :payment_method_chosen => "PAYMENT_METHOD_CHOSEN",
|
7
|
+
:paid => "PAID", :authorized => "AUTHORIZED",
|
8
|
+
:canceled => "CANCELED", :timeouted => "TIMEOUTED",
|
9
|
+
:refunded => "REFUNDED", :failed => "FAILED",
|
10
|
+
:call_completed => "CALL_COMPLETED", :call_failed => "CALL_FAILED",
|
11
|
+
:unknown => "UNKNOWN"}
|
12
|
+
|
13
|
+
def self.configure
|
14
|
+
yield configuration
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.configuration
|
18
|
+
@configuration ||= Configuration.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.configure_from_yaml(path)
|
22
|
+
yaml = YAML.load_file(path)
|
23
|
+
return unless yaml
|
24
|
+
configuration.goid = yaml["goid"]
|
25
|
+
configuration.success_url = yaml["success_url"]
|
26
|
+
configuration.failed_url = yaml["failed_url"]
|
27
|
+
configuration.secure_key = yaml["secure_key"]
|
28
|
+
return configuration
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.configure_from_rails
|
32
|
+
path = ::Rails.root.join("config", "gopay.yml")
|
33
|
+
configure_from_yaml(path) if File.exists?(path)
|
34
|
+
env = if defined?(::Rails) && ::Rails.respond_to?(:env)
|
35
|
+
::Rails.env.to_sym
|
36
|
+
elsif defined?(::RAILS_ENV)
|
37
|
+
::RAILS_ENV.to_sym
|
38
|
+
end
|
39
|
+
configuration.environment ||= (env == :development) ? :test : env
|
40
|
+
warn "GoPay wasnt properly configured." if GoPay.configuration.goid.blank?
|
41
|
+
configuration
|
42
|
+
end
|
43
|
+
|
44
|
+
class Configuration
|
45
|
+
attr_accessor :environment, :goid, :success_url, :failed_url, :secure_key
|
46
|
+
attr_reader :country_codes, :messages
|
47
|
+
|
48
|
+
def initialize
|
49
|
+
@country_codes = YAML.load_file File.join(BASE_PATH, "config", "country_codes.yml")
|
50
|
+
config = YAML.load_file(File.join(BASE_PATH, "config", "config.yml"))
|
51
|
+
@urls = config["urls"]
|
52
|
+
@messages = config["messages"]
|
53
|
+
end
|
54
|
+
|
55
|
+
def urls
|
56
|
+
env = @environment.nil? ? "test" : @environment.to_s
|
57
|
+
@urls[env]
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/lib/gopay/crypt.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require "digest/sha1"
|
2
|
+
require "openssl"
|
3
|
+
|
4
|
+
module GoPay
|
5
|
+
|
6
|
+
module Crypt
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def sha1(string)
|
10
|
+
Digest::SHA1.hexdigest(string)
|
11
|
+
end
|
12
|
+
|
13
|
+
def encrypt(string)
|
14
|
+
string = sha1(string)
|
15
|
+
des = OpenSSL::Cipher::Cipher.new("des-ede3")
|
16
|
+
des.encrypt
|
17
|
+
des.key = GoPay.configuration.secure_key
|
18
|
+
result = des.update(string)
|
19
|
+
result.unpack("H*").to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def decrypt(encrypted_data, padding_off = false)
|
23
|
+
encrypted_data = bin2hex(encrypted_data)
|
24
|
+
des = OpenSSL::Cipher::Cipher.new("des-ede3")
|
25
|
+
des.decrypt
|
26
|
+
des.padding = 0 if padding_off
|
27
|
+
des.key = GoPay.configuration.secure_key
|
28
|
+
result = ""
|
29
|
+
result << des.update(encrypted_data)
|
30
|
+
end
|
31
|
+
|
32
|
+
def bin2hex(bin)
|
33
|
+
bin.scan(/../).map { | tuple | tuple.hex.chr }.to_s
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require "savon"
|
2
|
+
|
3
|
+
Savon.configure { |config| config.log = false }
|
4
|
+
|
5
|
+
module GoPay
|
6
|
+
|
7
|
+
class BasePayment
|
8
|
+
|
9
|
+
def initialize(attributes = {})
|
10
|
+
attributes.each do |key, value|
|
11
|
+
instance_variable_set(:"@#{key}", value) if self.respond_to?(key)
|
12
|
+
end
|
13
|
+
@target_goid ||= GoPay.configuration.goid.to_s
|
14
|
+
@secure_key ||= GoPay.configuration.secure_key.to_s
|
15
|
+
@payment_channels ||= []
|
16
|
+
@payment_channels = @payment_channels.join(',')
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :target_goid, :product_name, :total_price_in_cents, :currency,
|
20
|
+
:order_number, :payment_channels, :default_payment_channel, :secure_key,
|
21
|
+
:first_name, :last_name, :city, :street, :postal_code, :country_code,
|
22
|
+
:email, :phone_number, :p1, :p2, :p3, :p4, :lang,
|
23
|
+
:session_state
|
24
|
+
|
25
|
+
attr_accessor :payment_session_id, :response
|
26
|
+
|
27
|
+
def create
|
28
|
+
client = Savon::Client.new GoPay.configuration.urls["wsdl"]
|
29
|
+
soap_response = client.request "createPayment" do |soap|
|
30
|
+
soap.body = {"paymentCommand" => payment_command_hash}
|
31
|
+
end
|
32
|
+
self.response = soap_response.to_hash[:create_payment_response][:create_payment_return]
|
33
|
+
self.payment_session_id = response[:payment_session_id]
|
34
|
+
valid_response?(response, GoPay::STATUSES[:created])
|
35
|
+
end
|
36
|
+
|
37
|
+
def load(validated_status = nil)
|
38
|
+
client = Savon::Client.new GoPay.configuration.urls["wsdl"]
|
39
|
+
soap_response = client.request "paymentStatus" do |soap|
|
40
|
+
soap.body = {"paymentSessionInfo" => payment_session_hash}
|
41
|
+
end
|
42
|
+
self.response = soap_response.to_hash[:payment_status_response][:payment_status_return]
|
43
|
+
valid_payment_session?(response, validated_status)
|
44
|
+
end
|
45
|
+
|
46
|
+
def is_in_status?(status)
|
47
|
+
load(status)
|
48
|
+
end
|
49
|
+
|
50
|
+
def payment_command_hash
|
51
|
+
{"targetGoId" => target_goid.to_i,
|
52
|
+
"productName" => product_name,
|
53
|
+
"totalPrice" => total_price_in_cents,
|
54
|
+
"currency" => currency,
|
55
|
+
"orderNumber" => order_number,
|
56
|
+
"successURL" => GoPay.configuration.success_url,
|
57
|
+
"failedURL" => GoPay.configuration.failed_url,
|
58
|
+
"preAuthorization" => false,
|
59
|
+
"defaultPaymentChannel" => default_payment_channel,
|
60
|
+
"recurrentPayment" => false,
|
61
|
+
"encryptedSignature" => GoPay::Crypt.encrypt(concat_payment_command),
|
62
|
+
"customerData" => {
|
63
|
+
"firstName" => first_name,
|
64
|
+
"lastName" => last_name,
|
65
|
+
"city" => city,
|
66
|
+
"street" => street,
|
67
|
+
"postalCode" => postal_code,
|
68
|
+
"countryCode" => country_code,
|
69
|
+
"email" => email,
|
70
|
+
"phoneNumber" => phone_number},
|
71
|
+
"paymentChannels" => payment_channels,
|
72
|
+
"lang" => lang}
|
73
|
+
end
|
74
|
+
|
75
|
+
def payment_session_hash
|
76
|
+
{"targetGoId" => target_goid.to_i,
|
77
|
+
"paymentSessionId" => payment_session_id,
|
78
|
+
"encryptedSignature" => GoPay::Crypt.encrypt(concat_payment_session)}
|
79
|
+
end
|
80
|
+
|
81
|
+
def valid_response?(response, status)
|
82
|
+
raise "CALL NOT COMPLETED " if response[:result] != GoPay::STATUSES[:call_completed]
|
83
|
+
goid_valid = (response[:target_go_id].to_s == target_goid)
|
84
|
+
|
85
|
+
response_valid = {:session_state => status,
|
86
|
+
:product_name => product_name,
|
87
|
+
:total_price => total_price_in_cents.to_s
|
88
|
+
}.all? { |key, value| response[key].to_s == value.to_s }
|
89
|
+
|
90
|
+
response_valid && goid_valid
|
91
|
+
end
|
92
|
+
|
93
|
+
def valid_payment_session?(response, status = nil)
|
94
|
+
raise "CALL NOT COMPLETED " if response[:result] != GoPay::STATUSES[:call_completed]
|
95
|
+
status_valid = if status
|
96
|
+
response[:session_state] == status
|
97
|
+
else
|
98
|
+
GoPay::STATUSES.values.include?(response[:session_state])
|
99
|
+
end
|
100
|
+
response_valid = {:order_number => order_number,
|
101
|
+
:product_name => product_name,
|
102
|
+
:target_go_id => target_goid,
|
103
|
+
:total_price => total_price_in_cents,
|
104
|
+
:currency => currency
|
105
|
+
}.all? { |key, value|
|
106
|
+
response[key].to_s == value.to_s }
|
107
|
+
|
108
|
+
signature_valid = GoPay::Crypt.sha1(concat_payment_status(response)) == GoPay::Crypt.decrypt(response[:encrypted_signature])
|
109
|
+
|
110
|
+
status_valid && response_valid && signature_valid
|
111
|
+
end
|
112
|
+
|
113
|
+
def valid_identity?(params, padding_off = false)
|
114
|
+
params['targetGoId'] == target_goid.to_s &&
|
115
|
+
params['orderNumber'] == order_number.to_s &&
|
116
|
+
GoPay::Crypt.sha1(concat_payment_identity(params)) == GoPay::Crypt.decrypt(params['encryptedSignature'], padding_off)
|
117
|
+
end
|
118
|
+
|
119
|
+
def concat_payment_identity(params)
|
120
|
+
[params['targetGoId'],
|
121
|
+
params['paymentSessionId'],
|
122
|
+
params['parentPaymentSessionId'],
|
123
|
+
params['orderNumber'],
|
124
|
+
secure_key].map { |attr| attr.to_s.strip }.join("|")
|
125
|
+
end
|
126
|
+
|
127
|
+
def concat_payment_command
|
128
|
+
[target_goid,
|
129
|
+
product_name.strip,
|
130
|
+
total_price_in_cents,
|
131
|
+
currency,
|
132
|
+
order_number,
|
133
|
+
GoPay.configuration.failed_url,
|
134
|
+
GoPay.configuration.success_url,
|
135
|
+
0, #preAuthorization
|
136
|
+
0, #recurrentPayment
|
137
|
+
nil, #recurrenceDateTo
|
138
|
+
nil, #recurrenceCycle
|
139
|
+
nil, #recurrencePeriod,
|
140
|
+
payment_channels,
|
141
|
+
secure_key].map { |attr| attr.to_s }.join("|")
|
142
|
+
end
|
143
|
+
|
144
|
+
def concat_payment_session
|
145
|
+
[target_goid,
|
146
|
+
payment_session_id,
|
147
|
+
secure_key].map { |attr| attr.to_s.strip }.join("|")
|
148
|
+
end
|
149
|
+
|
150
|
+
def concat_payment_status(response)
|
151
|
+
[response[:target_go_id],
|
152
|
+
response[:product_name],
|
153
|
+
response[:total_price],
|
154
|
+
response[:currency],
|
155
|
+
response[:order_number],
|
156
|
+
response[:recurrent_payment] ? 1 : 0,
|
157
|
+
response[:parent_payment_session_id],
|
158
|
+
response[:pre_authorization] ? 1 : 0,
|
159
|
+
response[:result],
|
160
|
+
response[:session_state],
|
161
|
+
response[:session_sub_state],
|
162
|
+
response[:payment_channel],
|
163
|
+
secure_key].map { |attr| attr.is_a?(Hash) ? "" : attr.to_s }.join("|")
|
164
|
+
end
|
165
|
+
|
166
|
+
def gopay_url
|
167
|
+
return unless payment_session_id
|
168
|
+
parameters = {"sessionInfo.targetGoId" => target_goid,
|
169
|
+
"sessionInfo.paymentSessionId" => payment_session_id,
|
170
|
+
"sessionInfo.encryptedSignature" => GoPay::Crypt.encrypt(self.concat_payment_session)}
|
171
|
+
query_string = parameters.map { |key, value| "#{key}=#{value}" }.join("&")
|
172
|
+
GoPay.configuration.urls["full_integration"] + "?" + query_string
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "savon"
|
2
|
+
|
3
|
+
Savon.configure { |config| config.log = false }
|
4
|
+
|
5
|
+
module GoPay
|
6
|
+
class PaymentMethod
|
7
|
+
|
8
|
+
attr_reader :code, :offline, :payment_method, :logo
|
9
|
+
|
10
|
+
def initialize(attributes = {})
|
11
|
+
attributes.each do |key, value|
|
12
|
+
instance_variable_set(:"@#{key}", value) if self.respond_to?(key)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.all
|
17
|
+
client = Savon::Client.new GoPay.configuration.urls["wsdl"]
|
18
|
+
response = client.request("paymentMethodList")
|
19
|
+
response.to_hash[:payment_method_list_response][:payment_method_list_return][:payment_method_list_return].map do |item|
|
20
|
+
PaymentMethod.new(item)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/test/config_test.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "test_helper"
|
3
|
+
|
4
|
+
class ConfigTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "GoPay configured" do
|
7
|
+
|
8
|
+
should "load both config and country_codes yml files" do
|
9
|
+
assert_equal "Česká Republika", GoPay.configuration.country_codes["CZE"]
|
10
|
+
assert_equal "https://testgw.gopay.cz/gw/pay-full-v2", GoPay.configuration.urls["full_integration"]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/test/crypt_test.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class CryptTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "GoPay configured" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
GoPay.configuration.stubs(:goid).returns('1234567890')
|
9
|
+
GoPay.configuration.stubs(:secure_key).returns('405ed9cacf63d5b123d65d09')
|
10
|
+
@base_payment = GoPay::BasePayment.new(:order_number => 'xxxxyyyy',
|
11
|
+
:product_name => "productName",
|
12
|
+
:total_price_in_cents => 10000,
|
13
|
+
:default_payment_channel => "cz_vb",
|
14
|
+
:currency => 'CZK',
|
15
|
+
:payment_channels => ["cz_ge", "cz_vb", "cz_sms"],
|
16
|
+
:email => 'patrikjira@gmail.com')
|
17
|
+
end
|
18
|
+
|
19
|
+
should "generate sha1 hexdigest for an object" do
|
20
|
+
assert_equal "8dc10d197e260b55ac6aea7702246ef87435404e",
|
21
|
+
GoPay::Crypt.sha1(@base_payment.concat_payment_command)
|
22
|
+
end
|
23
|
+
|
24
|
+
should "generate encrypted signature for an object" do
|
25
|
+
assert_equal "1fa2d2682dead62ba7bdb0f34ba304888f9cbb26df18b5a69d2cdeb73d7511b14791c68cc7eadb61",
|
26
|
+
GoPay::Crypt.encrypt(@base_payment.concat_payment_command)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/test/models_test.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ModelsTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "GoPay configured" do
|
6
|
+
|
7
|
+
should "load payment methods" do
|
8
|
+
assert GoPay::PaymentMethod.all.first.is_a?(GoPay::PaymentMethod)
|
9
|
+
end
|
10
|
+
|
11
|
+
context "when having test BasePayment" do
|
12
|
+
setup do
|
13
|
+
@base_payment = GoPay::BasePayment.new(:order_number => 'xxxxyyyy',
|
14
|
+
:product_name => "productName",
|
15
|
+
:total_price_in_cents => 10000,
|
16
|
+
:default_payment_channel => "cz_vb",
|
17
|
+
:currency => 'CZK',
|
18
|
+
:payment_channels => ["cz_ge", "cz_vb", "cz_sms"],
|
19
|
+
:email => 'patrikjira@gmail.com')
|
20
|
+
end
|
21
|
+
|
22
|
+
should "create and verify this payment on paygate" do
|
23
|
+
assert @base_payment.create
|
24
|
+
assert @base_payment.payment_session_id.to_i > 0
|
25
|
+
assert @base_payment.response.is_a?(Hash)
|
26
|
+
end
|
27
|
+
|
28
|
+
should "load payment, verify it and check status" do
|
29
|
+
@base_payment.create
|
30
|
+
assert @base_payment.load
|
31
|
+
assert @base_payment.is_in_status?(GoPay::STATUSES[:created])
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when having test BasePayment with stubbed credentials" do
|
37
|
+
setup do
|
38
|
+
GoPay.configuration.stubs(:goid).returns('1234567890')
|
39
|
+
GoPay.configuration.stubs(:secure_key).returns('405ed9cacf63d5b123d65d09')
|
40
|
+
@base_payment = GoPay::BasePayment.new(:order_number => 'xxxxyyyy',
|
41
|
+
:product_name => "productName",
|
42
|
+
:total_price_in_cents => 10000,
|
43
|
+
:default_payment_channel => "cz_vb",
|
44
|
+
:currency => 'CZK',
|
45
|
+
:payment_channels => ["cz_ge", "cz_vb", "cz_sms"],
|
46
|
+
:email => 'patrikjira@gmail.com')
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
should "validate base payment identity" do
|
51
|
+
params = {'targetGoId' => GoPay.configuration.goid.to_s,
|
52
|
+
'orderNumber' => 'xxxxyyyy',
|
53
|
+
'paymentSessionId' => '123456',
|
54
|
+
'encryptedSignature' => 'e8557aba66dde7923f7ae4594fde08b4812ed5d2a5b9ed6b66a372e8d3c41f0b91da996af1fe7fad'}
|
55
|
+
|
56
|
+
assert @base_payment.valid_identity?(params, true)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
goid: XXXXYYYYZZ
|
2
|
+
success_url: http://www.example.com/gopay/soap/callback
|
3
|
+
failed_url: http://www.example.com/gopay/soap/callback
|
4
|
+
callback_url: http://www.example.com/gopay/soap/callback
|
5
|
+
action_url: http://www.example.com/gopay/soap/callback
|
6
|
+
lang: cs
|
7
|
+
secure_key: SECUREKEYSECUREKEY123
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$: << File.join(File.expand_path(File.dirname(__FILE__)), "../lib")
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require 'test/unit'
|
5
|
+
require "shoulda"
|
6
|
+
require 'mocha'
|
7
|
+
|
8
|
+
require "gopay"
|
9
|
+
require "awesome_print"
|
10
|
+
|
11
|
+
GoPay.configure do |config|
|
12
|
+
config.environment = :test
|
13
|
+
end
|
14
|
+
|
15
|
+
# create your own test.yml (see test.example.yml)
|
16
|
+
GoPay.configure_from_yaml(File.join(File.dirname(__FILE__), "test.yml"))
|
metadata
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gopay
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- papricek
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-09-23 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: savon
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: shoulda
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: mocha
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
62
|
+
description: GoPay is a library making it easy to access GoPay http://www.gopay.cz paygate from Ruby. It offers some basic wrapper around soap calls in the form of AR-like models. Its autoconfigurable from Rails.
|
63
|
+
email:
|
64
|
+
- patrikjira@gmail.com
|
65
|
+
executables: []
|
66
|
+
|
67
|
+
extensions: []
|
68
|
+
|
69
|
+
extra_rdoc_files: []
|
70
|
+
|
71
|
+
files:
|
72
|
+
- .gitignore
|
73
|
+
- .rvmrc
|
74
|
+
- Gemfile
|
75
|
+
- README.textile
|
76
|
+
- Rakefile
|
77
|
+
- config/config.yml
|
78
|
+
- config/country_codes.yml
|
79
|
+
- gopay.gemspec
|
80
|
+
- init.rb
|
81
|
+
- lib/gopay.rb
|
82
|
+
- lib/gopay/config.rb
|
83
|
+
- lib/gopay/crypt.rb
|
84
|
+
- lib/gopay/models/base_payment.rb
|
85
|
+
- lib/gopay/models/payment_method.rb
|
86
|
+
- lib/gopay/railtie.rb
|
87
|
+
- lib/gopay/version.rb
|
88
|
+
- test/config_test.rb
|
89
|
+
- test/crypt_test.rb
|
90
|
+
- test/models_test.rb
|
91
|
+
- test/test.example.yml
|
92
|
+
- test/test_helper.rb
|
93
|
+
homepage: http://gopay.defactory.net
|
94
|
+
licenses: []
|
95
|
+
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
hash: 3
|
107
|
+
segments:
|
108
|
+
- 0
|
109
|
+
version: "0"
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 3
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
version: "0"
|
119
|
+
requirements: []
|
120
|
+
|
121
|
+
rubyforge_project: gopay
|
122
|
+
rubygems_version: 1.8.21
|
123
|
+
signing_key:
|
124
|
+
specification_version: 3
|
125
|
+
summary: A little gem making integration of GoPay easy
|
126
|
+
test_files:
|
127
|
+
- test/config_test.rb
|
128
|
+
- test/crypt_test.rb
|
129
|
+
- test/models_test.rb
|
130
|
+
- test/test.example.yml
|
131
|
+
- test/test_helper.rb
|