activemerchant 1.109.0 → 1.114.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +47 -1
- data/README.md +2 -2
- data/lib/active_merchant/billing/credit_card.rb +1 -1
- data/lib/active_merchant/billing/credit_card_methods.rb +1 -1
- data/lib/active_merchant/billing/gateway.rb +1 -1
- data/lib/active_merchant/billing/gateways/adyen.rb +17 -6
- data/lib/active_merchant/billing/gateways/authorize_net.rb +6 -6
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +1 -1
- data/lib/active_merchant/billing/gateways/balanced.rb +1 -1
- data/lib/active_merchant/billing/gateways/bambora_apac.rb +1 -1
- data/lib/active_merchant/billing/gateways/bank_frick.rb +1 -1
- data/lib/active_merchant/billing/gateways/blue_snap.rb +74 -16
- data/lib/active_merchant/billing/gateways/borgun.rb +1 -1
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +7 -7
- data/lib/active_merchant/billing/gateways/cardknox.rb +1 -1
- data/lib/active_merchant/billing/gateways/cenpos.rb +1 -1
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +1 -1
- data/lib/active_merchant/billing/gateways/credorax.rb +7 -1
- data/lib/active_merchant/billing/gateways/culqi.rb +1 -1
- data/lib/active_merchant/billing/gateways/cyber_source.rb +53 -16
- data/lib/active_merchant/billing/gateways/decidir.rb +1 -1
- data/lib/active_merchant/billing/gateways/digitzs.rb +1 -1
- data/lib/active_merchant/billing/gateways/efsnet.rb +1 -1
- data/lib/active_merchant/billing/gateways/element.rb +4 -0
- data/lib/active_merchant/billing/gateways/eway_rapid.rb +2 -2
- data/lib/active_merchant/billing/gateways/ezic.rb +1 -1
- data/lib/active_merchant/billing/gateways/fat_zebra.rb +5 -3
- data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +8 -0
- data/lib/active_merchant/billing/gateways/flo2cash.rb +1 -1
- data/lib/active_merchant/billing/gateways/global_collect.rb +5 -0
- data/lib/active_merchant/billing/gateways/hdfc.rb +1 -1
- data/lib/active_merchant/billing/gateways/hps.rb +9 -6
- data/lib/active_merchant/billing/gateways/ipp.rb +2 -2
- data/lib/active_merchant/billing/gateways/iridium.rb +2 -2
- data/lib/active_merchant/billing/gateways/linkpoint.rb +1 -1
- data/lib/active_merchant/billing/gateways/litle.rb +1 -1
- data/lib/active_merchant/billing/gateways/mastercard.rb +2 -2
- data/lib/active_merchant/billing/gateways/mercado_pago.rb +1 -1
- data/lib/active_merchant/billing/gateways/netbanx.rb +8 -2
- data/lib/active_merchant/billing/gateways/openpay.rb +1 -1
- data/lib/active_merchant/billing/gateways/opp.rb +3 -3
- data/lib/active_merchant/billing/gateways/optimal_payment.rb +1 -1
- data/lib/active_merchant/billing/gateways/orbital.rb +8 -1
- data/lib/active_merchant/billing/gateways/pagarme.rb +1 -1
- data/lib/active_merchant/billing/gateways/pay_junction.rb +2 -2
- data/lib/active_merchant/billing/gateways/payeezy.rb +3 -3
- data/lib/active_merchant/billing/gateways/payex.rb +5 -5
- data/lib/active_merchant/billing/gateways/payflow.rb +3 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +1 -1
- data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +1 -1
- data/lib/active_merchant/billing/gateways/paymill.rb +3 -3
- data/lib/active_merchant/billing/gateways/payu_latam.rb +4 -1
- data/lib/active_merchant/billing/gateways/plugnpay.rb +1 -1
- data/lib/active_merchant/billing/gateways/psigate.rb +1 -1
- data/lib/active_merchant/billing/gateways/qbms.rb +3 -3
- data/lib/active_merchant/billing/gateways/quickbooks.rb +3 -2
- data/lib/active_merchant/billing/gateways/qvalent.rb +1 -1
- data/lib/active_merchant/billing/gateways/realex.rb +1 -0
- data/lib/active_merchant/billing/gateways/redsys.rb +3 -3
- data/lib/active_merchant/billing/gateways/sage_pay.rb +4 -4
- data/lib/active_merchant/billing/gateways/skip_jack.rb +1 -1
- data/lib/active_merchant/billing/gateways/stripe.rb +2 -2
- data/lib/active_merchant/billing/gateways/telr.rb +1 -1
- data/lib/active_merchant/billing/gateways/trans_first.rb +1 -1
- data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +2 -2
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +7 -7
- data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +4 -4
- data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +1 -1
- data/lib/active_merchant/billing/gateways/worldpay_us.rb +2 -2
- data/lib/active_merchant/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d467cbeefbc698298d8e87dc6f9655cb8105cd6b949753082696802cd667d15
|
4
|
+
data.tar.gz: e7a09ed0f9dbead854bf3bab3940e2a335109aa4a76c2a8f2f824c27a2236833
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45db32004cb0fb161a6ae422b64b3401d9c6b3bf780549ba17cc50b2f94e79f94baa76353fdc5cfbad771423613ab5a3030b164e69f1de8ae44c612cd6982bf2
|
7
|
+
data.tar.gz: 2ea821b491e9c6cd21442c7563fcac422d42190a8a222583d15783fc1e1a87f77894a6d4eac7a41a5bb1c63d69c59cc17f2d6aaf1540d0d01e5ae4ee168e2b5f
|
data/CHANGELOG
CHANGED
@@ -2,6 +2,53 @@
|
|
2
2
|
|
3
3
|
== HEAD
|
4
4
|
|
5
|
+
== Version 1.114.0
|
6
|
+
* BlueSnap: Add address1,address2,phone,shipping_* support #3749
|
7
|
+
* BlueSnap: Protect against `nil` metadata [carrigan] #3752
|
8
|
+
* Cybersource: [CyberSource] Ensure the default address doesn't override `ActionController::Parameters` [pi3r] #3755
|
9
|
+
|
10
|
+
== Version 1.113.0
|
11
|
+
* Orbital: Add cardIndicators field [meagabeth] #3734
|
12
|
+
* Openpay: Add Colombia to supported countries [molbrown] #3740
|
13
|
+
* Mercado Pago: Update Device Id Header field [cdmackeyfree] #3741
|
14
|
+
* RuboCop: Fix Style/TrailingCommaInHashLiteral [leila-alderman] #3718
|
15
|
+
* RuboCop: Fix Naming/PredicateName [leila-alderman] #3724
|
16
|
+
* RuboCop: Fix Style/Attr [leila-alderman] #3728
|
17
|
+
* Payflow: Use application_id to set buttonsource [britth] #3737
|
18
|
+
* HPS: Enable refunds using capture transaction [britth] #3738
|
19
|
+
* Quickbooks: Omit empty strings in address [leila-alderman] #3743
|
20
|
+
* BlueSnap: Add transactionMetaData support #3745
|
21
|
+
* Orbital: Fix typo in PC3DtlLineTot field [naashton] #3736
|
22
|
+
* Credorax: Send first and last name parameters for CFT transactions [britth] #3748
|
23
|
+
* Orbital: Update CardIndicators field to fix bug [meagabeth] #3746
|
24
|
+
* CyberSource: Always send default address [leila-alderman] #3747
|
25
|
+
* Netbanx: Reject partial refund on pending status [rockyhakjoong] #3735
|
26
|
+
|
27
|
+
== Version 1.112.0
|
28
|
+
* Cybersource: add `maestro` and `diners_club` eci brand mapping [bbraschi] #3708
|
29
|
+
* Cybersource: Ensure Partner Solution Id placement conforms to schema [britth] #3715
|
30
|
+
* Adyen: Adyen: Pass `subMerchantId` as `additionalData` [naashton] #3714
|
31
|
+
* Litle: Omit checkNum when nil [leila-alderman] #3719
|
32
|
+
* PayU Latam: Improve error response [esmitperez] #3717
|
33
|
+
* Vantiv: Vantiv Express - CardPresentCode, PaymentType, SubmissionType, DuplicateCheckDisableFlag [esmitperez] #3730,#3731
|
34
|
+
* Cybersource: Ensure issueradditionaldata comes before partnerSolutionId [britth] #3733
|
35
|
+
|
36
|
+
== Version 1.111.0
|
37
|
+
* Fat Zebra: standardized 3DS fields and card on file extra data for Visa scheme rules [montdidier] #3409
|
38
|
+
* Realex: Change 3DSecure v1 message_version to a valid format [shuhala] #3702
|
39
|
+
* Ingenico/ GlobalCollect: Add field for installments [cdmackeyfree] #3707
|
40
|
+
* Cybersource: do not send 3DS fields if 'cavv` is missing and `commerceIndicator` is inferred [bbraschi] #3712
|
41
|
+
|
42
|
+
== Version 1.110.0
|
43
|
+
* FirstData e4 v27+: Strip linebreaks from address [curiousepic] #3693
|
44
|
+
* Adyen: Change shopper_email to email and shopper_ip to ip [rikterbeek] #3675
|
45
|
+
* FirstData e4 v27+ Fix strip_line_breaks method [carrigan] #3695
|
46
|
+
* Cybersource: Set authorization on the response even when in fraud review [pi3r] #3701
|
47
|
+
* Cybersource: Add fields to override stored creds [leila-alderman] #3689
|
48
|
+
* Cybersource: Conditionally find stored credentials [therufs] #3696 #3697
|
49
|
+
* Cybersource: Update logic to send cavv as xid for 3DS2 [douglas] #3699
|
50
|
+
* Credorax: Default 3ds_browsercolordepth to 32 when passed as 30 [britth] #3700
|
51
|
+
|
5
52
|
== Version 1.109.0
|
6
53
|
* Remove reference to `Billing::Integrations` [pi3r] #3692
|
7
54
|
* DLocal: Handle nil address1 [molbrown] #3661
|
@@ -26,7 +73,6 @@
|
|
26
73
|
* RuboCop: Fix Style/TrailingUnderscoreVariable [leila-alderman] #3663
|
27
74
|
* RuboCop: Fix Style/WordArray [leila-alderman] #3664
|
28
75
|
* RuboCop: Fix Style/SymbolArray [leila-alderman] #3665
|
29
|
-
|
30
76
|
* Mercado-Pago: Notification url GSF [cdmackeyfree] #3678
|
31
77
|
* Credorax: Update logic for setting 3ds_homephonecountry [britth] #3691
|
32
78
|
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Active Merchant
|
2
|
-
[![Build Status](https://travis-ci.org/activemerchant/active_merchant.
|
3
|
-
[![Code Climate](https://codeclimate.com/github/activemerchant/active_merchant.
|
2
|
+
[![Build Status](https://travis-ci.org/activemerchant/active_merchant.svg?branch=master)](https://travis-ci.org/activemerchant/active_merchant)
|
3
|
+
[![Code Climate](https://codeclimate.com/github/activemerchant/active_merchant.svg)](https://codeclimate.com/github/activemerchant/active_merchant)
|
4
4
|
|
5
5
|
Active Merchant is an extraction from the ecommerce system [Shopify](http://www.shopify.com).
|
6
6
|
Shopify's requirements for a simple and unified API to access dozens of different payment
|
@@ -190,7 +190,7 @@ module ActiveMerchant #:nodoc:
|
|
190
190
|
'contactless' => 'Data was read by a Contactless EMV kernel. Issuer script results are not available.',
|
191
191
|
'contactless_magstripe' => 'Contactless data was read with a non-EMV protocol.',
|
192
192
|
'contact' => 'Data was read using the EMV protocol. Issuer script results may follow.',
|
193
|
-
'contact_quickchip' => 'Data was read by the Quickchip EMV kernel. Issuer script results are not available.'
|
193
|
+
'contact_quickchip' => 'Data was read by the Quickchip EMV kernel. Issuer script results are not available.'
|
194
194
|
}
|
195
195
|
|
196
196
|
# Returns the ciphertext of the card's encrypted PIN.
|
@@ -95,7 +95,7 @@ module ActiveMerchant #:nodoc:
|
|
95
95
|
pickup_card: 'pick_up_card',
|
96
96
|
config_error: 'config_error',
|
97
97
|
test_mode_live_card: 'test_mode_live_card',
|
98
|
-
unsupported_feature: 'unsupported_feature'
|
98
|
+
unsupported_feature: 'unsupported_feature'
|
99
99
|
}
|
100
100
|
|
101
101
|
cattr_reader :implementations
|
@@ -26,7 +26,7 @@ module ActiveMerchant #:nodoc:
|
|
26
26
|
'132' => STANDARD_ERROR_CODE[:incorrect_address],
|
27
27
|
'133' => STANDARD_ERROR_CODE[:incorrect_address],
|
28
28
|
'134' => STANDARD_ERROR_CODE[:incorrect_address],
|
29
|
-
'135' => STANDARD_ERROR_CODE[:incorrect_address]
|
29
|
+
'135' => STANDARD_ERROR_CODE[:incorrect_address]
|
30
30
|
}
|
31
31
|
|
32
32
|
def initialize(options={})
|
@@ -196,9 +196,6 @@ module ActiveMerchant #:nodoc:
|
|
196
196
|
|
197
197
|
def add_extra_data(post, payment, options)
|
198
198
|
post[:telephoneNumber] = options[:billing_address][:phone] if options.dig(:billing_address, :phone)
|
199
|
-
post[:shopperEmail] = options[:shopper_email] if options[:shopper_email]
|
200
|
-
post[:shopperIP] = options[:shopper_ip] if options[:shopper_ip]
|
201
|
-
post[:shopperStatement] = options[:shopper_statement] if options[:shopper_statement]
|
202
199
|
post[:fraudOffset] = options[:fraud_offset] if options[:fraud_offset]
|
203
200
|
post[:selectedBrand] = options[:selected_brand] if options[:selected_brand]
|
204
201
|
post[:selectedBrand] ||= NETWORK_TOKENIZATION_CARD_SOURCE[payment.source.to_s] if payment.is_a?(NetworkTokenizationCreditCard)
|
@@ -212,11 +209,25 @@ module ActiveMerchant #:nodoc:
|
|
212
209
|
post[:additionalData][:authorisationType] = options[:authorisation_type] if options[:authorisation_type]
|
213
210
|
post[:additionalData][:adjustAuthorisationData] = options[:adjust_authorisation_data] if options[:adjust_authorisation_data]
|
214
211
|
post[:additionalData][:industryUsage] = options[:industry_usage] if options[:industry_usage]
|
215
|
-
post[:additionalData][:updateShopperStatement] = options[:update_shopper_statement] if options[:update_shopper_statement]
|
216
212
|
post[:additionalData][:RequestedTestAcquirerResponseCode] = options[:requested_test_acquirer_response_code] if options[:requested_test_acquirer_response_code] && test?
|
217
213
|
post[:deviceFingerprint] = options[:device_fingerprint] if options[:device_fingerprint]
|
214
|
+
add_shopper_data(post, options)
|
218
215
|
add_risk_data(post, options)
|
219
216
|
add_shopper_reference(post, options)
|
217
|
+
add_merchant_data(post, options)
|
218
|
+
end
|
219
|
+
|
220
|
+
def add_shopper_data(post, options)
|
221
|
+
post[:shopperEmail] = options[:email] if options[:email]
|
222
|
+
post[:shopperEmail] = options[:shopper_email] if options[:shopper_email]
|
223
|
+
post[:shopperIP] = options[:ip] if options[:ip]
|
224
|
+
post[:shopperIP] = options[:shopper_ip] if options[:shopper_ip]
|
225
|
+
post[:shopperStatement] = options[:shopper_statement] if options[:shopper_statement]
|
226
|
+
post[:additionalData][:updateShopperStatement] = options[:update_shopper_statement] if options[:update_shopper_statement]
|
227
|
+
end
|
228
|
+
|
229
|
+
def add_merchant_data(post, options)
|
230
|
+
post[:additionalData][:subMerchantId] = options[:sub_merchant_id] if options[:sub_merchant_id]
|
220
231
|
end
|
221
232
|
|
222
233
|
def add_risk_data(post, options)
|
@@ -232,7 +243,7 @@ module ActiveMerchant #:nodoc:
|
|
232
243
|
splits = []
|
233
244
|
split_data.each do |split|
|
234
245
|
amount = {
|
235
|
-
value: split['amount']['value']
|
246
|
+
value: split['amount']['value']
|
236
247
|
}
|
237
248
|
amount[:currency] = split['amount']['currency'] if split['amount']['currency']
|
238
249
|
|
@@ -54,7 +54,7 @@ module ActiveMerchant
|
|
54
54
|
'37' => STANDARD_ERROR_CODE[:invalid_expiry_date],
|
55
55
|
'378' => STANDARD_ERROR_CODE[:invalid_cvc],
|
56
56
|
'38' => STANDARD_ERROR_CODE[:expired_card],
|
57
|
-
'384' => STANDARD_ERROR_CODE[:config_error]
|
57
|
+
'384' => STANDARD_ERROR_CODE[:config_error]
|
58
58
|
}
|
59
59
|
|
60
60
|
MARKET_TYPE = {
|
@@ -771,7 +771,7 @@ module ActiveMerchant
|
|
771
771
|
end
|
772
772
|
|
773
773
|
def parse(action, raw_response, options = {})
|
774
|
-
if
|
774
|
+
if cim_action?(action) || action == :verify_credentials
|
775
775
|
parse_cim(raw_response, options)
|
776
776
|
else
|
777
777
|
parse_normal(action, raw_response)
|
@@ -802,7 +802,7 @@ module ActiveMerchant
|
|
802
802
|
end
|
803
803
|
end
|
804
804
|
|
805
|
-
def
|
805
|
+
def cim_action?(action)
|
806
806
|
action.to_s.start_with?('cim')
|
807
807
|
end
|
808
808
|
|
@@ -824,7 +824,7 @@ module ActiveMerchant
|
|
824
824
|
'deleteCustomerProfileRequest'
|
825
825
|
elsif action == :verify_credentials
|
826
826
|
'authenticateTestRequest'
|
827
|
-
elsif
|
827
|
+
elsif cim_action?(action)
|
828
828
|
'createCustomerProfileTransactionRequest'
|
829
829
|
else
|
830
830
|
'createTransactionRequest'
|
@@ -1006,7 +1006,7 @@ module ActiveMerchant
|
|
1006
1006
|
|
1007
1007
|
def auth_was_for_cim?(authorization)
|
1008
1008
|
_, _, action = split_authorization(authorization)
|
1009
|
-
action &&
|
1009
|
+
action && cim_action?(action)
|
1010
1010
|
end
|
1011
1011
|
|
1012
1012
|
def parse_direct_response_elements(response, options)
|
@@ -1059,7 +1059,7 @@ module ActiveMerchant
|
|
1059
1059
|
card_type: parts[51] || '',
|
1060
1060
|
split_tender_id: parts[52] || '',
|
1061
1061
|
requested_amount: parts[53] || '',
|
1062
|
-
balance_on_card: parts[54] || ''
|
1062
|
+
balance_on_card: parts[54] || ''
|
1063
1063
|
}
|
1064
1064
|
end
|
1065
1065
|
end
|
@@ -928,7 +928,7 @@ module ActiveMerchant #:nodoc:
|
|
928
928
|
'card_type' => direct_response_fields[51] || '',
|
929
929
|
'split_tender_id' => direct_response_fields[52] || '',
|
930
930
|
'requested_amount' => direct_response_fields[53] || '',
|
931
|
-
'balance_on_card' => direct_response_fields[54] || ''
|
931
|
+
'balance_on_card' => direct_response_fields[54] || ''
|
932
932
|
}
|
933
933
|
)
|
934
934
|
end
|
@@ -254,7 +254,7 @@ module ActiveMerchant #:nodoc:
|
|
254
254
|
'Authorization' => 'Basic ' + Base64.encode64(@options[:login].to_s + ':').strip,
|
255
255
|
'User-Agent' => "Balanced/v1.1 ActiveMerchantBindings/#{ActiveMerchant::VERSION}",
|
256
256
|
'Accept' => 'application/vnd.api+json;revision=1.1',
|
257
|
-
'X-Balanced-User-Agent' => @@ua
|
257
|
+
'X-Balanced-User-Agent' => @@ua
|
258
258
|
}
|
259
259
|
end
|
260
260
|
end
|
@@ -18,7 +18,7 @@ module ActiveMerchant #:nodoc:
|
|
18
18
|
'05' => STANDARD_ERROR_CODE[:card_declined],
|
19
19
|
'06' => STANDARD_ERROR_CODE[:processing_error],
|
20
20
|
'14' => STANDARD_ERROR_CODE[:invalid_number],
|
21
|
-
'54' => STANDARD_ERROR_CODE[:expired_card]
|
21
|
+
'54' => STANDARD_ERROR_CODE[:expired_card]
|
22
22
|
}
|
23
23
|
|
24
24
|
def initialize(options={})
|
@@ -58,7 +58,7 @@ module ActiveMerchant
|
|
58
58
|
'line1: N, zip: M, name: N' => 'W',
|
59
59
|
'line1: N, zip: N, name: U' => 'N',
|
60
60
|
'line1: N, zip: N, name: M' => 'K',
|
61
|
-
'line1: N, zip: N, name: N' => 'N'
|
61
|
+
'line1: N, zip: N, name: N' => 'N'
|
62
62
|
}
|
63
63
|
|
64
64
|
BANK_ACCOUNT_TYPE_MAPPING = {
|
@@ -177,7 +177,7 @@ module ActiveMerchant
|
|
177
177
|
add_order(doc, options)
|
178
178
|
doc.send('store-card', options[:store_card] || false)
|
179
179
|
add_amount(doc, money, options)
|
180
|
-
add_fraud_info(doc, options)
|
180
|
+
add_fraud_info(doc, payment_method, options)
|
181
181
|
|
182
182
|
if payment_method.is_a?(String)
|
183
183
|
doc.send('vaulted-shopper-id', payment_method)
|
@@ -200,6 +200,7 @@ module ActiveMerchant
|
|
200
200
|
doc.send('last-name', payment_method.last_name)
|
201
201
|
doc.send('personal-identification-number', options[:personal_identification_number]) if options[:personal_identification_number]
|
202
202
|
doc.email(options[:email]) if options[:email]
|
203
|
+
doc.phone(options[:phone_number]) if options[:phone_number]
|
203
204
|
add_address(doc, options)
|
204
205
|
end
|
205
206
|
|
@@ -212,12 +213,28 @@ module ActiveMerchant
|
|
212
213
|
end
|
213
214
|
end
|
214
215
|
|
215
|
-
def
|
216
|
+
def add_metadata(doc, options)
|
217
|
+
transaction_meta_data = options[:transaction_meta_data] || []
|
218
|
+
return if transaction_meta_data.empty? && !options[:description]
|
219
|
+
|
216
220
|
doc.send('transaction-meta-data') do
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
doc.send('meta-
|
221
|
+
# ensure backwards compatibility for calls expecting :description
|
222
|
+
# to become meta-data fields.
|
223
|
+
if options[:description]
|
224
|
+
doc.send('meta-data') do
|
225
|
+
doc.send('meta-key', 'description')
|
226
|
+
doc.send('meta-value', truncate(options[:description], 500))
|
227
|
+
doc.send('meta-description', 'Description')
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
# https://developers.bluesnap.com/v8976-XML/docs/meta-data
|
232
|
+
transaction_meta_data.each do |entry|
|
233
|
+
doc.send('meta-data') do
|
234
|
+
doc.send('meta-key', truncate(entry[:meta_key], 40))
|
235
|
+
doc.send('meta-value', truncate(entry[:meta_value], 500))
|
236
|
+
doc.send('meta-description', truncate(entry[:meta_description], 40))
|
237
|
+
end
|
221
238
|
end
|
222
239
|
end
|
223
240
|
end
|
@@ -225,7 +242,7 @@ module ActiveMerchant
|
|
225
242
|
def add_order(doc, options)
|
226
243
|
doc.send('merchant-transaction-id', truncate(options[:order_id], 50)) if options[:order_id]
|
227
244
|
doc.send('soft-descriptor', options[:soft_descriptor]) if options[:soft_descriptor]
|
228
|
-
|
245
|
+
add_metadata(doc, options)
|
229
246
|
add_3ds(doc, options[:three_d_secure]) if options[:three_d_secure]
|
230
247
|
add_level_3_data(doc, options)
|
231
248
|
end
|
@@ -236,7 +253,8 @@ module ActiveMerchant
|
|
236
253
|
|
237
254
|
doc.country(address[:country]) if address[:country]
|
238
255
|
doc.state(address[:state]) if address[:state] && STATE_CODE_COUNTRIES.include?(address[:country])
|
239
|
-
doc.address(address[:
|
256
|
+
doc.address(address[:address1]) if address[:address1]
|
257
|
+
doc.address2(address[:address2]) if address[:address2]
|
240
258
|
doc.city(address[:city]) if address[:city]
|
241
259
|
doc.zip(address[:zip]) if address[:zip]
|
242
260
|
end
|
@@ -298,12 +316,31 @@ module ActiveMerchant
|
|
298
316
|
doc.send('transaction-id', authorization)
|
299
317
|
end
|
300
318
|
|
301
|
-
def add_fraud_info(doc, options)
|
319
|
+
def add_fraud_info(doc, payment_method, options)
|
302
320
|
doc.send('transaction-fraud-info') do
|
303
321
|
doc.send('shopper-ip-address', options[:ip]) if options[:ip]
|
322
|
+
|
323
|
+
unless payment_method.is_a? String
|
324
|
+
doc.send('shipping-contact-info') do
|
325
|
+
add_shipping_contact_info(doc, payment_method, options)
|
326
|
+
end
|
327
|
+
end
|
304
328
|
end
|
305
329
|
end
|
306
330
|
|
331
|
+
def add_shipping_contact_info(doc, payment_method, options)
|
332
|
+
# https://developers.bluesnap.com/v8976-XML/docs/shipping-contact-info
|
333
|
+
doc.send('first-name', payment_method.first_name)
|
334
|
+
doc.send('last-name', payment_method.last_name)
|
335
|
+
|
336
|
+
doc.country(options[:shipping_country]) if options[:shipping_country]
|
337
|
+
doc.state(options[:shipping_state]) if options[:shipping_state] && STATE_CODE_COUNTRIES.include?(options[:shipping_country])
|
338
|
+
doc.address1(options[:shipping_address1]) if options[:shipping_address1]
|
339
|
+
doc.address2(options[:shipping_address2]) if options[:shipping_address2]
|
340
|
+
doc.city(options[:shipping_city]) if options[:shipping_city]
|
341
|
+
doc.zip(options[:shipping_zip]) if options[:shipping_zip]
|
342
|
+
end
|
343
|
+
|
307
344
|
def add_alt_transaction_purchase(doc, money, payment_method_details, options)
|
308
345
|
doc.send('merchant-transaction-id', truncate(options[:order_id], 50)) if options[:order_id]
|
309
346
|
doc.send('soft-descriptor', options[:soft_descriptor]) if options[:soft_descriptor]
|
@@ -314,8 +351,8 @@ module ActiveMerchant
|
|
314
351
|
|
315
352
|
add_echeck_transaction(doc, payment_method_details.payment_method, options, vaulted_shopper_id.present?) if payment_method_details.check?
|
316
353
|
|
317
|
-
add_fraud_info(doc, options)
|
318
|
-
|
354
|
+
add_fraud_info(doc, payment_method_details.payment_method, options)
|
355
|
+
add_metadata(doc, options)
|
319
356
|
end
|
320
357
|
|
321
358
|
def add_echeck_transaction(doc, check, options, vaulted_shopper)
|
@@ -350,12 +387,21 @@ module ActiveMerchant
|
|
350
387
|
parsed = {}
|
351
388
|
doc = Nokogiri::XML(response.body)
|
352
389
|
doc.root.xpath('*').each do |node|
|
390
|
+
name = node.name.downcase
|
391
|
+
|
353
392
|
if node.elements.empty?
|
354
|
-
parsed[
|
393
|
+
parsed[name] = node.text
|
394
|
+
elsif name == 'transaction-meta-data'
|
395
|
+
metadata = []
|
396
|
+
node.elements.each { |m|
|
397
|
+
metadata.push parse_metadata_entry(m)
|
398
|
+
}
|
399
|
+
|
400
|
+
parsed['transaction-meta-data'] = metadata
|
355
401
|
else
|
356
|
-
node.elements.each
|
402
|
+
node.elements.each { |childnode|
|
357
403
|
parse_element(parsed, childnode)
|
358
|
-
|
404
|
+
}
|
359
405
|
end
|
360
406
|
end
|
361
407
|
|
@@ -363,6 +409,18 @@ module ActiveMerchant
|
|
363
409
|
parsed
|
364
410
|
end
|
365
411
|
|
412
|
+
def parse_metadata_entry(node)
|
413
|
+
entry = {}
|
414
|
+
|
415
|
+
node.elements.each { |e|
|
416
|
+
entry = entry.merge({
|
417
|
+
e.name => e.text
|
418
|
+
})
|
419
|
+
}
|
420
|
+
|
421
|
+
entry
|
422
|
+
end
|
423
|
+
|
366
424
|
def parse_element(parsed, node)
|
367
425
|
if !node.elements.empty?
|
368
426
|
node.elements.each { |e| parse_element(parsed, e) }
|
@@ -476,7 +534,7 @@ module ActiveMerchant
|
|
476
534
|
def headers
|
477
535
|
{
|
478
536
|
'Content-Type' => 'application/xml',
|
479
|
-
'Authorization' => ('Basic ' + Base64.strict_encode64("#{@options[:api_username]}:#{@options[:api_password]}").strip)
|
537
|
+
'Authorization' => ('Basic ' + Base64.strict_encode64("#{@options[:api_username]}:#{@options[:api_password]}").strip)
|
480
538
|
}
|
481
539
|
end
|
482
540
|
|
@@ -176,7 +176,7 @@ module ActiveMerchant #:nodoc:
|
|
176
176
|
|
177
177
|
def headers
|
178
178
|
{
|
179
|
-
'Authorization' => 'Basic ' + Base64.strict_encode64(@options[:username].to_s + ':' + @options[:password].to_s)
|
179
|
+
'Authorization' => 'Basic ' + Base64.strict_encode64(@options[:username].to_s + ':' + @options[:password].to_s)
|
180
180
|
}
|
181
181
|
end
|
182
182
|
|
@@ -234,7 +234,7 @@ module ActiveMerchant #:nodoc:
|
|
234
234
|
phone: options[:phone] || (options[:billing_address][:phone] if options[:billing_address] &&
|
235
235
|
options[:billing_address][:phone]),
|
236
236
|
id: options[:customer],
|
237
|
-
device_data: options[:device_data]
|
237
|
+
device_data: options[:device_data]
|
238
238
|
}.merge credit_card_params
|
239
239
|
result = @braintree_gateway.customer.create(merge_credit_card_options(parameters, options))
|
240
240
|
Response.new(result.success?, message_from_result(result),
|
@@ -258,7 +258,7 @@ module ActiveMerchant #:nodoc:
|
|
258
258
|
cvv: credit_card.verification_value,
|
259
259
|
expiration_month: credit_card.month.to_s.rjust(2, '0'),
|
260
260
|
expiration_year: credit_card.year.to_s,
|
261
|
-
device_data: options[:device_data]
|
261
|
+
device_data: options[:device_data]
|
262
262
|
}
|
263
263
|
if options[:billing_address]
|
264
264
|
address = map_address(options[:billing_address])
|
@@ -320,7 +320,7 @@ module ActiveMerchant #:nodoc:
|
|
320
320
|
company: address[:company],
|
321
321
|
locality: address[:city],
|
322
322
|
region: address[:state],
|
323
|
-
postal_code: scrub_zip(address[:zip])
|
323
|
+
postal_code: scrub_zip(address[:zip])
|
324
324
|
}
|
325
325
|
|
326
326
|
mapped[:country_code_alpha2] = (address[:country] || address[:country_code_alpha2]) if address[:country] || address[:country_code_alpha2]
|
@@ -508,7 +508,7 @@ module ActiveMerchant #:nodoc:
|
|
508
508
|
customer_details = {
|
509
509
|
'id' => transaction.customer_details.id,
|
510
510
|
'email' => transaction.customer_details.email,
|
511
|
-
'phone' => transaction.customer_details.phone
|
511
|
+
'phone' => transaction.customer_details.phone
|
512
512
|
}
|
513
513
|
|
514
514
|
billing_details = {
|
@@ -518,7 +518,7 @@ module ActiveMerchant #:nodoc:
|
|
518
518
|
'locality' => transaction.billing_details.locality,
|
519
519
|
'region' => transaction.billing_details.region,
|
520
520
|
'postal_code' => transaction.billing_details.postal_code,
|
521
|
-
'country_name' => transaction.billing_details.country_name
|
521
|
+
'country_name' => transaction.billing_details.country_name
|
522
522
|
}
|
523
523
|
|
524
524
|
shipping_details = {
|
@@ -528,7 +528,7 @@ module ActiveMerchant #:nodoc:
|
|
528
528
|
'locality' => transaction.shipping_details.locality,
|
529
529
|
'region' => transaction.shipping_details.region,
|
530
530
|
'postal_code' => transaction.shipping_details.postal_code,
|
531
|
-
'country_name' => transaction.shipping_details.country_name
|
531
|
+
'country_name' => transaction.shipping_details.country_name
|
532
532
|
}
|
533
533
|
credit_card_details = {
|
534
534
|
'masked_number' => transaction.credit_card_details.masked_number,
|
@@ -578,7 +578,7 @@ module ActiveMerchant #:nodoc:
|
|
578
578
|
options: {
|
579
579
|
store_in_vault: options[:store] ? true : false,
|
580
580
|
submit_for_settlement: options[:submit_for_settlement],
|
581
|
-
hold_in_escrow: options[:hold_in_escrow]
|
581
|
+
hold_in_escrow: options[:hold_in_escrow]
|
582
582
|
}
|
583
583
|
}
|
584
584
|
|