braintree 4.9.0 → 4.11.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/lib/braintree/apple_pay_card.rb +2 -0
- data/lib/braintree/credit_card_verification_gateway.rb +18 -5
- data/lib/braintree/customer.rb +4 -1
- data/lib/braintree/dispute.rb +9 -0
- data/lib/braintree/dispute_search.rb +1 -0
- data/lib/braintree/error_codes.rb +7 -0
- data/lib/braintree/gateway.rb +4 -0
- data/lib/braintree/payment_instrument_type.rb +7 -6
- data/lib/braintree/payment_method_gateway.rb +2 -0
- data/lib/braintree/payment_method_nonce_details.rb +3 -0
- data/lib/braintree/payment_method_parser.rb +2 -0
- data/lib/braintree/sepa_direct_debit_account.rb +60 -0
- data/lib/braintree/sepa_direct_debit_account_gateway.rb +25 -0
- data/lib/braintree/sepa_direct_debit_account_nonce_details.rb +28 -0
- data/lib/braintree/test/nonce.rb +2 -0
- data/lib/braintree/transaction/credit_card_details.rb +4 -0
- data/lib/braintree/transaction/sepa_direct_debit_account_details.rb +27 -0
- data/lib/braintree/transaction.rb +6 -0
- data/lib/braintree/transaction_gateway.rb +1 -1
- data/lib/braintree/transaction_search.rb +1 -0
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/webhook_notification.rb +1 -0
- data/lib/braintree/webhook_testing_gateway.rb +76 -0
- data/lib/braintree.rb +4 -0
- data/spec/integration/braintree/credit_card_spec.rb +0 -60
- data/spec/integration/braintree/credit_card_verification_spec.rb +124 -1
- data/spec/integration/braintree/customer_spec.rb +1 -32
- data/spec/integration/braintree/dispute_search_spec.rb +28 -19
- data/spec/integration/braintree/dispute_spec.rb +27 -0
- data/spec/integration/braintree/http_spec.rb +1 -1
- data/spec/integration/braintree/paypal_account_spec.rb +2 -2
- data/spec/integration/braintree/sepa_direct_debit_account_spec.rb +196 -0
- data/spec/integration/braintree/subscription_spec.rb +1 -1
- data/spec/integration/braintree/transaction_search_spec.rb +34 -2
- data/spec/integration/braintree/transaction_spec.rb +107 -101
- data/spec/integration/spec_helper.rb +6 -0
- data/spec/unit/braintree/apple_pay_card_spec.rb +99 -11
- data/spec/unit/braintree/credit_card_verification_gateway_spec.rb +51 -0
- data/spec/unit/braintree/customer_spec.rb +11 -1
- data/spec/unit/braintree/dispute_search_spec.rb +1 -0
- data/spec/unit/braintree/dispute_spec.rb +8 -0
- data/spec/unit/braintree/payment_method_nonce_details_spec.rb +9 -1
- data/spec/unit/braintree/sepa_debit_account_nonce_details_spec.rb +29 -0
- data/spec/unit/braintree/sepa_debit_account_spec.rb +86 -0
- data/spec/unit/braintree/transaction/credit_card_details_spec.rb +16 -0
- data/spec/unit/braintree/transaction/deposit_details_spec.rb +1 -1
- data/spec/unit/braintree/transaction/sepa_direct_debit_account_details_spec.rb +33 -0
- data/spec/unit/braintree/transaction_gateway_spec.rb +111 -0
- data/spec/unit/braintree/transaction_spec.rb +72 -0
- data/spec/unit/braintree/webhook_notification_spec.rb +16 -0
- metadata +13 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bee761d9c397c8fd16648ea8fbb108ff57e10e821c3867391b9fb39f7f524a4
|
4
|
+
data.tar.gz: b638e5e4b14ddde9ed7034f7909b0b6c4ab3fc9332cebe5fffd8a141c2e7ab09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77c28cf2f97e235be57bca0e0443386c344af4e6c5295b9f9eda7433575a82920b2c5b977138c0b3ebf396101debc76d8a66e358d2119ae9b9c09733a4dfb982
|
7
|
+
data.tar.gz: d8e3cf8bad775556b0b3c2d89bb372443144d95086abcc21fa8a57e88b335525ec0181f4d11682bcc13d6e1d099beebbec4f7642b38aba29199c563e300a17af
|
@@ -10,6 +10,7 @@ module Braintree
|
|
10
10
|
All = constants.map { |c| const_get(c) }
|
11
11
|
end
|
12
12
|
|
13
|
+
attr_reader :billing_address
|
13
14
|
attr_reader :bin
|
14
15
|
attr_reader :card_type
|
15
16
|
attr_reader :cardholder_name
|
@@ -39,6 +40,7 @@ module Braintree
|
|
39
40
|
def initialize(gateway, attributes) # :nodoc:
|
40
41
|
@gateway = gateway
|
41
42
|
set_instance_variables_from_hash(attributes)
|
43
|
+
@billing_address = attributes[:billing_address] ? Address._new(@gateway, attributes[:billing_address]) : nil
|
42
44
|
@subscriptions = (@subscriptions || []).map { |subscription_hash| Subscription._new(@gateway, subscription_hash) }
|
43
45
|
end
|
44
46
|
|
@@ -46,11 +46,24 @@ module Braintree
|
|
46
46
|
|
47
47
|
def self._create_signature
|
48
48
|
[
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
49
|
+
{:credit_card => [
|
50
|
+
:cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year,
|
51
|
+
:number, {:billing_address => AddressGateway._shared_signature}
|
52
|
+
]},
|
53
|
+
:intended_transaction_source,
|
54
|
+
{:options => [:amount, :merchant_account_id, :account_type]},
|
55
|
+
:payment_method_nonce,
|
56
|
+
:three_d_secure_authentication_id,
|
57
|
+
{:three_d_secure_pass_thru => [
|
58
|
+
:eci_flag,
|
59
|
+
:cavv,
|
60
|
+
:xid,
|
61
|
+
:three_d_secure_version,
|
62
|
+
:authentication_response,
|
63
|
+
:directory_response,
|
64
|
+
:cavv_algorithm,
|
65
|
+
:ds_transaction_id,
|
66
|
+
]},
|
54
67
|
]
|
55
68
|
end
|
56
69
|
end
|
data/lib/braintree/customer.rb
CHANGED
@@ -19,6 +19,7 @@ module Braintree
|
|
19
19
|
attr_reader :paypal_accounts
|
20
20
|
attr_reader :phone
|
21
21
|
attr_reader :samsung_pay_cards
|
22
|
+
attr_reader :sepa_direct_debit_accounts
|
22
23
|
attr_reader :tax_identifiers
|
23
24
|
attr_reader :updated_at
|
24
25
|
attr_reader :us_bank_accounts
|
@@ -89,6 +90,7 @@ module Braintree
|
|
89
90
|
@venmo_accounts = (@venmo_accounts || []).map { |pm| VenmoAccount._new gateway, pm }
|
90
91
|
@us_bank_accounts = (@us_bank_accounts || []).map { |pm| UsBankAccount._new gateway, pm }
|
91
92
|
@visa_checkout_cards = (@visa_checkout_cards|| []).map { |pm| VisaCheckoutCard._new gateway, pm }
|
93
|
+
@sepa_direct_debit_accounts = (@sepa_debit_accounts || []).map { |pm| SepaDirectDebitAccount._new gateway, pm }
|
92
94
|
@samsung_pay_cards = (@samsung_pay_cards|| []).map { |pm| SamsungPayCard._new gateway, pm }
|
93
95
|
@addresses = (@addresses || []).map { |addr| Address._new gateway, addr }
|
94
96
|
@tax_identifiers = (@tax_identifiers || []).map { |addr| TaxIdentifier._new gateway, addr }
|
@@ -121,7 +123,8 @@ module Braintree
|
|
121
123
|
@venmo_accounts +
|
122
124
|
@us_bank_accounts +
|
123
125
|
@visa_checkout_cards +
|
124
|
-
@samsung_pay_cards
|
126
|
+
@samsung_pay_cards +
|
127
|
+
@sepa_direct_debit_accounts
|
125
128
|
end
|
126
129
|
|
127
130
|
def inspect # :nodoc:
|
data/lib/braintree/dispute.rb
CHANGED
@@ -21,6 +21,7 @@ module Braintree
|
|
21
21
|
attr_reader :merchant_account_id
|
22
22
|
attr_reader :original_dispute_id
|
23
23
|
attr_reader :paypal_messages
|
24
|
+
attr_reader :pre_dispute_program
|
24
25
|
attr_reader :processor_comments
|
25
26
|
attr_reader :protection_level
|
26
27
|
attr_reader :reason
|
@@ -37,6 +38,7 @@ module Braintree
|
|
37
38
|
|
38
39
|
module Status
|
39
40
|
Accepted = "accepted"
|
41
|
+
AutoAccepted = "auto_accepted"
|
40
42
|
Disputed = "disputed"
|
41
43
|
Expired = "expired"
|
42
44
|
Open = "open"
|
@@ -86,6 +88,13 @@ module Braintree
|
|
86
88
|
All = constants.map { |c| const_get(c) }
|
87
89
|
end
|
88
90
|
|
91
|
+
module PreDisputeProgram
|
92
|
+
None = "none"
|
93
|
+
VisaRdr = "visa_rdr"
|
94
|
+
|
95
|
+
All = constants.map { |c| const_get(c) }
|
96
|
+
end
|
97
|
+
|
89
98
|
class << self
|
90
99
|
protected :new
|
91
100
|
def _new(*args) # :nodoc:
|
@@ -13,6 +13,7 @@ module Braintree
|
|
13
13
|
multiple_value_field :protection_level, :allows => Dispute::ProtectionLevel::All
|
14
14
|
multiple_value_field :kind, :allows => Dispute::Kind::All
|
15
15
|
multiple_value_field :merchant_account_id
|
16
|
+
multiple_value_field :pre_dispute_program, :allows => Dispute::PreDisputeProgram::All
|
16
17
|
multiple_value_field :reason, :allows => Dispute::Reason::All
|
17
18
|
multiple_value_field :reason_code
|
18
19
|
multiple_value_field :status, :allows => Dispute::Status::All
|
@@ -83,6 +83,7 @@ module Braintree
|
|
83
83
|
ExpirationYearIsInvalid = "81713"
|
84
84
|
InvalidParamsForCreditCardUpdate = "91745"
|
85
85
|
InvalidVenmoSDKPaymentMethodCode = "91727"
|
86
|
+
NetworkTokenizationAttributeCryptogramIsRequired = "81762"
|
86
87
|
NumberIsInvalid = "81715"
|
87
88
|
NumberIsProhibited = "81750"
|
88
89
|
NumberIsRequired = "81714"
|
@@ -203,6 +204,12 @@ module Braintree
|
|
203
204
|
TokenIsInUse = "92906"
|
204
205
|
end
|
205
206
|
|
207
|
+
module SepaDirectDebitAccount
|
208
|
+
SepaDebitAccountPaymentMethodMandateTypeIsNotSupported = "87115"
|
209
|
+
SepaDebitAccountPaymentMethodCustomerIdIsInvalid = "87116"
|
210
|
+
SepaDebitAccountPaymentMethodCustomerIdIsRequired = "87117"
|
211
|
+
end
|
212
|
+
|
206
213
|
module Subscription
|
207
214
|
BillingDayOfMonthCannotBeUpdated = "91918"
|
208
215
|
BillingDayOfMonthIsInvalid = "91914"
|
data/lib/braintree/gateway.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
module Braintree
|
2
2
|
module PaymentInstrumentType
|
3
|
-
PayPalAccount = "paypal_account"
|
4
|
-
CreditCard = "credit_card"
|
5
3
|
ApplePayCard = "apple_pay_card"
|
4
|
+
CreditCard = "credit_card"
|
6
5
|
GooglePayCard = "android_pay_card"
|
7
|
-
VenmoAccount = "venmo_account"
|
8
|
-
UsBankAccount = "us_bank_account"
|
9
|
-
VisaCheckoutCard = "visa_checkout_card"
|
10
|
-
SamsungPayCard = "samsung_pay_card"
|
11
6
|
LocalPayment = "local_payment"
|
7
|
+
PayPalAccount = "paypal_account"
|
12
8
|
PayPalHere = "paypal_here"
|
9
|
+
SamsungPayCard = "samsung_pay_card"
|
10
|
+
SepaDirectDebitAccount = "sepa_debit_account"
|
11
|
+
UsBankAccount = "us_bank_account"
|
12
|
+
VenmoAccount = "venmo_account"
|
13
|
+
VisaCheckoutCard = "visa_checkout_card"
|
13
14
|
end
|
14
15
|
end
|
@@ -50,6 +50,8 @@ module Braintree
|
|
50
50
|
GooglePayCard._new(@gateway, response[:android_pay_card])
|
51
51
|
elsif response.has_key?(:venmo_account)
|
52
52
|
VenmoAccount._new(@gateway, response[:venmo_account])
|
53
|
+
elsif response.has_key?(:sepa_debit_account)
|
54
|
+
SepaDirectDebitAccount._new(@gateway, response[:sepa_debit_account])
|
53
55
|
else
|
54
56
|
UnknownPaymentMethod._new(@gateway, response)
|
55
57
|
end
|
@@ -9,12 +9,14 @@ module Braintree
|
|
9
9
|
attr_reader :is_network_tokenized
|
10
10
|
attr_reader :last_two
|
11
11
|
attr_reader :payer_info
|
12
|
+
attr_reader :sepa_direct_debit_account_nonce_details
|
12
13
|
|
13
14
|
alias_method :is_network_tokenized?, :is_network_tokenized
|
14
15
|
|
15
16
|
def initialize(attributes)
|
16
17
|
set_instance_variables_from_hash attributes unless attributes.nil?
|
17
18
|
@payer_info = PaymentMethodNonceDetailsPayerInfo.new(attributes[:payer_info]) if attributes[:payer_info]
|
19
|
+
@sepa_direct_debit_account_nonce_details = ::Braintree::SepaDirectDebitAccountNonceDetails.new(attributes)
|
18
20
|
end
|
19
21
|
|
20
22
|
def inspect
|
@@ -26,6 +28,7 @@ module Braintree
|
|
26
28
|
:is_network_tokenized,
|
27
29
|
:last_two,
|
28
30
|
:payer_info,
|
31
|
+
:sepa_direct_debit_account_nonce_details,
|
29
32
|
]
|
30
33
|
|
31
34
|
formatted_attrs = attr_order.map do |attr|
|
@@ -18,6 +18,8 @@ module Braintree
|
|
18
18
|
VisaCheckoutCard._new(gateway, attributes[:visa_checkout_card])
|
19
19
|
elsif attributes[:samsung_pay_card]
|
20
20
|
SamsungPayCard._new(gateway, attributes[:samsung_pay_card])
|
21
|
+
elsif attributes[:sepa_debit_account]
|
22
|
+
SepaDirectDebitAccount._new(gateway, attributes[:sepa_debit_account])
|
21
23
|
else
|
22
24
|
UnknownPaymentMethod._new(gateway, attributes)
|
23
25
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Braintree
|
2
|
+
class SepaDirectDebitAccount
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_reader :bank_reference_token
|
6
|
+
attr_reader :created_at
|
7
|
+
attr_reader :customer_id
|
8
|
+
attr_reader :customer_global_id
|
9
|
+
attr_reader :default
|
10
|
+
attr_reader :global_id
|
11
|
+
attr_reader :image_url
|
12
|
+
attr_reader :last_4
|
13
|
+
attr_reader :mandate_type
|
14
|
+
attr_reader :merchant_or_partner_customer_id
|
15
|
+
attr_reader :subscriptions
|
16
|
+
attr_reader :token
|
17
|
+
attr_reader :updated_at
|
18
|
+
attr_reader :view_mandate_url
|
19
|
+
|
20
|
+
def initialize(gateway, attributes) # :nodoc:
|
21
|
+
@gateway = gateway
|
22
|
+
@subscriptions = (@subscriptions || []).map { |subscription_hash| Subscription._new(@gateway, subscription_hash) }
|
23
|
+
set_instance_variables_from_hash(attributes)
|
24
|
+
end
|
25
|
+
|
26
|
+
def default?
|
27
|
+
@default
|
28
|
+
end
|
29
|
+
|
30
|
+
class << self
|
31
|
+
protected :new
|
32
|
+
end
|
33
|
+
|
34
|
+
def self._new(*args) # :nodoc:
|
35
|
+
self.new(*args)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.find(*args)
|
39
|
+
Configuration.gateway.sepa_direct_debit_account.find(*args)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.delete(*args)
|
43
|
+
Configuration.gateway.sepa_direct_debit_account.delete(*args)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.sale(token, transaction_attributes)
|
47
|
+
options = transaction_attributes[:options] || {}
|
48
|
+
Configuration.gateway.transaction.sale(
|
49
|
+
transaction_attributes.merge(
|
50
|
+
:payment_method_token => token,
|
51
|
+
:options => options.merge(:submit_for_settlement => true),
|
52
|
+
),
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.sale!(token, transaction_attributes)
|
57
|
+
return_object_or_raise(:transaction) { sale(token, transaction_attributes) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Braintree
|
2
|
+
class SepaDirectDebitAccountGateway
|
3
|
+
def initialize(gateway)
|
4
|
+
@gateway = gateway
|
5
|
+
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(token)
|
10
|
+
raise ArgumentError if token.nil? || token.to_s.strip == ""
|
11
|
+
response = @config.http.get("#{@config.base_merchant_path}/payment_methods/sepa_debit_account/#{token}")
|
12
|
+
SepaDirectDebitAccount._new(@gateway, response[:sepa_debit_account])
|
13
|
+
rescue NotFoundError
|
14
|
+
raise NotFoundError, "sepa direct debit account with token #{token.inspect} not found"
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete(token)
|
18
|
+
raise ArgumentError if token.nil? || token.to_s.strip == ""
|
19
|
+
@config.http.delete("#{@config.base_merchant_path}/payment_methods/sepa_debit_account/#{token}")
|
20
|
+
SuccessfulResult.new
|
21
|
+
rescue NotFoundError
|
22
|
+
raise NotFoundError, "sepa direct debit account with token #{token.inspect} not found"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Braintree
|
2
|
+
class SepaDirectDebitAccountNonceDetails# :nodoc:
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_reader :bank_reference_token
|
6
|
+
attr_reader :last_4
|
7
|
+
attr_reader :mandate_type
|
8
|
+
attr_reader :merchant_or_partner_customer_id
|
9
|
+
|
10
|
+
def initialize(attributes)
|
11
|
+
set_instance_variables_from_hash attributes unless attributes.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect
|
15
|
+
attr_order = [
|
16
|
+
:bank_reference_token,
|
17
|
+
:last_4,
|
18
|
+
:mandate_type,
|
19
|
+
:merchant_or_partner_customer_id,
|
20
|
+
]
|
21
|
+
|
22
|
+
formatted_attrs = attr_order.map do |attr|
|
23
|
+
"#{attr}: #{send(attr).inspect}"
|
24
|
+
end
|
25
|
+
"#<SepaDirectDebitAccountNonceDetails#{formatted_attrs.join(", ")}>"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/braintree/test/nonce.rb
CHANGED
@@ -4,6 +4,7 @@ module Braintree
|
|
4
4
|
Transactable = "fake-valid-nonce"
|
5
5
|
Consumed = "fake-consumed-nonce"
|
6
6
|
PayPalOneTimePayment = "fake-paypal-one-time-nonce"
|
7
|
+
#NEXT_MAJOR_VERSION - no longer supported in the Gateway, remove this constant
|
7
8
|
PayPalFuturePayment = "fake-paypal-future-nonce"
|
8
9
|
PayPalBillingAgreement = "fake-paypal-billing-agreement-nonce"
|
9
10
|
LocalPayment = "fake-local-payment-method-nonce"
|
@@ -68,6 +69,7 @@ module Braintree
|
|
68
69
|
SamsungPayDiscover = "tokensam_fake_discover"
|
69
70
|
SamsungPayMasterCard = "tokensam_fake_mastercard"
|
70
71
|
SamsungPayVisa = "tokensam_fake_visa"
|
72
|
+
SepaDirectDebit = "fake-sepa-direct-debit-nonce"
|
71
73
|
end
|
72
74
|
end
|
73
75
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Braintree
|
2
|
+
class Transaction
|
3
|
+
class SepaDirectDebitAccountDetails # :nodoc:
|
4
|
+
include BaseModule
|
5
|
+
|
6
|
+
attr_reader :bank_reference_token
|
7
|
+
attr_reader :capture_id
|
8
|
+
attr_reader :debug_id
|
9
|
+
attr_reader :global_id
|
10
|
+
attr_reader :last_4
|
11
|
+
attr_reader :mandate_type
|
12
|
+
attr_reader :merchant_or_partner_customer_id
|
13
|
+
attr_reader :paypal_v2_order_id
|
14
|
+
attr_reader :refund_from_transaction_fee_amount
|
15
|
+
attr_reader :refund_from_transaction_fee_currency_iso_code
|
16
|
+
attr_reader :refund_id
|
17
|
+
attr_reader :settlement_type
|
18
|
+
attr_reader :token
|
19
|
+
attr_reader :transaction_fee_amount
|
20
|
+
attr_reader :transaction_fee_currency_iso_code
|
21
|
+
|
22
|
+
def initialize(attributes)
|
23
|
+
set_instance_variables_from_hash attributes unless attributes.nil?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -24,6 +24,7 @@ module Braintree
|
|
24
24
|
AVSAndCVV = "avs_and_cvv"
|
25
25
|
CVV = "cvv"
|
26
26
|
Duplicate = "duplicate"
|
27
|
+
ExcessiveRetry = "excessive_retry"
|
27
28
|
Fraud = "fraud"
|
28
29
|
RiskThreshold = "risk_threshold"
|
29
30
|
ThreeDSecure = "three_d_secure"
|
@@ -128,6 +129,7 @@ module Braintree
|
|
128
129
|
attr_reader :merchant_account_id
|
129
130
|
attr_reader :network_response_code # Response code from the card network
|
130
131
|
attr_reader :network_response_text # Response text from the card network
|
132
|
+
attr_reader :network_token_details
|
131
133
|
attr_reader :network_transaction_id
|
132
134
|
attr_reader :order_id
|
133
135
|
attr_reader :partial_settlement_transaction_ids
|
@@ -153,6 +155,8 @@ module Braintree
|
|
153
155
|
attr_reader :samsung_pay_card_details
|
154
156
|
attr_reader :sca_exemption_requested
|
155
157
|
attr_reader :service_fee_amount
|
158
|
+
attr_reader :sepa_direct_debit_account_details
|
159
|
+
attr_reader :sepa_direct_debit_return_code
|
156
160
|
attr_reader :settlement_batch_id
|
157
161
|
attr_reader :shipping_amount
|
158
162
|
attr_reader :shipping_details
|
@@ -296,6 +300,7 @@ module Braintree
|
|
296
300
|
@apple_pay_details = ApplePayDetails.new(@apple_pay)
|
297
301
|
@billing_details = AddressDetails.new(@billing)
|
298
302
|
@credit_card_details = CreditCardDetails.new(@credit_card)
|
303
|
+
@network_token_details = CreditCardDetails.new(@network_token)
|
299
304
|
@custom_fields = attributes[:custom_fields].is_a?(Hash) ? attributes[:custom_fields] : {}
|
300
305
|
@customer_details = CustomerDetails.new(@customer)
|
301
306
|
@descriptor = Descriptor.new(@descriptor)
|
@@ -307,6 +312,7 @@ module Braintree
|
|
307
312
|
@paypal_here_details = PayPalHereDetails.new(@paypal_here)
|
308
313
|
@samsung_pay_card_details = SamsungPayCardDetails.new(attributes[:samsung_pay_card])
|
309
314
|
@sca_exemption_requested = attributes[:sca_exemption_requested]
|
315
|
+
@sepa_direct_debit_account_details = SepaDirectDebitAccountDetails.new(@sepa_debit_account_detail)
|
310
316
|
@service_fee_amount = Util.to_big_decimal(service_fee_amount)
|
311
317
|
@shipping_details = AddressDetails.new(@shipping)
|
312
318
|
@status_history = attributes[:status_history] ? attributes[:status_history].map { |s| StatusDetails.new(s) } : []
|
@@ -195,7 +195,7 @@ module Braintree
|
|
195
195
|
:sca_exemption, :currency_iso_code, :exchange_rate_quote_id,
|
196
196
|
{:line_items => [:quantity, :name, :description, :kind, :unit_amount, :unit_tax_amount, :total_amount, :discount_amount, :tax_amount, :unit_of_measure, :product_code, :commodity_code, :url]},
|
197
197
|
{:risk_data => [:customer_browser, :customer_device_id, :customer_ip, :customer_location_zip, :customer_tenure]},
|
198
|
-
{:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number, {:payment_reader_card_details => [:encrypted_card_data, :key_serial_number]}]},
|
198
|
+
{:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number, {:payment_reader_card_details => [:encrypted_card_data, :key_serial_number]}, {:network_tokenization_attributes => [:cryptogram, :ecommerce_indicator, :token_requestor_id]}]},
|
199
199
|
{:customer => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]},
|
200
200
|
{
|
201
201
|
:billing => AddressGateway._shared_signature
|
data/lib/braintree/version.rb
CHANGED
@@ -42,6 +42,8 @@ module Braintree
|
|
42
42
|
_dispute_won_sample_xml(id)
|
43
43
|
when Braintree::WebhookNotification::Kind::DisputeAccepted
|
44
44
|
_dispute_accepted_sample_xml(id)
|
45
|
+
when Braintree::WebhookNotification::Kind::DisputeAutoAccepted
|
46
|
+
_dispute_auto_accepted_sample_xml(id)
|
45
47
|
when Braintree::WebhookNotification::Kind::DisputeDisputed
|
46
48
|
_dispute_disputed_sample_xml(id)
|
47
49
|
when Braintree::WebhookNotification::Kind::DisputeExpired
|
@@ -337,6 +339,14 @@ module Braintree
|
|
337
339
|
end
|
338
340
|
end
|
339
341
|
|
342
|
+
def _dispute_auto_accepted_sample_xml(id)
|
343
|
+
if id == "legacy_dispute_id"
|
344
|
+
_old_dispute_auto_accepted_sample_xml(id)
|
345
|
+
else
|
346
|
+
_new_dispute_auto_accepted_sample_xml(id)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
340
350
|
def _dispute_disputed_sample_xml(id)
|
341
351
|
if id == "legacy_dispute_id"
|
342
352
|
_old_dispute_disputed_sample_xml(id)
|
@@ -434,6 +444,26 @@ module Braintree
|
|
434
444
|
XML
|
435
445
|
end
|
436
446
|
|
447
|
+
def _old_dispute_auto_accepted_sample_xml(id)
|
448
|
+
<<-XML
|
449
|
+
<dispute>
|
450
|
+
<amount>100.00</amount>
|
451
|
+
<currency-iso-code>USD</currency-iso-code>
|
452
|
+
<received-date type="date">2014-03-01</received-date>
|
453
|
+
<reply-by-date type="date">2014-03-21</reply-by-date>
|
454
|
+
<kind>chargeback</kind>
|
455
|
+
<status>auto_accepted</status>
|
456
|
+
<reason>fraud</reason>
|
457
|
+
<id>#{id}</id>
|
458
|
+
<transaction>
|
459
|
+
<id>#{id}</id>
|
460
|
+
<amount>100.00</amount>
|
461
|
+
</transaction>
|
462
|
+
<date-opened type=\"date\">2014-03-21</date-opened>
|
463
|
+
</dispute>
|
464
|
+
XML
|
465
|
+
end
|
466
|
+
|
437
467
|
def _old_dispute_disputed_sample_xml(id)
|
438
468
|
<<-XML
|
439
469
|
<dispute>
|
@@ -685,6 +715,52 @@ module Braintree
|
|
685
715
|
XML
|
686
716
|
end
|
687
717
|
|
718
|
+
def _new_dispute_auto_accepted_sample_xml(id)
|
719
|
+
<<-XML
|
720
|
+
<dispute>
|
721
|
+
<id>#{id}</id>
|
722
|
+
<amount>100.00</amount>
|
723
|
+
<amount-disputed>100.00</amount-disputed>
|
724
|
+
<amount-won>95.00</amount-won>
|
725
|
+
<case-number>CASE-12345</case-number>
|
726
|
+
<created-at type="datetime">2017-06-16T20:44:41Z</created-at>
|
727
|
+
<currency-iso-code>USD</currency-iso-code>
|
728
|
+
<forwarded-comments nil="true"/>
|
729
|
+
<kind>chargeback</kind>
|
730
|
+
<merchant-account-id>ytnlulaloidoqwvzxjrdqputg</merchant-account-id>
|
731
|
+
<reason>fraud</reason>
|
732
|
+
<reason-code nil="true"/>
|
733
|
+
<reason-description nil="true"/>
|
734
|
+
<received-date type="date">2016-02-15</received-date>
|
735
|
+
<reference-number>REF-9876</reference-number>
|
736
|
+
<reply-by-date type="date">2016-02-22</reply-by-date>
|
737
|
+
<status>auto_accepted</status>
|
738
|
+
<updated-at type="datetime">2017-06-16T20:44:41Z</updated-at>
|
739
|
+
<original-dispute-id>9qde5qgp</original-dispute-id>
|
740
|
+
<status-history type="array">
|
741
|
+
<status-history>
|
742
|
+
<status>open</status>
|
743
|
+
<timestamp type="datetime">2017-06-16T20:44:41Z</timestamp>
|
744
|
+
</status-history>
|
745
|
+
<status-history>
|
746
|
+
<status>auto_accepted</status>
|
747
|
+
<timestamp type="datetime">2017-06-25T20:50:55Z</timestamp>
|
748
|
+
</status-history>
|
749
|
+
</status-history>
|
750
|
+
<evidence type="array"/>
|
751
|
+
<transaction>
|
752
|
+
<id>#{id}</id>
|
753
|
+
<amount>100.00</amount>
|
754
|
+
<created-at>2017-06-21T20:44:41Z</created-at>
|
755
|
+
<order-id nil="true"/>
|
756
|
+
<purchase-order-number nil="true"/>
|
757
|
+
<payment-instrument-subtype>Visa</payment-instrument-subtype>
|
758
|
+
</transaction>
|
759
|
+
<date-opened type=\"date\">2014-03-21</date-opened>
|
760
|
+
</dispute>
|
761
|
+
XML
|
762
|
+
end
|
763
|
+
|
688
764
|
def _new_dispute_disputed_sample_xml(id)
|
689
765
|
<<-XML
|
690
766
|
<dispute>
|
data/lib/braintree.rb
CHANGED
@@ -124,6 +124,9 @@ require "braintree/us_bank_account_verification_gateway"
|
|
124
124
|
require "braintree/us_bank_account_verification_search"
|
125
125
|
require "braintree/us_bank_account_gateway"
|
126
126
|
require "braintree/transaction/us_bank_account_details"
|
127
|
+
require "braintree/sepa_direct_debit_account"
|
128
|
+
require "braintree/sepa_direct_debit_account_gateway"
|
129
|
+
require "braintree/sepa_direct_debit_account_nonce_details"
|
127
130
|
require "braintree/sha256_digest"
|
128
131
|
require "braintree/signature_service"
|
129
132
|
require "braintree/subscription"
|
@@ -150,6 +153,7 @@ require "braintree/transaction/installment/adjustment"
|
|
150
153
|
require "braintree/transaction/paypal_details"
|
151
154
|
require "braintree/transaction/paypal_here_details"
|
152
155
|
require "braintree/transaction/samsung_pay_card_details"
|
156
|
+
require "braintree/transaction/sepa_direct_debit_account_details"
|
153
157
|
require "braintree/transaction/status_details"
|
154
158
|
require "braintree/transaction/subscription_details"
|
155
159
|
require "braintree/transaction/venmo_account_details"
|
@@ -576,66 +576,6 @@ describe Braintree::CreditCard do
|
|
576
576
|
end
|
577
577
|
end
|
578
578
|
|
579
|
-
context "venmo_sdk" do
|
580
|
-
describe "venmo_sdk_payment_method_code" do
|
581
|
-
it "can pass a venmo sdk payment method code" do
|
582
|
-
customer = Braintree::Customer.create!
|
583
|
-
result = Braintree::CreditCard.create(
|
584
|
-
:customer_id => customer.id,
|
585
|
-
:venmo_sdk_payment_method_code => Braintree::Test::VenmoSDK::VisaPaymentMethodCode,
|
586
|
-
)
|
587
|
-
result.success?.should == true
|
588
|
-
result.credit_card.venmo_sdk?.should == false
|
589
|
-
result.credit_card.bin.should == "400934"
|
590
|
-
result.credit_card.last_4.should == "1881"
|
591
|
-
end
|
592
|
-
|
593
|
-
it "success? returns false when given an invalid venmo sdk payment method code" do
|
594
|
-
customer = Braintree::Customer.create!
|
595
|
-
result = Braintree::CreditCard.create(
|
596
|
-
:customer_id => customer.id,
|
597
|
-
:venmo_sdk_payment_method_code => Braintree::Test::VenmoSDK::InvalidPaymentMethodCode,
|
598
|
-
)
|
599
|
-
|
600
|
-
result.success?.should == false
|
601
|
-
result.message.should == "Invalid VenmoSDK payment method code"
|
602
|
-
result.errors.first.code.should == "91727"
|
603
|
-
end
|
604
|
-
end
|
605
|
-
|
606
|
-
describe "venmo_sdk_session" do
|
607
|
-
it "venmo_sdk? returns true when given a valid session" do
|
608
|
-
customer = Braintree::Customer.create!
|
609
|
-
result = Braintree::CreditCard.create(
|
610
|
-
:customer_id => customer.id,
|
611
|
-
:number => Braintree::Test::CreditCardNumbers::Visa,
|
612
|
-
:expiration_date => "05/2009",
|
613
|
-
:cvv => "100",
|
614
|
-
:options => {
|
615
|
-
:venmo_sdk_session => Braintree::Test::VenmoSDK::Session
|
616
|
-
},
|
617
|
-
)
|
618
|
-
result.success?.should == true
|
619
|
-
result.credit_card.venmo_sdk?.should == false
|
620
|
-
end
|
621
|
-
|
622
|
-
it "venmo_sdk? returns false when given an invalid session" do
|
623
|
-
customer = Braintree::Customer.create!
|
624
|
-
result = Braintree::CreditCard.create(
|
625
|
-
:customer_id => customer.id,
|
626
|
-
:number => Braintree::Test::CreditCardNumbers::Visa,
|
627
|
-
:expiration_date => "05/2009",
|
628
|
-
:cvv => "100",
|
629
|
-
:options => {
|
630
|
-
:venmo_sdk_session => Braintree::Test::VenmoSDK::InvalidSession
|
631
|
-
},
|
632
|
-
)
|
633
|
-
result.success?.should == true
|
634
|
-
result.credit_card.venmo_sdk?.should == false
|
635
|
-
end
|
636
|
-
end
|
637
|
-
end
|
638
|
-
|
639
579
|
context "client API" do
|
640
580
|
it "adds credit card to an existing customer using a payment method nonce" do
|
641
581
|
nonce = nonce_for_new_payment_method(
|