webmoney 0.0.4.3 → 0.0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +6 -0
- data/README +69 -8
- data/lib/messenger.rb +7 -5
- data/lib/request.rb +69 -0
- data/lib/result.rb +21 -0
- data/lib/webmoney.rb +35 -128
- data/lib/wmid.rb +1 -1
- data/rakefile +1 -1
- data/spec/unit/messenger_spec.rb +9 -5
- data/spec/unit/webmoney_spec.rb +7 -3
- metadata +4 -2
data/ChangeLog
CHANGED
data/README
CHANGED
@@ -1,11 +1,72 @@
|
|
1
|
-
|
1
|
+
== About Webmoney library
|
2
2
|
|
3
|
-
|
3
|
+
This library should help to make requests to WebMoney Transfer http://www.wmtransfer.com
|
4
|
+
XML-interfaces: http://www.wmtransfer.com/eng/developers/interfaces/index.shtml
|
4
5
|
|
5
|
-
|
6
|
-
type: classic
|
7
|
-
wmid: '123456789012'
|
8
|
-
key: 'gQABAIR6... YOUR BASE64-KEY (see wmsigner readme) ...2cC8FZTyKyjBM='
|
9
|
-
password: _your_password_
|
6
|
+
Gem have built-in native *wmsigner*.
|
10
7
|
|
11
|
-
|
8
|
+
Author:: Alexander Oryol (mailto:eagle.alex@gmail.com)
|
9
|
+
License:: MIT License
|
10
|
+
|
11
|
+
== Request types
|
12
|
+
|
13
|
+
Completed:
|
14
|
+
- send_message - x6
|
15
|
+
- get_passport - x11
|
16
|
+
- bussines_level
|
17
|
+
|
18
|
+
Incompleted (help need!):
|
19
|
+
- create_invoice - x1
|
20
|
+
- create_transaction - x2
|
21
|
+
- operation_history - x3
|
22
|
+
- outgoing_invoices - x4
|
23
|
+
- finish_protect - x5
|
24
|
+
- check_sign - x7
|
25
|
+
- find_wm - x8
|
26
|
+
- balance - x9
|
27
|
+
- incoming_invoices - x10
|
28
|
+
- reject_protection - x13
|
29
|
+
- transaction_moneyback - x14
|
30
|
+
- i_trust - x15
|
31
|
+
- trust_me - x15
|
32
|
+
- trust_save - x15
|
33
|
+
- create_purse - x16
|
34
|
+
|
35
|
+
Please, see relative documentation and parameters on wiki:
|
36
|
+
|
37
|
+
http://wiki.wmtransfer.com/wiki/list/XML-Interfaces
|
38
|
+
|
39
|
+
http://wiki.webmoney.ru/wiki/list/XML-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D1%8B (in russian)
|
40
|
+
|
41
|
+
or official sites:
|
42
|
+
|
43
|
+
http://www.wmtransfer.com/eng/developers/interfaces/xml/index.shtml
|
44
|
+
|
45
|
+
http://www.webmoney.ru/rus/developers/interfaces/xml/index.shtml (in russian)
|
46
|
+
|
47
|
+
== Examples
|
48
|
+
|
49
|
+
= Setup
|
50
|
+
|
51
|
+
@wm = Webmoney.new(:wmid => '123456789012', :password => 'my_pass', :key => 'gQABAIR6...2cC8FZTyKyjBM=')
|
52
|
+
|
53
|
+
wmid = '111222333444'
|
54
|
+
|
55
|
+
= Passport (X11) request:
|
56
|
+
|
57
|
+
passport = @wm.request(:get_passport, :wmid => wmid)
|
58
|
+
|
59
|
+
= Bussines level request:
|
60
|
+
|
61
|
+
bl = @wm.request(:bussines_level, :wmid => wmid)
|
62
|
+
|
63
|
+
= Sending message
|
64
|
+
|
65
|
+
... for one message:
|
66
|
+
@wm.request(:send_message, :wmid => wmid, :subj => 'Subject', :text => 'Body of \<b>message\</b>')
|
67
|
+
|
68
|
+
... for many messages (with queue):
|
69
|
+
@wm.send_message(:wmid => wmid, :subj => 'Subject', :text => 'Body of \<b>message\</b>')
|
70
|
+
|
71
|
+
|
72
|
+
Also, see examples into spec's.
|
data/lib/messenger.rb
CHANGED
@@ -13,12 +13,12 @@ class Webmoney
|
|
13
13
|
unless msg.nil?
|
14
14
|
begin
|
15
15
|
result = @webmoney.request(:send_message, msg)
|
16
|
+
# Requeue if fail
|
16
17
|
@queue.push(msg) unless result.kind_of?(Hash)
|
17
|
-
rescue ResultError
|
18
|
-
|
19
|
-
#
|
20
|
-
|
21
|
-
puts "ResponseError: #{@webmoney.error}"
|
18
|
+
rescue ResultError, ResponseError => e
|
19
|
+
# TODO Replace this to logger call
|
20
|
+
# puts "#{e}: #{@webmoney.error} #{@webmoney.errormsg}"
|
21
|
+
|
22
22
|
# Requeue message
|
23
23
|
@queue.push(msg)
|
24
24
|
end
|
@@ -30,6 +30,8 @@ class Webmoney
|
|
30
30
|
def push(msg)
|
31
31
|
@queue.push(msg)
|
32
32
|
end
|
33
|
+
|
34
|
+
# TODO callback on success send message
|
33
35
|
|
34
36
|
end
|
35
37
|
|
data/lib/request.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
module Webmoney::XMLRequest # :nodoc:all
|
2
|
+
|
3
|
+
def envelope(utf = true)
|
4
|
+
x = Builder::XmlMarkup.new(:indent => 1)
|
5
|
+
encoding = utf ? "utf-8" : "windows-1251"
|
6
|
+
x.instruct!(:xml, :version => "1.0", :encoding => encoding)
|
7
|
+
x
|
8
|
+
end
|
9
|
+
|
10
|
+
def xml_get_passport(opt)
|
11
|
+
x = envelope(false)
|
12
|
+
x.request do
|
13
|
+
x.wmid @wmid
|
14
|
+
x.passportwmid opt[:wmid]
|
15
|
+
x.params { x.dict 0; x.info 1; x.mode 0 }
|
16
|
+
x.sign sign(@wmid + opt[:wmid]) if classic?
|
17
|
+
end
|
18
|
+
x
|
19
|
+
end
|
20
|
+
|
21
|
+
def xml_bussines_level(opt)
|
22
|
+
x = envelope
|
23
|
+
x.tag!('WMIDLevel.request') do
|
24
|
+
x.signerwmid @wmid
|
25
|
+
x.wmid opt[:wmid]
|
26
|
+
end
|
27
|
+
x
|
28
|
+
end
|
29
|
+
|
30
|
+
def xml_check_sign(opt)
|
31
|
+
x = envelope(false)
|
32
|
+
x.tag!('w3s.request') do
|
33
|
+
x.wmid @wmid
|
34
|
+
plan_out = @ic_out.iconv(opt[:plan])
|
35
|
+
x.testsign do
|
36
|
+
x.wmid opt[:wmid]
|
37
|
+
x.plan { x.cdata! plan_out }
|
38
|
+
x.sign opt[:sign]
|
39
|
+
end
|
40
|
+
if classic?
|
41
|
+
plan = @wmid + opt[:wmid] + plan_out + opt[:sign]
|
42
|
+
x.sign sign(plan)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
x
|
46
|
+
end
|
47
|
+
|
48
|
+
def xml_send_message(opt)
|
49
|
+
x = envelope(false)
|
50
|
+
req = reqn()
|
51
|
+
x.tag!('w3s.request') do
|
52
|
+
x.wmid @wmid
|
53
|
+
x.reqn req
|
54
|
+
msgsubj = @ic_out.iconv(opt[:subj])
|
55
|
+
msgtext = @ic_out.iconv(opt[:text])
|
56
|
+
x.message do
|
57
|
+
x.receiverwmid opt[:wmid]
|
58
|
+
x.msgsubj { x.cdata! msgsubj }
|
59
|
+
x.msgtext { x.cdata! msgtext }
|
60
|
+
end
|
61
|
+
if classic?
|
62
|
+
@plan = opt[:wmid] + req + msgtext + msgsubj
|
63
|
+
x.sign sign(@plan)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
x
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
data/lib/result.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Webmoney::RequestResult # :nodoc:all
|
2
|
+
|
3
|
+
def result_check_sign(doc)
|
4
|
+
doc.at('//testsign/res').inner_html == 'yes' ? true : false
|
5
|
+
end
|
6
|
+
|
7
|
+
def result_get_passport(doc)
|
8
|
+
Webmoney::Passport.new(doc)
|
9
|
+
end
|
10
|
+
|
11
|
+
def result_bussines_level(doc)
|
12
|
+
doc.at('//level').inner_html.to_i
|
13
|
+
end
|
14
|
+
|
15
|
+
def result_send_message(doc)
|
16
|
+
time = doc.at('//message/datecrt').inner_html
|
17
|
+
m = time.match(/(\d{4})(\d{2})(\d{2}) (\d{2}):(\d{2}):(\d{2})/)
|
18
|
+
time = Time.mktime(*m[1..6])
|
19
|
+
{ :id => doc.at('//message')['id'], :date => time }
|
20
|
+
end
|
21
|
+
end
|
data/lib/webmoney.rb
CHANGED
@@ -1,67 +1,7 @@
|
|
1
|
-
=begin rdoc
|
2
|
-
== About Webmoney library
|
3
|
-
|
4
|
-
This library help to make requests to WebMoney Transfer http://www.wmtransfer.com
|
5
|
-
XML-interfaces: http://www.wmtransfer.com/eng/developers/interfaces/index.shtml
|
6
|
-
|
7
|
-
Gem have built-in native *wmsigner*.
|
8
|
-
|
9
|
-
Author:: Alexander Oryol (mailto:eagle.alex@gmail.com)
|
10
|
-
License:: MIT License
|
11
|
-
|
12
|
-
== Request types
|
13
|
-
|
14
|
-
- create_invoice - x1
|
15
|
-
- create_transaction - x2
|
16
|
-
- operation_history - x3
|
17
|
-
- outgoing_invoices - x4
|
18
|
-
- finish_protect - x5
|
19
|
-
- send_message - x6
|
20
|
-
- check_sign - x7
|
21
|
-
- find_wm - x8
|
22
|
-
- balance - x9
|
23
|
-
- incoming_invoices - x10
|
24
|
-
- get_passport - x11
|
25
|
-
- reject_protection - x13
|
26
|
-
- transaction_moneyback - x14
|
27
|
-
- i_trust - x15
|
28
|
-
- trust_me - x15
|
29
|
-
- trust_save - x15
|
30
|
-
- create_purse - x16
|
31
|
-
- bussines_level
|
32
|
-
|
33
|
-
Please, see relative documentation and parameters on wiki:
|
34
|
-
|
35
|
-
http://wiki.wmtransfer.com/wiki/list/XML-Interfaces
|
36
|
-
|
37
|
-
http://wiki.webmoney.ru/wiki/list/XML-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D1%8B (in russian)
|
38
|
-
|
39
|
-
or official sites:
|
40
|
-
|
41
|
-
http://www.wmtransfer.com/eng/developers/interfaces/xml/index.shtml
|
42
|
-
|
43
|
-
http://www.webmoney.ru/rus/developers/interfaces/xml/index.shtml (in russian)
|
44
|
-
|
45
|
-
== Examples
|
46
|
-
|
47
|
-
@wm = Webmoney.new(:wmid => '123456789012', :password => 'my_pass', :key => 'gQABAIR6...2cC8FZTyKyjBM=')
|
48
|
-
|
49
|
-
passport = @wm.request(:get_passport, :wmid => @wm.wmid)
|
50
|
-
|
51
|
-
bl = @wm.request(:bussines_level, :wmid => '123456789012')
|
52
|
-
|
53
|
-
@wm.request(:send_message, :wmid => @wm.wmid, :subj => 'Subject', :text => 'Body of \<b>message\</b>')
|
54
|
-
|
55
|
-
|
56
|
-
Also, see examples into spec's.
|
57
|
-
=end
|
58
|
-
|
59
|
-
|
60
1
|
# :title:Webmoney library Documentation
|
61
2
|
# :main:lib/webmoney.rb
|
62
3
|
# :include:README
|
63
4
|
|
64
|
-
require File.dirname(__FILE__) +'/wmsigner'
|
65
5
|
require 'time'
|
66
6
|
require 'net/http'
|
67
7
|
require 'net/https'
|
@@ -70,11 +10,23 @@ require 'iconv'
|
|
70
10
|
require 'builder'
|
71
11
|
require 'hpricot'
|
72
12
|
|
13
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
|
14
|
+
|
15
|
+
require 'wmsigner'
|
16
|
+
require 'wmid'
|
17
|
+
require 'passport'
|
18
|
+
require 'request'
|
19
|
+
require 'result'
|
20
|
+
require 'messenger'
|
21
|
+
|
73
22
|
# Main class for Webmoney lib. Instance contain info
|
74
23
|
# for WMT-interfaces requests (wmid, key, etc).
|
75
24
|
# Implement general requests.
|
76
25
|
class Webmoney
|
77
26
|
|
27
|
+
include XMLRequest
|
28
|
+
include RequestResult
|
29
|
+
|
78
30
|
# Error classes
|
79
31
|
class WebmoneyError < StandardError; end
|
80
32
|
class RequestError < WebmoneyError; end
|
@@ -82,10 +34,6 @@ class Webmoney
|
|
82
34
|
class IncorrectWmidError < WebmoneyError; end
|
83
35
|
class CaCertificateError < WebmoneyError; end
|
84
36
|
|
85
|
-
require File.dirname(__FILE__) + '/../lib/wmid'
|
86
|
-
require File.dirname(__FILE__) + '/../lib/passport'
|
87
|
-
require File.dirname(__FILE__) + '/../lib/messenger'
|
88
|
-
|
89
37
|
attr_reader :wmid, :error, :errormsg, :last_request, :messenger
|
90
38
|
|
91
39
|
# Required options:
|
@@ -172,69 +120,13 @@ class Webmoney
|
|
172
120
|
reqn = reqn()
|
173
121
|
raise ArgumentError unless opt.kind_of?(Hash)
|
174
122
|
opt[:wmid] = @wmid if opt[:wmid].nil?
|
175
|
-
|
176
|
-
x.instruct!(:xml, :version=>"1.0", :encoding=>"windows-1251")
|
177
|
-
unless [:get_passport, :bussines_level].include?(iface)
|
178
|
-
x.tag!('w3s.request') do
|
179
|
-
x.wmid @wmid
|
180
|
-
case iface
|
181
|
-
when :check_sign then
|
182
|
-
plan_out = @ic_out.iconv(opt[:plan])
|
183
|
-
x.testsign do
|
184
|
-
x.wmid opt[:wmid]
|
185
|
-
x.plan { x.cdata! plan_out }
|
186
|
-
x.sign opt[:sign]
|
187
|
-
end
|
188
|
-
plan = @wmid + opt[:wmid] + plan_out + opt[:sign]
|
189
|
-
when :send_message
|
190
|
-
x.reqn reqn
|
191
|
-
msgsubj = @ic_out.iconv(opt[:subj])
|
192
|
-
msgtext = @ic_out.iconv(opt[:text])
|
193
|
-
x.message do
|
194
|
-
x.receiverwmid opt[:wmid]
|
195
|
-
x.msgsubj { x.cdata! msgsubj }
|
196
|
-
x.msgtext { x.cdata! msgtext }
|
197
|
-
end
|
198
|
-
plan = opt[:wmid] + reqn + msgtext + msgsubj
|
199
|
-
end
|
200
|
-
x.sign sign(plan) if classic?
|
201
|
-
end
|
202
|
-
else
|
203
|
-
case iface
|
204
|
-
when :bussines_level
|
205
|
-
x.tag!('WMIDLevel.request') do
|
206
|
-
x.signerwmid @wmid
|
207
|
-
x.wmid opt[:wmid]
|
208
|
-
end
|
209
|
-
when :get_passport
|
210
|
-
x.request do
|
211
|
-
x.wmid @wmid
|
212
|
-
x.passportwmid opt[:wmid]
|
213
|
-
x.params { x.dict 0; x.info 1; x.mode 0 }
|
214
|
-
x.sign sign(@wmid + opt[:wmid]) if classic?
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
123
|
+
|
219
124
|
# Do request
|
220
|
-
res = https_request(iface,
|
221
|
-
|
125
|
+
res = https_request(iface, make_xml(iface, opt))
|
126
|
+
|
222
127
|
# Parse response
|
223
128
|
parse_retval(res)
|
224
|
-
|
225
|
-
case iface
|
226
|
-
when :check_sign
|
227
|
-
return doc.at('//testsign/res').inner_html == 'yes' ? true : false
|
228
|
-
when :get_passport
|
229
|
-
return Passport.new(doc)
|
230
|
-
when :bussines_level
|
231
|
-
return doc.at('//level').inner_html.to_i
|
232
|
-
when :send_message
|
233
|
-
time = doc.at('//message/datecrt').inner_html
|
234
|
-
m = time.match(/(\d{4})(\d{2})(\d{2}) (\d{2}):(\d{2}):(\d{2})/)
|
235
|
-
time = Time.mktime(*m[1..6])
|
236
|
-
return {:id => doc.at('//message')['id'], :date => time}
|
237
|
-
end
|
129
|
+
make_result(iface, res)
|
238
130
|
end
|
239
131
|
|
240
132
|
# Signing string by instance wmid's,
|
@@ -260,7 +152,7 @@ class Webmoney
|
|
260
152
|
if File.file? @ca_cert
|
261
153
|
http.ca_file = @ca_cert
|
262
154
|
else
|
263
|
-
raise CaCertificateError
|
155
|
+
raise CaCertificateError, @ca_cert
|
264
156
|
end
|
265
157
|
http.use_ssl = true
|
266
158
|
@last_request = xml
|
@@ -273,7 +165,7 @@ class Webmoney
|
|
273
165
|
else
|
274
166
|
@error = result.code
|
275
167
|
@errormsg = result.body if result.class.body_permitted?()
|
276
|
-
raise RequestError
|
168
|
+
raise RequestError, [@error, @errormsg].join(' ')
|
277
169
|
end
|
278
170
|
end
|
279
171
|
|
@@ -291,7 +183,7 @@ class Webmoney
|
|
291
183
|
unless retval == 0
|
292
184
|
@error = retval
|
293
185
|
@errormsg = retdesc
|
294
|
-
raise ResultError
|
186
|
+
raise ResultError, [@error, @errormsg].join(' ')
|
295
187
|
end
|
296
188
|
end
|
297
189
|
|
@@ -301,5 +193,20 @@ class Webmoney
|
|
301
193
|
t = Time.now
|
302
194
|
t.strftime('%Y%m%d%H%M%S') + t.to_f.to_s.match(/\.(\d\d)/)[1]
|
303
195
|
end
|
304
|
-
|
196
|
+
|
197
|
+
def make_xml(iface, opt) # :nodoc:
|
198
|
+
iface_func = ('xml_'+iface.to_s).to_sym
|
199
|
+
self.send(iface_func, opt).target!
|
200
|
+
rescue NoMethodError
|
201
|
+
raise NotImplementedError, "#{iface_func}()"
|
202
|
+
end
|
203
|
+
|
204
|
+
def make_result(iface, res) # :nodoc:
|
205
|
+
doc = Hpricot.XML(res)
|
206
|
+
iface_result = ('result_'+iface.to_s).to_sym
|
207
|
+
self.send(iface_result, doc)
|
208
|
+
rescue NoMethodError
|
209
|
+
raise NotImplementedError, "#{iface_result}()"
|
210
|
+
end
|
211
|
+
|
305
212
|
end
|
data/lib/wmid.rb
CHANGED
data/rakefile
CHANGED
data/spec/unit/messenger_spec.rb
CHANGED
@@ -8,16 +8,20 @@ class Webmoney
|
|
8
8
|
@wm = webmoney()
|
9
9
|
end
|
10
10
|
|
11
|
-
it "should create instance
|
11
|
+
it "should create instance" do
|
12
12
|
@wm.messenger.should be_nil
|
13
13
|
@wm.send_message(:wmid => @wm.wmid, :subj => 'FIRST', :text => 'BODY')
|
14
14
|
@wm.messenger.should be_instance_of(Messenger)
|
15
|
-
@wm.send_message(:wmid => @wm.wmid, :subj => 'SECOND', :text => 'SECOUND')
|
16
|
-
sleep(3)
|
17
15
|
end
|
18
16
|
|
19
|
-
|
20
|
-
|
17
|
+
it "should call request(:send_message) twice" do
|
18
|
+
params = { :wmid => @wm.wmid, :subj => 'FIRST', :text => 'BODY' }
|
19
|
+
@wm.should_receive(:request).
|
20
|
+
with(:send_message, params).twice().and_return({:test => 'test'})
|
21
|
+
@wm.send_message(params)
|
22
|
+
@wm.send_message(params)
|
23
|
+
end
|
24
|
+
|
21
25
|
end
|
22
26
|
|
23
27
|
end
|
data/spec/unit/webmoney_spec.rb
CHANGED
@@ -44,9 +44,9 @@ class Webmoney
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should parse retval and raise error" do
|
47
|
-
lambda { @wm.request(:
|
48
|
-
@wm.error.should == -
|
49
|
-
@wm.errormsg.should match(%r{
|
47
|
+
lambda { @wm.request(:send_message, :wmid => '')}.should raise_error(ResultError)
|
48
|
+
@wm.error.should == -2
|
49
|
+
@wm.errormsg.should match(%r{value of w3s.request/message/receiverwmid is incorrect})
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should sign string" do
|
@@ -106,6 +106,10 @@ class Webmoney
|
|
106
106
|
((result[:date] + 60) > Time.now).should be_true
|
107
107
|
end
|
108
108
|
|
109
|
+
it "should raise error on undefined xml func" do
|
110
|
+
lambda { @wm.request(:unexistent_interface) }.should raise_error(::NotImplementedError)
|
111
|
+
end
|
112
|
+
|
109
113
|
end
|
110
114
|
|
111
115
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webmoney
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.4.
|
4
|
+
version: 0.0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Oryol
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-03-15 00:00:00 +03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -47,6 +47,8 @@ files:
|
|
47
47
|
- README
|
48
48
|
- lib/WebMoneyCA.crt
|
49
49
|
- lib/messenger.rb
|
50
|
+
- lib/request.rb
|
51
|
+
- lib/result.rb
|
50
52
|
- lib/passport.rb
|
51
53
|
- lib/webmoney.rb
|
52
54
|
- lib/wmid.rb
|