activemerchant-payline 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +5 -0
  3. data/.gitignore +18 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +57 -0
  8. data/Rakefile +1 -0
  9. data/activemerchant-payline.gemspec +33 -0
  10. data/lib/active_merchant/billing/gateways/payline.rb +57 -0
  11. data/lib/active_merchant/billing/gateways/payline/payline_common.rb +368 -0
  12. data/lib/active_merchant/billing/gateways/payline/payline_constants.rb +83 -0
  13. data/lib/active_merchant/billing/gateways/payline/payline_direct_api.rb +78 -0
  14. data/lib/active_merchant/billing/gateways/payline/payline_management_payment_api.rb +154 -0
  15. data/lib/active_merchant/billing/gateways/payline/payline_status_api.rb +36 -0
  16. data/lib/active_merchant/billing/gateways/payline/payline_wallet_management.rb +249 -0
  17. data/lib/active_merchant/billing/gateways/payline/payline_web_api.rb +186 -0
  18. data/lib/active_merchant/billing/iso_4217_currency_codes.rb +32 -0
  19. data/lib/activemerchant-payline.rb +2 -0
  20. data/test/fixtures.yml +8 -0
  21. data/test/fixtures/vcr_cassettes/test_failed_create_wallet.yml +1820 -0
  22. data/test/fixtures/vcr_cassettes/test_failed_disable_payment_record.yml +1821 -0
  23. data/test/fixtures/vcr_cassettes/test_failed_disable_wallet.yml +1820 -0
  24. data/test/fixtures/vcr_cassettes/test_failed_do_authorization.yml +1956 -0
  25. data/test/fixtures/vcr_cassettes/test_failed_do_capture.yml +1890 -0
  26. data/test/fixtures/vcr_cassettes/test_failed_do_credit.yml +1882 -0
  27. data/test/fixtures/vcr_cassettes/test_failed_do_debit.yml +1981 -0
  28. data/test/fixtures/vcr_cassettes/test_failed_do_recurrent_wallet_payment.yml +2033 -0
  29. data/test/fixtures/vcr_cassettes/test_failed_do_refund.yml +1944 -0
  30. data/test/fixtures/vcr_cassettes/test_failed_do_reset.yml +1820 -0
  31. data/test/fixtures/vcr_cassettes/test_failed_do_scheduled_wallet_payment.yml +1927 -0
  32. data/test/fixtures/vcr_cassettes/test_failed_do_web_payment.yml +1822 -0
  33. data/test/fixtures/vcr_cassettes/test_failed_enable_wallet.yml +1819 -0
  34. data/test/fixtures/vcr_cassettes/test_failed_get_payment_record.yml +1821 -0
  35. data/test/fixtures/vcr_cassettes/test_failed_get_wallet.yml +1819 -0
  36. data/test/fixtures/vcr_cassettes/test_failed_get_web_payment_details.yml +1851 -0
  37. data/test/fixtures/vcr_cassettes/test_failed_immediate_wallet_payment.yml +1938 -0
  38. data/test/fixtures/vcr_cassettes/test_failed_manage_web_wallet.yml +1870 -0
  39. data/test/fixtures/vcr_cassettes/test_failed_update_wallet.yml +1820 -0
  40. data/test/fixtures/vcr_cassettes/test_failed_update_web_wallet.yml +1819 -0
  41. data/test/fixtures/vcr_cassettes/test_get_transaction_details.yml +3711 -0
  42. data/test/fixtures/vcr_cassettes/test_get_web_wallet.yml +1871 -0
  43. data/test/fixtures/vcr_cassettes/test_missing_parameters_create_web_wallet.yml +1870 -0
  44. data/test/fixtures/vcr_cassettes/test_missing_parameters_do_web_payment.yml +1822 -0
  45. data/test/fixtures/vcr_cassettes/test_successful_create_wallet.yml +1826 -0
  46. data/test/fixtures/vcr_cassettes/test_successful_create_web_wallet.yml +1822 -0
  47. data/test/fixtures/vcr_cassettes/test_successful_disable_payment_record.yml +1876 -0
  48. data/test/fixtures/vcr_cassettes/test_successful_disable_wallet.yml +1871 -0
  49. data/test/fixtures/vcr_cassettes/test_successful_do_authorization.yml +1837 -0
  50. data/test/fixtures/vcr_cassettes/test_successful_do_bank_transfer.yml +1826 -0
  51. data/test/fixtures/vcr_cassettes/test_successful_do_capture.yml +1889 -0
  52. data/test/fixtures/vcr_cassettes/test_successful_do_credit.yml +1829 -0
  53. data/test/fixtures/vcr_cassettes/test_successful_do_debit.yml +1834 -0
  54. data/test/fixtures/vcr_cassettes/test_successful_do_immediate_wallet_payment.yml +1875 -0
  55. data/test/fixtures/vcr_cassettes/test_successful_do_recurrent_wallet_payment.yml +1827 -0
  56. data/test/fixtures/vcr_cassettes/test_successful_do_refund.yml +1888 -0
  57. data/test/fixtures/vcr_cassettes/test_successful_do_reset.yml +1892 -0
  58. data/test/fixtures/vcr_cassettes/test_successful_do_scheduled_wallet_payment.yml +1821 -0
  59. data/test/fixtures/vcr_cassettes/test_successful_do_web_payment.yml +1821 -0
  60. data/test/fixtures/vcr_cassettes/test_successful_enable_wallet.yml +1924 -0
  61. data/test/fixtures/vcr_cassettes/test_successful_get_payment_record.yml +1891 -0
  62. data/test/fixtures/vcr_cassettes/test_successful_get_wallet.yml +1894 -0
  63. data/test/fixtures/vcr_cassettes/test_successful_get_web_payment_details.yml +1908 -0
  64. data/test/fixtures/vcr_cassettes/test_successful_manage_web_wallet.yml +1821 -0
  65. data/test/fixtures/vcr_cassettes/test_successful_update_wallet.yml +1825 -0
  66. data/test/fixtures/vcr_cassettes/test_successful_update_web_wallet.yml +1820 -0
  67. data/test/run_test.rb +9 -0
  68. data/test/test_helper.rb +350 -0
  69. data/test/unit/gateways/payline/payline_direct_api_test.rb +122 -0
  70. data/test/unit/gateways/payline/payline_management_payment_api_test.rb +197 -0
  71. data/test/unit/gateways/payline/payline_status_api_test.rb +30 -0
  72. data/test/unit/gateways/payline/payline_wallet_management_api_test.rb +297 -0
  73. data/test/unit/gateways/payline/payline_web_api_test.rb +221 -0
  74. metadata +360 -0
@@ -0,0 +1,83 @@
1
+ require_relative '../../iso_4217_currency_codes'
2
+
3
+ module PaylineConstants
4
+
5
+ WDSL_URL = 'https://services.payline.com/V4/services/WebPaymentAPI?wsdl'.freeze
6
+ WDSL_TEST_URL = 'https://homologation.payline.com/V4/services/WebPaymentAPI?wsdl'.freeze
7
+
8
+ WEB_API_VERSION = '16'.freeze
9
+
10
+ IMPL_NAMESPACE = 'http://impl.ws.payline.experian.com'.freeze
11
+ OBJ_NAMESPACE = 'http://obj.ws.payline.experian.com'.freeze
12
+
13
+ LOG_FILTERED_TAGS = %w( number cvx ).freeze
14
+
15
+ DATE_FORMAT = "%d/%m/%Y".freeze
16
+ DATETIME_FORMAT = "#{DATE_FORMAT} %H:%M".freeze
17
+
18
+ ACTION_CODES = {
19
+ :authorization => 100, # Authorization
20
+ :purchase => 101, # Authorization + Validation
21
+ :capture => 201 # Validation
22
+ }.freeze
23
+
24
+ CARD_BRAND_CODES = Hash.new('CB').update(
25
+ 'visa' => 'VISA',
26
+ 'master' => 'MASTERCARD',
27
+ 'american_express' => 'AMEX',
28
+ 'diners_club' => 'DINERS',
29
+ 'jcb' => 'JCB',
30
+ 'switch' => 'SWITCH',
31
+ 'maestro' => 'MAESTRO'
32
+ ).freeze
33
+
34
+ EXPIRATION_DATE_FORMAT = "%.2d%.2d".freeze
35
+
36
+ PAYMENT_MODES = {
37
+ :direct => 'CPT',
38
+ :deffered => 'DIF',
39
+ :installments => 'NX',
40
+ :recurrent => 'REC'
41
+ }.freeze
42
+
43
+ # locale => ISO 639-2 code
44
+ LANGUAGE_CODES = {
45
+ 'fr' => 'fre',
46
+ 'en' => 'eng',
47
+ 'es' => 'spa',
48
+ 'it' => 'ita',
49
+ 'pt' => 'por',
50
+ 'de' => 'ger',
51
+ 'nl' => 'dut',
52
+ 'fi' => 'fin'
53
+ }.freeze
54
+
55
+ RECURRING_FREQUENCIES = {
56
+ :daily => 10,
57
+ :weekly => 20,
58
+ :fortnightly => 30,
59
+ :monthly => 40,
60
+ :bimonthly => 50,
61
+ :quarterly => 60,
62
+ :semiannual => 70,
63
+ :yearly => 80,
64
+ :biannual => 90
65
+ }.freeze
66
+
67
+ SSL = 'SSL'.freeze
68
+
69
+ SUCCESS_MESSAGES = {
70
+ # Card & Check
71
+ "00000" => "Transaction approved",
72
+ "01001" => "Transaction approved but required a verification by merchant",
73
+ # Wallet
74
+ "02500" => "Operation successful",
75
+ "02501" => "Operation successful but wallet will expire",
76
+ "02517" => "Cannot disable some wallet(s)",
77
+ "02520" => "Cannot enable some wallet(s)",
78
+ # Cancelling & Reauthorizing
79
+ "02616" => "Error while creating the wallet"
80
+ }.freeze
81
+
82
+ SUCCESS_CODES = SUCCESS_MESSAGES.keys.freeze
83
+ end
@@ -0,0 +1,78 @@
1
+ require_relative 'payline_common'
2
+ include ActiveMerchant::Billing::PaylineCommon
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ module PaylineDirectAPI
7
+ # :amount [Number] Amount of transaction (required)
8
+ # :credit_card [Hash] Credit card informations - Must contain number, brand, month, year, verification_value (required)
9
+ # :order_ref [String] Order ref (required)
10
+ # :currency [String] Default currency code is default_currency
11
+ # :action [String] Default is :purchase (101 (Authorization + Validation))
12
+ # :mode [String] Default is :direct ("CPT")
13
+ # Optional parameters: media
14
+ # Optional objects: buyer, private_data, contract_number_wallet
15
+ def do_authorization(amount, credit_card, options = {})
16
+ #requires!(options, :order_id, :credit_card)
17
+ currency = currency_code(options[:currency])
18
+ action = options[:action] || :authorization
19
+
20
+ optional_parameters = ['media']
21
+
22
+ data = merged_data([
23
+ # Required parameters
24
+ add_payment(amount, currency, action, options[:mode], options[:payment]),
25
+ add_bank_account_data(options[:bank_account_data]), # Doest seem required
26
+ add_credit_card(credit_card),
27
+ add_order(amount, currency, options[:order_ref], options[:order]),
28
+ # Optional parameters
29
+ add_buyer(options[:buyer]),
30
+ add_owner(options[:owner]),
31
+ add_private_data(options[:private_data]),
32
+ add_authentication_3D_secure(options[:authentication_3D_secure]),
33
+ add_optional_parameters(options, optional_parameters)
34
+ ])
35
+
36
+ direct_api_request :do_authorization, data
37
+ end
38
+ alias_method :authorize, :do_authorization
39
+
40
+ # payment_record_id [String] Payment record ID, can be retrieved after a do_recurrent_wallet_payment request (required)
41
+ def get_payment_record(payment_record_id)
42
+ payment_record_request :get, payment_record_id
43
+ end
44
+
45
+ # payment_record_id [String] Payment record ID, can be retrieved after a do_recurrent_wallet_payment request (required)
46
+ def disable_payment_record(payment_record_id)
47
+ payment_record_request :disable, payment_record_id
48
+ end
49
+
50
+ protected
51
+ def payment_record_request(method_name, payment_record_id)
52
+ data = { paymentRecordId: payment_record_id }
53
+ direct_api_request :"#{method_name}_payment_record", data
54
+ end
55
+
56
+ def add_bank_account_data(bank_account_data)
57
+ if bank_account_data
58
+ optional_parameters = {
59
+ countryCode: bank_account_data[:country_code],
60
+ bankCode: bank_account_data[:bank_code],
61
+ accountNumber: bank_account_data[:account_number],
62
+ key: bank_account_data[:key]
63
+ }
64
+
65
+ parameters = [add_optional_parameters(bank_account_data, optional_parameters)]
66
+
67
+ data = { bankAccountData: merged_data(parameters) }
68
+ end
69
+
70
+ data ||= {}
71
+ end
72
+
73
+ def expiration_date(month, year)
74
+ EXPIRATION_DATE_FORMAT % [month, year.to_s[-2..-1]]
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,154 @@
1
+ require_relative 'payline_common'
2
+ include ActiveMerchant::Billing::PaylineCommon
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ module PaylineManagementPaymentAPI
7
+
8
+ # Optional parameters: comment, transaction_id, order_id
9
+ # Required objects: payment, creditor
10
+ def do_bank_transfer(amount, options = {})
11
+ optional_parameters = ['comment', 'transactionID', 'orderID']
12
+
13
+ data = merged_data([
14
+ # Required parameters
15
+ add_payment(amount, currency_code(options[:currency]), options[:action], options[:mode], options[:payment]),
16
+ add_creditor(options[:creditor]),
17
+ # Optional parameters
18
+ add_optional_parameters(options, optional_parameters)
19
+ ])
20
+
21
+ direct_api_request :do_bank_transfer, data
22
+ end
23
+
24
+ # :amount [Number] Amount of transaction (required)
25
+ # :transaction_id [String] Transaction id (required)
26
+ # :currency [String] Default currency code is default_currency
27
+ # :mode [String] CPT for Full (default) / DIF for Deferred/ NX for N instalments / REC for Recurring
28
+ # Optional parameters: sequence_number, media
29
+ # Optional objects: payment
30
+ def do_capture(amount, transaction_id, options = {})
31
+ optional_parameters = ['sequenceNumber', 'media']
32
+ required_parameters = { transactionID: transaction_id }
33
+
34
+ data = merged_data([
35
+ # Required parameters
36
+ required_parameters,
37
+ add_payment(amount, currency_code(options[:currency]), 201, options[:mode], options[:payment]),
38
+ # Optional parameters
39
+ add_private_data(options[:private_data]),
40
+ add_optional_parameters(options, optional_parameters)
41
+ ])
42
+
43
+ direct_api_request :do_capture, data
44
+ end
45
+ alias_method :capture, :do_capture
46
+
47
+ # Optional parameters: comment, media
48
+ # Required objects: payment, card, order
49
+ # Optional objects: buyer, owner, private_data, optional_parameters
50
+ def do_credit(amount, credit_card, order_ref, options = {})
51
+ optional_parameters = ['comment', 'media']
52
+
53
+ data = merged_data([
54
+ # Required parameters
55
+ add_payment(amount, currency_code(options[:currency]), 422, options[:mode], options[:payment]),
56
+ add_credit_card(credit_card),
57
+ add_order(amount, currency_code(options[:currency]), order_ref, options[:order]),
58
+ # Optional parameters
59
+ add_buyer(options[:buyer]),
60
+ add_owner(options[:owner]),
61
+ add_private_data(options[:private_data]),
62
+ add_optional_parameters(options, optional_parameters)
63
+ ])
64
+
65
+ direct_api_request :do_credit, data
66
+ end
67
+
68
+ # Optional parameters: media
69
+ # Required objects: payment, card, order, authorization
70
+ # Optional parameters: buyer, owner, private_data
71
+ def do_debit(amount, credit_card, order_ref, options = {})
72
+ optional_parameters = ['media']
73
+
74
+ data = merged_data([
75
+ # Required parameters
76
+ add_payment(amount, currency_code(options[:currency]), 204, options[:mode], options[:payment]),
77
+ add_credit_card(credit_card),
78
+ add_order(amount, currency_code(options[:currency]), order_ref, options[:order]),
79
+ add_authorization(options[:authorization]), # Seems to be required
80
+ # Optional parameters
81
+ add_buyer(options[:buyer]),
82
+ add_owner(options[:owner]),
83
+ add_private_data(options[:private_data]),
84
+ add_optional_parameters(options, optional_parameters)
85
+ ])
86
+
87
+ direct_api_request :do_debit, data
88
+ end
89
+
90
+ # :amount [Number] Amount of transaction
91
+ # :transaction_id [String] Transaction id
92
+ # :currency [String] Default currency code is default_currency
93
+ # :mode [String] CPT for Full (default) / DIF for Deferred/ NX for N instalments / REC for Recurring
94
+ # Optional parameters: comment, sequence_number, media
95
+ # Optional objects: payment
96
+ def do_refund(amount, transaction_id, options = {})
97
+ optional_parameters = ['comment', 'sequenceNumber', 'media']
98
+ required_parameters = { transactionID: transaction_id }
99
+
100
+ data = merged_data([
101
+ # Required parameters
102
+ required_parameters,
103
+ add_payment(amount, currency_code(options[:currency]), 421, options[:mode], options[:payment]),
104
+ # Optional parameters
105
+ add_optional_parameters(options, optional_parameters)
106
+ ])
107
+
108
+ direct_api_request :do_refund, data
109
+ end
110
+ alias_method :refund, :do_refund
111
+
112
+ # Transaction_id [String] Transaction id (required)
113
+ # Optional parameters: comment, sequence_number, media
114
+ def do_reset(transaction_id, options = {})
115
+ optional_parameters = ['comment', 'sequenceNumber', 'media']
116
+ required_parameters = { transactionID: transaction_id }
117
+
118
+ data = merged_data([
119
+ # Required parameters
120
+ required_parameters,
121
+ # Optional parameters
122
+ add_optional_parameters(options, optional_parameters)
123
+ ])
124
+
125
+ direct_api_request :do_reset, data
126
+ end
127
+ alias_method :void, :do_reset
128
+
129
+ private
130
+ def add_creditor(creditor_data)
131
+ if creditor_data
132
+ required_parameters = {
133
+ bic: creditor_data[:bic],
134
+ iban: creditor_data[:iban],
135
+ name: creditor_data[:name]
136
+ }
137
+ end
138
+ data = { creditor: required_parameters }
139
+ end
140
+
141
+ def add_authorization(authorization_data)
142
+ if authorization_data
143
+ required_parameters = {
144
+ number: authorization_data[:number],
145
+ date: authorization_data[:date]
146
+ }
147
+ end
148
+ required_parameters ||= {}
149
+
150
+ data = {authorization: required_parameters}
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'payline_common'
2
+ include ActiveMerchant::Billing::PaylineCommon
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ module PaylineStatusAPI
7
+ # Required parameter: transaction_id
8
+ # Optional parameters: order_ref, start_date, end_date, transaction_history, archive_search
9
+ def get_transaction_details(transaction_id, options={})
10
+ optional_parameters = ['orderRef', 'startDate', 'endDate', 'transactionHistory', 'archiveSearch']
11
+ required_parameters = { transaction_id: transaction_id }
12
+
13
+ data = merged_data([
14
+ # Required parameters
15
+ required_parameters,
16
+ # Optional parameters
17
+ add_optional_parameters(options, optional_parameters)
18
+ ])
19
+
20
+ extended_api_request :get_transaction_details, data
21
+ end
22
+
23
+ protected
24
+ def extended_api_request(method_name, data)
25
+ savon_request(extended_api_savon_client, method_name, data)
26
+ end
27
+
28
+ def extended_api_savon_client
29
+ url = test? ? self.extended_test_payment_url : self.extended_payment_url
30
+
31
+ @extended_api_savon_client ||= create_savon_client(url)
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,249 @@
1
+ require_relative 'payline_common'
2
+ include ActiveMerchant::Billing::PaylineCommon
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ module PaylineWalletManagementAPI
7
+
8
+ # Optional parameters: media
9
+ # Required objects: Wallet
10
+ # Optional objects: buyer, owner, private_data, authentication_3D_secure, contract_number_wallet
11
+ def create_wallet(wallet, options = {})
12
+ optional_parameters = ['media']
13
+ data = merged_data([
14
+ # Required parameters
15
+ add_wallet(wallet),
16
+ # Option parameters,
17
+ add_buyer(options[:buyer]),
18
+ add_owner(options[:owner]),
19
+ add_private_data(options[:private_data]),
20
+ add_authentication_3D_secure(options[:authentication_3D_secure]),
21
+ add_optional_parameters(options, optional_parameters),
22
+ add_contract_number_wallet_list(options[:contract_number_wallet])
23
+ ])
24
+
25
+ direct_api_request :create_wallet, data
26
+ end
27
+
28
+ def disable_wallet(contract_number, wallet_id, options={})
29
+ optional_parameters = ['cardInd']
30
+ required_parameters = { contractNumber: contract_number}
31
+
32
+ data = merged_data([
33
+ required_parameters,
34
+ add_optional_parameters(options, optional_parameters),
35
+ add_wallet_id_list(wallet_id)
36
+ ])
37
+
38
+ direct_api_request :disable_wallet, data
39
+ end
40
+
41
+ # :wallet_id [String] Wallet ID
42
+ # :order_ref [String] Order ID (required)
43
+ # Required parameters: order_ref, wallet_id, buyer
44
+ # Optional parameters: card_ind, media, wallet_cvx
45
+ # Required objects: order, payment, authentication_3D_secure
46
+ # Optional parameters: private_data
47
+ def do_immediate_wallet_payment(amount, wallet_id, options = {})
48
+ currency = currency_code(options[:currency])
49
+
50
+ optional_parameters = ['cardInd', 'media', 'walletCvx']
51
+ required_parameters = {
52
+ walletId: wallet_id
53
+ }
54
+
55
+ buyer_options = options[:buyer].blank? ? { wallet_id: wallet_id} : options[:buyer]
56
+
57
+ data = merged_data([
58
+ # Required parameters
59
+ required_parameters,
60
+ add_payment( amount, currency, options[:action], :direct, options[:payment]),
61
+ add_order( amount, currency, options[:order_ref], options[:order]),
62
+ add_buyer(buyer_options),
63
+ # Optional parameters
64
+ add_private_data(options[:private_data]),
65
+ add_authentication_3D_secure(options[:authentication_3D_secure]),
66
+ add_optional_parameters(options, optional_parameters)
67
+ ])
68
+
69
+ direct_api_request :do_immediate_wallet_payment, data
70
+ end
71
+
72
+ # :wallet_id [String] Wallet ID
73
+ # :order_ref [String] Order ID (required)
74
+ # Required parameters: order_ref, order_data, schedule_date, wallet_id
75
+ # Optional parameters: card_ind, media
76
+ # Required objects: payment, recurring
77
+ # Optional parameters: order, private_data
78
+ def do_recurrent_wallet_payment(amount, wallet_id, options = {})
79
+ currency = currency_code(options[:currency])
80
+
81
+ optional_parameters = ['cardInd', 'media']
82
+ required_parameters = {
83
+ orderRef: options[:order_ref],
84
+ orderDate: options[:order_date], # Doesnt seem required
85
+ scheduledDate: options[:scheduled_date], # Doesnt seem required
86
+ walletId: wallet_id,
87
+ }
88
+
89
+ data = merged_data([
90
+ # Required parameters
91
+ required_parameters,
92
+ add_payment( amount, currency, options[:action], :recurrent, options[:payment]),
93
+ add_recurring( options[:recurring]),
94
+ # Optional parameters
95
+ add_order( amount, currency, options[:order_ref], options[:order]),
96
+ add_private_data(options[:private_data]),
97
+ add_optional_parameters(options, optional_parameters)
98
+ ])
99
+
100
+ direct_api_request :do_recurrent_wallet_payment, data
101
+ end
102
+
103
+ # :wallet_id [String] Wallet ID
104
+ # :order_ref [String] Order ID (required)
105
+ # Required parameters: order_ref, wallet_id, scheduled_date (doesn't seem that required)
106
+ # Optional parameters: card_ind, media, wallet_cvx
107
+ # Required objects: order, payment, authentication_3D_secure
108
+ # Optional parameters: private_data
109
+ def do_scheduled_wallet_payment(amount, wallet_id, options = {})
110
+ currency = currency_code(options[:currency])
111
+
112
+ optional_parameters = ['cardInd', 'media', 'orderDate']
113
+ required_parameters = {
114
+ walletId: wallet_id,
115
+ scheduledDate: options[:scheduled_data],
116
+ orderRef: options[:order_ref]
117
+ }
118
+
119
+ buyer_options = options[:buyer].blank? ? { wallet_id: wallet_id} : options[:buyer]
120
+
121
+ data = merged_data([
122
+ # Required parameters
123
+ required_parameters,
124
+ add_payment( amount, currency, options[:action], :direct, options[:payment]),
125
+ add_order( amount, currency, options[:order_ref], options[:order]),
126
+ # Optional parameters
127
+ add_private_data(options[:private_data]),
128
+ add_optional_parameters(options, optional_parameters)
129
+ ])
130
+
131
+ direct_api_request :do_scheduled_wallet_payment, data
132
+ end
133
+
134
+
135
+ # :wallet_id [String] Wallet ID
136
+ # Required parameters: contract_number, wallet_id
137
+ # Optional parameters: card_ind
138
+ def enable_wallet(contract_number, wallet_id, options={})
139
+ optional_parameters = ['cardInd']
140
+ required_parameters = {
141
+ contractNumber: contract_number,
142
+ walletId: wallet_id
143
+ }
144
+
145
+ data = merged_data([
146
+ required_parameters,
147
+ add_optional_parameters(options, optional_parameters)
148
+ ])
149
+
150
+ direct_api_request :enable_wallet, data
151
+ end
152
+
153
+ # :wallet_id [String] Wallet ID
154
+ # Required parameters: contract_number, wallet_id
155
+ # Optional parameters: card_ind
156
+ def get_wallet(contract_number, wallet_id, options={})
157
+ optional_parameters = ['cardInd', 'media']
158
+ required_parameters = {
159
+ contractNumber: contract_number,
160
+ walletId: wallet_id
161
+ }
162
+
163
+ data = merged_data([
164
+ required_parameters,
165
+ add_optional_parameters(options, optional_parameters)
166
+ ])
167
+
168
+ direct_api_request :get_wallet, data
169
+ end
170
+
171
+ # Optional parameters: card_ind, media
172
+ # Required objects: Wallet
173
+ # Optional objects: buyer, owner, private_data, authentication_3D_secure, contract_number_wallet
174
+ def update_wallet(wallet, options = {})
175
+ optional_parameters = ['cardInd', 'media']
176
+ data = merged_data([
177
+ # Required parameters
178
+ add_wallet(wallet),
179
+ # Option parameters
180
+ add_buyer(options[:buyer]),
181
+ add_owner(options[:owner]),
182
+ add_private_data(options[:private_data]),
183
+ add_authentication_3D_secure(options[:authentication_3D_secure]),
184
+ add_optional_parameters(options, optional_parameters),
185
+ add_contract_number_wallet_list(options[:contract_number_wallet])
186
+ ])
187
+
188
+ direct_api_request :update_wallet, data
189
+ end
190
+
191
+ private
192
+ # Optional parameters: first_amount, billing_left, start_date, end_date, new_amount, amount_modification_date
193
+ # Required parameters: amount, billing_cycle
194
+ def add_recurring(recurring_data)
195
+ optional_parameters = ['firstAmount', 'billingLeft', 'startDate', 'endDate', 'newAmount', 'amountModificationDate']
196
+ if recurring_data
197
+ required_parameters = {
198
+ amount: recurring_data[:amount],
199
+ billingCycle: PaylineCommon::RECURRING_FREQUENCIES[recurring_data[:billing_cycle]]
200
+ }
201
+ objects = [
202
+ required_parameters,
203
+ add_optional_parameters(options, optional_parameters)
204
+ ]
205
+
206
+ data = { recurring: merged_data(objects)}
207
+ end
208
+ data ||= { recurring: {} }
209
+ end
210
+
211
+ # Optional parameters: last_name, first_name, email, comment, default, card_status, card_brand
212
+ # Required parameters: wallet_id
213
+ # Required objects: card
214
+ # Optional objects: shipping_address
215
+ def add_wallet(wallet_data)
216
+ if wallet_data
217
+ optional_parameters = ['lastName', 'firstName', 'email', 'comment', 'default', 'cardStatus', 'cardBrand']
218
+ required_parameters = {
219
+ walletId: wallet_data[:wallet_id]
220
+ }
221
+
222
+ objects = [
223
+ # Required parameters
224
+ required_parameters,
225
+ add_credit_card(wallet_data[:card]),
226
+ # Optional parameters
227
+ add_address(wallet_data[:shipping_address], :shipping_address),
228
+ add_optional_parameters(wallet_data, optional_parameters)
229
+ ]
230
+
231
+ data = { wallet: merged_data(objects) }
232
+ end
233
+
234
+ data ||= {}
235
+ end
236
+
237
+ def add_wallet_id_list(wallet_id)
238
+ if wallet_id
239
+ data = { walletIdList:
240
+ {
241
+ walletId: wallet_id
242
+ }
243
+ }
244
+ end
245
+ data ||= {}
246
+ end
247
+ end
248
+ end
249
+ end