activemerchant-payline 0.1.9
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 +7 -0
- data/.env.example +5 -0
- data/.gitignore +18 -0
- data/.travis.yml +9 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +57 -0
- data/Rakefile +1 -0
- data/activemerchant-payline.gemspec +33 -0
- data/lib/active_merchant/billing/gateways/payline.rb +57 -0
- data/lib/active_merchant/billing/gateways/payline/payline_common.rb +368 -0
- data/lib/active_merchant/billing/gateways/payline/payline_constants.rb +83 -0
- data/lib/active_merchant/billing/gateways/payline/payline_direct_api.rb +78 -0
- data/lib/active_merchant/billing/gateways/payline/payline_management_payment_api.rb +154 -0
- data/lib/active_merchant/billing/gateways/payline/payline_status_api.rb +36 -0
- data/lib/active_merchant/billing/gateways/payline/payline_wallet_management.rb +249 -0
- data/lib/active_merchant/billing/gateways/payline/payline_web_api.rb +186 -0
- data/lib/active_merchant/billing/iso_4217_currency_codes.rb +32 -0
- data/lib/activemerchant-payline.rb +2 -0
- data/test/fixtures.yml +8 -0
- data/test/fixtures/vcr_cassettes/test_failed_create_wallet.yml +1820 -0
- data/test/fixtures/vcr_cassettes/test_failed_disable_payment_record.yml +1821 -0
- data/test/fixtures/vcr_cassettes/test_failed_disable_wallet.yml +1820 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_authorization.yml +1956 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_capture.yml +1890 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_credit.yml +1882 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_debit.yml +1981 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_recurrent_wallet_payment.yml +2033 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_refund.yml +1944 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_reset.yml +1820 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_scheduled_wallet_payment.yml +1927 -0
- data/test/fixtures/vcr_cassettes/test_failed_do_web_payment.yml +1822 -0
- data/test/fixtures/vcr_cassettes/test_failed_enable_wallet.yml +1819 -0
- data/test/fixtures/vcr_cassettes/test_failed_get_payment_record.yml +1821 -0
- data/test/fixtures/vcr_cassettes/test_failed_get_wallet.yml +1819 -0
- data/test/fixtures/vcr_cassettes/test_failed_get_web_payment_details.yml +1851 -0
- data/test/fixtures/vcr_cassettes/test_failed_immediate_wallet_payment.yml +1938 -0
- data/test/fixtures/vcr_cassettes/test_failed_manage_web_wallet.yml +1870 -0
- data/test/fixtures/vcr_cassettes/test_failed_update_wallet.yml +1820 -0
- data/test/fixtures/vcr_cassettes/test_failed_update_web_wallet.yml +1819 -0
- data/test/fixtures/vcr_cassettes/test_get_transaction_details.yml +3711 -0
- data/test/fixtures/vcr_cassettes/test_get_web_wallet.yml +1871 -0
- data/test/fixtures/vcr_cassettes/test_missing_parameters_create_web_wallet.yml +1870 -0
- data/test/fixtures/vcr_cassettes/test_missing_parameters_do_web_payment.yml +1822 -0
- data/test/fixtures/vcr_cassettes/test_successful_create_wallet.yml +1826 -0
- data/test/fixtures/vcr_cassettes/test_successful_create_web_wallet.yml +1822 -0
- data/test/fixtures/vcr_cassettes/test_successful_disable_payment_record.yml +1876 -0
- data/test/fixtures/vcr_cassettes/test_successful_disable_wallet.yml +1871 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_authorization.yml +1837 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_bank_transfer.yml +1826 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_capture.yml +1889 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_credit.yml +1829 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_debit.yml +1834 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_immediate_wallet_payment.yml +1875 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_recurrent_wallet_payment.yml +1827 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_refund.yml +1888 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_reset.yml +1892 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_scheduled_wallet_payment.yml +1821 -0
- data/test/fixtures/vcr_cassettes/test_successful_do_web_payment.yml +1821 -0
- data/test/fixtures/vcr_cassettes/test_successful_enable_wallet.yml +1924 -0
- data/test/fixtures/vcr_cassettes/test_successful_get_payment_record.yml +1891 -0
- data/test/fixtures/vcr_cassettes/test_successful_get_wallet.yml +1894 -0
- data/test/fixtures/vcr_cassettes/test_successful_get_web_payment_details.yml +1908 -0
- data/test/fixtures/vcr_cassettes/test_successful_manage_web_wallet.yml +1821 -0
- data/test/fixtures/vcr_cassettes/test_successful_update_wallet.yml +1825 -0
- data/test/fixtures/vcr_cassettes/test_successful_update_web_wallet.yml +1820 -0
- data/test/run_test.rb +9 -0
- data/test/test_helper.rb +350 -0
- data/test/unit/gateways/payline/payline_direct_api_test.rb +122 -0
- data/test/unit/gateways/payline/payline_management_payment_api_test.rb +197 -0
- data/test/unit/gateways/payline/payline_status_api_test.rb +30 -0
- data/test/unit/gateways/payline/payline_wallet_management_api_test.rb +297 -0
- data/test/unit/gateways/payline/payline_web_api_test.rb +221 -0
- 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
|