braintree 2.95.0 → 2.96.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/braintree.rb +1 -0
- data/lib/braintree/gateway.rb +2 -0
- data/lib/braintree/ideal_payment.rb +2 -0
- data/lib/braintree/ideal_payment_gateway.rb +2 -0
- data/lib/braintree/local_payment_completed.rb +3 -0
- data/lib/braintree/payment_instrument_type.rb +1 -1
- data/lib/braintree/paypal_account.rb +1 -0
- data/lib/braintree/test/nonce.rb +2 -0
- data/lib/braintree/transaction.rb +5 -0
- data/lib/braintree/transaction/android_pay_details.rb +10 -0
- data/lib/braintree/transaction/apple_pay_details.rb +10 -0
- data/lib/braintree/transaction/ideal_payment_details.rb +2 -0
- data/lib/braintree/transaction/local_payment_details.rb +17 -0
- data/lib/braintree/transaction/paypal_details.rb +3 -1
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/webhook_notification.rb +4 -1
- data/lib/braintree/webhook_testing_gateway.rb +35 -0
- data/spec/integration/braintree/paypal_account_spec.rb +1 -0
- data/spec/integration/braintree/transaction_search_spec.rb +15 -0
- data/spec/integration/braintree/transaction_spec.rb +43 -49
- data/spec/spec_helper.rb +0 -1
- data/spec/unit/braintree/local_payment_completed_spec.rb +12 -0
- data/spec/unit/braintree/webhook_notification_spec.rb +24 -40
- metadata +4 -5
- data/spec/integration/braintree/ideal_payment_spec.rb +0 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05a36d5ea5b0870293e17db6baa85393f97e0a8aa8ba495ee34ec2f30d64f29a
|
4
|
+
data.tar.gz: d7291802e13bfdecf5e3258b0f9cac7bb15654fd4f6249faf0e96444de55576e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5bee8dcbe48df9d0c752d150dd3c18ae3c4232a31aa3e850ac5ab1a8ef4a85f292515b96489dbf736a2bde1d4780bb1f5f1edfb4eeaeacde6b983e8c72d4825
|
7
|
+
data.tar.gz: 5065e4ad5cde4db02b5bfdee866425a8d837604ff50b69d4c1f721915e6483cec41ef8ff9e53f03c3ce2290d1e27f13a346c01bb9a277ffd0b179284ed4fba9d
|
data/lib/braintree.rb
CHANGED
@@ -76,6 +76,7 @@ require "braintree/ideal_payment"
|
|
76
76
|
require "braintree/ideal_payment_gateway"
|
77
77
|
require "braintree/transaction/ideal_payment_details"
|
78
78
|
require "braintree/local_payment_completed"
|
79
|
+
require "braintree/transaction/local_payment_details"
|
79
80
|
require "braintree/merchant"
|
80
81
|
require "braintree/merchant_gateway"
|
81
82
|
require "braintree/merchant_account"
|
data/lib/braintree/gateway.rb
CHANGED
@@ -72,6 +72,8 @@ module Braintree
|
|
72
72
|
UsBankAccountGateway.new(self)
|
73
73
|
end
|
74
74
|
|
75
|
+
# NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
|
76
|
+
# DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
|
75
77
|
def ideal_payment
|
76
78
|
IdealPaymentGateway.new(self)
|
77
79
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
module Braintree
|
2
|
+
# NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
|
3
|
+
# DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
|
2
4
|
class IdealPayment
|
3
5
|
include BaseModule
|
4
6
|
|
@@ -1,4 +1,6 @@
|
|
1
1
|
module Braintree
|
2
|
+
# NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
|
3
|
+
# DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
|
2
4
|
class IdealPaymentGateway
|
3
5
|
def initialize(gateway)
|
4
6
|
@gateway = gateway
|
@@ -4,9 +4,12 @@ module Braintree
|
|
4
4
|
|
5
5
|
attr_reader :payment_id
|
6
6
|
attr_reader :payer_id
|
7
|
+
attr_reader :payment_method_nonce
|
8
|
+
attr_reader :transaction
|
7
9
|
|
8
10
|
def initialize(attributes) # :nodoc:
|
9
11
|
set_instance_variables_from_hash(attributes)
|
12
|
+
@transaction = Transaction._new(Configuration.gateway, transaction)
|
10
13
|
end
|
11
14
|
|
12
15
|
class << self
|
@@ -8,9 +8,9 @@ module Braintree
|
|
8
8
|
AndroidPayCard = 'android_pay_card'
|
9
9
|
VenmoAccount = 'venmo_account'
|
10
10
|
UsBankAccount = 'us_bank_account'
|
11
|
-
IdealPayment = 'ideal_payment'
|
12
11
|
VisaCheckoutCard = 'visa_checkout_card'
|
13
12
|
MasterpassCard = 'masterpass_card'
|
14
13
|
SamsungPayCard = 'samsung_pay_card'
|
14
|
+
LocalPayment = 'local_payment'
|
15
15
|
end
|
16
16
|
end
|
data/lib/braintree/test/nonce.rb
CHANGED
@@ -6,6 +6,7 @@ module Braintree
|
|
6
6
|
PayPalOneTimePayment = "fake-paypal-one-time-nonce"
|
7
7
|
PayPalFuturePayment = "fake-paypal-future-nonce"
|
8
8
|
PayPalBillingAgreement = "fake-paypal-billing-agreement-nonce"
|
9
|
+
LocalPayment = "fake-local-payment-nonce"
|
9
10
|
ApplePayVisa = "fake-apple-pay-visa-nonce"
|
10
11
|
ApplePayMasterCard = "fake-apple-pay-mastercard-nonce"
|
11
12
|
ApplePayAmEx = "fake-apple-pay-amex-nonce"
|
@@ -18,6 +19,7 @@ module Braintree
|
|
18
19
|
AndroidPayAmEx = "fake-android-pay-amex-nonce"
|
19
20
|
AmexExpressCheckout = "fake-amex-express-checkout-nonce"
|
20
21
|
VenmoAccount = "fake-venmo-account-nonce"
|
22
|
+
VenmoAccountTokenIssuanceError = "fake-token-issuance-error-venmo-account-nonce"
|
21
23
|
TransactableVisa = "fake-valid-visa-nonce"
|
22
24
|
TransactableAmEx = "fake-valid-amex-nonce"
|
23
25
|
TransactableMasterCard = "fake-valid-mastercard-nonce"
|
@@ -26,6 +26,7 @@ module Braintree
|
|
26
26
|
Duplicate = "duplicate"
|
27
27
|
Fraud = "fraud"
|
28
28
|
ThreeDSecure = "three_d_secure"
|
29
|
+
TokenIssuance = "token_issuance"
|
29
30
|
Unrecognized = "unrecognized"
|
30
31
|
end
|
31
32
|
|
@@ -108,7 +109,10 @@ module Braintree
|
|
108
109
|
attr_reader :facilitator_details
|
109
110
|
attr_reader :gateway_rejection_reason
|
110
111
|
attr_reader :id
|
112
|
+
# NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
|
113
|
+
# DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
|
111
114
|
attr_reader :ideal_payment_details
|
115
|
+
attr_reader :local_payment_details
|
112
116
|
attr_reader :masterpass_card_details
|
113
117
|
attr_reader :merchant_account_id
|
114
118
|
attr_reader :network_transaction_id
|
@@ -282,6 +286,7 @@ module Braintree
|
|
282
286
|
@status_history = attributes[:status_history] ? attributes[:status_history].map { |s| StatusDetails.new(s) } : []
|
283
287
|
@tax_amount = Util.to_big_decimal(tax_amount)
|
284
288
|
@descriptor = Descriptor.new(@descriptor)
|
289
|
+
@local_payment_details = LocalPaymentDetails.new(@local_payment)
|
285
290
|
@paypal_details = PayPalDetails.new(@paypal)
|
286
291
|
@apple_pay_details = ApplePayDetails.new(@apple_pay)
|
287
292
|
@android_pay_details = AndroidPayDetails.new(@android_pay_card)
|
@@ -15,6 +15,16 @@ module Braintree
|
|
15
15
|
attr_reader :token
|
16
16
|
attr_reader :virtual_card_last_4
|
17
17
|
attr_reader :virtual_card_type
|
18
|
+
attr_reader :prepaid
|
19
|
+
attr_reader :healthcare
|
20
|
+
attr_reader :debit
|
21
|
+
attr_reader :durbin_regulated
|
22
|
+
attr_reader :commercial
|
23
|
+
attr_reader :payroll
|
24
|
+
attr_reader :issuing_bank
|
25
|
+
attr_reader :country_of_issuance
|
26
|
+
attr_reader :product_id
|
27
|
+
attr_reader :global_id
|
18
28
|
|
19
29
|
def initialize(attributes)
|
20
30
|
set_instance_variables_from_hash attributes unless attributes.nil?
|
@@ -12,6 +12,16 @@ module Braintree
|
|
12
12
|
attr_reader :payment_instrument_name
|
13
13
|
attr_reader :source_description
|
14
14
|
attr_reader :token
|
15
|
+
attr_reader :prepaid
|
16
|
+
attr_reader :healthcare
|
17
|
+
attr_reader :debit
|
18
|
+
attr_reader :durbin_regulated
|
19
|
+
attr_reader :commercial
|
20
|
+
attr_reader :payroll
|
21
|
+
attr_reader :issuing_bank
|
22
|
+
attr_reader :country_of_issuance
|
23
|
+
attr_reader :product_id
|
24
|
+
attr_reader :global_id
|
15
25
|
|
16
26
|
def initialize(attributes)
|
17
27
|
set_instance_variables_from_hash attributes unless attributes.nil?
|
@@ -1,4 +1,6 @@
|
|
1
1
|
module Braintree
|
2
|
+
# NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
|
3
|
+
# DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
|
2
4
|
class Transaction
|
3
5
|
class IdealPaymentDetails # :nodoc:
|
4
6
|
include BaseModule
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Braintree
|
2
|
+
class Transaction
|
3
|
+
class LocalPaymentDetails
|
4
|
+
include BaseModule
|
5
|
+
|
6
|
+
attr_reader :custom_field
|
7
|
+
attr_reader :description
|
8
|
+
attr_reader :funding_source
|
9
|
+
attr_reader :payer_id
|
10
|
+
attr_reader :payment_id
|
11
|
+
|
12
|
+
def initialize(attributes)
|
13
|
+
set_instance_variables_from_hash attributes unless attributes.nil?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -9,14 +9,16 @@ module Braintree
|
|
9
9
|
attr_reader :debug_id
|
10
10
|
attr_reader :description
|
11
11
|
attr_reader :image_url
|
12
|
-
attr_reader :payee_id
|
13
12
|
attr_reader :payee_email
|
13
|
+
attr_reader :payee_id
|
14
14
|
attr_reader :payer_email
|
15
15
|
attr_reader :payer_first_name
|
16
16
|
attr_reader :payer_id
|
17
17
|
attr_reader :payer_last_name
|
18
18
|
attr_reader :payer_status
|
19
19
|
attr_reader :payment_id
|
20
|
+
attr_reader :refund_from_transaction_fee_amount
|
21
|
+
attr_reader :refund_from_transaction_fee_currency_iso_code
|
20
22
|
attr_reader :refund_id
|
21
23
|
attr_reader :seller_protection_status
|
22
24
|
attr_reader :token
|
data/lib/braintree/version.rb
CHANGED
@@ -33,6 +33,8 @@ module Braintree
|
|
33
33
|
|
34
34
|
AccountUpdaterDailyReport = "account_updater_daily_report"
|
35
35
|
|
36
|
+
# NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
|
37
|
+
# DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
|
36
38
|
IdealPaymentComplete = "ideal_payment_complete"
|
37
39
|
IdealPaymentFailed = "ideal_payment_failed"
|
38
40
|
|
@@ -46,6 +48,7 @@ module Braintree
|
|
46
48
|
GrantorUpdatedGrantedPaymentMethod = "grantor_updated_granted_payment_method"
|
47
49
|
RecipientUpdatedGrantedPaymentMethod = "recipient_updated_granted_payment_method"
|
48
50
|
GrantedPaymentInstrumentRevoked = "granted_payment_instrument_revoked"
|
51
|
+
PaymentMethodRevokedByCustomer = "payment_method_revoked_by_customer"
|
49
52
|
|
50
53
|
LocalPaymentCompleted = "local_payment_completed"
|
51
54
|
end
|
@@ -91,7 +94,7 @@ module Braintree
|
|
91
94
|
@connected_merchant_status_transitioned = ConnectedMerchantStatusTransitioned._new(@subject[:connected_merchant_status_transitioned]) if @subject.has_key?(:connected_merchant_status_transitioned)
|
92
95
|
@connected_merchant_paypal_status_changed = ConnectedMerchantPayPalStatusChanged._new(@subject[:connected_merchant_paypal_status_changed]) if @subject.has_key?(:connected_merchant_paypal_status_changed)
|
93
96
|
@granted_payment_instrument_update = GrantedPaymentInstrumentUpdate._new(@subject[:granted_payment_instrument_update]) if @subject.has_key?(:granted_payment_instrument_update)
|
94
|
-
@revoked_payment_method_metadata = RevokedPaymentMethodMetadata._new(gateway, @subject) if
|
97
|
+
@revoked_payment_method_metadata = RevokedPaymentMethodMetadata._new(gateway, @subject) if [Kind::GrantedPaymentInstrumentRevoked, Kind::PaymentMethodRevokedByCustomer].include?(@kind)
|
95
98
|
@local_payment_completed = LocalPaymentCompleted._new(@subject[:local_payment]) if @subject.has_key?(:local_payment)
|
96
99
|
end
|
97
100
|
|
@@ -72,8 +72,12 @@ module Braintree
|
|
72
72
|
_auth_status_transitioned_sample_xml(id)
|
73
73
|
when Braintree::WebhookNotification::Kind::ConnectedMerchantPayPalStatusChanged
|
74
74
|
_auth_paypal_status_changed_sample_xml(id)
|
75
|
+
# NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
|
76
|
+
# DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
|
75
77
|
when Braintree::WebhookNotification::Kind::IdealPaymentComplete
|
76
78
|
_ideal_payment_complete_sample_xml(id)
|
79
|
+
# NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
|
80
|
+
# DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
|
77
81
|
when Braintree::WebhookNotification::Kind::IdealPaymentFailed
|
78
82
|
_ideal_payment_failed_sample_xml(id)
|
79
83
|
# NEXT_MAJOR_VERSION remove GrantedPaymentInstrumentUpdate
|
@@ -83,6 +87,8 @@ module Braintree
|
|
83
87
|
_granted_payment_instrument_update_sample_xml(id)
|
84
88
|
when Braintree::WebhookNotification::Kind::RecipientUpdatedGrantedPaymentMethod
|
85
89
|
_granted_payment_instrument_update_sample_xml(id)
|
90
|
+
when Braintree::WebhookNotification::Kind::PaymentMethodRevokedByCustomer
|
91
|
+
_payment_method_revoked_by_customer_sample_xml(id)
|
86
92
|
when Braintree::WebhookNotification::Kind::LocalPaymentCompleted
|
87
93
|
_local_payment_completed_sample_xml(id)
|
88
94
|
else
|
@@ -669,11 +675,40 @@ module Braintree
|
|
669
675
|
XML
|
670
676
|
end
|
671
677
|
|
678
|
+
def _payment_method_revoked_by_customer_sample_xml(id)
|
679
|
+
<<-XML
|
680
|
+
<paypal-account>
|
681
|
+
<billing-agreement-id>a-billing-agreement-id</billing-agreement-id>
|
682
|
+
<created-at type="datetime">2019-01-01T12:00:00Z</created-at>
|
683
|
+
<customer-id>a-customer-id</customer-id>
|
684
|
+
<default type="boolean">true</default>
|
685
|
+
<email>name@email.com</email>
|
686
|
+
<global-id>cGF5bWVudG1ldGhvZF9jaDZieXNz</global-id>
|
687
|
+
<image-url>https://assets.braintreegateway.com/payment_method_logo/paypal.png?environment=test</image-url>
|
688
|
+
<subscriptions type="array"/>
|
689
|
+
<token>#{id}</token>
|
690
|
+
<updated-at type="datetime">2019-01-02T12:00:00Z</updated-at>
|
691
|
+
<is-channel-initiated nil="true"/>
|
692
|
+
<payer-id>a-payer-id</payer-id>
|
693
|
+
<payer-info nil="true"/>
|
694
|
+
<limited-use-order-id nil="true"/>
|
695
|
+
<revoked-at type="datetime">2019-01-02T12:00:00Z</revoked-at>
|
696
|
+
</paypal-account>
|
697
|
+
XML
|
698
|
+
end
|
699
|
+
|
672
700
|
def _local_payment_completed_sample_xml(id)
|
673
701
|
<<-XML
|
674
702
|
<local-payment>
|
675
703
|
<payment-id>PAY-XYZ123</payment-id>
|
676
704
|
<payer-id>ABCPAYER</payer-id>
|
705
|
+
<payment-method-nonce>ee257d98-de40-47e8-96b3-a6954ea7a9a4</payment-method-nonce>
|
706
|
+
<transaction>
|
707
|
+
<id>#{id}</id>
|
708
|
+
<status>authorized</status>
|
709
|
+
<amount>49.99</amount>
|
710
|
+
<order-id>order4567</order-id>
|
711
|
+
</transaction>
|
677
712
|
</local-payment>
|
678
713
|
XML
|
679
714
|
end
|
@@ -25,6 +25,7 @@ describe Braintree::PayPalAccount do
|
|
25
25
|
paypal_account.created_at.should_not be_nil
|
26
26
|
paypal_account.updated_at.should_not be_nil
|
27
27
|
paypal_account.customer_id.should == customer.id
|
28
|
+
paypal_account.revoked_at.should be_nil
|
28
29
|
end
|
29
30
|
|
30
31
|
it "returns a PayPalAccount with a billing agreement id" do
|
@@ -345,6 +345,21 @@ describe Braintree::Transaction, "search" do
|
|
345
345
|
collection.first.payment_instrument_type.should == Braintree::PaymentInstrumentType::PayPalAccount
|
346
346
|
end
|
347
347
|
|
348
|
+
it "searches by payment instrument type LocalPaymentDetail" do
|
349
|
+
transaction = Braintree::Transaction.sale!(
|
350
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
351
|
+
:payment_method_nonce => Braintree::Test::Nonce::LocalPayment
|
352
|
+
)
|
353
|
+
|
354
|
+
collection = Braintree::Transaction.search do |search|
|
355
|
+
search.id.is transaction.id
|
356
|
+
search.payment_instrument_type.in ["LocalPaymentDetail"]
|
357
|
+
end
|
358
|
+
|
359
|
+
collection.first.id.should == transaction.id
|
360
|
+
collection.first.payment_instrument_type.should == Braintree::PaymentInstrumentType::LocalPayment
|
361
|
+
end
|
362
|
+
|
348
363
|
it "searches by payment instrument type ApplePay" do
|
349
364
|
transaction = Braintree::Transaction.sale!(
|
350
365
|
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
@@ -201,7 +201,7 @@ describe Braintree::Transaction do
|
|
201
201
|
result.success?.should be(false)
|
202
202
|
invalid_folio = Braintree::ErrorCodes::Transaction::Industry::Lodging::FolioNumberIsInvalid
|
203
203
|
check_out_date_must_follow_check_in_date = Braintree::ErrorCodes::Transaction::Industry::Lodging::CheckOutDateMustFollowCheckInDate
|
204
|
-
result.errors.for(:transaction).for(:industry).map { |e| e.code }.sort.should
|
204
|
+
result.errors.for(:transaction).for(:industry).map { |e| e.code }.sort.should include *[invalid_folio, check_out_date_must_follow_check_in_date]
|
205
205
|
end
|
206
206
|
end
|
207
207
|
|
@@ -766,6 +766,16 @@ describe Braintree::Transaction do
|
|
766
766
|
result.success?.should == false
|
767
767
|
result.transaction.gateway_rejection_reason.should == Braintree::Transaction::GatewayRejectionReason::Fraud
|
768
768
|
end
|
769
|
+
|
770
|
+
it "exposes the token issuance gateway rejection reason" do
|
771
|
+
result = Braintree::Transaction.sale(
|
772
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
773
|
+
:merchant_account_id => SpecHelper::FakeVenmoAccountMerchantAccountId,
|
774
|
+
:payment_method_nonce => Braintree::Test::Nonce::VenmoAccountTokenIssuanceError,
|
775
|
+
)
|
776
|
+
result.success?.should == false
|
777
|
+
result.transaction.gateway_rejection_reason.should == Braintree::Transaction::GatewayRejectionReason::TokenIssuance
|
778
|
+
end
|
769
779
|
end
|
770
780
|
|
771
781
|
it "accepts credit card expiration month and expiration year" do
|
@@ -1575,6 +1585,13 @@ describe Braintree::Transaction do
|
|
1575
1585
|
apple_pay_details.cardholder_name.should_not be_nil
|
1576
1586
|
apple_pay_details.image_url.should_not be_nil
|
1577
1587
|
apple_pay_details.token.should be_nil
|
1588
|
+
apple_pay_details.prepaid.should_not be_nil
|
1589
|
+
apple_pay_details.healthcare.should_not be_nil
|
1590
|
+
apple_pay_details.debit.should_not be_nil
|
1591
|
+
apple_pay_details.durbin_regulated.should_not be_nil
|
1592
|
+
apple_pay_details.commercial.should_not be_nil
|
1593
|
+
apple_pay_details.payroll.should_not be_nil
|
1594
|
+
apple_pay_details.product_id.should_not be_nil
|
1578
1595
|
end
|
1579
1596
|
|
1580
1597
|
it "can create a vaulted transaction with a fake apple pay nonce" do
|
@@ -1620,6 +1637,13 @@ describe Braintree::Transaction do
|
|
1620
1637
|
android_pay_details.google_transaction_id.should == "google_transaction_id"
|
1621
1638
|
android_pay_details.image_url.should_not be_nil
|
1622
1639
|
android_pay_details.token.should be_nil
|
1640
|
+
android_pay_details.prepaid.should_not be_nil
|
1641
|
+
android_pay_details.healthcare.should_not be_nil
|
1642
|
+
android_pay_details.debit.should_not be_nil
|
1643
|
+
android_pay_details.durbin_regulated.should_not be_nil
|
1644
|
+
android_pay_details.commercial.should_not be_nil
|
1645
|
+
android_pay_details.payroll.should_not be_nil
|
1646
|
+
android_pay_details.product_id.should_not be_nil
|
1623
1647
|
end
|
1624
1648
|
|
1625
1649
|
it "can create a vaulted transaction with a fake android pay proxy card nonce" do
|
@@ -2098,7 +2122,7 @@ describe Braintree::Transaction do
|
|
2098
2122
|
|
2099
2123
|
it "returns an error for transaction with three_d_secure_pass_thru when processor settings do not support 3DS for card type" do
|
2100
2124
|
result = Braintree::Transaction.create(
|
2101
|
-
:merchant_account_id => "
|
2125
|
+
:merchant_account_id => "heartland_ma",
|
2102
2126
|
:type => "sale",
|
2103
2127
|
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
2104
2128
|
:credit_card => {
|
@@ -2239,6 +2263,21 @@ describe Braintree::Transaction do
|
|
2239
2263
|
end
|
2240
2264
|
end
|
2241
2265
|
|
2266
|
+
context "local payments" do
|
2267
|
+
it "can create a local payment transaction with a nonce" do
|
2268
|
+
result = Braintree::Transaction.create(
|
2269
|
+
:type => "sale",
|
2270
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
2271
|
+
:payment_method_nonce => Braintree::Test::Nonce::LocalPayment
|
2272
|
+
)
|
2273
|
+
|
2274
|
+
result.should be_success
|
2275
|
+
result.transaction.local_payment_details.should_not be_nil
|
2276
|
+
result.transaction.local_payment_details.funding_source.should_not be_nil
|
2277
|
+
result.transaction.local_payment_details.payment_id.should_not be_nil
|
2278
|
+
end
|
2279
|
+
end
|
2280
|
+
|
2242
2281
|
context "onetime" do
|
2243
2282
|
it "can create a paypal transaction with a nonce" do
|
2244
2283
|
result = Braintree::Transaction.create(
|
@@ -2439,53 +2478,6 @@ describe Braintree::Transaction do
|
|
2439
2478
|
end
|
2440
2479
|
end
|
2441
2480
|
|
2442
|
-
context "ideal payment nonce" do
|
2443
|
-
it "returns a successful result for tansacting on an ideal payment nonce" do
|
2444
|
-
valid_ideal_payment_id = generate_valid_ideal_payment_nonce
|
2445
|
-
result = Braintree::Transaction.create(
|
2446
|
-
:type => "sale",
|
2447
|
-
:order_id => SpecHelper::DefaultOrderId,
|
2448
|
-
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
2449
|
-
:merchant_account_id => SpecHelper::IdealMerchantAccountId,
|
2450
|
-
:payment_method_nonce => valid_ideal_payment_id,
|
2451
|
-
:options => {
|
2452
|
-
:submit_for_settlement => true,
|
2453
|
-
}
|
2454
|
-
)
|
2455
|
-
result.success?.should == true
|
2456
|
-
result.transaction.id.should =~ /^\w{6,}$/
|
2457
|
-
result.transaction.type.should == "sale"
|
2458
|
-
result.transaction.payment_instrument_type.should == Braintree::PaymentInstrumentType::IdealPayment
|
2459
|
-
result.transaction.amount.should == BigDecimal(Braintree::Test::TransactionAmounts::Authorize)
|
2460
|
-
result.transaction.status.should == Braintree::Transaction::Status::Settled
|
2461
|
-
result.transaction.ideal_payment_details.ideal_payment_id.should =~ /^idealpayment_\w{6,}$/
|
2462
|
-
result.transaction.ideal_payment_details.ideal_transaction_id.should =~ /^\d{16,}$/
|
2463
|
-
result.transaction.ideal_payment_details.image_url.should start_with("https://")
|
2464
|
-
result.transaction.ideal_payment_details.masked_iban.should_not be_empty
|
2465
|
-
result.transaction.ideal_payment_details.bic.should_not be_empty
|
2466
|
-
end
|
2467
|
-
|
2468
|
-
it "returns a failure if ideal payment is not complete" do
|
2469
|
-
expired_payment_amount = "3.00"
|
2470
|
-
|
2471
|
-
incomplete_payment_id = generate_valid_ideal_payment_nonce(expired_payment_amount)
|
2472
|
-
|
2473
|
-
result = Braintree::Transaction.create(
|
2474
|
-
:type => "sale",
|
2475
|
-
:order_id => SpecHelper::DefaultOrderId,
|
2476
|
-
:amount => expired_payment_amount,
|
2477
|
-
:merchant_account_id => SpecHelper::IdealMerchantAccountId,
|
2478
|
-
:payment_method_nonce => incomplete_payment_id,
|
2479
|
-
:options => {
|
2480
|
-
:submit_for_settlement => true,
|
2481
|
-
}
|
2482
|
-
)
|
2483
|
-
|
2484
|
-
result.success?.should == false
|
2485
|
-
result.errors.for(:transaction).on(:payment_method_nonce)[0].code.should == Braintree::ErrorCodes::Transaction::IdealPaymentNotComplete
|
2486
|
-
end
|
2487
|
-
end
|
2488
|
-
|
2489
2481
|
context "line items" do
|
2490
2482
|
it "allows creation with empty line items and returns none" do
|
2491
2483
|
result = Braintree::Transaction.create(
|
@@ -5863,6 +5855,8 @@ describe Braintree::Transaction do
|
|
5863
5855
|
transaction.paypal_details.refund_id.should_not be_nil
|
5864
5856
|
transaction.paypal_details.transaction_fee_amount.should_not be_nil
|
5865
5857
|
transaction.paypal_details.transaction_fee_currency_iso_code.should_not be_nil
|
5858
|
+
transaction.paypal_details.refund_from_transaction_fee_amount.should_not be_nil
|
5859
|
+
transaction.paypal_details.refund_from_transaction_fee_currency_iso_code.should_not be_nil
|
5866
5860
|
end
|
5867
5861
|
end
|
5868
5862
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -41,7 +41,6 @@ unless defined?(SPEC_HELPER_LOADED)
|
|
41
41
|
FakeVenmoAccountMerchantAccountId = "fake_first_data_venmo_account"
|
42
42
|
UsBankMerchantAccountId = "us_bank_merchant_account"
|
43
43
|
AnotherUsBankMerchantAccountId = "another_us_bank_merchant_account"
|
44
|
-
IdealMerchantAccountId = "ideal_merchant_account"
|
45
44
|
AdyenMerchantAccountId = "adyen_ma"
|
46
45
|
HiperBRLMerchantAccountId = "hiper_brl"
|
47
46
|
|
@@ -14,11 +14,23 @@ describe Braintree::LocalPaymentCompleted do
|
|
14
14
|
params = {
|
15
15
|
payment_id: "a-payment-id",
|
16
16
|
payer_id: "a-payer-id",
|
17
|
+
payment_method_nonce: "a-nonce",
|
18
|
+
transaction: {
|
19
|
+
id: "a-transaction-id",
|
20
|
+
amount: "31.00",
|
21
|
+
order_id: "an-order-id",
|
22
|
+
status: Braintree::Transaction::Status::Authorized,
|
23
|
+
},
|
17
24
|
}
|
18
25
|
local_payment_completed = Braintree::LocalPaymentCompleted._new(params)
|
19
26
|
|
20
27
|
local_payment_completed.payment_id.should eq("a-payment-id")
|
21
28
|
local_payment_completed.payer_id.should eq("a-payer-id")
|
29
|
+
local_payment_completed.payment_method_nonce.should eq("a-nonce")
|
30
|
+
local_payment_completed.transaction.id.should eq("a-transaction-id")
|
31
|
+
local_payment_completed.transaction.amount.should eq(31.0)
|
32
|
+
local_payment_completed.transaction.order_id.should eq("an-order-id")
|
33
|
+
local_payment_completed.transaction.status.should eq(Braintree::Transaction::Status::Authorized)
|
22
34
|
end
|
23
35
|
end
|
24
36
|
end
|
@@ -305,44 +305,6 @@ describe Braintree::WebhookNotification do
|
|
305
305
|
end
|
306
306
|
end
|
307
307
|
|
308
|
-
context "ideal payments" do
|
309
|
-
it "builds a sample notification for a ideal_payment_complete complete webhook" do
|
310
|
-
sample_notification = Braintree::WebhookTesting.sample_notification(
|
311
|
-
Braintree::WebhookNotification::Kind::IdealPaymentComplete,
|
312
|
-
"my_id"
|
313
|
-
)
|
314
|
-
|
315
|
-
notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
|
316
|
-
notification.kind.should == Braintree::WebhookNotification::Kind::IdealPaymentComplete
|
317
|
-
ideal_payment = notification.ideal_payment
|
318
|
-
|
319
|
-
ideal_payment.id.should == "my_id"
|
320
|
-
ideal_payment.status.should == "COMPLETE"
|
321
|
-
ideal_payment.order_id.should == "ORDERABC"
|
322
|
-
ideal_payment.amount.should == "10.00"
|
323
|
-
ideal_payment.approval_url.should == "https://example.com"
|
324
|
-
ideal_payment.ideal_transaction_id.should == "1234567890"
|
325
|
-
end
|
326
|
-
|
327
|
-
it "builds a sample notification for a ideal_payment_failed webhook" do
|
328
|
-
sample_notification = Braintree::WebhookTesting.sample_notification(
|
329
|
-
Braintree::WebhookNotification::Kind::IdealPaymentFailed,
|
330
|
-
"my_id"
|
331
|
-
)
|
332
|
-
|
333
|
-
notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
|
334
|
-
notification.kind.should == Braintree::WebhookNotification::Kind::IdealPaymentFailed
|
335
|
-
ideal_payment = notification.ideal_payment
|
336
|
-
|
337
|
-
ideal_payment.id.should == "my_id"
|
338
|
-
ideal_payment.status.should == "FAILED"
|
339
|
-
ideal_payment.order_id.should == "ORDERABC"
|
340
|
-
ideal_payment.amount.should == "10.00"
|
341
|
-
ideal_payment.approval_url.should == "https://example.com"
|
342
|
-
ideal_payment.ideal_transaction_id.should == "1234567890"
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
308
|
context "merchant account" do
|
347
309
|
it "builds a sample notification for a merchant account approved webhook" do
|
348
310
|
sample_notification = Braintree::WebhookTesting.sample_notification(
|
@@ -604,6 +566,23 @@ describe Braintree::WebhookNotification do
|
|
604
566
|
end
|
605
567
|
end
|
606
568
|
|
569
|
+
context "payment_method_revoked_by_customer" do
|
570
|
+
it "builds a sample notification for a payment_method_revoked_by_customer webhook" do
|
571
|
+
sample_notification = Braintree::WebhookTesting.sample_notification(
|
572
|
+
Braintree::WebhookNotification::Kind::PaymentMethodRevokedByCustomer,
|
573
|
+
"my_payment_method_token"
|
574
|
+
)
|
575
|
+
|
576
|
+
notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
|
577
|
+
notification.kind.should == Braintree::WebhookNotification::Kind::PaymentMethodRevokedByCustomer
|
578
|
+
|
579
|
+
metadata = notification.revoked_payment_method_metadata
|
580
|
+
metadata.token.should == "my_payment_method_token"
|
581
|
+
metadata.revoked_payment_method.class.should == Braintree::PayPalAccount
|
582
|
+
metadata.revoked_payment_method.revoked_at.should_not be_nil
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
607
586
|
context "local_payment_completed" do
|
608
587
|
it "builds a sample notification for a local_payment webhook" do
|
609
588
|
sample_notification = Braintree::WebhookTesting.sample_notification(
|
@@ -615,8 +594,13 @@ describe Braintree::WebhookNotification do
|
|
615
594
|
notification.kind.should == Braintree::WebhookNotification::Kind::LocalPaymentCompleted
|
616
595
|
|
617
596
|
local_payment_completed = notification.local_payment_completed
|
618
|
-
local_payment_completed.payment_id.should ==
|
619
|
-
local_payment_completed.payer_id.should ==
|
597
|
+
local_payment_completed.payment_id.should == "PAY-XYZ123"
|
598
|
+
local_payment_completed.payer_id.should == "ABCPAYER"
|
599
|
+
local_payment_completed.payment_method_nonce.should == "ee257d98-de40-47e8-96b3-a6954ea7a9a4"
|
600
|
+
local_payment_completed.transaction.id.should == "my_id"
|
601
|
+
local_payment_completed.transaction.status.should == Braintree::Transaction::Status::Authorized
|
602
|
+
local_payment_completed.transaction.amount.should == 49.99
|
603
|
+
local_payment_completed.transaction.order_id.should == "order4567"
|
620
604
|
end
|
621
605
|
end
|
622
606
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: braintree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.96.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Braintree
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: builder
|
@@ -151,6 +151,7 @@ files:
|
|
151
151
|
- lib/braintree/transaction/customer_details.rb
|
152
152
|
- lib/braintree/transaction/disbursement_details.rb
|
153
153
|
- lib/braintree/transaction/ideal_payment_details.rb
|
154
|
+
- lib/braintree/transaction/local_payment_details.rb
|
154
155
|
- lib/braintree/transaction/masterpass_card_details.rb
|
155
156
|
- lib/braintree/transaction/paypal_details.rb
|
156
157
|
- lib/braintree/transaction/samsung_pay_card_details.rb
|
@@ -213,7 +214,6 @@ files:
|
|
213
214
|
- spec/integration/braintree/error_codes_spec.rb
|
214
215
|
- spec/integration/braintree/graphql_client_spec.rb
|
215
216
|
- spec/integration/braintree/http_spec.rb
|
216
|
-
- spec/integration/braintree/ideal_payment_spec.rb
|
217
217
|
- spec/integration/braintree/masterpass_card_spec.rb
|
218
218
|
- spec/integration/braintree/merchant_account_spec.rb
|
219
219
|
- spec/integration/braintree/merchant_spec.rb
|
@@ -318,8 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
318
318
|
- !ruby/object:Gem::Version
|
319
319
|
version: '0'
|
320
320
|
requirements: []
|
321
|
-
|
322
|
-
rubygems_version: 2.7.9
|
321
|
+
rubygems_version: 3.0.3
|
323
322
|
signing_key:
|
324
323
|
specification_version: 4
|
325
324
|
summary: Braintree Gateway Ruby Client Library
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + "/client_api/spec_helper")
|
3
|
-
|
4
|
-
describe Braintree::IdealPayment do
|
5
|
-
context "self.sale" do
|
6
|
-
it "creates a transaction using an Ideal payment token and returns a result object" do
|
7
|
-
ideal_payment_id = generate_valid_ideal_payment_nonce
|
8
|
-
|
9
|
-
result = Braintree::IdealPayment.sale(
|
10
|
-
ideal_payment_id,
|
11
|
-
:order_id => SpecHelper::DefaultOrderId,
|
12
|
-
:merchant_account_id => "ideal_merchant_account",
|
13
|
-
:amount => Braintree::Test::TransactionAmounts::Authorize
|
14
|
-
)
|
15
|
-
|
16
|
-
result.success?.should == true
|
17
|
-
result.transaction.amount.should == BigDecimal(Braintree::Test::TransactionAmounts::Authorize)
|
18
|
-
result.transaction.type.should == "sale"
|
19
|
-
ideal_payment_details = result.transaction.ideal_payment_details
|
20
|
-
ideal_payment_details.ideal_payment_id.should =~ /^idealpayment_\w{6,}$/
|
21
|
-
ideal_payment_details.ideal_transaction_id.should =~ /^\d{16,}$/
|
22
|
-
ideal_payment_details.image_url.should start_with("https://")
|
23
|
-
ideal_payment_details.masked_iban.should_not be_empty
|
24
|
-
ideal_payment_details.bic.should_not be_empty
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context "self.sale!" do
|
29
|
-
it "creates a transaction using an ideal payment and returns a result object" do
|
30
|
-
ideal_payment_id = generate_valid_ideal_payment_nonce
|
31
|
-
|
32
|
-
transaction = Braintree::IdealPayment.sale!(
|
33
|
-
ideal_payment_id,
|
34
|
-
:order_id => SpecHelper::DefaultOrderId,
|
35
|
-
:merchant_account_id => "ideal_merchant_account",
|
36
|
-
:amount => Braintree::Test::TransactionAmounts::Authorize
|
37
|
-
)
|
38
|
-
|
39
|
-
transaction.amount.should == BigDecimal(Braintree::Test::TransactionAmounts::Authorize)
|
40
|
-
transaction.type.should == "sale"
|
41
|
-
ideal_payment_details = transaction.ideal_payment_details
|
42
|
-
ideal_payment_details.ideal_payment_id.should =~ /^idealpayment_\w{6,}$/
|
43
|
-
ideal_payment_details.ideal_transaction_id.should =~ /^\d{16,}$/
|
44
|
-
ideal_payment_details.image_url.should start_with("https://")
|
45
|
-
ideal_payment_details.masked_iban.should_not be_empty
|
46
|
-
ideal_payment_details.bic.should_not be_empty
|
47
|
-
end
|
48
|
-
|
49
|
-
it "does not create a transaction using an ideal payment and returns raises an exception" do
|
50
|
-
expect do
|
51
|
-
Braintree::IdealPayment.sale!(
|
52
|
-
"invalid_nonce",
|
53
|
-
:merchant_account_id => "ideal_merchant_account",
|
54
|
-
:amount => Braintree::Test::TransactionAmounts::Authorize
|
55
|
-
)
|
56
|
-
end.to raise_error(Braintree::ValidationsFailed)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context "self.find" do
|
61
|
-
it "finds the Ideal payment with an id" do
|
62
|
-
ideal_payment_id = generate_valid_ideal_payment_nonce
|
63
|
-
ideal_payment = Braintree::IdealPayment.find(ideal_payment_id)
|
64
|
-
|
65
|
-
ideal_payment.id.should =~ /^idealpayment_\w{6,}$/
|
66
|
-
ideal_payment.ideal_transaction_id.should =~ /^\d{16,}$/
|
67
|
-
ideal_payment.currency.should_not be_empty
|
68
|
-
ideal_payment.amount.should_not be_empty
|
69
|
-
ideal_payment.status.should_not be_empty
|
70
|
-
ideal_payment.order_id.should_not be_empty
|
71
|
-
ideal_payment.issuer.should_not be_empty
|
72
|
-
ideal_payment.approval_url.should start_with("https://")
|
73
|
-
ideal_payment.iban_bank_account.account_holder_name.should_not be_empty
|
74
|
-
ideal_payment.iban_bank_account.bic.should_not be_empty
|
75
|
-
ideal_payment.iban_bank_account.masked_iban.should_not be_empty
|
76
|
-
ideal_payment.iban_bank_account.iban_account_number_last_4.should =~ /^\d{4}$/
|
77
|
-
ideal_payment.iban_bank_account.iban_country.should_not be_empty
|
78
|
-
ideal_payment.iban_bank_account.description.should_not be_empty
|
79
|
-
end
|
80
|
-
|
81
|
-
it "raises if the Ideal payment is not found" do
|
82
|
-
expect do
|
83
|
-
Braintree::IdealPayment.find("idealpayment_nxyqkq_s654wq_92jr64_mnr4kr_yjz")
|
84
|
-
end.to raise_error(Braintree::NotFoundError)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|