Skip to content

Commit 9caf303

Browse files
committed
Support embedded payment captures and chargebacks
1 parent 1f0b1d2 commit 9caf303

File tree

4 files changed

+96
-9
lines changed

4 files changed

+96
-9
lines changed

examples/payments/get.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
payment = Mollie::Payment.get('tr_7UhSN1zuXS')
2+
3+
# With embedded resources
4+
payment = Mollie::Payment.get('tr_7UhSN1zuXS', embed: 'captures,chargebacks,refunds')

lib/mollie/payment.rb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,23 @@ def refunds(options = {})
207207
end
208208

209209
def chargebacks(options = {})
210-
Payment::Chargeback.all(options.merge(payment_id: id))
210+
resources = (attributes['_embedded']['chargebacks'] if attributes['_embedded'])
211+
212+
if resources.nil?
213+
Payment::Chargeback.all(options.merge(payment_id: id))
214+
else
215+
List.new({ '_embedded' => { 'chargebacks' => resources } }, Payment::Chargeback)
216+
end
211217
end
212218

213219
def captures(options = {})
214-
Payment::Capture.all(options.merge(payment_id: id))
220+
resources = (attributes['_embedded']['captures'] if attributes['_embedded'])
221+
222+
if resources.nil?
223+
Payment::Capture.all(options.merge(payment_id: id))
224+
else
225+
List.new({ '_embedded' => { 'captures' => resources } }, Payment::Capture)
226+
end
215227
end
216228

217229
def customer(options = {})

test/fixtures/payments/get_embedded_resources.json

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,74 @@
2323
"redirectUrl": "https://webshop.example.org/order/12345/",
2424
"webhookUrl": "https://webshop.example.org/payments/webhook/",
2525
"_embedded": {
26+
"captures": [
27+
{
28+
"resource": "capture",
29+
"id": "cpt_mNepDkEtco6ah3QNPUGYH",
30+
"mode": "test",
31+
"amount": {
32+
"value": "10.00",
33+
"currency": "EUR"
34+
},
35+
"status": "succeeded",
36+
"createdAt": "2025-03-19T15:03:34+00:00",
37+
"description": "Capture for order #12345",
38+
"settlementAmount": {
39+
"value": "10.00",
40+
"currency": "EUR"
41+
},
42+
"paymentId": "tr_WDqYK6vllg",
43+
"_links": {
44+
"self": {
45+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg/captures/cpt_mNepDkEtco6ah3QNPUGYH",
46+
"type": "application/hal+json"
47+
},
48+
"payment": {
49+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg",
50+
"type": "application/hal+json"
51+
}
52+
}
53+
}
54+
],
55+
"chargebacks": [
56+
{
57+
"resource": "chargeback",
58+
"id": "chb_ls7ahg",
59+
"amount": {
60+
"value": "10.00",
61+
"currency": "EUR"
62+
},
63+
"created_at": "2022-01-03T13:20:37+00:00",
64+
"payment_id": "tr_WDqYK6vllg",
65+
"settlement_amount": {
66+
"value": "-10.00",
67+
"currency": "EUR"
68+
},
69+
"_links": {
70+
"self": {
71+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg/chargebacks/chb_ls7ahg",
72+
"type": "application/hal+json"
73+
},
74+
"payment": {
75+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg",
76+
"type": "application/hal+json"
77+
}
78+
}
79+
}
80+
],
2681
"refunds": [
2782
{
2883
"resource": "refund",
2984
"id": "re_vD3Jm32wQt",
85+
"mode": "test",
3086
"amount": {
3187
"value": "329.99",
3288
"currency": "EUR"
3389
},
3490
"status": "pending",
3591
"createdAt": "2019-01-15T15:41:21+00:00",
3692
"description": "Required quantity not in stock, refunding one photo book.",
37-
"orderId": "ord_kEn1PlbGa",
93+
"metadata": null,
3894
"paymentId": "tr_WDqYK6vllg",
3995
"settlementAmount": {
4096
"value": "-329.99",
@@ -48,10 +104,6 @@
48104
"payment": {
49105
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg",
50106
"type": "application/hal+json"
51-
},
52-
"order": {
53-
"href": "https://api.mollie.com/v2/orders/ord_kEn1PlbGa",
54-
"type": "application/hal+json"
55107
}
56108
}
57109
}

test/mollie/payment_test.rb

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,11 +235,31 @@ def test_restrict_payment_methods_to_country
235235
assert_equal 'NL', payment.restrict_payment_methods_to_country
236236
end
237237

238+
def test_embedded_captures
239+
stub_request(:get, 'https://api.mollie.com/v2/payments/tr_WDqYK6vllg?embed=captures')
240+
.to_return(status: 200, body: GET_PAYMENT_WITH_EMBEDDED_RESOURCES, headers: {})
241+
242+
payment = Payment.get('tr_WDqYK6vllg', embed: 'captures')
243+
244+
assert_equal 'cpt_mNepDkEtco6ah3QNPUGYH', payment.captures.first.id
245+
assert_equal 1, payment.captures.size
246+
end
247+
248+
def test_embedded_chargebacks
249+
stub_request(:get, 'https://api.mollie.com/v2/payments/tr_WDqYK6vllg?embed=chargebacks')
250+
.to_return(status: 200, body: GET_PAYMENT_WITH_EMBEDDED_RESOURCES, headers: {})
251+
252+
payment = Payment.get('tr_WDqYK6vllg', embed: 'chargebacks')
253+
254+
assert_equal 'chb_ls7ahg', payment.chargebacks.first.id
255+
assert_equal 1, payment.chargebacks.size
256+
end
257+
238258
def test_embedded_refunds
239-
stub_request(:get, 'https://api.mollie.com/v2/payments/tr_WDqYK6vllg')
259+
stub_request(:get, 'https://api.mollie.com/v2/payments/tr_WDqYK6vllg?embed=refunds')
240260
.to_return(status: 200, body: GET_PAYMENT_WITH_EMBEDDED_RESOURCES, headers: {})
241261

242-
payment = Payment.get('tr_WDqYK6vllg')
262+
payment = Payment.get('tr_WDqYK6vllg', embed: 'refunds')
243263

244264
assert_equal 're_vD3Jm32wQt', payment.refunds.first.id
245265
assert_equal 1, payment.refunds.size

0 commit comments

Comments
 (0)