activemerchant 1.56.0 → 1.57.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.
- checksums.yaml +4 -4
- data/CHANGELOG +42 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +52 -21
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +1 -0
- data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +243 -0
- data/lib/active_merchant/billing/gateways/bpoint.rb +1 -1
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +11 -11
- data/lib/active_merchant/billing/gateways/bridge_pay.rb +37 -8
- data/lib/active_merchant/billing/gateways/card_stream.rb +36 -11
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +3 -0
- data/lib/active_merchant/billing/gateways/clearhaus.rb +2 -2
- data/lib/active_merchant/billing/gateways/creditcall.rb +1 -1
- data/lib/active_merchant/billing/gateways/cyber_source.rb +12 -1
- data/lib/active_merchant/billing/gateways/element.rb +335 -0
- data/lib/active_merchant/billing/gateways/forte.rb +8 -0
- data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
- data/lib/active_merchant/billing/gateways/litle.rb +1 -1
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +2 -1
- data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +165 -0
- data/lib/active_merchant/billing/gateways/payeezy.rb +54 -12
- data/lib/active_merchant/billing/gateways/sage.rb +379 -128
- data/lib/active_merchant/billing/gateways/stripe.rb +13 -3
- data/lib/active_merchant/billing/gateways/trans_first.rb +26 -6
- data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +573 -0
- data/lib/active_merchant/billing/gateways/worldpay.rb +7 -0
- data/lib/active_merchant/billing/network_tokenization_credit_card.rb +11 -0
- data/lib/active_merchant/version.rb +1 -1
- metadata +7 -6
- data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +0 -89
- data/lib/active_merchant/billing/gateways/sage/sage_core.rb +0 -115
- data/lib/active_merchant/billing/gateways/sage/sage_vault.rb +0 -149
- data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +0 -97
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 763b8ca398277831841d2b263a482a46e2f8793b
|
4
|
+
data.tar.gz: 6acb014413ea74d8b36ebe9a2a40ae04e60de312
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fce7249de3a503a61123f020bf72a374d5fe3fc9368c786e939135995ff5f4d5a392f31026325d7844ffd6458bc832d7c845e56d1f892c21b4e567ce322b5ec7
|
7
|
+
data.tar.gz: 204553110484e103828c9767405bf11cd704810a5689f1150bace201316445168ce9f523ba67278f9e3ff2010906ca2237cd8a6d58ddd99192671cffd08d36d3
|
data/CHANGELOG
CHANGED
@@ -1,5 +1,44 @@
|
|
1
1
|
= ActiveMerchant CHANGELOG
|
2
2
|
|
3
|
+
== Version 1.57.0 (February 1, 2016)
|
4
|
+
* AuthorizeNetCim: Add unmaskExpirationDate option [RamilGilmanov]
|
5
|
+
* Element: Add gateway support [davidsantoso]
|
6
|
+
* Cardstream: 3D-secure capture fix [duff]
|
7
|
+
* Auth.net: Update store to create payment profiles [davidsantoso]
|
8
|
+
* CyberSource: Add support for mdd_fields [duff]
|
9
|
+
* Worldpay: Add support for verify [davidsantoso]
|
10
|
+
* Element: Add guard clause to handle undocumented errors [davidsantoso]
|
11
|
+
* Clearhaus: Add tests for signed requests [anellis]
|
12
|
+
* Stripe: Support adding cards to account [anellis]
|
13
|
+
* Clearhaus: Add text_on_statement option [anellis]
|
14
|
+
* Payeezy: Void and verify support [davidsantoso]
|
15
|
+
* Creditcall: Use ecommerce rather than cnp [duff]
|
16
|
+
* Payeezy: Add support for echecks [davidsantoso]
|
17
|
+
* Bridgepay: Add ability to store cards and pay with token [anellis]
|
18
|
+
* Initial support for Android Pay network tokenization cards [mrezentes]
|
19
|
+
* Transfirst: Fix exception when not all eCheck information is present [davidsantoso]
|
20
|
+
* Auth.net: Add tests for echeck refunds [davidsantoso]
|
21
|
+
* Transfirst: use default values for some eCheck data [davidsantoso]
|
22
|
+
* Element: Update the live URL endpoint [davidsantoso]
|
23
|
+
* Element: Parse responses from unexpected API errors [davidsantoso]
|
24
|
+
* Transfirst: Remove unused fields for echeck [davidsantoso]
|
25
|
+
* Sage: Internal refactoring into a single gateway class w/ common http conn [anellis]
|
26
|
+
* Cardstream: Adjust authorize and capture transactions [anellis]
|
27
|
+
* NCRSecurePay: New gateway support (Monetra white-label) [rwdaigle]
|
28
|
+
* Element: Map ReferenceNumber to order_id [duff]
|
29
|
+
* Element: Use a better MotoECICode default [duff]
|
30
|
+
* BraintreeBlue: Return transaction id for failed transactions when available [prburke]
|
31
|
+
* PayPal: Add InContextPaypalExpressGateway [xuorig]
|
32
|
+
* TransFirst: CVV is a required tag [duff]
|
33
|
+
* Checkout V2: Add Descriptor Name and City Options [anellis]
|
34
|
+
* Forte: Pass order_id [anellis]
|
35
|
+
* Merchant ESolutioins: Truncate order_id [anellis]
|
36
|
+
* Transfirst Transaction Express: New gateway support [sdball]
|
37
|
+
* Stripe: Add `stripe_account` header option [anellis]
|
38
|
+
* Cardstream: Add AVS code and message [anellis]
|
39
|
+
* Barclaycard Smartpay: New gateway support [curiousepic]
|
40
|
+
|
41
|
+
|
3
42
|
== Version 1.56.0 (December 1, 2015)
|
4
43
|
* Add Cardknox gateway [dlehren]
|
5
44
|
* Mercury: Add support for card present track 2 [ryanbalsdon]
|
@@ -201,6 +240,9 @@
|
|
201
240
|
* Paystation: No longer require order_id everywhere [duff]
|
202
241
|
* Checkout: Support descriptor_name and descriptor_city [duff]
|
203
242
|
* Add supports_network_tokenization? to gateways [jnormore]
|
243
|
+
* Bpoint: Handle message for invalid login [anellis]
|
244
|
+
* TransFirst: Add scrubbing [davidsantoso]
|
245
|
+
* TransFirst: Add back a few request fields [davidsantoso]
|
204
246
|
|
205
247
|
|
206
248
|
== Version 1.50.0 (June 1, 2015)
|
@@ -8,7 +8,7 @@ module ActiveMerchant #:nodoc:
|
|
8
8
|
self.test_url = 'https://apitest.authorize.net/xml/v1/request.api'
|
9
9
|
self.live_url = 'https://api2.authorize.net/xml/v1/request.api'
|
10
10
|
|
11
|
-
self.supported_countries = %w(AD AT AU BE BG CA CH CY CZ DE DK ES FI FR GB GB GI GR HU IE IT LI LU MC MT NL NO PL PT RO SE SI SK SM TR US VA)
|
11
|
+
self.supported_countries = %w(AD AT AU BE BG CA CH CY CZ DE DK EE ES FI FR GB GB GI GR HU IE IS IT LI LT LU LV MC MT NL NO PL PT RO SE SI SK SM TR US VA)
|
12
12
|
self.default_currency = 'USD'
|
13
13
|
self.money_format = :dollars
|
14
14
|
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb, :maestro]
|
@@ -154,25 +154,10 @@ module ActiveMerchant #:nodoc:
|
|
154
154
|
end
|
155
155
|
|
156
156
|
def store(credit_card, options = {})
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
xml.email(options[:email]) unless empty?(options[:email])
|
162
|
-
|
163
|
-
xml.paymentProfiles do
|
164
|
-
xml.customerType("individual")
|
165
|
-
add_billing_address(xml, credit_card, options)
|
166
|
-
add_shipping_address(xml, options, "shipToList")
|
167
|
-
xml.payment do
|
168
|
-
xml.creditCard do
|
169
|
-
xml.cardNumber(truncate(credit_card.number, 16))
|
170
|
-
xml.expirationDate(format(credit_card.year, :four_digits) + '-' + format(credit_card.month, :two_digits))
|
171
|
-
xml.cardCode(credit_card.verification_value) if credit_card.verification_value
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
157
|
+
if options[:customer_profile_id]
|
158
|
+
create_customer_payment_profile(credit_card, options)
|
159
|
+
else
|
160
|
+
create_customer_profile(credit_card, options)
|
176
161
|
end
|
177
162
|
end
|
178
163
|
|
@@ -460,7 +445,6 @@ module ActiveMerchant #:nodoc:
|
|
460
445
|
xml.routingNumber(check.routing_number)
|
461
446
|
xml.accountNumber(check.account_number)
|
462
447
|
xml.nameOnAccount(check.name)
|
463
|
-
xml.echeckType("WEB")
|
464
448
|
xml.bankName(check.bank_name)
|
465
449
|
xml.checkNumber(check.number)
|
466
450
|
end
|
@@ -538,6 +522,46 @@ module ActiveMerchant #:nodoc:
|
|
538
522
|
end
|
539
523
|
end
|
540
524
|
|
525
|
+
def create_customer_payment_profile(credit_card, options)
|
526
|
+
commit(:cim_store_update) do |xml|
|
527
|
+
xml.customerProfileId options[:customer_profile_id]
|
528
|
+
xml.paymentProfile do
|
529
|
+
add_billing_address(xml, credit_card, options)
|
530
|
+
xml.payment do
|
531
|
+
xml.creditCard do
|
532
|
+
xml.cardNumber(truncate(credit_card.number, 16))
|
533
|
+
xml.expirationDate(format(credit_card.year, :four_digits) + '-' + format(credit_card.month, :two_digits))
|
534
|
+
xml.cardCode(credit_card.verification_value) if credit_card.verification_value
|
535
|
+
end
|
536
|
+
end
|
537
|
+
end
|
538
|
+
end
|
539
|
+
end
|
540
|
+
|
541
|
+
def create_customer_profile(credit_card, options)
|
542
|
+
commit(:cim_store) do |xml|
|
543
|
+
xml.profile do
|
544
|
+
xml.merchantCustomerId(truncate(options[:merchant_customer_id], 20) || SecureRandom.hex(10))
|
545
|
+
xml.description(truncate(options[:description], 255)) unless empty?(options[:description])
|
546
|
+
xml.email(options[:email]) unless empty?(options[:email])
|
547
|
+
|
548
|
+
xml.paymentProfiles do
|
549
|
+
xml.customerType("individual")
|
550
|
+
add_billing_address(xml, credit_card, options)
|
551
|
+
add_shipping_address(xml, options, "shipToList")
|
552
|
+
xml.payment do
|
553
|
+
xml.creditCard do
|
554
|
+
xml.cardNumber(truncate(credit_card.number, 16))
|
555
|
+
xml.expirationDate(format(credit_card.year, :four_digits) + '-' + format(credit_card.month, :two_digits))
|
556
|
+
xml.cardCode(credit_card.verification_value) if credit_card.verification_value
|
557
|
+
end
|
558
|
+
end
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|
562
|
+
end
|
563
|
+
|
564
|
+
|
541
565
|
def names_from(payment_source, address, options)
|
542
566
|
if payment_source && !payment_source.is_a?(PaymentToken) && !payment_source.is_a?(String)
|
543
567
|
first_name, last_name = split_names(address[:name])
|
@@ -602,6 +626,8 @@ module ActiveMerchant #:nodoc:
|
|
602
626
|
def root_for(action)
|
603
627
|
if action == :cim_store
|
604
628
|
"createCustomerProfileRequest"
|
629
|
+
elsif action == :cim_store_update
|
630
|
+
"createCustomerPaymentProfileRequest"
|
605
631
|
elsif is_cim_action?(action)
|
606
632
|
"createCustomerProfileTransactionRequest"
|
607
633
|
else
|
@@ -697,6 +723,11 @@ module ActiveMerchant #:nodoc:
|
|
697
723
|
(empty?(element.content) ? nil : element.content)
|
698
724
|
end
|
699
725
|
|
726
|
+
response[:customer_payment_profile_id] = if(element = doc.at_xpath("//customerPaymentProfileIdList/numericString") ||
|
727
|
+
doc.at_xpath("//customerPaymentProfileId"))
|
728
|
+
(empty?(element.content) ? nil : element.content)
|
729
|
+
end
|
730
|
+
|
700
731
|
response[:direct_response] = if(element = doc.at_xpath("//directResponse"))
|
701
732
|
(empty?(element.content) ? nil : element.content)
|
702
733
|
end
|
@@ -574,6 +574,7 @@ module ActiveMerchant #:nodoc:
|
|
574
574
|
def build_get_customer_payment_profile_request(xml, options)
|
575
575
|
xml.tag!('customerProfileId', options[:customer_profile_id])
|
576
576
|
xml.tag!('customerPaymentProfileId', options[:customer_payment_profile_id])
|
577
|
+
xml.tag!('unmaskExpirationDate', options[:unmask_expiration_date]) if options[:unmask_expiration_date]
|
577
578
|
xml.target!
|
578
579
|
end
|
579
580
|
|
@@ -0,0 +1,243 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
class BarclaycardSmartpayGateway < Gateway
|
4
|
+
self.test_url = 'https://pal-test.barclaycardsmartpay.com/pal/servlet'
|
5
|
+
self.live_url = 'https://pal-live.barclaycardsmartpay.com/pal/servlet'
|
6
|
+
|
7
|
+
self.supported_countries = ['AR', 'AT', 'BE', 'BR', 'CA', 'CH', 'CL', 'CN', 'CO', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GB', 'HK', 'ID', 'IE', 'IL', 'IN', 'IT', 'JP', 'KR', 'LU', 'MX', 'MY', 'NL', 'NO', 'PA', 'PE', 'PH', 'PL', 'PT', 'RU', 'SE', 'SG', 'TH', 'TR', 'TW', 'US', 'VN', 'ZA']
|
8
|
+
self.default_currency = 'EUR'
|
9
|
+
self.money_format = :cents
|
10
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb, :dankort, :maestro]
|
11
|
+
|
12
|
+
self.homepage_url = 'https://www.barclaycardsmartpay.com/'
|
13
|
+
self.display_name = 'Barclaycard Smartpay'
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
requires!(options, :company, :merchant, :password)
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def purchase(money, creditcard, options = {})
|
21
|
+
requires!(options, :order_id)
|
22
|
+
|
23
|
+
MultiResponse.run do |r|
|
24
|
+
r.process { authorize(money, creditcard, options) }
|
25
|
+
r.process { capture(money, r.authorization, options) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def authorize(money, creditcard, options = {})
|
30
|
+
requires!(options, :order_id)
|
31
|
+
|
32
|
+
post = payment_request(money, options)
|
33
|
+
post[:amount] = amount_hash(money, options[:currency])
|
34
|
+
post[:card] = credit_card_hash(creditcard)
|
35
|
+
|
36
|
+
if address = (options[:billing_address] || options[:address])
|
37
|
+
post[:billingAddress] = address_hash(address)
|
38
|
+
end
|
39
|
+
|
40
|
+
if options[:shipping_address]
|
41
|
+
post[:deliveryAddress] = address_hash(options[:shipping_address])
|
42
|
+
end
|
43
|
+
|
44
|
+
commit('authorise', post)
|
45
|
+
end
|
46
|
+
|
47
|
+
def capture(money, authorization, options = {})
|
48
|
+
requires!(options, :order_id)
|
49
|
+
|
50
|
+
post = modification_request(authorization, options)
|
51
|
+
post[:modificationAmount] = amount_hash(money, options[:currency])
|
52
|
+
|
53
|
+
commit('capture', post)
|
54
|
+
end
|
55
|
+
|
56
|
+
def refund(money, authorization, options = {})
|
57
|
+
requires!(options, :order_id)
|
58
|
+
|
59
|
+
post = modification_request(authorization, options)
|
60
|
+
post[:modificationAmount] = amount_hash(money, options[:currency])
|
61
|
+
|
62
|
+
commit('refund', post)
|
63
|
+
end
|
64
|
+
|
65
|
+
def void(identification, options = {})
|
66
|
+
requires!(options, :order_id)
|
67
|
+
|
68
|
+
post = modification_request(identification, options)
|
69
|
+
|
70
|
+
commit('cancel', post)
|
71
|
+
end
|
72
|
+
|
73
|
+
def verify(creditcard, options = {})
|
74
|
+
authorize(0, creditcard, options)
|
75
|
+
end
|
76
|
+
|
77
|
+
def store(creditcard, options = {})
|
78
|
+
# ??? require :email and :customer, :order_id?
|
79
|
+
|
80
|
+
post = store_request(options)
|
81
|
+
post[:card] = credit_card_hash(creditcard)
|
82
|
+
post[:recurring] = {:contract => 'RECURRING'}
|
83
|
+
|
84
|
+
commit('store', post)
|
85
|
+
end
|
86
|
+
|
87
|
+
def supports_scrubbing?
|
88
|
+
true
|
89
|
+
end
|
90
|
+
|
91
|
+
def scrub(transcript)
|
92
|
+
transcript.
|
93
|
+
gsub(%r(((?:\r\n)?Authorization: Basic )[^\r\n]+(\r\n)?), '\1[FILTERED]').
|
94
|
+
gsub(%r((card.number=)\d+), '\1[FILTERED]').
|
95
|
+
gsub(%r((card.cvc=)\d+), '\1[FILTERED]')
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def commit(action, post)
|
101
|
+
request = post_data(flatten_hash(post))
|
102
|
+
raw_response = ssl_post(build_url(action), request, headers)
|
103
|
+
response = parse(raw_response)
|
104
|
+
|
105
|
+
Response.new(
|
106
|
+
success_from(response),
|
107
|
+
message_from(response),
|
108
|
+
response,
|
109
|
+
test: test?,
|
110
|
+
authorization: response['recurringDetailReference'] || response['pspReference']
|
111
|
+
)
|
112
|
+
|
113
|
+
rescue ResponseError => e
|
114
|
+
case e.response.code
|
115
|
+
when '401'
|
116
|
+
return Response.new(false, 'Invalid credentials', {}, :test => test?)
|
117
|
+
when '422'
|
118
|
+
return Response.new(false, 'Unprocessable Entity', {}, :test => test?)
|
119
|
+
when '500'
|
120
|
+
if e.response.body.split(' ')[0] == 'validation'
|
121
|
+
return Response.new(false, e.response.body.split(' ', 3)[2], {}, :test => test?)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
raise
|
125
|
+
end
|
126
|
+
|
127
|
+
def flatten_hash(hash, prefix = nil)
|
128
|
+
flat_hash = {}
|
129
|
+
hash.each_pair do |key, val|
|
130
|
+
conc_key = prefix.nil? ? key : "#{prefix}.#{key}"
|
131
|
+
if val.is_a?(Hash)
|
132
|
+
flat_hash.merge!(flatten_hash(val, conc_key))
|
133
|
+
else
|
134
|
+
flat_hash[conc_key] = val
|
135
|
+
end
|
136
|
+
end
|
137
|
+
flat_hash
|
138
|
+
end
|
139
|
+
|
140
|
+
def headers
|
141
|
+
{
|
142
|
+
'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8',
|
143
|
+
'Authorization' => 'Basic ' + Base64.encode64("ws@Company.#{@options[:company]}:#{@options[:password]}").strip
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
def parse(response)
|
148
|
+
Hash[
|
149
|
+
response.split('&').map do |x|
|
150
|
+
key, val = x.split('=', 2)
|
151
|
+
[key.split('.').last, CGI.unescape(val)]
|
152
|
+
end
|
153
|
+
]
|
154
|
+
end
|
155
|
+
|
156
|
+
def post_data(data)
|
157
|
+
data.map do |key, val|
|
158
|
+
"#{key}=#{CGI.escape(val.to_s)}"
|
159
|
+
end.reduce do |x, y|
|
160
|
+
"#{x}&#{y}"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def message_from(response)
|
165
|
+
return response['resultCode'] if response.has_key?('resultCode') # Payment request
|
166
|
+
return response['response'] if response['response'] # Modification request
|
167
|
+
return response['result'] if response.has_key?('result') # Store/Recurring request
|
168
|
+
'Failure' # Negative fallback in case of error
|
169
|
+
end
|
170
|
+
|
171
|
+
def success_from(response)
|
172
|
+
return true if response.has_key?('authCode')
|
173
|
+
return true if response['result'] == 'Success'
|
174
|
+
successful_responses = %w([capture-received] [cancel-received] [refund-received])
|
175
|
+
successful_responses.include?(response['response'])
|
176
|
+
end
|
177
|
+
|
178
|
+
def build_url(action)
|
179
|
+
case action
|
180
|
+
when 'store'
|
181
|
+
"#{test? ? self.test_url : self.live_url}/Recurring/v12/storeToken"
|
182
|
+
else
|
183
|
+
"#{test? ? self.test_url : self.live_url}/Payment/v12/#{action}"
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def address_hash(address)
|
188
|
+
full_address = "#{address[:address1]} #{address[:address2]}" if address
|
189
|
+
|
190
|
+
hash = {}
|
191
|
+
hash[:city] = address[:city] if address[:city]
|
192
|
+
hash[:street] = full_address.split(/\s+/).keep_if { |x| x !~ /\d/ }.join(' ')
|
193
|
+
hash[:houseNumberOrName] = full_address.split(/\s+/).keep_if { |x| x =~ /\d/ }.join(' ')
|
194
|
+
hash[:postalCode] = address[:zip] if address[:zip]
|
195
|
+
hash[:stateOrProvince] = address[:state] if address[:state]
|
196
|
+
hash[:country] = address[:country] if address[:country]
|
197
|
+
hash
|
198
|
+
end
|
199
|
+
|
200
|
+
def amount_hash(money, currency)
|
201
|
+
hash = {}
|
202
|
+
hash[:currency] = currency || currency(money)
|
203
|
+
hash[:value] = amount(money) if money
|
204
|
+
hash
|
205
|
+
end
|
206
|
+
|
207
|
+
def credit_card_hash(creditcard)
|
208
|
+
hash = {}
|
209
|
+
hash[:cvc] = creditcard.verification_value if creditcard.verification_value
|
210
|
+
hash[:expiryMonth] = format(creditcard.month, :two_digits) if creditcard.month
|
211
|
+
hash[:expiryYear] = format(creditcard.year, :four_digits) if creditcard.year
|
212
|
+
hash[:holderName] = creditcard.name if creditcard.name
|
213
|
+
hash[:number] = creditcard.number if creditcard.number
|
214
|
+
hash
|
215
|
+
end
|
216
|
+
|
217
|
+
def modification_request(reference, options)
|
218
|
+
hash = {}
|
219
|
+
hash[:merchantAccount] = @options[:merchant]
|
220
|
+
hash[:originalReference] = reference if reference
|
221
|
+
hash.keep_if { |_, v| v }
|
222
|
+
end
|
223
|
+
|
224
|
+
def payment_request(money, options)
|
225
|
+
hash = {}
|
226
|
+
hash[:merchantAccount] = @options[:merchant]
|
227
|
+
hash[:reference] = options[:order_id] if options[:order_id]
|
228
|
+
hash[:shopperEmail] = options[:email] if options[:email]
|
229
|
+
hash[:shopperIP] = options[:ip] if options[:ip]
|
230
|
+
hash[:shopperReference] = options[:customer] if options[:customer]
|
231
|
+
hash.keep_if { |_, v| v }
|
232
|
+
end
|
233
|
+
|
234
|
+
def store_request(options)
|
235
|
+
hash = {}
|
236
|
+
hash[:merchantAccount] = @options[:merchant]
|
237
|
+
hash[:shopperEmail] = options[:email] if options[:email]
|
238
|
+
hash[:shopperReference] = options[:customer] if options[:customer]
|
239
|
+
hash.keep_if { |_, v| v }
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
@@ -321,7 +321,7 @@ module ActiveMerchant #:nodoc:
|
|
321
321
|
def response_from_result(result)
|
322
322
|
Response.new(result.success?, message_from_result(result),
|
323
323
|
{ braintree_transaction: transaction_hash(result) },
|
324
|
-
{ authorization: (result.transaction.id if result.
|
324
|
+
{ authorization: (result.transaction.id if result.transaction) }
|
325
325
|
)
|
326
326
|
end
|
327
327
|
|
@@ -334,10 +334,8 @@ module ActiveMerchant #:nodoc:
|
|
334
334
|
|
335
335
|
def response_options(result)
|
336
336
|
options = {}
|
337
|
-
if result.success?
|
338
|
-
options[:authorization] = result.transaction.id
|
339
|
-
end
|
340
337
|
if result.transaction
|
338
|
+
options[:authorization] = result.transaction.id
|
341
339
|
options[:avs_result] = { code: avs_code_from(result.transaction) }
|
342
340
|
options[:cvv_result] = result.transaction.cvv_response_code
|
343
341
|
end
|
@@ -554,13 +552,15 @@ module ActiveMerchant #:nodoc:
|
|
554
552
|
:last_name => credit_card_or_vault_id.last_name
|
555
553
|
)
|
556
554
|
if credit_card_or_vault_id.is_a?(NetworkTokenizationCreditCard)
|
557
|
-
|
558
|
-
:
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
555
|
+
if credit_card_or_vault_id.source == :apple_pay
|
556
|
+
parameters[:apple_pay_card] = {
|
557
|
+
:number => credit_card_or_vault_id.number,
|
558
|
+
:expiration_month => credit_card_or_vault_id.month.to_s.rjust(2, "0"),
|
559
|
+
:expiration_year => credit_card_or_vault_id.year.to_s,
|
560
|
+
:cardholder_name => "#{credit_card_or_vault_id.first_name} #{credit_card_or_vault_id.last_name}",
|
561
|
+
:cryptogram => credit_card_or_vault_id.payment_cryptogram
|
562
|
+
}
|
563
|
+
end
|
564
564
|
else
|
565
565
|
parameters[:credit_card] = {
|
566
566
|
:number => credit_card_or_vault_id.number,
|