webmoney 0.0.4.6 → 0.0.4.8
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/ChangeLog +12 -0
- data/README +37 -8
- data/lib/messenger.rb +9 -7
- data/lib/passport.rb +17 -25
- data/lib/purse.rb +39 -0
- data/lib/request_result.rb +36 -0
- data/lib/request_retval.rb +23 -0
- data/lib/{request.rb → request_xml.rb} +20 -2
- data/lib/webmoney.rb +52 -54
- data/lib/wmid.rb +1 -1
- data/rakefile +1 -1
- data/spec/spec_helper.rb +5 -1
- data/spec/unit/messenger_spec.rb +23 -8
- data/spec/unit/passport_spec.rb +19 -23
- data/spec/unit/purse_spec.rb +56 -0
- data/spec/unit/webmoney_spec.rb +6 -12
- data/spec/unit/wmid_spec.rb +1 -1
- metadata +12 -5
- data/lib/result.rb +0 -21
data/ChangeLog
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
ChangeLog
|
2
2
|
|
3
|
+
Sat Oct 03 2009 16:18:00 + 0400
|
4
|
+
----------------------------
|
5
|
+
V 0.0.4.8
|
6
|
+
* Refactor class Passport
|
7
|
+
|
8
|
+
Wed Sep 30 2009 16:09:00 + 0400
|
9
|
+
----------------------------
|
10
|
+
V 0.0.4.7
|
11
|
+
* Class Webmoney refactor to module
|
12
|
+
* Add find_wm (X8) interface
|
13
|
+
* Add logger call when send message via simple queue
|
14
|
+
|
3
15
|
Wed Aug 12 2009 20:31:00 + 0400
|
4
16
|
----------------------------
|
5
17
|
V 0.0.4.6
|
data/README
CHANGED
@@ -13,6 +13,7 @@ License:: MIT License
|
|
13
13
|
Completed:
|
14
14
|
- send_message - x6
|
15
15
|
- get_passport - x11
|
16
|
+
- find_wm - x8
|
16
17
|
- bussines_level
|
17
18
|
|
18
19
|
Incompleted (help need!):
|
@@ -22,7 +23,6 @@ Incompleted (help need!):
|
|
22
23
|
- outgoing_invoices - x4
|
23
24
|
- finish_protect - x5
|
24
25
|
- check_sign - x7
|
25
|
-
- find_wm - x8
|
26
26
|
- balance - x9
|
27
27
|
- incoming_invoices - x10
|
28
28
|
- reject_protection - x13
|
@@ -31,6 +31,9 @@ Incompleted (help need!):
|
|
31
31
|
- trust_me - x15
|
32
32
|
- trust_save - x15
|
33
33
|
- create_purse - x16
|
34
|
+
- create_contract - x17
|
35
|
+
- transaction_get - x18
|
36
|
+
|
34
37
|
|
35
38
|
Please, see relative documentation and parameters on wiki:
|
36
39
|
|
@@ -48,17 +51,26 @@ http://www.webmoney.ru/rus/developers/interfaces/xml/index.shtml (in russian)
|
|
48
51
|
|
49
52
|
= Setup
|
50
53
|
|
51
|
-
|
54
|
+
class MyWM
|
55
|
+
include Webmoney
|
56
|
+
end
|
57
|
+
|
58
|
+
@wm = MyWM.new(:wmid => '123456789012', :password => 'my_pass', :key => 'gQABAIR6...2cC8FZTyKyjBM=')
|
52
59
|
|
53
60
|
wmid = '111222333444'
|
54
61
|
|
55
|
-
= Passport (X11)
|
62
|
+
= Passport (X11)
|
56
63
|
|
57
|
-
|
64
|
+
Get attestat data:
|
65
|
+
passport = Passport.new(wmid)
|
66
|
+
passport.attestat # { # Hash
|
67
|
+
# :attestat => 110, # == FORMAL attestat, as example
|
68
|
+
# :created_at => Wed Feb 25 21:54:01 +0300 2004 # Time object
|
69
|
+
# }
|
58
70
|
|
59
|
-
= Bussines level
|
71
|
+
= Bussines level
|
60
72
|
|
61
|
-
bl = @wm.request(:bussines_level, :wmid => wmid)
|
73
|
+
bl = @wm.request(:bussines_level, :wmid => wmid) # => 15
|
62
74
|
|
63
75
|
= Sending message
|
64
76
|
|
@@ -66,7 +78,24 @@ bl = @wm.request(:bussines_level, :wmid => wmid)
|
|
66
78
|
@wm.request(:send_message, :wmid => wmid, :subj => 'Subject', :text => 'Body of \<b>message\</b>')
|
67
79
|
|
68
80
|
... for many messages (with queue):
|
69
|
-
@wm.send_message(:wmid => wmid, :subj => 'Subject', :text => 'Body of \<b>message\</b>')
|
81
|
+
@wm.send_message(:wmid => wmid, :subj => 'Subject', :text => 'Body of \<b>message\</b>') do |msg, result|
|
82
|
+
File.open("logfile", "w") do |file|
|
83
|
+
case result
|
84
|
+
when Hash
|
85
|
+
file.puts "Message #{msg.inspect} sended in:#{result[:date]} with id:#{result[:id]}"
|
86
|
+
else
|
87
|
+
file.puts "Error sent message #{msg.inspect}: #{result.message}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
= Purses and WMIDs
|
93
|
+
|
94
|
+
@wm.wmid_exist?('123456789012') # => true
|
95
|
+
|
96
|
+
purse = Purse.new('Z123456789012')
|
97
|
+
purse.wmid # => '123456789012'
|
98
|
+
purse.belong_to?('123456789012') # => true
|
70
99
|
|
71
100
|
|
72
|
-
Also, see
|
101
|
+
Also, see spec/* for examples.
|
data/lib/messenger.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'thread'
|
2
2
|
|
3
|
-
|
3
|
+
module Webmoney
|
4
4
|
|
5
5
|
class Messenger
|
6
|
-
|
7
|
-
|
6
|
+
|
7
|
+
attr_reader :thread
|
8
|
+
|
9
|
+
def initialize(owner, &logger)
|
8
10
|
@webmoney = owner
|
9
11
|
@queue = Queue.new
|
10
12
|
@thread = Thread.new(@queue) do |q|
|
@@ -13,16 +15,16 @@ class Webmoney
|
|
13
15
|
unless msg.nil?
|
14
16
|
begin
|
15
17
|
result = @webmoney.request(:send_message, msg)
|
16
|
-
|
18
|
+
logger.call(msg, result)
|
19
|
+
# Requeue message on fail
|
17
20
|
@queue.push(msg) unless result.kind_of?(Hash)
|
18
21
|
rescue ResultError, ResponseError => e
|
19
|
-
|
20
|
-
# puts "#{e}: #{@webmoney.error} #{@webmoney.errormsg}"
|
21
|
-
|
22
|
+
logger.call(msg, e)
|
22
23
|
# Requeue message
|
23
24
|
@queue.push(msg)
|
24
25
|
end
|
25
26
|
end
|
27
|
+
sleep(0.2)
|
26
28
|
end
|
27
29
|
end
|
28
30
|
end
|
data/lib/passport.rb
CHANGED
@@ -1,33 +1,9 @@
|
|
1
1
|
require 'hpricot'
|
2
2
|
|
3
3
|
# Class for store attestat information
|
4
|
-
|
4
|
+
module Webmoney
|
5
5
|
class Passport < Wmid
|
6
6
|
|
7
|
-
# doc - Hpricot::Doc or xml-string
|
8
|
-
def initialize(doc)
|
9
|
-
doc = Hpricot.XML(doc) unless doc.kind_of?(Hpricot::Doc)
|
10
|
-
root = doc.at('/response')
|
11
|
-
if root && root['retval'] && root['retval'].to_i == 0
|
12
|
-
super(doc.at('/response/certinfo')['wmid'])
|
13
|
-
raise NonExistentWmidError unless doc.at('/response/certinfo/attestat')
|
14
|
-
tid = doc.at('/response/certinfo/attestat/row')['tid'].to_i
|
15
|
-
recalled = doc.at('/response/certinfo/attestat/row')['recalled'].to_i
|
16
|
-
locked = doc.at('/response/certinfo/userinfo/value/row')['locked'].to_i
|
17
|
-
@attestat = ( recalled + locked > 0) ? ALIAS : tid
|
18
|
-
@created_at = Time.xmlschema(doc.at('/response/certinfo/attestat/row')['datecrt'])
|
19
|
-
|
20
|
-
# TODO more attestat fields...
|
21
|
-
|
22
|
-
# Make all instance variables readable
|
23
|
-
instance_variables.each do |n|
|
24
|
-
class << self; self; end.instance_eval {
|
25
|
-
attr_reader n.sub(/^@/, '')
|
26
|
-
}
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
7
|
# Attestate types
|
32
8
|
ALIAS = 100
|
33
9
|
FORMAL = 110
|
@@ -41,5 +17,21 @@ class Webmoney
|
|
41
17
|
SERVICE = 190
|
42
18
|
SERVICE2 = 200
|
43
19
|
OPERATOR = 300
|
20
|
+
|
21
|
+
attr_reader :attestat
|
22
|
+
|
23
|
+
def self.worker= (worker)
|
24
|
+
@@worker = worker
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.worker
|
28
|
+
@@worker
|
29
|
+
end
|
30
|
+
|
31
|
+
def attestat
|
32
|
+
# memoize
|
33
|
+
@attestat ||= @@worker.request(:get_passport, :wmid => self)
|
34
|
+
end
|
35
|
+
|
44
36
|
end
|
45
37
|
end
|
data/lib/purse.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Support class
|
2
|
+
module Webmoney
|
3
|
+
class Purse < String
|
4
|
+
|
5
|
+
# Parameter: purse - String or Purse
|
6
|
+
|
7
|
+
def initialize(str)
|
8
|
+
str = str.to_s unless str.kind_of?(String)
|
9
|
+
raise IncorrectPurseError, str unless str =~ /^[BCDEGRUYZ]\d{12}$/
|
10
|
+
super(str)
|
11
|
+
end
|
12
|
+
|
13
|
+
def purse; self end
|
14
|
+
|
15
|
+
def self.worker= (worker)
|
16
|
+
@@worker = worker
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.worker
|
20
|
+
@@worker
|
21
|
+
end
|
22
|
+
|
23
|
+
# Get WMID for this purse
|
24
|
+
def wmid
|
25
|
+
# memoize
|
26
|
+
@wmid ||=
|
27
|
+
begin
|
28
|
+
res = @@worker.request(:find_wm, :purse => self)
|
29
|
+
res[:retval] == 1 ? Wmid.new(res[:wmid]) : nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Purse is belong to wmid?
|
34
|
+
def belong_to?(wmid)
|
35
|
+
self.wmid == Wmid.new(wmid)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,36 @@
|
|
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
|
+
tid = doc.at('/response/certinfo/attestat/row')['tid'].to_i
|
9
|
+
recalled = doc.at('/response/certinfo/attestat/row')['recalled'].to_i
|
10
|
+
locked = doc.at('/response/certinfo/userinfo/value/row')['locked'].to_i
|
11
|
+
{ # TODO more attestat fields...
|
12
|
+
:attestat => ( recalled + locked > 0) ? Webmoney::Passport::ALIAS : tid,
|
13
|
+
:created_at => Time.xmlschema(doc.at('/response/certinfo/attestat/row')['datecrt'])
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def result_bussines_level(doc)
|
18
|
+
doc.at('//level').inner_html.to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def result_send_message(doc)
|
22
|
+
time = doc.at('//message/datecrt').inner_html
|
23
|
+
m = time.match(/(\d{4})(\d{2})(\d{2}) (\d{2}):(\d{2}):(\d{2})/)
|
24
|
+
time = Time.mktime(*m[1..6])
|
25
|
+
{ :id => doc.at('//message')['id'], :date => time }
|
26
|
+
end
|
27
|
+
|
28
|
+
def result_find_wm(doc)
|
29
|
+
{
|
30
|
+
:retval => doc.at('//retval').inner_html.to_i,
|
31
|
+
:wmid => (doc.at('//testwmpurse/wmid').inner_html rescue nil),
|
32
|
+
:purse => (doc.at('//testwmpurse/purse').inner_html rescue nil)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Webmoney::RequestRetval # :nodoc:all
|
2
|
+
|
3
|
+
def retval_common(doc)
|
4
|
+
retval_element = doc.at('//retval')
|
5
|
+
@error = retval_element.inner_html.to_i
|
6
|
+
@errormsg = doc.at('//retdesc') ? doc.at('//retdesc').inner_html : ''
|
7
|
+
raise Webmoney::ResultError, [@error, @errormsg].join(' ') unless @error == 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def retval_get_passport(doc)
|
11
|
+
# retval is attribute <response>
|
12
|
+
@error = doc.at('//response')['retval'].to_i
|
13
|
+
@errormsg = doc.at('//response')['retdesc']
|
14
|
+
raise Webmoney::ResultError, [@error, @errormsg].join(' ') unless @error == 0
|
15
|
+
raise Webmoney::NonExistentWmidError unless doc.at('/response/certinfo/attestat')
|
16
|
+
end
|
17
|
+
|
18
|
+
def retval_find_wm(doc)
|
19
|
+
# do nothing
|
20
|
+
# retval = { 1 - found; 0 - not found }
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
module Webmoney::
|
1
|
+
module Webmoney::RequestXML # :nodoc:all
|
2
2
|
|
3
3
|
def envelope(utf = true)
|
4
4
|
x = Builder::XmlMarkup.new(:indent => 1)
|
5
5
|
encoding = utf ? "utf-8" : "windows-1251"
|
6
6
|
x.instruct!(:xml, :version => "1.0", :encoding => encoding)
|
7
7
|
x
|
8
|
-
end
|
8
|
+
end
|
9
9
|
|
10
10
|
def xml_get_passport(opt)
|
11
11
|
x = envelope(false)
|
@@ -66,4 +66,22 @@ module Webmoney::XMLRequest # :nodoc:all
|
|
66
66
|
x
|
67
67
|
end
|
68
68
|
|
69
|
+
def xml_find_wm(opt)
|
70
|
+
x = envelope(false)
|
71
|
+
req = reqn()
|
72
|
+
x.tag!('w3s.request') do
|
73
|
+
x.wmid @wmid
|
74
|
+
x.reqn req
|
75
|
+
x.testwmpurse do
|
76
|
+
x.wmid( opt[:wmid] || '' )
|
77
|
+
x.purse( opt[:purse] || '' )
|
78
|
+
end
|
79
|
+
if classic?
|
80
|
+
@plan = "#{opt[:wmid]}#{opt[:purse]}"
|
81
|
+
x.sign sign(@plan)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
x
|
85
|
+
end
|
86
|
+
|
69
87
|
end
|
data/lib/webmoney.rb
CHANGED
@@ -11,20 +11,15 @@ require 'builder'
|
|
11
11
|
require 'hpricot'
|
12
12
|
|
13
13
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
|
14
|
+
%w(wmsigner wmid passport purse request_xml request_retval request_result messenger).each { |lib| require lib }
|
14
15
|
|
15
|
-
|
16
|
-
require 'wmid'
|
17
|
-
require 'passport'
|
18
|
-
require 'request'
|
19
|
-
require 'result'
|
20
|
-
require 'messenger'
|
21
|
-
|
22
|
-
# Main class for Webmoney lib. Instance contain info
|
16
|
+
# Module for Webmoney lib. Instance contain info
|
23
17
|
# for WMT-interfaces requests (wmid, key, etc).
|
24
18
|
# Implement general requests.
|
25
|
-
|
19
|
+
module Webmoney
|
26
20
|
|
27
|
-
include
|
21
|
+
include RequestXML
|
22
|
+
include RequestRetval
|
28
23
|
include RequestResult
|
29
24
|
|
30
25
|
# Error classes
|
@@ -32,12 +27,14 @@ class Webmoney
|
|
32
27
|
class RequestError < WebmoneyError; end
|
33
28
|
class ResultError < WebmoneyError; end
|
34
29
|
class IncorrectWmidError < WebmoneyError; end
|
30
|
+
class IncorrectPurseError < WebmoneyError; end
|
35
31
|
class NonExistentWmidError < WebmoneyError; end
|
36
32
|
class CaCertificateError < WebmoneyError; end
|
37
33
|
|
38
|
-
attr_reader :wmid, :error, :errormsg, :last_request
|
39
|
-
attr_accessor :interfaces
|
40
|
-
|
34
|
+
attr_reader :wmid, :error, :errormsg, :last_request
|
35
|
+
attr_accessor :interfaces, :messenger
|
36
|
+
|
37
|
+
|
41
38
|
# Required options:
|
42
39
|
#
|
43
40
|
# - :wmid - WMID
|
@@ -51,11 +48,12 @@ class Webmoney
|
|
51
48
|
#
|
52
49
|
# Optional:
|
53
50
|
#
|
54
|
-
# - :ca_cert - path
|
51
|
+
# - :ca_cert - file CA certificate or path to directory with certs (in PEM format)
|
55
52
|
|
56
53
|
def initialize(opt = {})
|
54
|
+
|
57
55
|
@wmid = Wmid.new(opt[:wmid])
|
58
|
-
|
56
|
+
|
59
57
|
# classic or light
|
60
58
|
case opt[:key]
|
61
59
|
when String
|
@@ -65,9 +63,9 @@ class Webmoney
|
|
65
63
|
@cert = opt[:cert]
|
66
64
|
@password = opt[:password]
|
67
65
|
end
|
68
|
-
|
66
|
+
|
69
67
|
# ca_cert or default
|
70
|
-
@ca_cert =
|
68
|
+
@ca_cert =
|
71
69
|
if opt[:ca_cert].nil?
|
72
70
|
File.dirname(__FILE__) + '/../lib/certs/'
|
73
71
|
else
|
@@ -75,7 +73,7 @@ class Webmoney
|
|
75
73
|
end
|
76
74
|
|
77
75
|
w3s = 'https://w3s.wmtransfer.com/asp/'
|
78
|
-
|
76
|
+
|
79
77
|
@interfaces = {
|
80
78
|
'create_invoice' => URI.parse( w3s + 'XMLInvoice.asp' ), # x1
|
81
79
|
'create_transaction' => URI.parse( w3s + 'XMLTrans.asp' ), # x2
|
@@ -94,17 +92,22 @@ class Webmoney
|
|
94
92
|
'trust_me' => URI.parse( w3s + 'XMLTrustList2.asp'), # x15
|
95
93
|
'trust_save' => URI.parse( w3s + 'XMLTrustSave2.asp'), # x15
|
96
94
|
'create_purse' => URI.parse( w3s + 'XMLCreatePurse.asp'), # x16
|
95
|
+
'create_contract' => URI.parse( 'https://arbitrage.webmoney.ru/xml/X17_CreateContract.aspx'), # x17
|
96
|
+
'transaction_get' => URI.parse( 'https://merchant.webmoney.ru/conf/xml/XMLTransGet.asp'), # x18
|
97
97
|
'bussines_level' => URI.parse( 'https://stats.wmtransfer.com/levels/XMLWMIDLevel.aspx')
|
98
98
|
}
|
99
99
|
# Iconv.new(to, from)
|
100
100
|
@ic_in = Iconv.new('UTF-8', 'CP1251')
|
101
101
|
@ic_out = Iconv.new('CP1251', 'UTF-8')
|
102
|
+
|
103
|
+
# initialize workers by self
|
104
|
+
Purse.worker = self
|
105
|
+
Passport.worker = self
|
102
106
|
end
|
103
107
|
|
104
108
|
# Webmoney instance is classic type?
|
105
|
-
|
106
109
|
def classic?
|
107
|
-
|
110
|
+
!! @signer
|
108
111
|
end
|
109
112
|
|
110
113
|
# Send message through Queue and Thread
|
@@ -112,23 +115,32 @@ class Webmoney
|
|
112
115
|
# Params: { :wmid, :subj, :text }
|
113
116
|
|
114
117
|
def send_message(params)
|
115
|
-
@messenger = Messenger.new(self) if @messenger.nil?
|
118
|
+
@messenger = Messenger.new(self){} if @messenger.nil?
|
116
119
|
@messenger.push(params)
|
117
120
|
end
|
121
|
+
|
122
|
+
# Check existent WMID or not
|
123
|
+
#
|
124
|
+
# Params: wmid
|
125
|
+
def wmid_exist?(wmid)
|
126
|
+
request(:find_wm, :wmid => Wmid.new(wmid))[:retval] == 1
|
127
|
+
end
|
118
128
|
|
119
129
|
# Generic function for request to WMT-interfaces
|
120
130
|
|
121
131
|
def request(iface, opt ={})
|
122
|
-
|
123
|
-
|
124
|
-
|
132
|
+
raise ArgumentError, "should be hash" unless opt.kind_of?(Hash)
|
133
|
+
|
134
|
+
# Use self wmid when not defined
|
135
|
+
opt[:wmid] ||= @wmid
|
125
136
|
|
126
137
|
# Do request
|
127
138
|
res = https_request(iface, make_xml(iface, opt))
|
128
139
|
|
129
140
|
# Parse response
|
130
|
-
|
131
|
-
|
141
|
+
doc = Hpricot.XML(res)
|
142
|
+
parse_retval(iface, doc)
|
143
|
+
make_result(iface, doc)
|
132
144
|
end
|
133
145
|
|
134
146
|
# Signing string by instance wmid's,
|
@@ -173,24 +185,6 @@ class Webmoney
|
|
173
185
|
end
|
174
186
|
end
|
175
187
|
|
176
|
-
def parse_retval(response_xml) # :nodoc:
|
177
|
-
doc = Hpricot.XML(response_xml)
|
178
|
-
retval_element = doc.at('//retval')
|
179
|
-
# Workaround for passport interface
|
180
|
-
unless retval_element.nil?
|
181
|
-
retval = retval_element.inner_html.to_i
|
182
|
-
retdesc = doc.at('//retdesc').inner_html unless doc.at('//retdesc').nil?
|
183
|
-
else
|
184
|
-
retval = doc.at('//response')['retval'].to_i
|
185
|
-
retdesc = doc.at('//response')['retdesc']
|
186
|
-
end
|
187
|
-
unless retval == 0
|
188
|
-
@error = retval
|
189
|
-
@errormsg = retdesc
|
190
|
-
raise ResultError, [@error, @errormsg].join(' ')
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
188
|
# Create unique Request Number based on time,
|
195
189
|
# return 16 digits string
|
196
190
|
def reqn
|
@@ -200,18 +194,22 @@ class Webmoney
|
|
200
194
|
end
|
201
195
|
|
202
196
|
def make_xml(iface, opt) # :nodoc:
|
203
|
-
iface_func =
|
204
|
-
|
205
|
-
rescue NoMethodError
|
206
|
-
raise NotImplementedError, "#{iface_func}()"
|
197
|
+
iface_func = "xml_#{iface}"
|
198
|
+
send(iface_func, opt).target!
|
207
199
|
end
|
208
200
|
|
209
|
-
def
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
201
|
+
def parse_retval(iface, doc) # :nodoc:
|
202
|
+
method = "retval_#{iface}"
|
203
|
+
if respond_to?(method)
|
204
|
+
send(method, doc)
|
205
|
+
else
|
206
|
+
retval_common(doc)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def make_result(iface, doc) # :nodoc:
|
211
|
+
iface_result = "result_#{iface}"
|
212
|
+
send(iface_result, doc)
|
215
213
|
end
|
216
214
|
|
217
215
|
end
|
data/lib/wmid.rb
CHANGED
data/rakefile
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -15,8 +15,12 @@ if ENV['WM_ENV']
|
|
15
15
|
end
|
16
16
|
::WmConfig = OpenStruct.new(config.common)
|
17
17
|
|
18
|
+
class TestWM
|
19
|
+
include Webmoney
|
20
|
+
end
|
21
|
+
|
18
22
|
def webmoney
|
19
|
-
|
23
|
+
TestWM.new :wmid => WmConfig.wmid,
|
20
24
|
:password => WmConfig.password,
|
21
25
|
:key => WmConfig.key,
|
22
26
|
:ca_cert => WmConfig.ca_cert
|
data/spec/unit/messenger_spec.rb
CHANGED
@@ -1,25 +1,40 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
module Webmoney
|
4
4
|
|
5
5
|
describe Messenger, "class" do
|
6
6
|
|
7
7
|
before(:each) do
|
8
|
-
@wm = webmoney()
|
8
|
+
@wm = webmoney()
|
9
|
+
@params = { :wmid => @wm.wmid, :subj => 'FIRST', :text => 'BODY' }
|
9
10
|
end
|
10
11
|
|
11
12
|
it "should create instance" do
|
12
13
|
@wm.messenger.should be_nil
|
13
|
-
@wm.send_message(
|
14
|
+
@wm.send_message(@params)
|
14
15
|
@wm.messenger.should be_instance_of(Messenger)
|
15
16
|
end
|
16
|
-
|
17
|
+
|
18
|
+
it "should send with logger call" do
|
19
|
+
self.should_receive(:log_it).once()
|
20
|
+
logger = Proc.new do |msg, result|
|
21
|
+
case result
|
22
|
+
when Hash
|
23
|
+
log_it "Message #{msg.inspect} sended in:#{result[:date]} with id:#{result[:id]}"
|
24
|
+
else
|
25
|
+
log_it "Error sent message #{msg.inspect}: #{result.message}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
@wm.messenger = Messenger.new(@wm, &logger)
|
29
|
+
@wm.send_message(@params)
|
30
|
+
sleep(2)
|
31
|
+
end
|
32
|
+
|
17
33
|
it "should call request(:send_message) twice" do
|
18
|
-
params = { :wmid => @wm.wmid, :subj => 'FIRST', :text => 'BODY' }
|
19
34
|
@wm.should_receive(:request).
|
20
|
-
with(:send_message, params).twice().and_return({:test => 'test'})
|
21
|
-
@wm.send_message(params)
|
22
|
-
|
35
|
+
with(:send_message, @params).twice().and_return({:test => 'test'})
|
36
|
+
2.times {@wm.send_message(@params)}
|
37
|
+
sleep(2)
|
23
38
|
end
|
24
39
|
|
25
40
|
end
|
data/spec/unit/passport_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
module Webmoney
|
4
4
|
|
5
5
|
describe Passport, "class" do
|
6
6
|
|
@@ -8,38 +8,34 @@ class Webmoney
|
|
8
8
|
@wm = webmoney()
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
x = Builder::XmlMarkup.new
|
14
|
-
x.request do
|
15
|
-
x.wmid @wm.wmid
|
16
|
-
x.passportwmid test_wmid
|
17
|
-
x.sign @wm.send(:sign, @wm.wmid + test_wmid)
|
18
|
-
x.params { x.dict 0; x.info 1; x.mode 0 }
|
19
|
-
end
|
20
|
-
x.target!
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should return empty on incorrect xml" do
|
24
|
-
Passport.new('<response/>').should == ''
|
11
|
+
it "should return Passport instance" do
|
12
|
+
Passport.new(@wm.wmid).should be_instance_of(Passport)
|
25
13
|
end
|
26
14
|
|
27
|
-
it "should
|
28
|
-
|
15
|
+
it "request result get_passport should be Hash" do
|
16
|
+
@wm.request(:get_passport, :wmid => @wm.wmid).should be_instance_of(Hash)
|
29
17
|
end
|
30
18
|
|
31
19
|
it "should return correct data" do
|
32
20
|
wmid = '000000000007'
|
33
|
-
p = Passport.new(
|
21
|
+
p = Passport.new(wmid)
|
34
22
|
p.wmid.should == wmid
|
35
|
-
p.attestat.should == Webmoney::Passport::REGISTRATOR
|
36
|
-
p.created_at.strftime('%Y-%m-%d %H:%M:%S').should == '2004-02-25 21:54:01'
|
23
|
+
p.attestat[:attestat].should == Webmoney::Passport::REGISTRATOR
|
24
|
+
p.attestat[:created_at].strftime('%Y-%m-%d %H:%M:%S').should == '2004-02-25 21:54:01'
|
37
25
|
|
38
26
|
wmid = '370860915669'
|
39
|
-
p = Passport.new(
|
27
|
+
p = Passport.new(wmid)
|
40
28
|
p.wmid.should == wmid
|
41
|
-
p.attestat.should == Webmoney::Passport::ALIAS
|
42
|
-
p.created_at.strftime('%Y-%m-%d %H:%M:%S').should == '2006-04-19 10:16:30'
|
29
|
+
p.attestat[:attestat].should == Webmoney::Passport::ALIAS
|
30
|
+
p.attestat[:created_at].strftime('%Y-%m-%d %H:%M:%S').should == '2006-04-19 10:16:30'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should raise exception on bad WMID" do
|
34
|
+
lambda {@wm.request(:get_passport, :wmid => '111')}.should raise_error(Webmoney::ResultError)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should raise exception on non existent WMID" do
|
38
|
+
lambda {@wm.request(:get_passport, :wmid => '012345678901')}.should raise_error(Webmoney::NonExistentWmidError)
|
43
39
|
end
|
44
40
|
|
45
41
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
module Webmoney
|
4
|
+
|
5
|
+
describe Purse, "class" do
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
# initialize worker
|
9
|
+
@wm = webmoney
|
10
|
+
end
|
11
|
+
|
12
|
+
before(:each) do
|
13
|
+
@t = Purse.new('Z136894439563')
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should be kind of Wmid" do
|
17
|
+
@t.should be_kind_of(Purse)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be string" do
|
21
|
+
@t.should == 'Z136894439563'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should raise error on incorrect" do
|
25
|
+
lambda{ Purse.new('X123456789012') }.
|
26
|
+
should raise_error(IncorrectPurseError)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return wmid" do
|
30
|
+
@t.wmid.should == '405424574082'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return true" do
|
34
|
+
@wm.should_receive(:request).with(:find_wm, :purse => @t).and_return(:retval=>1, :wmid => '405424574082')
|
35
|
+
@t.belong_to?('405424574082').should be_true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return false" do
|
39
|
+
@wm.should_receive(:request).with(:find_wm, :purse => @t).and_return(:retval=>0)
|
40
|
+
@t.belong_to?('123456789012').should be_false
|
41
|
+
end
|
42
|
+
|
43
|
+
context "memoize" do
|
44
|
+
|
45
|
+
before(:each) { @t.wmid }
|
46
|
+
|
47
|
+
it "it" do
|
48
|
+
@wm.should_not_receive(:request).with(:find_wm, :purse => @t)
|
49
|
+
@t.belong_to?('405424574082').should be_true
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
data/spec/unit/webmoney_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
module Webmoney
|
4
4
|
|
5
5
|
describe Webmoney, "class" do
|
6
6
|
|
@@ -8,10 +8,6 @@ class Webmoney
|
|
8
8
|
@wm = webmoney()
|
9
9
|
end
|
10
10
|
|
11
|
-
it "should be instance of Webmoney" do
|
12
|
-
@wm.should be_instance_of(Webmoney)
|
13
|
-
end
|
14
|
-
|
15
11
|
it "should be classic" do
|
16
12
|
@wm.classic?.should be_true
|
17
13
|
end
|
@@ -95,10 +91,6 @@ class Webmoney
|
|
95
91
|
@wm.errormsg.should match(%r{неверно указан проверяемый WMID})
|
96
92
|
end
|
97
93
|
|
98
|
-
it "should get_passport" do
|
99
|
-
@wm.request(:get_passport, :wmid => @wm.wmid).should be_instance_of(Passport)
|
100
|
-
end
|
101
|
-
|
102
94
|
it "should raise exception on bad WMID" do
|
103
95
|
lambda {@wm.request(:get_passport, :wmid => '111')}.should raise_error(Webmoney::ResultError)
|
104
96
|
end
|
@@ -117,15 +109,17 @@ class Webmoney
|
|
117
109
|
end
|
118
110
|
|
119
111
|
it "should send message" do
|
120
|
-
result = @wm.request(:send_message,
|
121
|
-
:wmid => @wm.wmid,
|
112
|
+
result = @wm.request( :send_message,
|
113
|
+
:wmid => @wm.wmid,
|
114
|
+
:subj => 'Текст',
|
115
|
+
:text => 'Тело <b>сообщения</b>')
|
122
116
|
result.should be_kind_of(Hash)
|
123
117
|
result[:id].should match(/^\d*$/)
|
124
118
|
((result[:date] + 60) > Time.now).should be_true
|
125
119
|
end
|
126
120
|
|
127
121
|
it "should raise error on undefined xml func" do
|
128
|
-
lambda { @wm.request(:unexistent_interface) }.should raise_error(::
|
122
|
+
lambda { @wm.request(:unexistent_interface) }.should raise_error(::NoMethodError)
|
129
123
|
end
|
130
124
|
|
131
125
|
end
|
data/spec/unit/wmid_spec.rb
CHANGED
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.8
|
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-10-03 00:00:00 +04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,7 +32,11 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: "0"
|
34
34
|
version:
|
35
|
-
description:
|
35
|
+
description: |
|
36
|
+
This library should help to make requests to WebMoney Transfer http://www.wmtransfer.com
|
37
|
+
XML-interfaces: http://www.wmtransfer.com/eng/developers/interfaces/index.shtml
|
38
|
+
Gem have built-in native wmsigner tool.
|
39
|
+
|
36
40
|
email: eagle.alex@gmail.com
|
37
41
|
executables: []
|
38
42
|
|
@@ -50,9 +54,11 @@ files:
|
|
50
54
|
- lib/certs/AddTrust_External_Root.crt
|
51
55
|
- lib/certs/WebMoneyCA.crt
|
52
56
|
- lib/messenger.rb
|
53
|
-
- lib/
|
54
|
-
- lib/
|
57
|
+
- lib/request_result.rb
|
58
|
+
- lib/request_retval.rb
|
59
|
+
- lib/request_xml.rb
|
55
60
|
- lib/passport.rb
|
61
|
+
- lib/purse.rb
|
56
62
|
- lib/webmoney.rb
|
57
63
|
- lib/wmid.rb
|
58
64
|
- ext/wmsigner/extconf.rb
|
@@ -104,6 +110,7 @@ test_files:
|
|
104
110
|
- spec/spec_helper.rb
|
105
111
|
- spec/unit/messenger_spec.rb
|
106
112
|
- spec/unit/passport_spec.rb
|
113
|
+
- spec/unit/purse_spec.rb
|
107
114
|
- spec/unit/signer_spec.rb
|
108
115
|
- spec/unit/time_spec.rb
|
109
116
|
- spec/unit/webmoney_spec.rb
|
data/lib/result.rb
DELETED
@@ -1,21 +0,0 @@
|
|
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
|