webmoney 0.0.8 → 0.0.9

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 CHANGED
@@ -1,12 +1,18 @@
1
1
  ChangeLog
2
2
 
3
+ Mon Sep 20 2010 14:31:00 +0300
4
+ ----------------------------
5
+ V 0.0.9
6
+ * Add light-keys support
7
+ * Fix Purse bug
8
+ * Add Passport#wmids method
9
+
3
10
  Mon Aug 24 2010 12:00:00 +0300
4
11
  ----------------------------
5
12
  V 0.0.8
6
13
  * Compatible with ruby 1.9.2
7
14
  * Added Gemfile
8
15
 
9
-
10
16
  Mon Jun 07 2010 19:01:30 +0400
11
17
  ----------------------------
12
18
  V 0.0.7
data/README CHANGED
@@ -113,4 +113,38 @@ purse.wmid # => '123456789012'
113
113
  purse.belong_to?('123456789012') # => true
114
114
 
115
115
 
116
+ == Example: Create invoice and check it's state
117
+
118
+ @wm = MyWM.new(:wmid => '123456789012', :password => 'my_pass', :key => 'gQABAIR6...2cC8FZTyKyjBM=')
119
+
120
+ # Create invoice
121
+ @invoice = @wm.request(:create_invoice,
122
+ :orderid => 5,
123
+ :amount => 10,
124
+ :customerwmid => CUSTOMER_WMID,
125
+ :storepurse => STORE_PURSE,
126
+ :desc => "Test invoice",
127
+ :address => "Delivery Address"
128
+ )
129
+
130
+ # Check state
131
+ res = @wm.request(:outgoing_invoices,
132
+ :purse => STORE_PURSE,
133
+ :wminvid => @invoice[:id],
134
+ :orderid => @invoice[:orderid],
135
+ :customerwmid => CUSTOMER_WMID,
136
+ :datestart => @invoice[:created_at],
137
+ :datefinish => @invoice[:created_at]
138
+ )
139
+ if res[:retval].should == 0 && !res[:invoices].empty?
140
+ invoice = res[:invoices].first
141
+ case invoice[:state]
142
+ when 0 then # Not Paid
143
+ when 1 then # Paid with protection
144
+ when 2 then # Payment complete
145
+ when 3 then # Rejected
146
+ end
147
+ end
148
+
149
+
116
150
  Also, see spec/* for examples.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.8
1
+ 0.0.9
data/lib/passport.rb CHANGED
@@ -35,6 +35,7 @@ module Webmoney
35
35
  def directory; @directory ||= getinfo[:directory] end
36
36
  def full_access; @full_access = getinfo[:full_access] end
37
37
  def userinfo; @userinfo ||= getinfo[:userinfo] end
38
+ def wmids; @userinfo ||= getinfo[:wmids] end
38
39
 
39
40
  protected
40
41
 
@@ -100,4 +101,4 @@ module Webmoney
100
101
  end
101
102
 
102
103
  end
103
- end
104
+ end
data/lib/purse.rb CHANGED
@@ -26,7 +26,7 @@ module Webmoney
26
26
  # memoize
27
27
  @wmid ||=
28
28
  begin
29
- res = @@worker.request(:find_wm, :purse => self)
29
+ res = @@worker.request(:find_wm, :purse => self, :wmid => "")
30
30
  res[:retval] == 1 ? Wmid.new(res[:wmid]) : nil
31
31
  end
32
32
  end
@@ -28,6 +28,21 @@ module Webmoney::RequestResult # :nodoc:all
28
28
  }
29
29
  end
30
30
 
31
+ def result_create_invoice(doc)
32
+ res = {
33
+ :retval => doc.at('//retval').inner_html.to_i,
34
+ :retdesc => (doc.at('//testwmpurse/retdesc').inner_html rescue nil),
35
+ :orderid => (doc.at('//invoice/orderid').inner_html.to_i),
36
+ }
37
+ if res[:retval] == 0
38
+ res[:id] = (doc.at('//invoice').attributes['id'].value.to_i)
39
+ res[:ts] = (doc.at('//invoice').attributes['ts'].value.to_i)
40
+ res[:state] = (doc.at('//invoice/state').inner_html.to_i)
41
+ res[:created_at] = (DateTime.strptime(doc.at('//invoice/datecrt').inner_html, "%Y%m%d %H:%M:%S"))
42
+ end
43
+ res
44
+ end
45
+
31
46
  def result_create_transaction(doc)
32
47
  op = doc.at('//operation')
33
48
  {
@@ -38,4 +53,28 @@ module Webmoney::RequestResult # :nodoc:all
38
53
  end )
39
54
  end
40
55
 
41
- end
56
+ def result_outgoing_invoices(doc)
57
+ res = {
58
+ :retval => doc.at('//retval').inner_html.to_i,
59
+ :retdesc => (doc.at('//testwmpurse/retdesc').inner_html rescue nil),
60
+ }
61
+ if res[:retval] == 0
62
+ res[:invoices] = doc.at('//outinvoices').elements.collect do |invoice|
63
+ r = {
64
+ :id => invoice.attributes['id'].value.to_i,
65
+ :ts => invoice.attributes['ts'].value.to_i,
66
+ }
67
+ invoice.elements.each do |tag|
68
+ name = tag.name.to_sym
69
+ value = tag.inner_html
70
+ value = value.to_i if [:orderid, :tranid, :period, :expiration, :wmtranid, :state].include?(name)
71
+ value = value.to_f if [:rest, :amount, :comiss].include?(name)
72
+ value = DateTime.strptime(value, "%Y%m%d %H:%M:%S") if [:datecrt, :dateupd].include?(name)
73
+ r[name] = value
74
+ end
75
+ r
76
+ end
77
+ end
78
+ res
79
+ end
80
+ end
@@ -21,4 +21,15 @@ module Webmoney::RequestRetval # :nodoc:all
21
21
  # retval = { 1 - found; 0 - not found }
22
22
  end
23
23
 
24
- end
24
+ def retval_create_invoice(doc)
25
+ @error = doc.at('//retval').inner_html.to_i
26
+ @errormsg = doc.at('//retdesc').inner_html
27
+ raise Webmoney::ResultError, [@error, @errormsg].join(' ') unless @error == 0
28
+ end
29
+
30
+ def retval_outgoing_invoices(doc)
31
+ @error = doc.at('//retval').inner_html.to_i
32
+ @errormsg = doc.at('//retdesc').inner_html
33
+ raise Webmoney::ResultError, [@error, @errormsg].join(' ') unless @error == 0
34
+ end
35
+ end
data/lib/request_xml.rb CHANGED
@@ -83,7 +83,35 @@ module Webmoney::RequestXML # :nodoc:all
83
83
  }
84
84
  end
85
85
 
86
- def xml_create_transaction(opt)
86
+ def xml_create_invoice(opt)
87
+ req = reqn()
88
+ desc = @ic_out.iconv(opt[:desc])
89
+ address = @ic_out.iconv(opt[:address])[0...255].strip
90
+ amount = opt[:amount].to_f.to_s.gsub(/\.?0+$/, '')
91
+ Nokogiri::XML::Builder.new( :encoding => 'windows-1251' ) { |x|
92
+ x.send('w3s.request') {
93
+ x.wmid @wmid
94
+ x.reqn req
95
+ x.invoice do
96
+ x.orderid opt[:orderid]
97
+ x.customerwmid opt[:customerwmid]
98
+ x.storepurse opt[:storepurse]
99
+ x.amount amount
100
+ x.desc desc
101
+ x.address address
102
+ x.period opt[:period].to_i
103
+ x.expiration opt[:expiration].to_i
104
+ end
105
+ if classic?
106
+ @plan = "#{opt[:orderid]}#{opt[:customerwmid]}#{opt[:storepurse]}" + amount
107
+ @plan+= desc + address + "#{opt[:period].to_i}#{opt[:expiration].to_i}" + req
108
+ x.sign sign(@plan)
109
+ end
110
+ }
111
+ }
112
+ end
113
+
114
+ def xml_create_transaction(opt)
87
115
  req = reqn()
88
116
  desc = @ic_out.iconv(opt[:desc]) # description
89
117
  Nokogiri::XML::Builder.new( :encoding => 'windows-1251' ) { |x|
@@ -105,4 +133,25 @@ module Webmoney::RequestXML # :nodoc:all
105
133
  }
106
134
  end
107
135
 
136
+ def xml_outgoing_invoices(opt)
137
+ req = reqn()
138
+ Nokogiri::XML::Builder.new( :encoding => 'windows-1251' ) { |x|
139
+ x.send('w3s.request') {
140
+ x.wmid @wmid
141
+ x.reqn req
142
+ x.getoutinvoices do
143
+ x.purse opt[:purse]
144
+ x.wminvid opt[:wminvid]
145
+ x.orderid opt[:orderid]
146
+ x.datestart opt[:datestart].strftime("%Y%m%d %H:%M:%S")
147
+ x.datefinish opt[:datefinish].strftime("%Y%m%d %H:%M:%S")
148
+ end
149
+ if classic?
150
+ # TODO
151
+ @plan = opt[:purse] + req
152
+ x.sign sign(@plan)
153
+ end
154
+ }
155
+ }
156
+ end
108
157
  end
data/lib/webmoney.rb CHANGED
@@ -139,7 +139,7 @@ module Webmoney
139
139
  def wmid_exist?(wmid)
140
140
  request(:find_wm, :wmid => Wmid.new(wmid))[:retval] == 1
141
141
  end
142
-
142
+
143
143
  # Generic function for request to WMT-interfaces
144
144
 
145
145
  def request(iface, opt ={})
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,25 @@
1
1
  #encoding: utf-8
2
+ #
3
+ # ~/.wm/config.yml example:
4
+ #
5
+ # ca_cert:
6
+ #
7
+ # first:
8
+ # wmtype: classic
9
+ # wmid:
10
+ # password:
11
+ # key:
12
+ # wmz:
13
+ #
14
+ # second:
15
+ # wmtype: light
16
+ # wmid:
17
+ # password:
18
+ # cert: webmoney.cert
19
+ # key: webmoney.key
20
+ # wmz:
21
+ #
22
+
2
23
  require 'rubygems'
3
24
  require 'test/unit'
4
25
  require 'spec'
@@ -8,23 +29,49 @@ require 'time'
8
29
  require File.dirname(__FILE__) + '/../lib/webmoney'
9
30
 
10
31
  # Variables may be access, for example WmConfig.wmid
11
- config = OpenStruct.new(YAML.load_file("#{ENV['HOME']}/.wm/config.yml"))
32
+ config = YAML.load_file("#{ENV['HOME']}/.wm/config.yml")
12
33
  if ENV['WM_ENV']
13
34
  env_config = config.send(ENV['WM_ENV'])
14
35
  config.common.update(env_config) unless env_config.nil?
15
36
  end
16
- ::WmConfig = OpenStruct.new(config.common)
37
+ ::WmConfig = OpenStruct.new(config)
38
+ raise "First user wmtype must be classic!" if WmConfig.first['wmtype'] != 'classic'
17
39
 
18
40
  class TestWM
19
41
  include Webmoney
20
42
 
21
43
  def initialize(opt = {})
22
- defaults = {:wmid => WmConfig.wmid,
23
- :password => WmConfig.password,
24
- :key => WmConfig.key,
44
+ defaults = {:wmid => WmConfig.first['wmid'],
45
+ :password => WmConfig.first['password'],
46
+ :key => WmConfig.first['key'],
25
47
  :ca_cert => WmConfig.ca_cert}
26
48
  defaults.merge!(opt)
27
49
  super(defaults)
28
50
  end
51
+ end
52
+
53
+ def getwm(config)
54
+ if config.wmtype == "light"
55
+ # light
56
+ cert = OpenSSL::X509::Certificate.new(File.read(config.cert))
57
+ key = OpenSSL::PKey::RSA.new(File.read(config.key), config.password)
58
+ TestWM.new :wmid => config.wmid,
59
+ :key => key,
60
+ :cert => cert,
61
+ :ca_cert => WmConfig.ca_cert
62
+ else
63
+ # classic
64
+ TestWM.new :wmid => config.wmid,
65
+ :password => config.password,
66
+ :key => config.key,
67
+ :ca_cert => config.ca_cert
68
+ end
69
+ end
70
+
71
+ def webmoney
72
+ getwm(OpenStruct.new(WmConfig.first))
73
+ end
29
74
 
75
+ def contragent
76
+ getwm(OpenStruct.new(WmConfig.second))
30
77
  end
@@ -123,4 +123,10 @@ describe Webmoney::Passport, "class" do
123
123
  lambda {@wm.request(:get_passport, :wmid => '012345678901')}.should raise_error(Webmoney::NonExistentWmidError)
124
124
  end
125
125
 
126
+ it "should have wmids" do
127
+ passport = Webmoney::Passport.new(@wm.wmid)
128
+ passport.wmids.should be_instance_of(Hash)
129
+ passport.wmids.has_key?(@wm.wmid).should be_true
130
+ passport.wmids[@wm.wmid].should be_instance_of(Hash)
131
+ end
126
132
  end
@@ -12,6 +12,11 @@ describe Webmoney::Purse, "class" do
12
12
  @t = Webmoney::Purse.new('Z136894439563')
13
13
  end
14
14
 
15
+ it "should return 111111111111 wmid for Z111111111111 purse" do
16
+ t = Webmoney::Purse.new("Z111111111111")
17
+ t.wmid.should == '111111111111'
18
+ end
19
+
15
20
  it "should be kind of Wmid" do
16
21
  @t.should be_kind_of(Webmoney::Purse)
17
22
  end
@@ -26,16 +31,16 @@ describe Webmoney::Purse, "class" do
26
31
  end
27
32
 
28
33
  it "should return wmid" do
29
- @t.wmid.should == '405424574082'
34
+ @t.wmid.should == '128984249415'
30
35
  end
31
36
 
32
37
  it "should return true" do
33
- @wm.should_receive(:request).with(:find_wm, :purse => @t).and_return(:retval=>1, :wmid => '405424574082')
34
- @t.belong_to?('405424574082').should be_true
38
+ @wm.should_receive(:request).with(:find_wm, :purse => @t, :wmid => '').and_return(:retval=>1, :wmid => '128984249415')
39
+ @t.belong_to?('128984249415').should be_true
35
40
  end
36
41
 
37
42
  it "should return false" do
38
- @wm.should_receive(:request).with(:find_wm, :purse => @t).and_return(:retval=>0)
43
+ @wm.should_receive(:request).with(:find_wm, :purse => @t, :wmid => '').and_return(:retval=>0, :wmid => '128984249415')
39
44
  @t.belong_to?('123456789012').should be_false
40
45
  end
41
46
 
@@ -45,7 +50,7 @@ describe Webmoney::Purse, "class" do
45
50
 
46
51
  it "it" do
47
52
  @wm.should_not_receive(:request).with(:find_wm, :purse => @t)
48
- @t.belong_to?('405424574082').should be_true
53
+ @t.belong_to?('128984249415').should be_true
49
54
  end
50
55
 
51
56
  end
@@ -3,8 +3,8 @@ require 'spec_helper'
3
3
 
4
4
  describe Signer, "class" do
5
5
 
6
- before(:each) do
7
- @s = Signer.new( WmConfig.wmid, WmConfig.password, WmConfig.key)
6
+ before(:all) do
7
+ @s = Signer.new( WmConfig.first['wmid'].to_s, WmConfig.first['password'], WmConfig.first['key'])
8
8
  end
9
9
 
10
10
  it "should be Signer class" do
@@ -33,4 +33,4 @@ describe Signer, "class" do
33
33
  lambda{Signer.new('405424574082', 'test', '')}.should raise_error(ArgumentError)
34
34
  end
35
35
 
36
- end
36
+ end
@@ -20,7 +20,7 @@ describe Webmoney, "class" do
20
20
  end
21
21
 
22
22
  it "should correct prepare interfaces urls" do
23
- wm = TestWM.new :wmid => WmConfig.wmid , :key => nil
23
+ wm = TestWM.new :wmid => WmConfig.first['wmid'], :key => nil
24
24
  wm.should_not be_classic
25
25
  wm.interfaces[:balance].class.should == URI::HTTPS
26
26
  # converted to light-auth version
@@ -111,6 +111,10 @@ describe Webmoney, "class" do
111
111
  lambda {@wm.request(:get_passport, :wmid => '012345678901')}.should raise_error(Webmoney::NonExistentWmidError)
112
112
  end
113
113
 
114
+ it "should create transaction" do
115
+ # TODO @wm.request( :create_transaction, ...)
116
+ end
117
+
114
118
  it "should return correct BL" do
115
119
  wmid = '370860915669'
116
120
  @wm.request(:bussines_level, :wmid => wmid).should == 0
@@ -163,4 +167,43 @@ describe Webmoney, "class" do
163
167
  lambda { @wm.request(:unexistent_interface) }.should raise_error(::NoMethodError)
164
168
  end
165
169
 
170
+ describe "invoice" do
171
+ before(:each) do
172
+ @wm = webmoney()
173
+ @ca = contragent()
174
+ # create invoice
175
+ @invoice = @ca.request(:create_invoice,
176
+ :orderid => 1,
177
+ :amount => 1,
178
+ :customerwmid => @wm.wmid,
179
+ :storepurse => WmConfig.second['wmz'],
180
+ :desc => "Test invoice",
181
+ :address => "Address"
182
+ )
183
+ end
184
+
185
+ it "should be created" do
186
+ @invoice[:retval].should == 0
187
+ @invoice[:state].should == 0
188
+ @invoice[:orderid].should == 1
189
+ @invoice[:ts].should > 0
190
+ @invoice[:id].should > 0
191
+ end
192
+
193
+ it "should be in state 0 (not paid)" do
194
+ res = @ca.request(:outgoing_invoices,
195
+ :purse => WmConfig.second['wmz'],
196
+ :wminvid => @invoice[:id],
197
+ :orderid => @invoice[:orderid],
198
+ :customerwmid => @wm.wmid,
199
+ :datestart => @invoice[:created_at],
200
+ :datefinish => @invoice[:created_at]
201
+ )
202
+ res[:retval].should == 0
203
+ res[:invoices].length.should == 1
204
+ res[:invoices][0][:state].should == 0
205
+ res[:invoices][0][:amount].should == 1
206
+ end
207
+ end
208
+
166
209
  end
data/webmoney.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{webmoney}
8
- s.version = "0.0.8"
8
+ s.version = "0.0.9"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alexander Oryol"]
12
- s.date = %q{2010-08-24}
12
+ s.date = %q{2010-09-20}
13
13
  s.email = %q{eagle.alex@gmail.com}
14
14
  s.extensions = ["ext/wmsigner/extconf.rb"]
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmoney
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 8
10
- version: 0.0.8
9
+ - 9
10
+ version: 0.0.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alexander Oryol
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-24 00:00:00 +04:00
18
+ date: 2010-09-20 00:00:00 +04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency