adyen-ruby-api-library 11.2.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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -1
  3. data/.github/workflows/codeql.yml +4 -4
  4. data/.github/workflows/release.yml +1 -1
  5. data/.github/workflows/ruby.yml +3 -3
  6. data/.github/workflows/rubygems_release.yml +1 -1
  7. data/.github/workflows/stale.yml +1 -1
  8. data/Gemfile +2 -2
  9. data/README.md +30 -7
  10. data/VERSION +1 -1
  11. data/adyen-ruby-api-library.gemspec +1 -1
  12. data/lib/adyen/client.rb +10 -16
  13. data/lib/adyen/deprecation.rb +34 -0
  14. data/lib/adyen/services/balanceControl/balance_control_api.rb +3 -3
  15. data/lib/adyen/services/balancePlatform/account_holders_api.rb +14 -18
  16. data/lib/adyen/services/balancePlatform/authorized_card_users_api.rb +4 -12
  17. data/lib/adyen/services/balancePlatform/balance_accounts_api.rb +5 -65
  18. data/lib/adyen/services/balancePlatform/balances_api.rb +5 -15
  19. data/lib/adyen/services/balancePlatform/bank_account_validation_api.rb +1 -3
  20. data/lib/adyen/services/balancePlatform/card_orders_api.rb +2 -6
  21. data/lib/adyen/services/balancePlatform/custom_payout_schedules_sweeps_api.rb +56 -0
  22. data/lib/adyen/services/balancePlatform/direct_debit_mandates_api.rb +48 -0
  23. data/lib/adyen/services/balancePlatform/grant_accounts_api.rb +3 -3
  24. data/lib/adyen/services/balancePlatform/grant_offers_api.rb +6 -6
  25. data/lib/adyen/services/balancePlatform/manage_card_pin_api.rb +3 -9
  26. data/lib/adyen/services/balancePlatform/manage_sca_devices_api.rb +6 -18
  27. data/lib/adyen/services/balancePlatform/managed_payout_schedules_api.rb +80 -0
  28. data/lib/adyen/services/balancePlatform/network_tokens_api.rb +2 -6
  29. data/lib/adyen/services/balancePlatform/payment_instrument_groups_api.rb +3 -9
  30. data/lib/adyen/services/balancePlatform/payment_instruments_api.rb +9 -27
  31. data/lib/adyen/services/balancePlatform/platform_api.rb +3 -9
  32. data/lib/adyen/services/balancePlatform/recurring_top_ups_api.rb +48 -0
  33. data/lib/adyen/services/balancePlatform/sca_association_management_api.rb +3 -9
  34. data/lib/adyen/services/balancePlatform/sca_device_management_api.rb +11 -9
  35. data/lib/adyen/services/balancePlatform/transaction_rules_api.rb +4 -12
  36. data/lib/adyen/services/balancePlatform/transfer_limits_balance_account_level_api.rb +6 -18
  37. data/lib/adyen/services/balancePlatform/transfer_limits_balance_platform_level_api.rb +4 -12
  38. data/lib/adyen/services/balancePlatform/transfer_routes_api.rb +1 -3
  39. data/lib/adyen/services/balancePlatform.rb +20 -0
  40. data/lib/adyen/services/binLookup/bin_lookup_api.rb +2 -6
  41. data/lib/adyen/services/capital/dynamic_offers_api.rb +40 -0
  42. data/lib/adyen/services/capital/grant_accounts_api.rb +1 -3
  43. data/lib/adyen/services/capital/grant_offers_api.rb +4 -8
  44. data/lib/adyen/services/capital/grants_api.rb +6 -18
  45. data/lib/adyen/services/capital.rb +5 -0
  46. data/lib/adyen/services/checkout/donations_api.rb +2 -6
  47. data/lib/adyen/services/checkout/modifications_api.rb +6 -18
  48. data/lib/adyen/services/checkout/orders_api.rb +3 -9
  49. data/lib/adyen/services/checkout/payment_links_api.rb +3 -9
  50. data/lib/adyen/services/checkout/payments_api.rb +14 -18
  51. data/lib/adyen/services/checkout/recurring_api.rb +4 -12
  52. data/lib/adyen/services/checkout/utility_api.rb +6 -12
  53. data/lib/adyen/services/checkout.rb +1 -1
  54. data/lib/adyen/services/dataProtection/data_protection_api.rb +1 -3
  55. data/lib/adyen/services/disputes/disputes_api.rb +5 -15
  56. data/lib/adyen/services/legalEntityManagement/business_lines_api.rb +4 -12
  57. data/lib/adyen/services/legalEntityManagement/documents_api.rb +4 -12
  58. data/lib/adyen/services/legalEntityManagement/hosted_onboarding_api.rb +3 -9
  59. data/lib/adyen/services/legalEntityManagement/legal_entities_api.rb +7 -21
  60. data/lib/adyen/services/legalEntityManagement/pci_questionnaires_api.rb +5 -15
  61. data/lib/adyen/services/legalEntityManagement/tax_e_delivery_consent_api.rb +2 -6
  62. data/lib/adyen/services/legalEntityManagement/terms_of_service_api.rb +5 -15
  63. data/lib/adyen/services/legalEntityManagement/transfer_instruments_api.rb +4 -12
  64. data/lib/adyen/services/management/account_company_level_api.rb +3 -9
  65. data/lib/adyen/services/management/account_merchant_level_api.rb +4 -12
  66. data/lib/adyen/services/management/account_store_level_api.rb +8 -24
  67. data/lib/adyen/services/management/allowed_origins_company_level_api.rb +4 -12
  68. data/lib/adyen/services/management/allowed_origins_merchant_level_api.rb +4 -12
  69. data/lib/adyen/services/management/android_files_company_level_api.rb +6 -18
  70. data/lib/adyen/services/management/api_credentials_company_level_api.rb +4 -12
  71. data/lib/adyen/services/management/api_credentials_merchant_level_api.rb +4 -12
  72. data/lib/adyen/services/management/api_key_company_level_api.rb +1 -3
  73. data/lib/adyen/services/management/api_key_merchant_level_api.rb +1 -3
  74. data/lib/adyen/services/management/client_key_company_level_api.rb +1 -3
  75. data/lib/adyen/services/management/client_key_merchant_level_api.rb +1 -3
  76. data/lib/adyen/services/management/donation_campaigns_api.rb +64 -0
  77. data/lib/adyen/services/management/my_api_credential_api.rb +6 -18
  78. data/lib/adyen/services/management/payment_methods_merchant_level_api.rb +6 -18
  79. data/lib/adyen/services/management/payout_settings_merchant_level_api.rb +5 -15
  80. data/lib/adyen/services/management/split_configuration_merchant_level_api.rb +9 -27
  81. data/lib/adyen/services/management/terminal_actions_company_level_api.rb +2 -6
  82. data/lib/adyen/services/management/terminal_actions_terminal_level_api.rb +1 -3
  83. data/lib/adyen/services/management/terminal_orders_company_level_api.rb +10 -30
  84. data/lib/adyen/services/management/terminal_orders_merchant_level_api.rb +10 -30
  85. data/lib/adyen/services/management/terminal_settings_company_level_api.rb +4 -12
  86. data/lib/adyen/services/management/terminal_settings_merchant_level_api.rb +4 -12
  87. data/lib/adyen/services/management/terminal_settings_store_level_api.rb +8 -24
  88. data/lib/adyen/services/management/terminal_settings_terminal_level_api.rb +4 -12
  89. data/lib/adyen/services/management/terminals_terminal_level_api.rb +2 -6
  90. data/lib/adyen/services/management/users_company_level_api.rb +4 -12
  91. data/lib/adyen/services/management/users_merchant_level_api.rb +4 -12
  92. data/lib/adyen/services/management/webhooks_company_level_api.rb +7 -21
  93. data/lib/adyen/services/management/webhooks_merchant_level_api.rb +7 -21
  94. data/lib/adyen/services/management.rb +5 -0
  95. data/lib/adyen/services/payment/modifications_api.rb +10 -24
  96. data/lib/adyen/services/payment/payments_api.rb +5 -15
  97. data/lib/adyen/services/paymentsApp/payments_app_api.rb +5 -15
  98. data/lib/adyen/services/payout/initialization_api.rb +3 -9
  99. data/lib/adyen/services/payout/instant_payouts_api.rb +1 -3
  100. data/lib/adyen/services/payout/reviewing_api.rb +2 -6
  101. data/lib/adyen/services/posMobile/pos_mobile_api.rb +6 -3
  102. data/lib/adyen/services/posTerminalManagement.rb +10 -0
  103. data/lib/adyen/services/recurring/recurring_api.rb +10 -18
  104. data/lib/adyen/services/service.rb +12 -2
  105. data/lib/adyen/services/sessionAuthentication/session_authentication_api.rb +1 -3
  106. data/lib/adyen/services/storedValue/stored_value_api.rb +6 -18
  107. data/lib/adyen/services/transfers/capital_api.rb +9 -9
  108. data/lib/adyen/services/transfers/cash_out_api.rb +24 -0
  109. data/lib/adyen/services/transfers/transactions_api.rb +2 -6
  110. data/lib/adyen/services/transfers/transfers_api.rb +6 -18
  111. data/lib/adyen/services/transfers.rb +5 -0
  112. data/lib/adyen/utils/hmac_validator.rb +15 -18
  113. data/lib/adyen/version.rb +1 -1
  114. data/sdk-generation-log/balancecontrol.json +8 -0
  115. data/sdk-generation-log/balanceplatform.json +8 -0
  116. data/sdk-generation-log/binlookup.json +8 -0
  117. data/sdk-generation-log/capital.json +8 -0
  118. data/sdk-generation-log/checkout.json +8 -0
  119. data/sdk-generation-log/dataprotection.json +8 -0
  120. data/sdk-generation-log/disputes.json +8 -0
  121. data/sdk-generation-log/legalentitymanagement.json +8 -0
  122. data/sdk-generation-log/management.json +8 -0
  123. data/sdk-generation-log/payment.json +8 -0
  124. data/sdk-generation-log/paymentsapp.json +8 -0
  125. data/sdk-generation-log/payout.json +8 -0
  126. data/sdk-generation-log/posmobile.json +8 -0
  127. data/sdk-generation-log/recurring.json +8 -0
  128. data/sdk-generation-log/sessionauthentication.json +8 -0
  129. data/sdk-generation-log/storedvalue.json +8 -0
  130. data/sdk-generation-log/transfers.json +8 -0
  131. data/spec/balance_control_spec.rb +41 -0
  132. data/spec/balance_platform_spec.rb +609 -4
  133. data/spec/capital_spec.rb +82 -0
  134. data/spec/checkout-oauth_spec.rb +220 -10
  135. data/spec/checkout_spec.rb +245 -10
  136. data/spec/client_spec.rb +23 -5
  137. data/spec/deprecation_spec.rb +112 -0
  138. data/spec/management_spec.rb +184 -0
  139. data/spec/mocks/requests/BalancePlatform/apply_managed_schedule.json +14 -0
  140. data/spec/mocks/requests/BalancePlatform/begin_sca_device_registration.json +4 -0
  141. data/spec/mocks/requests/BalancePlatform/create_recurring_top_up.json +21 -0
  142. data/spec/mocks/requests/BalancePlatform/create_sweep.json +10 -0
  143. data/spec/mocks/requests/BalancePlatform/finish_sca_device_registration.json +3 -0
  144. data/spec/mocks/requests/BalancePlatform/submit_sca_association.json +8 -0
  145. data/spec/mocks/requests/BalancePlatform/update_balance_account_managed_schedule.json +5 -0
  146. data/spec/mocks/requests/BalancePlatform/update_mandate.json +14 -0
  147. data/spec/mocks/requests/BalancePlatform/update_recurring_top_ups.json +3 -0
  148. data/spec/mocks/requests/BalancePlatform/update_sweep.json +6 -0
  149. data/spec/mocks/requests/Checkout/amount_updates.json +1 -1
  150. data/spec/mocks/requests/Checkout/card_details.json +3 -0
  151. data/spec/mocks/requests/Checkout/create_stored_payment_method.json +10 -0
  152. data/spec/mocks/requests/Checkout/donation_campaigns.json +4 -0
  153. data/spec/mocks/requests/Checkout/donations.json +9 -0
  154. data/spec/mocks/requests/Checkout/orders.json +5 -3
  155. data/spec/mocks/requests/Checkout/payment-details.json +2 -14
  156. data/spec/mocks/requests/Checkout/payment_methods_balance.json +5 -2
  157. data/spec/mocks/requests/Checkout/payments.json +9 -10
  158. data/spec/mocks/requests/Checkout/paypal_update_order.json +5 -0
  159. data/spec/mocks/requests/Checkout/reversals.json +3 -0
  160. data/spec/mocks/requests/Checkout/update_session.json +7 -0
  161. data/spec/mocks/requests/Management/create_donation_campaign.json +7 -0
  162. data/spec/mocks/requests/Management/list_nonprofits.json +5 -0
  163. data/spec/mocks/requests/Management/update_donation_campaign.json +6 -0
  164. data/spec/mocks/requests/Transfers/initiate_cashout.json +12 -0
  165. data/spec/mocks/responses/BalancePlatform/apply_managed_schedule.json +17 -0
  166. data/spec/mocks/responses/BalancePlatform/begin_sca_device_registration.json +8 -0
  167. data/spec/mocks/responses/BalancePlatform/create_recurring_top_up.json +23 -0
  168. data/spec/mocks/responses/BalancePlatform/create_sweep.json +12 -0
  169. data/spec/mocks/responses/BalancePlatform/finish_sca_device_registration.json +7 -0
  170. data/spec/mocks/responses/BalancePlatform/get_all_sweeps_for_balance_account.json +31 -0
  171. data/spec/mocks/responses/BalancePlatform/get_balance_account_managed_schedule_by_id.json +17 -0
  172. data/spec/mocks/responses/BalancePlatform/get_balance_account_managed_schedules.json +26 -0
  173. data/spec/mocks/responses/BalancePlatform/get_balance_platform_managed_schedule_by_id.json +27 -0
  174. data/spec/mocks/responses/BalancePlatform/get_balance_platform_managed_schedules.json +31 -0
  175. data/spec/mocks/responses/BalancePlatform/get_list_of_mandates.json +19 -0
  176. data/spec/mocks/responses/BalancePlatform/get_mandate_by_id.json +14 -0
  177. data/spec/mocks/responses/BalancePlatform/get_payout_schedule_executions.json +21 -0
  178. data/spec/mocks/responses/BalancePlatform/get_recurring_top_ups.json +35 -0
  179. data/spec/mocks/responses/BalancePlatform/get_sweep.json +12 -0
  180. data/spec/mocks/responses/BalancePlatform/get_tax_form_summary.json +17 -0
  181. data/spec/mocks/responses/BalancePlatform/submit_sca_association.json +10 -0
  182. data/spec/mocks/responses/BalancePlatform/update_balance_account_managed_schedule.json +18 -0
  183. data/spec/mocks/responses/BalancePlatform/update_recurring_top_ups.json +23 -0
  184. data/spec/mocks/responses/BalancePlatform/update_sweep.json +12 -0
  185. data/spec/mocks/responses/Capital/calculate-preliminary-offer-from-dynamic-offer.json +16 -0
  186. data/spec/mocks/responses/Capital/create-static-offer-from-dynamic-offer.json +9 -0
  187. data/spec/mocks/responses/Capital/get-all-dynamic-offers.json +18 -0
  188. data/spec/mocks/responses/Checkout/amount_updates.json +1 -1
  189. data/spec/mocks/responses/Checkout/card_details.json +5 -0
  190. data/spec/mocks/responses/Checkout/create_stored_payment_method.json +5 -0
  191. data/spec/mocks/responses/Checkout/donation_campaigns.json +1 -0
  192. data/spec/mocks/responses/Checkout/donations.json +5 -0
  193. data/spec/mocks/responses/Checkout/orders.json +6 -1
  194. data/spec/mocks/responses/Checkout/orders_cancel.json +1 -1
  195. data/spec/mocks/responses/Checkout/payment-details.json +2 -13
  196. data/spec/mocks/responses/Checkout/payment_links.json +3 -0
  197. data/spec/mocks/responses/Checkout/payment_methods.json +2 -2
  198. data/spec/mocks/responses/Checkout/payment_methods_balance.json +5 -1
  199. data/spec/mocks/responses/Checkout/payments.json +4 -94
  200. data/spec/mocks/responses/Checkout/paypal_update_order.json +4 -0
  201. data/spec/mocks/responses/Checkout/reversals.json +6 -0
  202. data/spec/mocks/responses/Checkout/update_session.json +3 -0
  203. data/spec/mocks/responses/Management/donation_campaign.json +13 -0
  204. data/spec/mocks/responses/Management/list_donation_campaigns.json +19 -0
  205. data/spec/mocks/responses/Management/list_nonprofits.json +34 -0
  206. data/spec/mocks/responses/Transfers/initiate_cashout.json +31 -0
  207. data/spec/service_spec.rb +40 -0
  208. data/spec/spec_helper.rb +2 -2
  209. data/spec/transfers_spec.rb +28 -0
  210. data/spec/utils/consumer_smoke.rb +23 -0
  211. data/spec/utils/hmac_validator_spec.rb +55 -0
  212. data/templates/api-small.mustache +4 -4
  213. data/templates/api.mustache +4 -4
  214. metadata +84 -2
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "TUPC0000000000000000000001",
3
+ "counterparty": {
4
+ "transferInstrumentId": "SE000000000000000000000001"
5
+ },
6
+ "description": "new description",
7
+ "topUpAmount": {
8
+ "fixed": {
9
+ "value": 1000,
10
+ "currency": "EUR"
11
+ }
12
+ },
13
+ "trigger": {
14
+ "schedule": {
15
+ "type": "weekdays"
16
+ },
17
+ "threshold": {
18
+ "value": 100,
19
+ "currency": "EUR"
20
+ }
21
+ },
22
+ "status": "inactive"
23
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "counterparty": {
3
+ "balanceAccountId": "BA3227C223222B5BLP6JQC3FD"
4
+ },
5
+ "currency": "EUR",
6
+ "id": "SWEP00000000000000000000000001",
7
+ "schedule": {
8
+ "type": "weekly"
9
+ },
10
+ "status": "inactive",
11
+ "type": "push"
12
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "DO00000000000000000000001",
3
+ "amount": {
4
+ "currency": "EUR",
5
+ "value": 10000
6
+ },
7
+ "fee": {
8
+ "amount": {
9
+ "currency": "EUR",
10
+ "value": 1000
11
+ }
12
+ },
13
+ "repayment": {
14
+ "basisPoints": 1000
15
+ }
16
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "GO00000000000000000000002",
3
+ "accountHolderId": "AH00000000000000000000001",
4
+ "contractType": "cashAdvance",
5
+ "amount": {
6
+ "currency": "EUR",
7
+ "value": 10000
8
+ }
9
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "dynamicOffers": [
3
+ {
4
+ "id": "DO00000000000000000000001",
5
+ "accountHolderId": "AH00000000000000000000001",
6
+ "financing": {
7
+ "minimum": {
8
+ "currency": "EUR",
9
+ "value": 5000
10
+ },
11
+ "maximum": {
12
+ "currency": "EUR",
13
+ "value": 25000
14
+ }
15
+ }
16
+ }
17
+ ]
18
+ }
@@ -6,7 +6,7 @@
6
6
  "merchantAccount": "TestMerchant",
7
7
  "paymentPspReference": "123456789",
8
8
  "pspReference": "12345",
9
- "reason": "delayedCharge",
9
+ "industryUsage": "delayedCharge",
10
10
  "reference": "123456789",
11
11
  "splits": [
12
12
  {
@@ -0,0 +1,5 @@
1
+ {
2
+ "fundingSource": "mock-fundingSource",
3
+ "isCardCommercial": true,
4
+ "issuingCountryCode": "mock-issuingCountryCode"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "alias": "mock-alias",
3
+ "aliasType": "mock-aliasType",
4
+ "brand": "mc"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "donationAccount": "YOUR_DONATION_ACCOUNT",
3
+ "id": "MOCK_ID_123",
4
+ "merchantAccount": "YOUR_MERCHANT_ACCOUNT"
5
+ }
@@ -1,8 +1,13 @@
1
1
  {
2
+ "amount": {
3
+ "currency": "USD",
4
+ "value": 1000
5
+ },
2
6
  "expiresAt": "1970-01-01",
3
7
  "orderData": "mockedOrderData",
4
8
  "remainingAmount": {
5
9
  "currency": "USD",
6
10
  "value": 100
7
- }
11
+ },
12
+ "resultCode": "Success"
8
13
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "pspReference": "mocked_psp_ref",
3
- "resultCode": "cancelled"
3
+ "resultCode": "Received"
4
4
  }
@@ -1,14 +1,3 @@
1
1
  {
2
- "resultCode": "RedirectShopper",
3
- "details": [
4
- {
5
- "key": "returnUrlQueryString",
6
- "type": "text"
7
- }
8
- ],
9
- "paymentData": "Ab02b4c0!BQABAgCZ5wU8Xzylbj3tQI9zZtbOmutq5gON3jF0JOVL9VXTcQ70LkB8UzJZ2EuJiURbwNSpyfMnNNR9ecDBq0Ai+Cu97eUP6/wc51Gh2VClWKILA3fpetixy8rcEd1dHVT9Exa77zg0LuY6qXz/5GIIH62y9CnmKJH4a4KZVQwFu9VYtPnsC8p6Bby2BuByD/VSa3noZDBVuapvWL7+8P6QaPgkFgoWYnzT8uzdoCio+gTNEYivlxhuQj5qa+eyQCrzZDXAvl+1a1z7O3BOOC7yPT0VDd8zNnyxKk9lyax75FUCRYl1BNCP1CGGDzHfvsS8C4FhXPixhZ4Lb1pYajLpKXNqfiRqU4DXn6bAkdnoQ5X8TvD3HqgHos4OLY93qq7j3ai+zeS/hWkZrd0SM+br3G+kCPmzMcBYdIqJLecJcVUUWHUNfdYIl6tmzNDbeedqSXVkyX+w7R/bM3hHppQyFpy2UM6BHalSaIc2oqR2wLQeObOlV9VML2yAvUzIK6OsFdnCtjK+aQsYwBvKMHkgsukvJiEvfwkLzrwxJQWRvYQtVV7ITcSz98tKZmxUFdke8Hca+ySTbqq9OvjGCK+T7FLhaKYGSECcwwKCCKMneTW7S/8Y+qpw2WRBx2Bhho8ZfIwsnq2Nll+QbaOJEiC0PG3NokYhcrKVhXiFFkYYnzNI9hAnjkefE+5rR5dWWWM8Q8h7AEp7ImtleSI6IkFGMEFBQTEwM0NBNTM3RUFFRDg3QzI0REQ1MzkwOUI4MEE3OEE5MjNFMzgyM0Q2OERBQ0M5NEI5RkY4MzA1REMifbA560uFihRRe//z0I3kVj3lZxHTKJZgPZUDraWMQfkMjM7KKXPwyCXyThFp1bFYMmebpxYvbqErFky66og24VCmvNKiZnf1uPJi5OsK9t6QJU1vhC0/QzeCu1TQLUEyUWrelX0V+iO+933RFUzSv78BLNO/bt5JMFIKQoLP6J4CW+bHk+fWrBn4PhbZ5z/ezu23OHoDvg6Pvk1kjxps8FAbHoSB35b+HvOUDtph/usiBWBCgLQVtkbR7C2ImDd4HRh3QvkgjXgbRGGIBBc+jPM9TMYytNlAhB32jktviPASz9+v073N417onB0pcS0Bp2iFTpmsMjWcSbctbj65JTiBIwY6egGrD9ona/oEb+/oppiz4KzS2sJKvtOPg+Jxn2UNssc0dg8gZhV1dxfSqDNonsfxl0vwKoeG99FjyrfgFQvYNlqjn3/WNacjFtCOrBafIQJk95TnkBdpzuqtvqQyIZeq7PbRuTNIb1AQBTmKNmuZMd+gO95sIvhbE1XgO2InIQKCpw0q0Hbw9Nzowm6w1gbSKnabGZhb8SOM+lJ37dNTsNIB/5Eo36kijladqVt5RYGMHLkQa6vxjhfuYPfHYzO5MX4i0ml8rstB5D5sfLqvY3Igzc6RnDhpX5kxVIFAhuPxkTeKFTpCXmnHJwilCY9pZTzVlJp6kOWnk1JlalrzmI3iU6Zhz3ICLNQ+Ub/HEnombi31lZWHnUmhwGKxKg==",
10
- "redirect": {
11
- "method": "GET",
12
- "url": "https://test.adyen.com/hpp/redirectIdeal.shtml?brandCode=ideal&currencyCode=USD&merchantAccount=ColinRood&merchantReference=PM+Checkout+Payment&merchantSig=MKOR8NMs6190maY8sPDCMgOHNIscN356EIhUxSnpDsw%3D&paymentAmount=1000&resURL=https%3A%2F%2Fcheckoutshopper-test.adyen.com%2Fcheckoutshopper%2Fservices%2FPaymentIncomingRedirect%2Fv1%2FlocalPaymentMethod%3FreturnURL%3D&sessionValidity=2018-03-02T18%3A05%3A42Z&skinCode=pub.v2.8115054323780109.7FDNnCDyDJG8hRqbIjU3AQHvyBRuRoNFYHQWgmX4lAU"
13
- }
14
- }
2
+ "resultCode": "RedirectShopper"
3
+ }
@@ -4,6 +4,9 @@
4
4
  "value": 1000
5
5
  },
6
6
  "expiresAt": "2019-12-14T10:05:29Z",
7
+ "id": "MockId",
8
+ "merchantAccount": "TestMerchant",
7
9
  "reference": "Merchant Reference",
10
+ "status": "active",
8
11
  "url": "https://checkoutshopper-test.adyen.com"
9
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "paymentMethods": [
3
3
  {
4
- "details": [
4
+ "inputDetails": [
5
5
  {
6
6
  "key": "additionalData.card.encrypted.json",
7
7
  "type": "cardToken"
@@ -11,7 +11,7 @@
11
11
  "type": "scheme"
12
12
  },
13
13
  {
14
- "details": [
14
+ "inputDetails": [
15
15
  {
16
16
  "items": [
17
17
  {
@@ -1,3 +1,7 @@
1
1
  {
2
- "balance": "100"
2
+ "balance": {
3
+ "currency": "EUR",
4
+ "value": 100
5
+ },
6
+ "resultCode": "Success"
3
7
  }
@@ -1,95 +1,5 @@
1
1
  {
2
- "additionalData": {
3
- "liabilityShift": "true",
4
- "fraudResultType": "GREEN",
5
- "authCode": "43733",
6
- "avsResult": "4 AVS not supported for this card type",
7
- "cardHolderName": "Holder",
8
- "cardSummary": "1111",
9
- "fraudManualReview": "false",
10
- "threeDOffered": "true",
11
- "refusalReasonRaw": "AUTHORISED",
12
- "expiryDate": "8/2018",
13
- "cvcResult": "1 Matches",
14
- "cardBin": "411111",
15
- "avsResultRaw": "4",
16
- "threeDAuthenticated": "false",
17
- "paymentMethod": "visa",
18
- "cvcResultRaw": "1",
19
- "acquirerCode": "TestPmmAcquirer",
20
- "acquirerReference": "7F59FSE1M6K"
21
- },
22
- "fraudResult": {
23
- "accountScore": 25,
24
- "results": [{
25
- "FraudCheckResult": {
26
- "accountScore": 8,
27
- "checkId": 2,
28
- "name": "CardChunkUsage"
29
- }
30
- }, {
31
- "FraudCheckResult": {
32
- "accountScore": 5,
33
- "checkId": 3,
34
- "name": "PaymentDetailUsage"
35
- }
36
- }, {
37
- "FraudCheckResult": {
38
- "accountScore": 12,
39
- "checkId": 4,
40
- "name": "HolderNameUsage"
41
- }
42
- }, {
43
- "FraudCheckResult": {
44
- "accountScore": 0,
45
- "checkId": 1,
46
- "name": "PaymentDetailRefCheck"
47
- }
48
- }, {
49
- "FraudCheckResult": {
50
- "accountScore": 0,
51
- "checkId": 13,
52
- "name": "IssuerRefCheck"
53
- }
54
- }, {
55
- "FraudCheckResult": {
56
- "accountScore": 0,
57
- "checkId": 15,
58
- "name": "IssuingCountryReferral"
59
- }
60
- }, {
61
- "FraudCheckResult": {
62
- "accountScore": 0,
63
- "checkId": 27,
64
- "name": "PmOwnerRefCheck"
65
- }
66
- }, {
67
- "FraudCheckResult": {
68
- "accountScore": 0,
69
- "checkId": 41,
70
- "name": "PaymentDetailNonFraudRefCheck"
71
- }
72
- }, {
73
- "FraudCheckResult": {
74
- "accountScore": 0,
75
- "checkId": 10,
76
- "name": "HolderNameContainsNumber"
77
- }
78
- }, {
79
- "FraudCheckResult": {
80
- "accountScore": 0,
81
- "checkId": 11,
82
- "name": "HolderNameIsOneWord"
83
- }
84
- }, {
85
- "FraudCheckResult": {
86
- "accountScore": 0,
87
- "checkId": 25,
88
- "name": "CVCAuthResultCheck"
89
- }
90
- }]
91
- },
92
- "pspReference": "7924835492819808",
93
- "resultCode": "Authorised",
94
- "authCode": "69746"
95
- }
2
+ "merchantReference": "YOUR_REFERENCE_0001",
3
+ "pspReference": "8512345678901234",
4
+ "resultCode": "Authorised"
5
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "paymentData": "mock-paymentData",
3
+ "status": "error"
4
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
3
+ "paymentPspReference": "8535678901234567",
4
+ "pspReference": "8512345678901234",
5
+ "status": "received"
6
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "sessionData": "UPDATED_SESSION_DATA_BLOB"
3
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "DC3227C223222B5BLP6JQC3FD",
3
+ "name": "Spring fundraiser",
4
+ "status": "inactive",
5
+ "nonprofitCause": {
6
+ "causeId": "CA3227C223222B5BLP6JQC3FD",
7
+ "nonprofitName": "Example Nonprofit",
8
+ "description": "An example nonprofit cause."
9
+ },
10
+ "accountHolderIds": [
11
+ "AH3227C223222B5BLP6JQC3FD"
12
+ ]
13
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "itemsTotal": 1,
3
+ "pagesTotal": 1,
4
+ "campaigns": [
5
+ {
6
+ "id": "DC3227C223222B5BLP6JQC3FD",
7
+ "name": "Spring fundraiser",
8
+ "status": "active",
9
+ "nonprofitCause": {
10
+ "causeId": "CA3227C223222B5BLP6JQC3FD",
11
+ "nonprofitName": "Example Nonprofit",
12
+ "description": "An example nonprofit cause."
13
+ },
14
+ "accountHolderIds": [
15
+ "AH3227C223222B5BLP6JQC3FD"
16
+ ]
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "itemsTotal": 1,
3
+ "pagesTotal": 1,
4
+ "nonprofits": [
5
+ {
6
+ "id": "NP3227C223222B5BLP6JQC3FD",
7
+ "name": "Example Nonprofit",
8
+ "description": "An example nonprofit organization.",
9
+ "logoUrl": "https://example.org/logo.png",
10
+ "website": "https://example.org",
11
+ "termsAndConditionsUrl": "https://example.org/terms",
12
+ "goals": [
13
+ "unsdg_1"
14
+ ],
15
+ "locales": [
16
+ "en-US"
17
+ ],
18
+ "regions": [
19
+ "US"
20
+ ],
21
+ "causes": [
22
+ {
23
+ "id": "CA3227C223222B5BLP6JQC3FD",
24
+ "name": "Example Cause",
25
+ "description": "An example cause.",
26
+ "bannerUrl": "https://example.org/banner.png",
27
+ "locales": [
28
+ "en-US"
29
+ ]
30
+ }
31
+ ]
32
+ }
33
+ ]
34
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "id": "1W1UG35U8A9J5ZLG",
3
+ "amount": {
4
+ "value": 110000,
5
+ "currency": "EUR"
6
+ },
7
+ "instructingBalanceAccountId": "BAB8B2C3D4E5F6G7H8D9J6GD4",
8
+ "counterparty": {
9
+ "transferInstrumentId": "SE000JVZ7Q8D2ZJ4VZ0J"
10
+ },
11
+ "referenceForBeneficiary": "Your-reference-sent-to-the-beneficiary",
12
+ "description": "Your description for the cashout",
13
+ "transfers": [
14
+ {
15
+ "id": "400F6060JMB1I0AB",
16
+ "type": "cashoutRepayment",
17
+ "amount": {
18
+ "currency": "EUR",
19
+ "value": 50500
20
+ }
21
+ },
22
+ {
23
+ "id": "400F6060JMB1I0AA",
24
+ "type": "cashoutFee",
25
+ "amount": {
26
+ "currency": "EUR",
27
+ "value": 500
28
+ }
29
+ }
30
+ ]
31
+ }
data/spec/service_spec.rb CHANGED
@@ -3,6 +3,30 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe Adyen::Service do
6
+ describe '#build_endpoint' do
7
+ subject(:service) { described_class.new(nil, nil, 'Test') }
8
+
9
+ it 'strips the leading slash' do
10
+ expect(service.send(:build_endpoint, '/accountHolders')).to eq 'accountHolders'
11
+ end
12
+
13
+ it 'substitutes a single path parameter' do
14
+ expect(service.send(:build_endpoint, '/accountHolders/{id}', 'AH123')).to eq 'accountHolders/AH123'
15
+ end
16
+
17
+ it 'substitutes multiple path parameters' do
18
+ expect(service.send(:build_endpoint, '/merchants/{merchantId}/stores/{storeId}', 'M1', 'S2')).to eq 'merchants/M1/stores/S2'
19
+ end
20
+
21
+ it 'handles a path with no parameters' do
22
+ expect(service.send(:build_endpoint, '/companies')).to eq 'companies'
23
+ end
24
+
25
+ it 'preserves literal percent characters in the path' do
26
+ expect(service.send(:build_endpoint, '/path%20with/{id}/spaces', 'X')).to eq 'path%20with/X/spaces'
27
+ end
28
+ end
29
+
6
30
  describe '.action_for_method_name' do
7
31
  it 'handles all methods that exist currently' do
8
32
  expect(described_class.action_for_method_name(:adjust_authorisation)).to eq 'adjustAuthorisation'
@@ -45,6 +69,22 @@ RSpec.describe Adyen::Service do
45
69
  expect(described_class.action_for_method_name(:get_onboarding_url)).to eq 'getOnboardingUrl'
46
70
  end
47
71
  end
72
+
73
+ describe '#create_query_string' do
74
+ let(:service) { described_class.new(double('client'), 'v1', 'TestService') }
75
+
76
+ it 'returns empty string when params are empty' do
77
+ expect(service.create_query_string({})).to eq ''
78
+ end
79
+
80
+ it 'returns query string with ? prefix when params are present' do
81
+ expect(service.create_query_string({ key: 'value' })).to eq '?key=value'
82
+ end
83
+
84
+ it 'encodes multiple params' do
85
+ expect(service.create_query_string({ a: '1', b: '2' })).to eq '?a=1&b=2'
86
+ end
87
+ end
48
88
  end
49
89
  # rubocop:enable Layout/LineLength
50
90
  # rubocop:enable Metrics/BlockLength
data/spec/spec_helper.rb CHANGED
@@ -2,7 +2,6 @@
2
2
  # rubocop:disable Metrics/AbcSize
3
3
 
4
4
  require 'webmock/rspec'
5
- require 'base64'
6
5
  require_relative '../lib/adyen-ruby-api-library'
7
6
 
8
7
  # disable external connections
@@ -32,7 +31,8 @@ def create_test(client, service, method_name, parent_object)
32
31
  elsif !client.oauth_token.nil?
33
32
  headers["Authorization"] = "Bearer #{client.oauth_token}"
34
33
  elsif !client.ws_user.nil? && !client.ws_password.nil?
35
- auth_header = "Basic #{Base64.encode64("#{client.ws_user}:#{client.ws_password}")}"
34
+ # Base64 encoding
35
+ auth_header = "Basic #{["#{client.ws_user}:#{client.ws_password}"].pack('m')}"
36
36
  headers['Authorization'] = auth_header.strip
37
37
  else
38
38
  raise ArgumentError, 'Authentication not set correctly in test case'
@@ -33,6 +33,34 @@ RSpec.describe Adyen::Transfers, service: 'transfers' do
33
33
  .to eq(200)
34
34
  end
35
35
 
36
+ it 'makes a cashouts POST call' do
37
+ request_body = JSON.parse(json_from_file('mocks/requests/Transfers/initiate_cashout.json'))
38
+
39
+ response_body = json_from_file('mocks/responses/Transfers/initiate_cashout.json')
40
+
41
+ url = @shared_values[:client].service_url(@shared_values[:service], 'cashouts',
42
+ @shared_values[:client].transfers.version)
43
+ WebMock.stub_request(:post, url)
44
+ .with(
45
+ body: request_body,
46
+ headers: {
47
+ 'x-api-key' => @shared_values[:client].api_key
48
+ }
49
+ )
50
+ .to_return(
51
+ body: response_body
52
+ )
53
+
54
+ result = @shared_values[:client].transfers.cash_out_api.initiate_cashout(request_body)
55
+ response_hash = result.response
56
+
57
+ expect(result.status)
58
+ .to eq(200)
59
+ expect(response_hash).to eq(JSON.parse(response_body))
60
+ expect(response_hash).to be_a Adyen::HashWithAccessors
61
+ expect(response_hash).to be_a_kind_of Hash
62
+ end
63
+
36
64
  it 'makes a transactions GET call' do
37
65
  response_body = json_from_file('mocks/responses/Transfers/make_transfer.json')
38
66
 
@@ -0,0 +1,23 @@
1
+ # Consumer smoke test for the HMAC validator, run by hmac_validator_spec.rb.
2
+ # Executed in a clean Ruby process that only loads the library.
3
+ # Exits non-zero (via abort) when the library cannot be used standalone.
4
+
5
+ require 'adyen-ruby-api-library'
6
+
7
+ validator = Adyen::Utils::HmacValidator.new
8
+ key = '44782DEF547AAA06C910C43932B1EB0C71FC68D9D0C057550C48EC2ACF6BA056'
9
+ webhook_request_item = {
10
+ 'additionalData' => { 'hmacSignature' => 'coqCmt/IZ4E3CzPvMY8zTjQVL5hYJUiBRg8UU+iCWo0=' },
11
+ 'amount' => { 'value' => 1130, 'currency' => 'EUR' },
12
+ 'pspReference' => '7914073381342284',
13
+ 'eventCode' => 'AUTHORISATION',
14
+ 'merchantAccountCode' => 'TestMerchant',
15
+ 'merchantReference' => 'TestPayment-1407325143704',
16
+ 'paymentMethod' => 'visa',
17
+ 'success' => 'true'
18
+ }
19
+
20
+ abort 'valid_webhook_hmac? returned false' unless validator.valid_webhook_hmac?(webhook_request_item, key)
21
+
22
+ payload_sign = validator.calculate_webhook_payload_hmac('payload', key)
23
+ abort "unexpected payload hmac: #{payload_sign}" unless payload_sign == 'McjT0WKyyQ5Zqv3FC9sVNf14NYfSAZa1chxoXY3yIlE='
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'open3'
2
3
 
3
4
  RSpec.describe Adyen::Utils::HmacValidator do
4
5
  let(:validator) { described_class.new }
@@ -77,6 +78,60 @@ RSpec.describe Adyen::Utils::HmacValidator do
77
78
  expect(validator.valid_webhook_payload_hmac?(hmac_signature, key, payload)).to be true
78
79
  end
79
80
 
81
+ it 'returns false when additionalData hmacSignature is nil' do
82
+ webhook_request_item['additionalData'] = { 'hmacSignature' => nil }
83
+
84
+ expect(validator.valid_webhook_hmac?(webhook_request_item, key)).to be false
85
+ end
86
+
87
+ it 'returns false when payload webhook hmac_signature is nil' do
88
+ payload = json_from_file('mocks/responses/Webhooks/mixed_webhook.json')
89
+
90
+ expect(validator.valid_webhook_payload_hmac?(nil, key, payload)).to be false
91
+ end
92
+
93
+ end
94
+
95
+ describe 'consumer-side regression' do
96
+ # Run the validator in a clean Ruby process that only loads the library, like
97
+ # a consumer application, so test dependencies cannot mask missing dependencies.
98
+ it 'computes HMAC signatures in a clean consumer process' do
99
+ lib_dir = File.expand_path('../../lib', __dir__)
100
+ smoke_test = File.expand_path('consumer_smoke.rb', __dir__)
101
+
102
+ stdout, stderr, status = Open3.capture3(Gem.ruby, '-I', lib_dir, smoke_test)
103
+
104
+ expect(status).to be_success,
105
+ "library must work in a clean consumer process.\nstdout: #{stdout}\nstderr: #{stderr}"
106
+ end
107
+ end
108
+
109
+ describe 'deprecated methods' do
110
+ around do |example|
111
+ previous = Warning[:deprecated]
112
+ Warning[:deprecated] = true
113
+ example.run
114
+ ensure
115
+ Warning[:deprecated] = previous
116
+ end
117
+
118
+ it 'valid_notification_hmac? emits a deprecation warning and still validates' do
119
+ result = nil
120
+ expect do
121
+ result = validator.valid_notification_hmac?(webhook_request_item, key)
122
+ end.to output(/\[DEPRECATED\] `valid_notification_hmac\?` is deprecated\. Use valid_webhook_hmac\?\(\) instead\.\n/).to_stderr
123
+
124
+ expect(result).to be true
125
+ end
126
+
127
+ it 'calculate_notification_hmac emits a deprecation warning and still calculates' do
128
+ result = nil
129
+ expect do
130
+ result = validator.calculate_notification_hmac(webhook_request_item, key)
131
+ end.to output(/\[DEPRECATED\] `calculate_notification_hmac` is deprecated\. Use calculate_webhook_hmac\(\) instead\.\n/).to_stderr
132
+
133
+ expect(result).to eq expected_sign
134
+ end
80
135
  end
81
136
  end
82
137
  # rubocop:enable Metrics/BlockLength
@@ -18,11 +18,11 @@ module Adyen
18
18
  # {{{summary}}}{{^summary}}{{operationId}}{{/summary}}{{#isDeprecated}}
19
19
  #
20
20
  # Deprecated {{#vendorExtensions.x-deprecatedInVersion}}since {{#appName}}{{{.}}}{{/appName}} v{{.}}{{/vendorExtensions.x-deprecatedInVersion}}{{#vendorExtensions.x-deprecatedMessage}}
21
- # {{{.}}}{{/vendorExtensions.x-deprecatedMessage}}{{/isDeprecated}}
21
+ # {{{.}}}{{/vendorExtensions.x-deprecatedMessage}}
22
+ # @deprecated{{/isDeprecated}}
22
23
  def {{#lambda.snakecase}}{{#vendorExtensions.x-methodName}}{{.}}{{/vendorExtensions.x-methodName}}{{^vendorExtensions.x-methodName}}{{nickname}}{{/vendorExtensions.x-methodName}}{{/lambda.snakecase}}({{#bodyParams}}request, {{/bodyParams}}{{#requiredParams}}{{^isQueryParam}}{{#lambda.snakecase}}{{paramName}}{{/lambda.snakecase}}, {{/isQueryParam}}{{/requiredParams}}headers: {}{{#queryParams}}{{#-first}}, query_params: {}{{/-first}}{{/queryParams}})
23
- endpoint = '{{path}}'.gsub(/{.+?}/, '%s')
24
- endpoint = endpoint.gsub(%r{^/}, '')
25
- endpoint = format(endpoint{{#pathParams}}{{#lambda.snakecase}}, {{paramName}}{{/lambda.snakecase}}{{/pathParams}})
24
+ {{#isDeprecated}}Adyen::Deprecation.warn(:{{#lambda.snakecase}}{{#vendorExtensions.x-methodName}}{{.}}{{/vendorExtensions.x-methodName}}{{^vendorExtensions.x-methodName}}{{nickname}}{{/vendorExtensions.x-methodName}}{{/lambda.snakecase}}{{#vendorExtensions.x-deprecatedInVersion}}, since: '{{#lambda.escapeSingleQuotedString}}{{#appName}}{{{.}}}{{/appName}} v{{.}}{{/lambda.escapeSingleQuotedString}}'{{/vendorExtensions.x-deprecatedInVersion}}{{#vendorExtensions.x-deprecatedMessage}}, message: '{{#lambda.escapeSingleQuotedString}}{{{.}}}{{/lambda.escapeSingleQuotedString}}'{{/vendorExtensions.x-deprecatedMessage}})
25
+ {{/isDeprecated}}endpoint = build_endpoint('{{#lambda.escapeSingleQuotedString}}{{{path}}}{{/lambda.escapeSingleQuotedString}}'{{#pathParams}}, {{#lambda.snakecase}}{{paramName}}{{/lambda.snakecase}}{{/pathParams}})
26
26
  {{#queryParams}}{{#-first}}endpoint += create_query_string(query_params){{/-first}}{{/queryParams}}
27
27
  action = { method: '{{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}', url: endpoint }
28
28
  {{#bodyParams}}