adyen-ruby-api-library 11.3.0 → 12.0.0
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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/Gemfile +2 -2
- data/README.md +30 -7
- data/VERSION +1 -1
- data/adyen-ruby-api-library.gemspec +1 -1
- data/lib/adyen/client.rb +6 -11
- data/lib/adyen/deprecation.rb +34 -0
- data/lib/adyen/services/balanceControl/balance_control_api.rb +2 -0
- data/lib/adyen/services/balancePlatform/balance_accounts_api.rb +0 -40
- data/lib/adyen/services/balancePlatform/custom_payout_schedules_sweeps_api.rb +56 -0
- data/lib/adyen/services/balancePlatform/grant_accounts_api.rb +2 -0
- data/lib/adyen/services/balancePlatform/grant_offers_api.rb +4 -0
- data/lib/adyen/services/balancePlatform/managed_payout_schedules_api.rb +80 -0
- data/lib/adyen/services/balancePlatform/recurring_top_ups_api.rb +48 -0
- data/lib/adyen/services/balancePlatform/sca_device_management_api.rb +8 -0
- data/lib/adyen/services/balancePlatform.rb +15 -0
- data/lib/adyen/services/checkout/payments_api.rb +8 -0
- data/lib/adyen/services/checkout/utility_api.rb +2 -0
- data/lib/adyen/services/checkout.rb +1 -1
- data/lib/adyen/services/management/donation_campaigns_api.rb +64 -0
- data/lib/adyen/services/management.rb +5 -0
- data/lib/adyen/services/payment/modifications_api.rb +2 -0
- data/lib/adyen/services/posMobile/pos_mobile_api.rb +5 -0
- data/lib/adyen/services/posTerminalManagement.rb +10 -0
- data/lib/adyen/services/recurring/recurring_api.rb +4 -0
- data/lib/adyen/services/service.rb +2 -0
- data/lib/adyen/services/transfers/capital_api.rb +6 -0
- data/lib/adyen/services/transfers/cash_out_api.rb +24 -0
- data/lib/adyen/services/transfers.rb +5 -0
- data/lib/adyen/utils/hmac_validator.rb +15 -17
- data/lib/adyen/version.rb +1 -1
- data/sdk-generation-log/balanceplatform.json +4 -4
- data/sdk-generation-log/checkout.json +4 -4
- data/sdk-generation-log/management.json +4 -4
- data/sdk-generation-log/posmobile.json +4 -4
- data/sdk-generation-log/transfers.json +4 -4
- data/spec/balance_control_spec.rb +41 -0
- data/spec/balance_platform_spec.rb +498 -4
- data/spec/checkout-oauth_spec.rb +220 -10
- data/spec/checkout_spec.rb +245 -10
- data/spec/client_spec.rb +1 -5
- data/spec/deprecation_spec.rb +112 -0
- data/spec/management_spec.rb +184 -0
- data/spec/mocks/requests/BalancePlatform/apply_managed_schedule.json +14 -0
- data/spec/mocks/requests/BalancePlatform/begin_sca_device_registration.json +4 -0
- data/spec/mocks/requests/BalancePlatform/create_recurring_top_up.json +21 -0
- data/spec/mocks/requests/BalancePlatform/create_sweep.json +10 -0
- data/spec/mocks/requests/BalancePlatform/finish_sca_device_registration.json +3 -0
- data/spec/mocks/requests/BalancePlatform/submit_sca_association.json +8 -0
- data/spec/mocks/requests/BalancePlatform/update_balance_account_managed_schedule.json +5 -0
- data/spec/mocks/requests/BalancePlatform/update_recurring_top_ups.json +3 -0
- data/spec/mocks/requests/BalancePlatform/update_sweep.json +6 -0
- data/spec/mocks/requests/Checkout/amount_updates.json +1 -1
- data/spec/mocks/requests/Checkout/card_details.json +3 -0
- data/spec/mocks/requests/Checkout/create_stored_payment_method.json +10 -0
- data/spec/mocks/requests/Checkout/donation_campaigns.json +4 -0
- data/spec/mocks/requests/Checkout/donations.json +9 -0
- data/spec/mocks/requests/Checkout/orders.json +5 -3
- data/spec/mocks/requests/Checkout/payment-details.json +2 -14
- data/spec/mocks/requests/Checkout/payment_methods_balance.json +5 -2
- data/spec/mocks/requests/Checkout/payments.json +9 -10
- data/spec/mocks/requests/Checkout/paypal_update_order.json +5 -0
- data/spec/mocks/requests/Checkout/reversals.json +3 -0
- data/spec/mocks/requests/Checkout/update_session.json +7 -0
- data/spec/mocks/requests/Management/create_donation_campaign.json +7 -0
- data/spec/mocks/requests/Management/list_nonprofits.json +5 -0
- data/spec/mocks/requests/Management/update_donation_campaign.json +6 -0
- data/spec/mocks/requests/Transfers/initiate_cashout.json +12 -0
- data/spec/mocks/responses/BalancePlatform/apply_managed_schedule.json +17 -0
- data/spec/mocks/responses/BalancePlatform/begin_sca_device_registration.json +8 -0
- data/spec/mocks/responses/BalancePlatform/create_recurring_top_up.json +23 -0
- data/spec/mocks/responses/BalancePlatform/create_sweep.json +12 -0
- data/spec/mocks/responses/BalancePlatform/finish_sca_device_registration.json +7 -0
- data/spec/mocks/responses/BalancePlatform/get_all_sweeps_for_balance_account.json +31 -0
- data/spec/mocks/responses/BalancePlatform/get_balance_account_managed_schedule_by_id.json +17 -0
- data/spec/mocks/responses/BalancePlatform/get_balance_account_managed_schedules.json +26 -0
- data/spec/mocks/responses/BalancePlatform/get_balance_platform_managed_schedule_by_id.json +27 -0
- data/spec/mocks/responses/BalancePlatform/get_balance_platform_managed_schedules.json +31 -0
- data/spec/mocks/responses/BalancePlatform/get_payout_schedule_executions.json +21 -0
- data/spec/mocks/responses/BalancePlatform/get_recurring_top_ups.json +35 -0
- data/spec/mocks/responses/BalancePlatform/get_sweep.json +12 -0
- data/spec/mocks/responses/BalancePlatform/submit_sca_association.json +10 -0
- data/spec/mocks/responses/BalancePlatform/update_balance_account_managed_schedule.json +18 -0
- data/spec/mocks/responses/BalancePlatform/update_recurring_top_ups.json +23 -0
- data/spec/mocks/responses/BalancePlatform/update_sweep.json +12 -0
- data/spec/mocks/responses/Checkout/amount_updates.json +1 -1
- data/spec/mocks/responses/Checkout/card_details.json +5 -0
- data/spec/mocks/responses/Checkout/create_stored_payment_method.json +5 -0
- data/spec/mocks/responses/Checkout/donation_campaigns.json +1 -0
- data/spec/mocks/responses/Checkout/donations.json +5 -0
- data/spec/mocks/responses/Checkout/orders.json +6 -1
- data/spec/mocks/responses/Checkout/orders_cancel.json +1 -1
- data/spec/mocks/responses/Checkout/payment-details.json +2 -13
- data/spec/mocks/responses/Checkout/payment_links.json +3 -0
- data/spec/mocks/responses/Checkout/payment_methods.json +2 -2
- data/spec/mocks/responses/Checkout/payment_methods_balance.json +5 -1
- data/spec/mocks/responses/Checkout/payments.json +4 -94
- data/spec/mocks/responses/Checkout/paypal_update_order.json +4 -0
- data/spec/mocks/responses/Checkout/reversals.json +6 -0
- data/spec/mocks/responses/Checkout/update_session.json +3 -0
- data/spec/mocks/responses/Management/donation_campaign.json +13 -0
- data/spec/mocks/responses/Management/list_donation_campaigns.json +19 -0
- data/spec/mocks/responses/Management/list_nonprofits.json +34 -0
- data/spec/mocks/responses/Transfers/initiate_cashout.json +31 -0
- data/spec/spec_helper.rb +2 -2
- data/spec/transfers_spec.rb +28 -0
- data/spec/utils/consumer_smoke.rb +23 -0
- data/spec/utils/hmac_validator_spec.rb +55 -0
- data/templates/api-small.mustache +4 -2
- data/templates/api.mustache +4 -2
- metadata +58 -2
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require_relative '../service'
|
|
2
|
+
module Adyen
|
|
3
|
+
|
|
4
|
+
# NOTE: This class is auto generated by OpenAPI Generator
|
|
5
|
+
# Ref: https://openapi-generator.tech
|
|
6
|
+
#
|
|
7
|
+
# Do not edit the class manually.
|
|
8
|
+
class DonationCampaignsApi < Service
|
|
9
|
+
attr_accessor :service, :version
|
|
10
|
+
|
|
11
|
+
def initialize(client, version = DEFAULT_VERSION)
|
|
12
|
+
super(client, version, 'Management')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Create a donation campaign
|
|
16
|
+
def create_donation_campaign(request, company_id, headers: {})
|
|
17
|
+
endpoint = build_endpoint('/companies/{companyId}/campaignManagement', company_id)
|
|
18
|
+
|
|
19
|
+
action = { method: 'post', url: endpoint }
|
|
20
|
+
@client.call_adyen_api(@service, action, request, headers, @version)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Delete a donation campaign
|
|
24
|
+
def delete_donation_campaign(company_id, donation_campaign_id, headers: {})
|
|
25
|
+
endpoint = build_endpoint('/companies/{companyId}/campaignManagement/{donationCampaignId}', company_id, donation_campaign_id)
|
|
26
|
+
|
|
27
|
+
action = { method: 'delete', url: endpoint }
|
|
28
|
+
@client.call_adyen_api(@service, action, {}, headers, @version)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Get the donation campaigns for an account holder
|
|
32
|
+
def list_donation_campaigns_for_account_holder(company_id, account_holder_id, headers: {}, query_params: {})
|
|
33
|
+
endpoint = build_endpoint('/companies/{companyId}/campaignManagement/accountHolders/{accountHolderId}', company_id, account_holder_id)
|
|
34
|
+
endpoint += create_query_string(query_params)
|
|
35
|
+
action = { method: 'get', url: endpoint }
|
|
36
|
+
@client.call_adyen_api(@service, action, {}, headers, @version)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Get a list of nonprofits
|
|
40
|
+
def list_nonprofits(request, company_id, headers: {}, query_params: {})
|
|
41
|
+
endpoint = build_endpoint('/companies/{companyId}/nonprofits', company_id)
|
|
42
|
+
endpoint += create_query_string(query_params)
|
|
43
|
+
action = { method: 'post', url: endpoint }
|
|
44
|
+
@client.call_adyen_api(@service, action, request, headers, @version)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Update a donation campaign
|
|
48
|
+
def update_donation_campaign(request, company_id, donation_campaign_id, headers: {})
|
|
49
|
+
endpoint = build_endpoint('/companies/{companyId}/campaignManagement/{donationCampaignId}', company_id, donation_campaign_id)
|
|
50
|
+
|
|
51
|
+
action = { method: 'patch', url: endpoint }
|
|
52
|
+
@client.call_adyen_api(@service, action, request, headers, @version)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Activate or end a donation campaign
|
|
56
|
+
def update_donation_campaign_status(company_id, donation_campaign_id, status, headers: {})
|
|
57
|
+
endpoint = build_endpoint('/companies/{companyId}/campaignManagement/{donationCampaignId}/status/{status}', company_id, donation_campaign_id, status)
|
|
58
|
+
|
|
59
|
+
action = { method: 'post', url: endpoint }
|
|
60
|
+
@client.call_adyen_api(@service, action, {}, headers, @version)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -10,6 +10,7 @@ require_relative 'management/allowed_origins_merchant_level_api'
|
|
|
10
10
|
require_relative 'management/android_files_company_level_api'
|
|
11
11
|
require_relative 'management/client_key_company_level_api'
|
|
12
12
|
require_relative 'management/client_key_merchant_level_api'
|
|
13
|
+
require_relative 'management/donation_campaigns_api'
|
|
13
14
|
require_relative 'management/my_api_credential_api'
|
|
14
15
|
require_relative 'management/payment_methods_merchant_level_api'
|
|
15
16
|
require_relative 'management/payout_settings_merchant_level_api'
|
|
@@ -92,6 +93,10 @@ module Adyen
|
|
|
92
93
|
@client_key_merchant_level_api ||= Adyen::ClientKeyMerchantLevelApi.new(@client, @version)
|
|
93
94
|
end
|
|
94
95
|
|
|
96
|
+
def donation_campaigns_api
|
|
97
|
+
@donation_campaigns_api ||= Adyen::DonationCampaignsApi.new(@client, @version)
|
|
98
|
+
end
|
|
99
|
+
|
|
95
100
|
def my_api_credential_api
|
|
96
101
|
@my_api_credential_api ||= Adyen::MyAPICredentialApi.new(@client, @version)
|
|
97
102
|
end
|
|
@@ -13,7 +13,12 @@ module Adyen
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
# Create a communication session
|
|
16
|
+
#
|
|
17
|
+
# Deprecated since POS Mobile API v68
|
|
18
|
+
# Use POST [/auth/certificate](https://docs.adyen.com/api-explorer/softpos-configuration-api/latest/post/auth/certificate) to establish secure communications.
|
|
19
|
+
# @deprecated
|
|
16
20
|
def create_communication_session(request, headers: {})
|
|
21
|
+
Adyen::Deprecation.warn(:create_communication_session, since: 'POS Mobile API v68', message: 'Use POST [/auth/certificate](https://docs.adyen.com/api-explorer/softpos-configuration-api/latest/post/auth/certificate) to establish secure communications.')
|
|
17
22
|
endpoint = build_endpoint('/sessions')
|
|
18
23
|
|
|
19
24
|
action = { method: 'post', url: endpoint }
|
|
@@ -17,7 +17,9 @@ module Adyen
|
|
|
17
17
|
#
|
|
18
18
|
# Deprecated since POS Terminal Management API v1
|
|
19
19
|
# Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).
|
|
20
|
+
# @deprecated
|
|
20
21
|
def assign_terminals(request, headers: {})
|
|
22
|
+
Adyen::Deprecation.warn(:assign_terminals, since: 'POS Terminal Management API v1', message: "Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).")
|
|
21
23
|
endpoint = '/assignTerminals'.gsub(/{.+?}/, '%s')
|
|
22
24
|
endpoint = endpoint.gsub(%r{^/}, '')
|
|
23
25
|
endpoint = format(endpoint)
|
|
@@ -30,7 +32,9 @@ module Adyen
|
|
|
30
32
|
#
|
|
31
33
|
# Deprecated since POS Terminal Management API v1
|
|
32
34
|
# Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).
|
|
35
|
+
# @deprecated
|
|
33
36
|
def find_terminal(request, headers: {})
|
|
37
|
+
Adyen::Deprecation.warn(:find_terminal, since: 'POS Terminal Management API v1', message: "Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).")
|
|
34
38
|
endpoint = '/findTerminal'.gsub(/{.+?}/, '%s')
|
|
35
39
|
endpoint = endpoint.gsub(%r{^/}, '')
|
|
36
40
|
endpoint = format(endpoint)
|
|
@@ -43,7 +47,9 @@ module Adyen
|
|
|
43
47
|
#
|
|
44
48
|
# Deprecated since POS Terminal Management API v1
|
|
45
49
|
# Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).
|
|
50
|
+
# @deprecated
|
|
46
51
|
def get_stores_under_account(request, headers: {})
|
|
52
|
+
Adyen::Deprecation.warn(:get_stores_under_account, since: 'POS Terminal Management API v1', message: "Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).")
|
|
47
53
|
endpoint = '/getStoresUnderAccount'.gsub(/{.+?}/, '%s')
|
|
48
54
|
endpoint = endpoint.gsub(%r{^/}, '')
|
|
49
55
|
endpoint = format(endpoint)
|
|
@@ -56,7 +62,9 @@ module Adyen
|
|
|
56
62
|
#
|
|
57
63
|
# Deprecated since POS Terminal Management API v1
|
|
58
64
|
# Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).
|
|
65
|
+
# @deprecated
|
|
59
66
|
def get_terminal_details(request, headers: {})
|
|
67
|
+
Adyen::Deprecation.warn(:get_terminal_details, since: 'POS Terminal Management API v1', message: "Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).")
|
|
60
68
|
endpoint = '/getTerminalDetails'.gsub(/{.+?}/, '%s')
|
|
61
69
|
endpoint = endpoint.gsub(%r{^/}, '')
|
|
62
70
|
endpoint = format(endpoint)
|
|
@@ -69,7 +77,9 @@ module Adyen
|
|
|
69
77
|
#
|
|
70
78
|
# Deprecated since POS Terminal Management API v1
|
|
71
79
|
# Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).
|
|
80
|
+
# @deprecated
|
|
72
81
|
def get_terminals_under_account(request, headers: {})
|
|
82
|
+
Adyen::Deprecation.warn(:get_terminals_under_account, since: 'POS Terminal Management API v1', message: "Use [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview).")
|
|
73
83
|
endpoint = '/getTerminalsUnderAccount'.gsub(/{.+?}/, '%s')
|
|
74
84
|
endpoint = endpoint.gsub(%r{^/}, '')
|
|
75
85
|
endpoint = format(endpoint)
|
|
@@ -15,7 +15,9 @@ module Adyen
|
|
|
15
15
|
# Create new permits linked to a recurring contract.
|
|
16
16
|
#
|
|
17
17
|
# Deprecated since Adyen Recurring API v68
|
|
18
|
+
# @deprecated
|
|
18
19
|
def create_permit(request, headers: {})
|
|
20
|
+
Adyen::Deprecation.warn(:create_permit, since: 'Adyen Recurring API v68')
|
|
19
21
|
endpoint = build_endpoint('/createPermit')
|
|
20
22
|
|
|
21
23
|
action = { method: 'post', url: endpoint }
|
|
@@ -33,7 +35,9 @@ module Adyen
|
|
|
33
35
|
# Disable an existing permit.
|
|
34
36
|
#
|
|
35
37
|
# Deprecated since Adyen Recurring API v68
|
|
38
|
+
# @deprecated
|
|
36
39
|
def disable_permit(request, headers: {})
|
|
40
|
+
Adyen::Deprecation.warn(:disable_permit, since: 'Adyen Recurring API v68')
|
|
37
41
|
endpoint = build_endpoint('/disablePermit')
|
|
38
42
|
|
|
39
43
|
action = { method: 'post', url: endpoint }
|
|
@@ -16,7 +16,9 @@ module Adyen
|
|
|
16
16
|
#
|
|
17
17
|
# Deprecated since Transfers API v4
|
|
18
18
|
# Use the `/grants` endpoint from the [Capital API](https://docs.adyen.com/api-explorer/capital/latest/get/grants) instead.
|
|
19
|
+
# @deprecated
|
|
19
20
|
def get_capital_account(headers: {}, query_params: {})
|
|
21
|
+
Adyen::Deprecation.warn(:get_capital_account, since: 'Transfers API v4', message: 'Use the `/grants` endpoint from the [Capital API](https://docs.adyen.com/api-explorer/capital/latest/get/grants) instead.')
|
|
20
22
|
endpoint = build_endpoint('/grants')
|
|
21
23
|
endpoint += create_query_string(query_params)
|
|
22
24
|
action = { method: 'get', url: endpoint }
|
|
@@ -27,7 +29,9 @@ module Adyen
|
|
|
27
29
|
#
|
|
28
30
|
# Deprecated since Transfers API v4
|
|
29
31
|
# Use the `/grants/{grantId}` endpoint from the [Capital API](https://docs.adyen.com/api-explorer/capital/latest/get/grants/(grantId)) instead.
|
|
32
|
+
# @deprecated
|
|
30
33
|
def get_grant_reference_details(id, headers: {})
|
|
34
|
+
Adyen::Deprecation.warn(:get_grant_reference_details, since: 'Transfers API v4', message: 'Use the `/grants/{grantId}` endpoint from the [Capital API](https://docs.adyen.com/api-explorer/capital/latest/get/grants/(grantId)) instead.')
|
|
31
35
|
endpoint = build_endpoint('/grants/{id}', id)
|
|
32
36
|
|
|
33
37
|
action = { method: 'get', url: endpoint }
|
|
@@ -38,7 +42,9 @@ module Adyen
|
|
|
38
42
|
#
|
|
39
43
|
# Deprecated since Transfers API v4
|
|
40
44
|
# Use the `/grants` endpoint from the [Capital API](https://docs.adyen.com/api-explorer/capital/latest/post/grants) instead.
|
|
45
|
+
# @deprecated
|
|
41
46
|
def request_grant_payout(request, headers: {})
|
|
47
|
+
Adyen::Deprecation.warn(:request_grant_payout, since: 'Transfers API v4', message: 'Use the `/grants` endpoint from the [Capital API](https://docs.adyen.com/api-explorer/capital/latest/post/grants) instead.')
|
|
42
48
|
endpoint = build_endpoint('/grants')
|
|
43
49
|
|
|
44
50
|
action = { method: 'post', url: endpoint }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require_relative '../service'
|
|
2
|
+
module Adyen
|
|
3
|
+
|
|
4
|
+
# NOTE: This class is auto generated by OpenAPI Generator
|
|
5
|
+
# Ref: https://openapi-generator.tech
|
|
6
|
+
#
|
|
7
|
+
# Do not edit the class manually.
|
|
8
|
+
class CashOutApi < Service
|
|
9
|
+
attr_accessor :service, :version
|
|
10
|
+
|
|
11
|
+
def initialize(client, version = DEFAULT_VERSION)
|
|
12
|
+
super(client, version, 'Transfers')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Initiate a cashout
|
|
16
|
+
def initiate_cashout(request, headers: {})
|
|
17
|
+
endpoint = build_endpoint('/cashouts')
|
|
18
|
+
|
|
19
|
+
action = { method: 'post', url: endpoint }
|
|
20
|
+
@client.call_adyen_api(@service, action, request, headers, @version)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require_relative 'transfers/capital_api'
|
|
2
|
+
require_relative 'transfers/cash_out_api'
|
|
2
3
|
require_relative 'transfers/transactions_api'
|
|
3
4
|
require_relative 'transfers/transfers_api'
|
|
4
5
|
|
|
@@ -22,6 +23,10 @@ module Adyen
|
|
|
22
23
|
@capital_api ||= Adyen::CapitalApi.new(@client, @version)
|
|
23
24
|
end
|
|
24
25
|
|
|
26
|
+
def cash_out_api
|
|
27
|
+
@cash_out_api ||= Adyen::CashOutApi.new(@client, @version)
|
|
28
|
+
end
|
|
29
|
+
|
|
25
30
|
def transactions_api
|
|
26
31
|
@transactions_api ||= Adyen::TransactionsApi.new(@client, @version)
|
|
27
32
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'openssl'
|
|
2
|
+
|
|
1
3
|
module Adyen
|
|
2
4
|
module Utils
|
|
3
5
|
class HmacValidator
|
|
@@ -9,7 +11,9 @@ module Adyen
|
|
|
9
11
|
].freeze
|
|
10
12
|
|
|
11
13
|
# <b>DEPRECATED:</b> Please use valid_webhook_hmac?() instead.
|
|
14
|
+
# @deprecated
|
|
12
15
|
def valid_notification_hmac?(notification_request_item, hmac_key)
|
|
16
|
+
Adyen::Deprecation.warn(:valid_notification_hmac?, message: "Use valid_webhook_hmac?() instead.")
|
|
13
17
|
valid_webhook_hmac?(notification_request_item, hmac_key)
|
|
14
18
|
end
|
|
15
19
|
|
|
@@ -18,14 +22,14 @@ module Adyen
|
|
|
18
22
|
#
|
|
19
23
|
# @param webhook_request_item [Object] The webhook request item.
|
|
20
24
|
# @param hmac_key [String] The HMAC key used to validate the payload.
|
|
21
|
-
|
|
22
|
-
# @return [Boolean] Returns true if the HMAC signature is valid, otherwise false.
|
|
25
|
+
|
|
26
|
+
# @return [Boolean] Returns true if the HMAC signature is valid, otherwise false.
|
|
23
27
|
def valid_webhook_hmac?(webhook_request_item, hmac_key)
|
|
24
28
|
expected_sign = calculate_webhook_hmac(webhook_request_item, hmac_key)
|
|
25
29
|
merchant_sign =
|
|
26
30
|
webhook_request_item.dig('additionalData', 'hmacSignature')
|
|
27
31
|
|
|
28
|
-
expected_sign
|
|
32
|
+
merchant_sign.is_a?(String) && OpenSSL.secure_compare(expected_sign, merchant_sign)
|
|
29
33
|
end
|
|
30
34
|
|
|
31
35
|
# validates the HMAC signature of a payload against an expected signature. Use for webhooks that provide the
|
|
@@ -35,37 +39,31 @@ module Adyen
|
|
|
35
39
|
# @param hmac_key [String] The HMAC key used to validate the payload.
|
|
36
40
|
# @param payload [String] The webhook payload.
|
|
37
41
|
|
|
38
|
-
# @return [Boolean] Returns true if the HMAC signature is valid, otherwise false.
|
|
42
|
+
# @return [Boolean] Returns true if the HMAC signature is valid, otherwise false.
|
|
39
43
|
def valid_webhook_payload_hmac?(hmac_signature, hmac_key, payload)
|
|
40
44
|
expected_sign = calculate_webhook_payload_hmac(payload, hmac_key)
|
|
41
|
-
expected_sign
|
|
45
|
+
hmac_signature.is_a?(String) && OpenSSL.secure_compare(expected_sign, hmac_signature)
|
|
42
46
|
end
|
|
43
47
|
|
|
44
48
|
# <b>DEPRECATED:</b> Please use calculate_webhook_hmac() instead.
|
|
49
|
+
# @deprecated
|
|
45
50
|
def calculate_notification_hmac(notification_request_item, hmac_key)
|
|
51
|
+
Adyen::Deprecation.warn(:calculate_notification_hmac, message: "Use calculate_webhook_hmac() instead.")
|
|
46
52
|
calculate_webhook_hmac(notification_request_item, hmac_key)
|
|
47
53
|
end
|
|
48
54
|
|
|
49
|
-
|
|
50
55
|
def calculate_webhook_payload_hmac(data, hmac_key)
|
|
51
|
-
Base64
|
|
52
|
-
|
|
53
|
-
)
|
|
56
|
+
# Base64 strict encoding
|
|
57
|
+
[OpenSSL::HMAC.digest(HMAC_ALGORITHM, [hmac_key].pack('H*'), data)].pack('m0')
|
|
54
58
|
end
|
|
55
59
|
|
|
56
60
|
def calculate_webhook_hmac(webhook_request_item, hmac_key)
|
|
57
61
|
data = data_to_sign(webhook_request_item)
|
|
58
62
|
|
|
59
|
-
Base64
|
|
60
|
-
|
|
61
|
-
)
|
|
63
|
+
# Base64 strict encoding
|
|
64
|
+
[OpenSSL::HMAC.digest(HMAC_ALGORITHM, [hmac_key].pack('H*'), data)].pack('m0')
|
|
62
65
|
end
|
|
63
66
|
|
|
64
|
-
|
|
65
|
-
# TODO: Deprecate instead of aliasing
|
|
66
|
-
alias valid_notification_hmac? valid_webhook_hmac?
|
|
67
|
-
alias calculate_notification_hmac calculate_webhook_hmac
|
|
68
|
-
|
|
69
67
|
def data_to_sign(webhook_request_item)
|
|
70
68
|
WEBHOOK_VALIDATION_KEYS
|
|
71
69
|
.map { webhook_request_item.dig(*_1.split('.')).to_s }
|
data/lib/adyen/version.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"service": "balanceplatform",
|
|
3
3
|
"project": "ruby",
|
|
4
|
-
"generatedAt": "2026-
|
|
5
|
-
"openapiCommitSha": "
|
|
6
|
-
"automationCommitSha": "
|
|
7
|
-
"libraryCommitSha": "
|
|
4
|
+
"generatedAt": "2026-07-31T12:01:02Z",
|
|
5
|
+
"openapiCommitSha": "425d65d12163ebd4fe6fa6d2f859075817c81cba",
|
|
6
|
+
"automationCommitSha": "0c108bd8050cf480d2710b78b770afdfbdd89397",
|
|
7
|
+
"libraryCommitSha": "7f77a7b7aca2c2b22147ba4b996ada979f9decd9"
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"service": "checkout",
|
|
3
3
|
"project": "ruby",
|
|
4
|
-
"generatedAt": "2026-
|
|
5
|
-
"openapiCommitSha": "
|
|
6
|
-
"automationCommitSha": "
|
|
7
|
-
"libraryCommitSha": "
|
|
4
|
+
"generatedAt": "2026-08-04T08:22:34Z",
|
|
5
|
+
"openapiCommitSha": "f0d0bd47b721d1b4e2c86e8b3aad706ecb88423a",
|
|
6
|
+
"automationCommitSha": "0c108bd8050cf480d2710b78b770afdfbdd89397",
|
|
7
|
+
"libraryCommitSha": "2c40b0c319ba09d1dd30970a137b53af3193db76"
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"service": "management",
|
|
3
3
|
"project": "ruby",
|
|
4
|
-
"generatedAt": "2026-
|
|
5
|
-
"openapiCommitSha": "
|
|
6
|
-
"automationCommitSha": "
|
|
7
|
-
"libraryCommitSha": "
|
|
4
|
+
"generatedAt": "2026-07-31T12:01:01Z",
|
|
5
|
+
"openapiCommitSha": "425d65d12163ebd4fe6fa6d2f859075817c81cba",
|
|
6
|
+
"automationCommitSha": "0c108bd8050cf480d2710b78b770afdfbdd89397",
|
|
7
|
+
"libraryCommitSha": "7f77a7b7aca2c2b22147ba4b996ada979f9decd9"
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"service": "posmobile",
|
|
3
3
|
"project": "ruby",
|
|
4
|
-
"generatedAt": "2026-
|
|
5
|
-
"openapiCommitSha": "
|
|
6
|
-
"automationCommitSha": "
|
|
7
|
-
"libraryCommitSha": "
|
|
4
|
+
"generatedAt": "2026-07-27T10:28:53Z",
|
|
5
|
+
"openapiCommitSha": "2f7d0e1961772ee974be4ed268282cf2ba8f6e03",
|
|
6
|
+
"automationCommitSha": "0c108bd8050cf480d2710b78b770afdfbdd89397",
|
|
7
|
+
"libraryCommitSha": "c80f38ce8b02c80778053741d0e9175e8e530742"
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"service": "transfers",
|
|
3
3
|
"project": "ruby",
|
|
4
|
-
"generatedAt": "2026-
|
|
5
|
-
"openapiCommitSha": "
|
|
6
|
-
"automationCommitSha": "
|
|
7
|
-
"libraryCommitSha": "
|
|
4
|
+
"generatedAt": "2026-07-31T12:01:01Z",
|
|
5
|
+
"openapiCommitSha": "425d65d12163ebd4fe6fa6d2f859075817c81cba",
|
|
6
|
+
"automationCommitSha": "0c108bd8050cf480d2710b78b770afdfbdd89397",
|
|
7
|
+
"libraryCommitSha": "7f77a7b7aca2c2b22147ba4b996ada979f9decd9"
|
|
8
8
|
}
|
|
@@ -42,4 +42,45 @@ RSpec.describe Adyen::BalanceControl, service: 'balanceControl' do
|
|
|
42
42
|
expect(response_hash)
|
|
43
43
|
.to be_a_kind_of Hash
|
|
44
44
|
end
|
|
45
|
+
|
|
46
|
+
describe 'deprecated balance_transfer' do
|
|
47
|
+
around do |example|
|
|
48
|
+
previous = Warning[:deprecated]
|
|
49
|
+
Warning[:deprecated] = true
|
|
50
|
+
example.run
|
|
51
|
+
ensure
|
|
52
|
+
Warning[:deprecated] = previous
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'emits a deprecation warning and still returns a successful response' do
|
|
56
|
+
request_body = JSON.parse(json_from_file('mocks/requests/BalanceControl/balance_transfer.json'))
|
|
57
|
+
|
|
58
|
+
response_body = json_from_file('mocks/responses/BalanceControl/balance_transfer.json')
|
|
59
|
+
|
|
60
|
+
url = @shared_values[:client].service_url(
|
|
61
|
+
@shared_values[:service],
|
|
62
|
+
'balanceTransfer',
|
|
63
|
+
@shared_values[:client].balance_control.version)
|
|
64
|
+
WebMock.stub_request(:post, url)
|
|
65
|
+
.with(
|
|
66
|
+
body: request_body,
|
|
67
|
+
headers: {
|
|
68
|
+
'x-api-key' => @shared_values[:client].api_key
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
.to_return(
|
|
72
|
+
body: response_body
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
result = nil
|
|
76
|
+
expect do
|
|
77
|
+
result = @shared_values[:client].balance_control.balance_control_api.balance_transfer(request_body)
|
|
78
|
+
end.to output(/\[DEPRECATED\] `balance_transfer` is deprecated since Adyen Balance Control API v1\n/).to_stderr
|
|
79
|
+
|
|
80
|
+
expect(result.status)
|
|
81
|
+
.to eq(200)
|
|
82
|
+
expect(result.response)
|
|
83
|
+
.to eq(JSON.parse(response_body))
|
|
84
|
+
end
|
|
85
|
+
end
|
|
45
86
|
end
|