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.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +2 -2
  3. data/Gemfile +2 -2
  4. data/README.md +30 -7
  5. data/VERSION +1 -1
  6. data/adyen-ruby-api-library.gemspec +1 -1
  7. data/lib/adyen/client.rb +6 -11
  8. data/lib/adyen/deprecation.rb +34 -0
  9. data/lib/adyen/services/balanceControl/balance_control_api.rb +2 -0
  10. data/lib/adyen/services/balancePlatform/balance_accounts_api.rb +0 -40
  11. data/lib/adyen/services/balancePlatform/custom_payout_schedules_sweeps_api.rb +56 -0
  12. data/lib/adyen/services/balancePlatform/grant_accounts_api.rb +2 -0
  13. data/lib/adyen/services/balancePlatform/grant_offers_api.rb +4 -0
  14. data/lib/adyen/services/balancePlatform/managed_payout_schedules_api.rb +80 -0
  15. data/lib/adyen/services/balancePlatform/recurring_top_ups_api.rb +48 -0
  16. data/lib/adyen/services/balancePlatform/sca_device_management_api.rb +8 -0
  17. data/lib/adyen/services/balancePlatform.rb +15 -0
  18. data/lib/adyen/services/checkout/payments_api.rb +8 -0
  19. data/lib/adyen/services/checkout/utility_api.rb +2 -0
  20. data/lib/adyen/services/checkout.rb +1 -1
  21. data/lib/adyen/services/management/donation_campaigns_api.rb +64 -0
  22. data/lib/adyen/services/management.rb +5 -0
  23. data/lib/adyen/services/payment/modifications_api.rb +2 -0
  24. data/lib/adyen/services/posMobile/pos_mobile_api.rb +5 -0
  25. data/lib/adyen/services/posTerminalManagement.rb +10 -0
  26. data/lib/adyen/services/recurring/recurring_api.rb +4 -0
  27. data/lib/adyen/services/service.rb +2 -0
  28. data/lib/adyen/services/transfers/capital_api.rb +6 -0
  29. data/lib/adyen/services/transfers/cash_out_api.rb +24 -0
  30. data/lib/adyen/services/transfers.rb +5 -0
  31. data/lib/adyen/utils/hmac_validator.rb +15 -17
  32. data/lib/adyen/version.rb +1 -1
  33. data/sdk-generation-log/balanceplatform.json +4 -4
  34. data/sdk-generation-log/checkout.json +4 -4
  35. data/sdk-generation-log/management.json +4 -4
  36. data/sdk-generation-log/posmobile.json +4 -4
  37. data/sdk-generation-log/transfers.json +4 -4
  38. data/spec/balance_control_spec.rb +41 -0
  39. data/spec/balance_platform_spec.rb +498 -4
  40. data/spec/checkout-oauth_spec.rb +220 -10
  41. data/spec/checkout_spec.rb +245 -10
  42. data/spec/client_spec.rb +1 -5
  43. data/spec/deprecation_spec.rb +112 -0
  44. data/spec/management_spec.rb +184 -0
  45. data/spec/mocks/requests/BalancePlatform/apply_managed_schedule.json +14 -0
  46. data/spec/mocks/requests/BalancePlatform/begin_sca_device_registration.json +4 -0
  47. data/spec/mocks/requests/BalancePlatform/create_recurring_top_up.json +21 -0
  48. data/spec/mocks/requests/BalancePlatform/create_sweep.json +10 -0
  49. data/spec/mocks/requests/BalancePlatform/finish_sca_device_registration.json +3 -0
  50. data/spec/mocks/requests/BalancePlatform/submit_sca_association.json +8 -0
  51. data/spec/mocks/requests/BalancePlatform/update_balance_account_managed_schedule.json +5 -0
  52. data/spec/mocks/requests/BalancePlatform/update_recurring_top_ups.json +3 -0
  53. data/spec/mocks/requests/BalancePlatform/update_sweep.json +6 -0
  54. data/spec/mocks/requests/Checkout/amount_updates.json +1 -1
  55. data/spec/mocks/requests/Checkout/card_details.json +3 -0
  56. data/spec/mocks/requests/Checkout/create_stored_payment_method.json +10 -0
  57. data/spec/mocks/requests/Checkout/donation_campaigns.json +4 -0
  58. data/spec/mocks/requests/Checkout/donations.json +9 -0
  59. data/spec/mocks/requests/Checkout/orders.json +5 -3
  60. data/spec/mocks/requests/Checkout/payment-details.json +2 -14
  61. data/spec/mocks/requests/Checkout/payment_methods_balance.json +5 -2
  62. data/spec/mocks/requests/Checkout/payments.json +9 -10
  63. data/spec/mocks/requests/Checkout/paypal_update_order.json +5 -0
  64. data/spec/mocks/requests/Checkout/reversals.json +3 -0
  65. data/spec/mocks/requests/Checkout/update_session.json +7 -0
  66. data/spec/mocks/requests/Management/create_donation_campaign.json +7 -0
  67. data/spec/mocks/requests/Management/list_nonprofits.json +5 -0
  68. data/spec/mocks/requests/Management/update_donation_campaign.json +6 -0
  69. data/spec/mocks/requests/Transfers/initiate_cashout.json +12 -0
  70. data/spec/mocks/responses/BalancePlatform/apply_managed_schedule.json +17 -0
  71. data/spec/mocks/responses/BalancePlatform/begin_sca_device_registration.json +8 -0
  72. data/spec/mocks/responses/BalancePlatform/create_recurring_top_up.json +23 -0
  73. data/spec/mocks/responses/BalancePlatform/create_sweep.json +12 -0
  74. data/spec/mocks/responses/BalancePlatform/finish_sca_device_registration.json +7 -0
  75. data/spec/mocks/responses/BalancePlatform/get_all_sweeps_for_balance_account.json +31 -0
  76. data/spec/mocks/responses/BalancePlatform/get_balance_account_managed_schedule_by_id.json +17 -0
  77. data/spec/mocks/responses/BalancePlatform/get_balance_account_managed_schedules.json +26 -0
  78. data/spec/mocks/responses/BalancePlatform/get_balance_platform_managed_schedule_by_id.json +27 -0
  79. data/spec/mocks/responses/BalancePlatform/get_balance_platform_managed_schedules.json +31 -0
  80. data/spec/mocks/responses/BalancePlatform/get_payout_schedule_executions.json +21 -0
  81. data/spec/mocks/responses/BalancePlatform/get_recurring_top_ups.json +35 -0
  82. data/spec/mocks/responses/BalancePlatform/get_sweep.json +12 -0
  83. data/spec/mocks/responses/BalancePlatform/submit_sca_association.json +10 -0
  84. data/spec/mocks/responses/BalancePlatform/update_balance_account_managed_schedule.json +18 -0
  85. data/spec/mocks/responses/BalancePlatform/update_recurring_top_ups.json +23 -0
  86. data/spec/mocks/responses/BalancePlatform/update_sweep.json +12 -0
  87. data/spec/mocks/responses/Checkout/amount_updates.json +1 -1
  88. data/spec/mocks/responses/Checkout/card_details.json +5 -0
  89. data/spec/mocks/responses/Checkout/create_stored_payment_method.json +5 -0
  90. data/spec/mocks/responses/Checkout/donation_campaigns.json +1 -0
  91. data/spec/mocks/responses/Checkout/donations.json +5 -0
  92. data/spec/mocks/responses/Checkout/orders.json +6 -1
  93. data/spec/mocks/responses/Checkout/orders_cancel.json +1 -1
  94. data/spec/mocks/responses/Checkout/payment-details.json +2 -13
  95. data/spec/mocks/responses/Checkout/payment_links.json +3 -0
  96. data/spec/mocks/responses/Checkout/payment_methods.json +2 -2
  97. data/spec/mocks/responses/Checkout/payment_methods_balance.json +5 -1
  98. data/spec/mocks/responses/Checkout/payments.json +4 -94
  99. data/spec/mocks/responses/Checkout/paypal_update_order.json +4 -0
  100. data/spec/mocks/responses/Checkout/reversals.json +6 -0
  101. data/spec/mocks/responses/Checkout/update_session.json +3 -0
  102. data/spec/mocks/responses/Management/donation_campaign.json +13 -0
  103. data/spec/mocks/responses/Management/list_donation_campaigns.json +19 -0
  104. data/spec/mocks/responses/Management/list_nonprofits.json +34 -0
  105. data/spec/mocks/responses/Transfers/initiate_cashout.json +31 -0
  106. data/spec/spec_helper.rb +2 -2
  107. data/spec/transfers_spec.rb +28 -0
  108. data/spec/utils/consumer_smoke.rb +23 -0
  109. data/spec/utils/hmac_validator_spec.rb +55 -0
  110. data/templates/api-small.mustache +4 -2
  111. data/templates/api.mustache +4 -2
  112. 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
@@ -47,7 +47,9 @@ module Adyen
47
47
  # Create a donation
48
48
  #
49
49
  # Deprecated
50
+ # @deprecated
50
51
  def donate(request, headers: {})
52
+ Adyen::Deprecation.warn(:donate)
51
53
  endpoint = build_endpoint('/donate')
52
54
 
53
55
  action = { method: 'post', url: endpoint }
@@ -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 }
@@ -1,3 +1,5 @@
1
+ require_relative '../deprecation'
2
+
1
3
  module Adyen
2
4
  class Service
3
5
  attr_accessor :service, :version
@@ -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 == merchant_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 == hmac_signature
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.strict_encode64(
52
- OpenSSL::HMAC.digest(HMAC_ALGORITHM, [hmac_key].pack('H*'), data)
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.strict_encode64(
60
- OpenSSL::HMAC.digest(HMAC_ALGORITHM, [hmac_key].pack('H*'), data)
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,4 +1,4 @@
1
1
  module Adyen
2
2
  NAME = 'adyen-ruby-api-library'.freeze
3
- VERSION = '11.3.0'.freeze
3
+ VERSION = '12.0.0'.freeze
4
4
  end
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "service": "balanceplatform",
3
3
  "project": "ruby",
4
- "generatedAt": "2026-04-20T13:40:00Z",
5
- "openapiCommitSha": "3550ecd3f320efaad6bee55ffed5122cb9ba09d5",
6
- "automationCommitSha": "4ad0c0c7e87bc0e5994a9a3350a991d0691350bb",
7
- "libraryCommitSha": "60ccdbdbbb7069d54600a8a8cd19eea245661134"
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-04-20T13:39:49Z",
5
- "openapiCommitSha": "3550ecd3f320efaad6bee55ffed5122cb9ba09d5",
6
- "automationCommitSha": "4ad0c0c7e87bc0e5994a9a3350a991d0691350bb",
7
- "libraryCommitSha": "60ccdbdbbb7069d54600a8a8cd19eea245661134"
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-04-20T13:39:49Z",
5
- "openapiCommitSha": "3550ecd3f320efaad6bee55ffed5122cb9ba09d5",
6
- "automationCommitSha": "4ad0c0c7e87bc0e5994a9a3350a991d0691350bb",
7
- "libraryCommitSha": "60ccdbdbbb7069d54600a8a8cd19eea245661134"
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-04-20T13:39:47Z",
5
- "openapiCommitSha": "3550ecd3f320efaad6bee55ffed5122cb9ba09d5",
6
- "automationCommitSha": "4ad0c0c7e87bc0e5994a9a3350a991d0691350bb",
7
- "libraryCommitSha": "60ccdbdbbb7069d54600a8a8cd19eea245661134"
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-04-20T13:39:51Z",
5
- "openapiCommitSha": "3550ecd3f320efaad6bee55ffed5122cb9ba09d5",
6
- "automationCommitSha": "4ad0c0c7e87bc0e5994a9a3350a991d0691350bb",
7
- "libraryCommitSha": "60ccdbdbbb7069d54600a8a8cd19eea245661134"
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