mollie-payment 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,9 +1,7 @@
1
1
  Mollie Payment
2
2
  ========
3
3
 
4
- This repository is currently a work in progress and under [Documentation Driven Development](http://thinkingphp.org/spliceit/docs/0.1_alpha/pages/ddd_info.html).
5
-
6
- On the one hand to get familiar with documenting and [YARD](http://yardoc.org/). On the other hand to focus on creating an opiniated Ruby-wrapper for the Mollie [iDEAL API](https://www.mollie.nl/beheer/betaaldiensten/documentatie/ideal/).
4
+ A client to interact with the Mollie API. Currently only the [iDEAL operations](https://www.mollie.nl/support/documentatie/betaaldiensten/ideal/) are supported.
7
5
 
8
6
  The generated docs can be [found here](http://rubydoc.info/gems/mollie-payment).
9
7
 
@@ -13,7 +11,9 @@ Develop
13
11
  $ git clone git://github.com/eval/mollie-payment.git
14
12
  $ cd mollie-payment
15
13
  $ bundle
16
- $ bundle exec autotest -s rspec2
14
+ $ rake spec
15
+ # or
16
+ $ bundle exec autotest
17
17
 
18
18
  Author
19
19
  ------
@@ -1,11 +1,37 @@
1
1
  require 'httparty'
2
2
 
3
3
  module Mollie
4
+ class IdealException < RuntimeError;end
5
+
6
+ class HTTParty::Response
7
+ def error?
8
+ parsed_response &&
9
+ (item = parsed_response['item']) && (type = item['type']) &&
10
+ 'error' == type
11
+ end
12
+ end
13
+
14
+ class Parser < HTTParty::Parser
15
+ def xml
16
+ result = super['response']
17
+ end
18
+
19
+ # Some responses (mostly error-responses) have content-type 'text/html',
20
+ # but an xml-body; therefor handle all html-responses *initially* as xml.
21
+ def html
22
+ xml
23
+ rescue MultiXml::ParseError, StandardError
24
+ super
25
+ end
26
+ end
27
+
4
28
  class Ideal
5
29
  include HTTParty
30
+ parser Mollie::Parser
6
31
  base_uri 'https://secure.mollie.nl/xml/ideal'
7
32
 
8
33
  attr_reader :partner_id, :production
34
+
9
35
  # Create a new Ideal object
10
36
  #
11
37
  # @param [String] partner_id your Mollie partner id
@@ -29,8 +55,11 @@ module Mollie
29
55
  #
30
56
  # @return [Array<Hash{Symbol => String}>] the list of banks.
31
57
  def self.banks
32
- resp = get('', :query => {:a => 'banklist'}).parsed_response
33
- resp["response"]["bank"].map do |b|
58
+ resp = get('', :query => {:a => 'banklist'})
59
+ parsed_response = resp.parsed_response
60
+ return error_response(resp) if resp.error?
61
+
62
+ parsed_response["bank"].map do |b|
34
63
  {:id => b["bank_id"], :name => b["bank_name"]}
35
64
  end
36
65
  end
@@ -48,7 +77,7 @@ module Mollie
48
77
  # @option opts [String] :description description of the transaction
49
78
  # (max. 30 characters).
50
79
  # @option opts [String] :report_url address where the result of the
51
- # transaction is sent (POSTed?).
80
+ # transaction is sent.
52
81
  # @option opts [String] :return_url address where the visitor is sent.
53
82
  # @option opts [String] :profile_key (nil) the profile this transaction
54
83
  # should be linked to.
@@ -75,11 +104,14 @@ module Mollie
75
104
  query_options.merge!(:a => 'fetch', :partnerid => self.partner_id)
76
105
  query_options.merge!(:testmode => 'true') unless self.production?
77
106
 
78
- resp = self.class.get('', :query => query_options).parsed_response
79
- order = resp["response"]["order"]
107
+ resp = self.class.get('', :query => query_options, :accept => 'text/xml')
108
+ parsed_response = resp.parsed_response
109
+ return error_response(resp) if resp.error?
110
+
111
+ order = parsed_response["order"]
80
112
 
81
113
  %w(transaction_id amount currency url).map(&:to_sym).inject({}) do |res, k|
82
- v = order[k.to_s]
114
+ v = order[k.to_s] || order[k.to_s.upcase]
83
115
  v = v.to_i if k == :amount
84
116
 
85
117
  res[k] = v
@@ -111,21 +143,31 @@ module Mollie
111
143
  # # and this is the first time you check it.',
112
144
  # # :status => 'Expired'
113
145
  # # }
146
+ # # Example of an error:
147
+ # # => {
148
+ # # :error => {
149
+ # # :code => "-10",
150
+ # # :message => "This is an unknown order."
151
+ # # }
152
+ # # }
114
153
  #
115
154
  # @note Once a transaction is payed, only the next time you verify the
116
155
  # transaction will the value of 'payed' be 'true'.
117
156
  # Else it will be 'false'.
118
- # @return [Hash] the status of the transaction (see example)
157
+ # @return [Hash] the status of the transaction (see example).
119
158
  def verify_transaction(options={})
120
159
  query_options = options_to_query_options(options)
121
160
  query_options.merge!(:a => 'check', :partnerid => self.partner_id)
122
161
  query_options.merge!(:testmode => 'true') unless self.production?
123
162
 
124
- resp = self.class.get('', :query => query_options).parsed_response
125
- order = resp["response"]["order"]
163
+ resp = self.class.get('', :query => query_options)
164
+ parsed_response = resp.parsed_response
165
+ return error_response(resp) if resp.error?
166
+
167
+ order = parsed_response["order"]
126
168
 
127
169
  result = %w(transaction_id amount currency payed status message).map(&:to_sym).inject({}) do |res, k|
128
- v = order[k.to_s]
170
+ v = order[k.to_s] || order[k.to_s.upcase]
129
171
  v = v.to_i if k == :amount
130
172
  v = (v == 'true') if k == :payed
131
173
 
@@ -158,5 +200,10 @@ module Mollie
158
200
  result
159
201
  end
160
202
  end
203
+
204
+ def error_response(response)
205
+ error = response.parsed_response['item']
206
+ {:error => {:code => error['errorcode'], :message => error['message']}}
207
+ end
161
208
  end
162
209
  end
@@ -1,5 +1,5 @@
1
1
  module Mollie
2
2
  class Payment
3
- VERSION = "0.5.0"
3
+ VERSION = "0.6.0"
4
4
  end
5
5
  end
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Gert Goet"]
9
9
  s.email = ["gert@thinkcreate.nl"]
10
10
  s.homepage = "https://github.com/eval/mollie-payment"
11
- s.summary = %q{Client for the Mollie API (currently iDEAL only}
12
- s.description = %q{Client for the Mollie API (currently iDEAL only}
11
+ s.summary = %q{Client for the Mollie API (currently iDEAL-only)}
12
+ s.description = %q{Client for the Mollie API (currently iDEAL-only)}
13
13
 
14
14
  s.rubyforge_project = "mollie-payment"
15
15
 
@@ -18,12 +18,12 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency "httparty"
21
+ s.add_dependency "httparty", "~> 0.8.1"
22
22
 
23
- s.add_development_dependency "yard"
24
- s.add_development_dependency "rdiscount"
25
- s.add_development_dependency "rspec"
26
- s.add_development_dependency "ZenTest"
27
- s.add_development_dependency "vcr"
28
- s.add_development_dependency "webmock"
23
+ s.add_development_dependency "yard", "~> 0.7.4"
24
+ s.add_development_dependency "rdiscount", "~> 1.6.8"
25
+ s.add_development_dependency "rspec", "~> 2.7.0"
26
+ s.add_development_dependency "ZenTest", "~> 4.6.2"
27
+ s.add_development_dependency "vcr", "~> 1.11.3"
28
+ s.add_development_dependency "webmock", "~> 1.7.8"
29
29
  end
@@ -3,7 +3,7 @@ require "bundler"
3
3
  Bundler.setup
4
4
 
5
5
  $:.unshift File.expand_path("../../lib", __FILE__)
6
- require "mollie-ideal"
6
+ require "mollie/ideal"
7
7
 
8
8
  Bundler.require(:test)
9
9
  require 'vcr'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mollie-payment
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,86 +9,86 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-02 00:00:00.000000000Z
12
+ date: 2011-12-23 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
16
- requirement: &70206244600140 !ruby/object:Gem::Requirement
16
+ requirement: &70226691896980 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: 0.8.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70206244600140
24
+ version_requirements: *70226691896980
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: yard
27
- requirement: &70206244599500 !ruby/object:Gem::Requirement
27
+ requirement: &70226691896340 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
- - - ! '>='
30
+ - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: '0'
32
+ version: 0.7.4
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70206244599500
35
+ version_requirements: *70226691896340
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rdiscount
38
- requirement: &70206244598920 !ruby/object:Gem::Requirement
38
+ requirement: &70226691895820 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
- - - ! '>='
41
+ - - ~>
42
42
  - !ruby/object:Gem::Version
43
- version: '0'
43
+ version: 1.6.8
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70206244598920
46
+ version_requirements: *70226691895820
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70206244598340 !ruby/object:Gem::Requirement
49
+ requirement: &70226691895300 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
- - - ! '>='
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 2.7.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70206244598340
57
+ version_requirements: *70226691895300
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: ZenTest
60
- requirement: &70206244597780 !ruby/object:Gem::Requirement
60
+ requirement: &70226691894720 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
- - - ! '>='
63
+ - - ~>
64
64
  - !ruby/object:Gem::Version
65
- version: '0'
65
+ version: 4.6.2
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70206244597780
68
+ version_requirements: *70226691894720
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: vcr
71
- requirement: &70206244597020 !ruby/object:Gem::Requirement
71
+ requirement: &70226691894060 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
- - - ! '>='
74
+ - - ~>
75
75
  - !ruby/object:Gem::Version
76
- version: '0'
76
+ version: 1.11.3
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70206244597020
79
+ version_requirements: *70226691894060
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: webmock
82
- requirement: &70206244596440 !ruby/object:Gem::Requirement
82
+ requirement: &70226691893540 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
- - - ! '>='
85
+ - - ~>
86
86
  - !ruby/object:Gem::Version
87
- version: '0'
87
+ version: 1.7.8
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70206244596440
91
- description: Client for the Mollie API (currently iDEAL only
90
+ version_requirements: *70226691893540
91
+ description: Client for the Mollie API (currently iDEAL-only)
92
92
  email:
93
93
  - gert@thinkcreate.nl
94
94
  executables: []
@@ -133,7 +133,7 @@ rubyforge_project: mollie-payment
133
133
  rubygems_version: 1.8.10
134
134
  signing_key:
135
135
  specification_version: 3
136
- summary: Client for the Mollie API (currently iDEAL only
136
+ summary: Client for the Mollie API (currently iDEAL-only)
137
137
  test_files:
138
138
  - spec/fixtures/vcr_cassettes/banks.yml
139
139
  - spec/fixtures/vcr_cassettes/request_transaction.yml