docdata 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +30 -1
- data/lib/docdata/response.rb +23 -7
- data/lib/docdata/version.rb +1 -1
- data/spec/response_spec.rb +16 -0
- data/spec/xml/status-paid-ideal-multiple.xml +42 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 583612f0f3405d88e304b04589e08faa14fc873c
|
4
|
+
data.tar.gz: e846c3af8a8be9caec3bddb1ca375565feb9e7e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f78048e064e074ffc7e343267d94b45b54d9ef81bbab5a34fd535466557f89746d80d23e3c027d195fa19388588c22a7305d374dd14b8df6c812b137fafcb82
|
7
|
+
data.tar.gz: c039738e8915fa272fd01ea4c95e4e0df54f9823ba89febe6831f67a685f49018b68b8ee6594b930efc301188652b34701cda63a973039c4cf54a56e08e2fa97
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -126,6 +126,35 @@ end
|
|
126
126
|
|
127
127
|
```
|
128
128
|
|
129
|
+
After a payment is completed, Docdata Payments will do two things:
|
130
|
+
|
131
|
+
1. Sends a GET request to your 'Update URL' (you can set this in the back office) with an 'id' parameter, containing your order_reference. This allows you to check the status of the transaction, before the user gets redirected back to your website.
|
132
|
+
2. Redirects the consumer back to the `return_url`.
|
133
|
+
|
134
|
+
```ruby
|
135
|
+
def check_transaction
|
136
|
+
# find the order from your database
|
137
|
+
# https://www.example.com/docdata/update?id=12345
|
138
|
+
@order = Order.find_by_order_reference(params[:id])
|
139
|
+
|
140
|
+
# Find this payment via the Docdata API,
|
141
|
+
# using the previously set 'docdata_key' attribute.
|
142
|
+
payment = Docdata::Payment.find(@order.docdata_key)
|
143
|
+
response = payment.status
|
144
|
+
if response.paid
|
145
|
+
# use your own methods to handle a paid order
|
146
|
+
# for example:
|
147
|
+
@order.mark_as_paid(response.payment_method)
|
148
|
+
else
|
149
|
+
# TODO: create logic to handle failed payments
|
150
|
+
end
|
151
|
+
|
152
|
+
# This action doesn't need a view template. It only needs to have a status 200 (OK)
|
153
|
+
render :nothing => true, :status => 200, :content_type => 'text/html'
|
154
|
+
end
|
155
|
+
|
156
|
+
```
|
157
|
+
|
129
158
|
## Ideal
|
130
159
|
|
131
160
|
For transactions in the Netherlands, iDeal is the most common option. To redirect a user directly to the bank page (skipping the Docdata web menu page), you can ask your user to choose a bank from any of the banks listed in the `Docdata::Ideal.banks` method.
|
@@ -222,7 +251,7 @@ To cancel an existing Payment, you can do one of the following:
|
|
222
251
|
|
223
252
|
|
224
253
|
## Contributing
|
225
|
-
Want to contribute?
|
254
|
+
Want to contribute? Great!
|
226
255
|
|
227
256
|
|
228
257
|
1. Fork it
|
data/lib/docdata/response.rb
CHANGED
@@ -61,7 +61,7 @@ module Docdata
|
|
61
61
|
# Set the attributes based on the API response
|
62
62
|
def set_attributes
|
63
63
|
self.paid = is_paid?
|
64
|
-
self.amount = report[:
|
64
|
+
self.amount = Response.payment_node(report)[:authorization][:amount].to_i if (report && Response.payment_node(report) && Response.payment_node(report)[:authorization] && Response.payment_node(report)[:authorization][:amount].present?)
|
65
65
|
self.status = capture_status if capture_status
|
66
66
|
self.currency = currency_to_set
|
67
67
|
end
|
@@ -80,6 +80,7 @@ module Docdata
|
|
80
80
|
m = body["#{method_name}_response".to_sym]["#{method_name}_success".to_sym]
|
81
81
|
r = self.new(key: m[:key], message: m[:success], success: true)
|
82
82
|
r.xml = xml #save the raw xml
|
83
|
+
# puts m[:report]
|
83
84
|
if m[:report]
|
84
85
|
r.report = m[:report]
|
85
86
|
end
|
@@ -112,8 +113,8 @@ module Docdata
|
|
112
113
|
# @return [String] the payment method of this transaction
|
113
114
|
def payment_method
|
114
115
|
begin
|
115
|
-
if report && report
|
116
|
-
report[:
|
116
|
+
if report && Response.payment_node(report).present? && Response.payment_node(report)[:payment_method].present?
|
117
|
+
Response.payment_node(report)[:payment_method].to_s
|
117
118
|
else
|
118
119
|
nil
|
119
120
|
end
|
@@ -122,10 +123,11 @@ module Docdata
|
|
122
123
|
end
|
123
124
|
end
|
124
125
|
|
126
|
+
|
125
127
|
# @return [String] the status string provided by the API. One of [AUTHORIZED, CANCELED]
|
126
128
|
def payment_status
|
127
|
-
if report && report
|
128
|
-
report[:
|
129
|
+
if report && Response.payment_node(report) && Response.payment_node(report)[:authorization]
|
130
|
+
Response.payment_node(report)[:authorization][:status]
|
129
131
|
else
|
130
132
|
nil
|
131
133
|
end
|
@@ -176,8 +178,8 @@ module Docdata
|
|
176
178
|
|
177
179
|
# @return [String] the status of the capture, if exists
|
178
180
|
def capture_status
|
179
|
-
if report && report
|
180
|
-
report[:
|
181
|
+
if report && Response.payment_node(report) && Response.payment_node(report)[:authorization] && Response.payment_node(report)[:authorization][:capture]
|
182
|
+
Response.payment_node(report)[:authorization][:capture][:status]
|
181
183
|
else
|
182
184
|
nil
|
183
185
|
end
|
@@ -207,5 +209,19 @@ module Docdata
|
|
207
209
|
@status_xml ||= Nokogiri.XML(doc.xpath("//S:Body").first.children.first.children.first.to_xml)
|
208
210
|
end
|
209
211
|
|
212
|
+
private
|
213
|
+
|
214
|
+
# Sometimes a single response has multiple payment nodes. When a payment fails first and
|
215
|
+
# succeeds later, for example. In that case, always use the last (== newest) node.
|
216
|
+
def self.payment_node(hash)
|
217
|
+
if hash[:payment] && hash[:payment].is_a?(Hash)
|
218
|
+
hash[:payment]
|
219
|
+
elsif hash[:payment] && hash[:payment].is_a?(Array)
|
220
|
+
hash[:payment].last
|
221
|
+
else
|
222
|
+
false
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
210
226
|
end
|
211
227
|
end
|
data/lib/docdata/version.rb
CHANGED
data/spec/response_spec.rb
CHANGED
@@ -17,6 +17,22 @@ describe Docdata::Response do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
describe "response with multiple payment nodes" do
|
21
|
+
before(:each) do
|
22
|
+
file = "#{File.dirname(__FILE__)}/xml/status-paid-ideal-multiple.xml"
|
23
|
+
@xml = open(file)
|
24
|
+
@response = Docdata::Response.parse(:status, @xml)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returs a response object" do
|
28
|
+
expect(@response).to be_kind_of(Docdata::Response)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "is paid" do
|
32
|
+
expect(@response.paid).to eq(true)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
20
36
|
describe "different payment methods" do
|
21
37
|
context ":status, paid iDeal" do
|
22
38
|
before(:each) do
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
|
2
|
+
<S:Body>
|
3
|
+
<statusResponse xmlns="http://www.docdatapayments.com/services/paymentservice/1_1/">
|
4
|
+
<statusSuccess>
|
5
|
+
<success code="SUCCESS">Operation successful.</success>
|
6
|
+
<report>
|
7
|
+
<approximateTotals exchangedTo="EUR" exchangeRateDate="2014-08-22 09:57:18">
|
8
|
+
<totalRegistered>2200</totalRegistered>
|
9
|
+
<totalShopperPending>0</totalShopperPending>
|
10
|
+
<totalAcquirerPending>0</totalAcquirerPending>
|
11
|
+
<totalAcquirerApproved>2200</totalAcquirerApproved>
|
12
|
+
<totalCaptured>2200</totalCaptured>
|
13
|
+
<totalRefunded>0</totalRefunded>
|
14
|
+
<totalChargedback>0</totalChargedback>
|
15
|
+
</approximateTotals>
|
16
|
+
<payment>
|
17
|
+
<id>2492860866</id>
|
18
|
+
<paymentMethod>IDEAL</paymentMethod>
|
19
|
+
<authorization>
|
20
|
+
<status>CANCELED</status>
|
21
|
+
<amount currency="EUR">2200</amount>
|
22
|
+
<confidenceLevel/>
|
23
|
+
</authorization>
|
24
|
+
</payment>
|
25
|
+
<payment>
|
26
|
+
<id>2492861418</id>
|
27
|
+
<paymentMethod>IDEAL</paymentMethod>
|
28
|
+
<authorization>
|
29
|
+
<status>AUTHORIZED</status>
|
30
|
+
<amount currency="EUR">2200</amount>
|
31
|
+
<confidenceLevel>ACQUIRER_APPROVED</confidenceLevel>
|
32
|
+
<capture>
|
33
|
+
<status>CAPTURED</status>
|
34
|
+
<amount currency="EUR">2200</amount>
|
35
|
+
</capture>
|
36
|
+
</authorization>
|
37
|
+
</payment>
|
38
|
+
</report>
|
39
|
+
</statusSuccess>
|
40
|
+
</statusResponse>
|
41
|
+
</S:Body>
|
42
|
+
</S:Envelope>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docdata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henk Meijer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -284,6 +284,7 @@ files:
|
|
284
284
|
- spec/xml/status-canceled-ideal.xml
|
285
285
|
- spec/xml/status-new.xml
|
286
286
|
- spec/xml/status-paid-creditcard.xml
|
287
|
+
- spec/xml/status-paid-ideal-multiple.xml
|
287
288
|
- spec/xml/status-paid-ideal.xml
|
288
289
|
- spec/xml/status-paid-sofort.xml
|
289
290
|
homepage: http://rdoc.info/github/henkm/docdata/
|
@@ -324,6 +325,7 @@ test_files:
|
|
324
325
|
- spec/xml/status-canceled-ideal.xml
|
325
326
|
- spec/xml/status-new.xml
|
326
327
|
- spec/xml/status-paid-creditcard.xml
|
328
|
+
- spec/xml/status-paid-ideal-multiple.xml
|
327
329
|
- spec/xml/status-paid-ideal.xml
|
328
330
|
- spec/xml/status-paid-sofort.xml
|
329
331
|
has_rdoc:
|