braintree 4.2.0 → 4.6.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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/braintree.gemspec +1 -1
  3. data/lib/braintree/apple_pay_card.rb +9 -0
  4. data/lib/braintree/enriched_customer_data.rb +21 -0
  5. data/lib/braintree/error_codes.rb +1 -0
  6. data/lib/braintree/google_pay_card.rb +9 -0
  7. data/lib/braintree/http.rb +1 -0
  8. data/lib/braintree/local_payment_expired.rb +21 -0
  9. data/lib/braintree/local_payment_funded.rb +22 -0
  10. data/lib/braintree/payment_method_customer_data_updated_metadata.rb +24 -0
  11. data/lib/braintree/plan.rb +20 -0
  12. data/lib/braintree/plan_gateway.rb +100 -0
  13. data/lib/braintree/successful_result.rb +1 -0
  14. data/lib/braintree/transaction/paypal_details.rb +2 -0
  15. data/lib/braintree/transaction_gateway.rb +2 -2
  16. data/lib/braintree/transaction_review.rb +18 -0
  17. data/lib/braintree/venmo_profile_data.rb +23 -0
  18. data/lib/braintree/version.rb +1 -1
  19. data/lib/braintree/webhook_notification.rb +14 -0
  20. data/lib/braintree/webhook_testing_gateway.rb +91 -17
  21. data/lib/braintree.rb +5 -0
  22. data/spec/integration/braintree/customer_spec.rb +27 -0
  23. data/spec/integration/braintree/merchant_account_spec.rb +3 -3
  24. data/spec/integration/braintree/payment_method_nonce_spec.rb +2 -1
  25. data/spec/integration/braintree/payment_method_spec.rb +27 -0
  26. data/spec/integration/braintree/plan_spec.rb +82 -0
  27. data/spec/integration/braintree/transaction_spec.rb +28 -0
  28. data/spec/unit/braintree/enriched_customer_data_spec.rb +32 -0
  29. data/spec/unit/braintree/http_spec.rb +2 -0
  30. data/spec/unit/braintree/local_payment_expired_spec.rb +24 -0
  31. data/spec/unit/braintree/local_payment_funded_spec.rb +34 -0
  32. data/spec/unit/braintree/payment_method_customer_data_updated_metadata_spec.rb +45 -0
  33. data/spec/unit/braintree/transaction/paypal_details_spec.rb +4 -0
  34. data/spec/unit/braintree/transaction_spec.rb +3 -3
  35. data/spec/unit/braintree/venmo_profile_data_spec.rb +32 -0
  36. data/spec/unit/braintree/webhook_notification_spec.rb +78 -1
  37. metadata +15 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b9382c924f47002feeb68618490bcaa17da29666dff9917252a54141b30a6f7
4
- data.tar.gz: 2744c9e6e6835a1213a89e35ce170efd74cf8bdab1b6b8d7f3c1a61bcc359b35
3
+ metadata.gz: 4d5f90896056b6236f7150b16b09322c9f32822b23bd4367140418f9506c8767
4
+ data.tar.gz: 948821597de9332dccd0ee502f3828b6e6d14253681fe42a8c5950d15fb71882
5
5
  SHA512:
6
- metadata.gz: d478c728fccb782500075966a9967918b2728b60925cf9e294da7447991c91a5898dfb1bdd46040f91f7a0c51f17fe8a795205adbbc1de97e6741c2cb18727e7
7
- data.tar.gz: fa5d2f84f33dd66a5049b99f4ea201cfb9787ce3686e6ef56921e9b3d3b25f080eac81b34ad042daa2445bc6090a33b3714d171a221d811a5858a8cd89bbf8d6
6
+ metadata.gz: 3f0d867f7795d6969fe315a78ee163f871d919fc611a9dcba22c259332fd2f1bb47c94676aad8f340ec4cb040ebe2d8f256d50704b9b586b5f4afb6cbf93199c
7
+ data.tar.gz: d2db07468b1b333986d61389cb60a16cde90db6168bd445a04a5f04621debdebd0cd334f9623ddc26ee85da546dc4efd1aea3751510d444c72c8e5a4b4771bf5
data/braintree.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  "bug_tracker_uri" => "https://github.com/braintree/braintree_ruby/issues",
19
19
  "changelog_uri" => "https://github.com/braintree/braintree_ruby/blob/master/CHANGELOG.md",
20
20
  "source_code_uri" => "https://github.com/braintree/braintree_ruby",
21
- "documentation_uri" => "https://developers.braintreepayments.com/"
21
+ "documentation_uri" => "https://developer.paypal.com/braintree/docs"
22
22
  }
23
23
  end
24
24
 
@@ -12,15 +12,24 @@ module Braintree
12
12
 
13
13
  attr_reader :bin
14
14
  attr_reader :card_type
15
+ attr_reader :commercial
16
+ attr_reader :country_of_issuance
15
17
  attr_reader :created_at
16
18
  attr_reader :customer_id
19
+ attr_reader :debit
17
20
  attr_reader :default
21
+ attr_reader :durbin_regulated
18
22
  attr_reader :expiration_month
19
23
  attr_reader :expiration_year
20
24
  attr_reader :expired
25
+ attr_reader :healthcare
21
26
  attr_reader :image_url
27
+ attr_reader :issuing_bank
22
28
  attr_reader :last_4
23
29
  attr_reader :payment_instrument_name
30
+ attr_reader :payroll
31
+ attr_reader :prepaid
32
+ attr_reader :product_id
24
33
  attr_reader :source_description
25
34
  attr_reader :subscriptions
26
35
  attr_reader :token
@@ -0,0 +1,21 @@
1
+ module Braintree
2
+ class EnrichedCustomerData
3
+ include BaseModule
4
+
5
+ attr_reader :fields_updated
6
+ attr_reader :profile_data
7
+
8
+ def initialize(attributes) # :nodoc:
9
+ set_instance_variables_from_hash(attributes)
10
+ @profile_data = VenmoProfileData._new(attributes[:profile_data])
11
+ end
12
+
13
+ class << self
14
+ protected :new
15
+ end
16
+
17
+ def self._new(*args) # :nodoc:
18
+ self.new(*args)
19
+ end
20
+ end
21
+ end
@@ -312,6 +312,7 @@ module Braintree
312
312
  DiscountAmountCannotBeNegative = "915160"
313
313
  DiscountAmountFormatIsInvalid = "915159"
314
314
  DiscountAmountIsTooLarge = "915161"
315
+ ExchangeRateQuoteIdTooLong = "915229"
315
316
  FailedAuthAdjustmentAllowRetry = "95603"
316
317
  FailedAuthAdjustmentHardDecline = "95602"
317
318
  FinalAuthSubmitForSettlementForDifferentAmount = "95601"
@@ -3,13 +3,22 @@ module Braintree
3
3
  include BaseModule # :nodoc:
4
4
 
5
5
  attr_reader :bin
6
+ attr_reader :commercial
7
+ attr_reader :country_of_issuance
6
8
  attr_reader :created_at
7
9
  attr_reader :customer_id
10
+ attr_reader :debit
8
11
  attr_reader :default
12
+ attr_reader :durbin_regulated
9
13
  attr_reader :expiration_month
10
14
  attr_reader :expiration_year
11
15
  attr_reader :google_transaction_id
16
+ attr_reader :healthcare
12
17
  attr_reader :image_url
18
+ attr_reader :issuing_bank
19
+ attr_reader :payroll
20
+ attr_reader :prepaid
21
+ attr_reader :product_id
13
22
  attr_reader :source_card_last_4
14
23
  attr_reader :source_card_type
15
24
  attr_reader :source_description
@@ -188,6 +188,7 @@ module Braintree
188
188
  formatted_xml = input_xml.gsub(/^/, "[Braintree] ")
189
189
  formatted_xml = formatted_xml.gsub(/<number>(.{6}).+?(.{4})<\/number>/m, '<number>\1******\2</number>')
190
190
  formatted_xml = formatted_xml.gsub(/<cvv>.+?<\/cvv>/m, "<cvv>***</cvv>")
191
+ formatted_xml = formatted_xml.gsub(/<encrypted-card-data>.+?<\/encrypted-card-data>/m, "<encrypted-card-data>***</encrypted-card-data>")
191
192
  formatted_xml
192
193
  end
193
194
 
@@ -0,0 +1,21 @@
1
+ module Braintree
2
+ class LocalPaymentExpired
3
+ include BaseModule
4
+
5
+ attr_reader :payment_id
6
+ attr_reader :payment_context_id
7
+
8
+ def initialize(attributes) # :nodoc:
9
+ set_instance_variables_from_hash(attributes)
10
+ end
11
+
12
+ class << self
13
+ protected :new
14
+ end
15
+
16
+ def self._new(*args) # :nodoc:
17
+ self.new(*args)
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,22 @@
1
+ module Braintree
2
+ class LocalPaymentFunded
3
+ include BaseModule
4
+
5
+ attr_reader :payment_id
6
+ attr_reader :payment_context_id
7
+ attr_reader :transaction
8
+
9
+ def initialize(attributes) # :nodoc:
10
+ set_instance_variables_from_hash(attributes)
11
+ @transaction = Transaction._new(Configuration.gateway, transaction)
12
+ end
13
+
14
+ class << self
15
+ protected :new
16
+ end
17
+
18
+ def self._new(*args) # :nodoc:
19
+ self.new(*args)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ module Braintree
2
+ class PaymentMethodCustomerDataUpdatedMetadata
3
+ include BaseModule
4
+
5
+ attr_reader :token
6
+ attr_reader :payment_method
7
+ attr_reader :datetime_updated
8
+ attr_reader :enriched_customer_data
9
+
10
+ def initialize(gateway, attributes) # :nodoc:
11
+ set_instance_variables_from_hash(attributes)
12
+ @payment_method = PaymentMethodParser.parse_payment_method(gateway, attributes[:payment_method])
13
+ @enriched_customer_data = EnrichedCustomerData._new(enriched_customer_data) if enriched_customer_data
14
+ end
15
+
16
+ class << self
17
+ protected :new
18
+ end
19
+
20
+ def self._new(*args) # :nodoc:
21
+ self.new(*args)
22
+ end
23
+ end
24
+ end
@@ -33,6 +33,26 @@ module Braintree
33
33
 
34
34
  class << self
35
35
  protected :new
36
+
37
+ def create(*args)
38
+ Configuration.gateway.plan.create(*args)
39
+ end
40
+
41
+ def create!(*args)
42
+ Configuration.gateway.plan.create!(*args)
43
+ end
44
+
45
+ def find(*args)
46
+ Configuration.gateway.plan.find(*args)
47
+ end
48
+
49
+ def update(*args)
50
+ Configuration.gateway.plan.update(*args)
51
+ end
52
+
53
+ def update!(*args)
54
+ Configuration.gateway.plan.update!(*args)
55
+ end
36
56
  end
37
57
 
38
58
  def self._new(*args)
@@ -1,5 +1,7 @@
1
1
  module Braintree
2
2
  class PlanGateway # :nodoc:
3
+ include BaseModule
4
+
3
5
  def initialize(gateway)
4
6
  @gateway = gateway
5
7
  @config = gateway.config
@@ -13,5 +15,103 @@ module Braintree
13
15
  Plan._new(@gateway, attributes)
14
16
  end
15
17
  end
18
+
19
+ def create(attributes)
20
+ Util.verify_keys(PlanGateway._create_signature, attributes)
21
+ _do_create "/plans", :plan => attributes
22
+ end
23
+
24
+ def create!(*args)
25
+ return_object_or_raise(:plan) { create(*args) }
26
+ end
27
+
28
+ def find(id)
29
+ raise ArgumentError if id.nil? || id.to_s.strip == ""
30
+ response = @config.http.get("#{@config.base_merchant_path}/plans/#{id}")
31
+ Plan._new(@gateway, response[:plan])
32
+ rescue NotFoundError
33
+ raise NotFoundError, "plan with id #{id.inspect} not found"
34
+ end
35
+
36
+ def update(plan_id, attributes)
37
+ Util.verify_keys(PlanGateway._update_signature, attributes)
38
+ response = @config.http.put("#{@config.base_merchant_path}/plans/#{plan_id}", :plan => attributes)
39
+ if response[:plan]
40
+ SuccessfulResult.new(:plan => Plan._new(@gateway, response[:plan]))
41
+ elsif response[:api_error_response]
42
+ ErrorResult.new(@gateway, response[:api_error_response])
43
+ else
44
+ raise UnexpectedError, "expected :plan or :api_error_response"
45
+ end
46
+ end
47
+
48
+ def update!(*args)
49
+ return_object_or_raise(:plan) { update(*args) }
50
+ end
51
+
52
+ def self._create_signature
53
+ [
54
+ :billing_day_of_month,
55
+ :billing_frequency,
56
+ :currency_iso_code,
57
+ :description,
58
+ :id,
59
+ :merchant_id,
60
+ :name,
61
+ :number_of_billing_cycles,
62
+ :price,
63
+ :trial_duration,
64
+ :trial_duration_unit,
65
+ :trial_period
66
+ ] + _add_on_discount_signature
67
+ end
68
+
69
+ def self._update_signature
70
+ [
71
+ :billing_day_of_month,
72
+ :billing_frequency,
73
+ :currency_iso_code,
74
+ :description,
75
+ :id,
76
+ :merchant_id,
77
+ :name,
78
+ :number_of_billing_cycles,
79
+ :price,
80
+ :trial_duration,
81
+ :trial_duration_unit,
82
+ :trial_period
83
+ ] + _add_on_discount_signature
84
+ end
85
+
86
+ def self._add_on_discount_signature
87
+ [
88
+ {
89
+ :add_ons => [
90
+ {:add => [:amount, :inherited_from_id, :never_expires, :number_of_billing_cycles, :quantity]},
91
+ {:update => [:amount, :existing_id, :never_expires, :number_of_billing_cycles, :quantity]},
92
+ {:remove => [:_any_key_]}
93
+ ]
94
+ },
95
+ {
96
+ :discounts => [
97
+ {:add => [:amount, :inherited_from_id, :never_expires, :number_of_billing_cycles, :quantity]},
98
+ {:update => [:amount, :existing_id, :never_expires, :number_of_billing_cycles, :quantity]},
99
+ {:remove => [:_any_key_]}
100
+ ]
101
+ }
102
+ ]
103
+ end
104
+
105
+ def _do_create(path, params) # :nodoc:
106
+ response = @config.http.post("#{@config.base_merchant_path}#{path}", params)
107
+ if response[:plan]
108
+ SuccessfulResult.new(:plan => Plan._new(@gateway, response[:plan]))
109
+ elsif response[:errors]
110
+ ErrorResult.new(@gateway, response[:errors])
111
+ else
112
+ raise UnexpectedError, "expected :plan or :errors"
113
+ end
114
+ end
16
115
  end
17
116
  end
117
+
@@ -16,6 +16,7 @@ module Braintree
16
16
  attr_reader :payment_method
17
17
  attr_reader :payment_method_nonce
18
18
  attr_reader :paypal_account
19
+ attr_reader :plan
19
20
  attr_reader :settlement_batch_summary
20
21
  attr_reader :subscription
21
22
  attr_reader :supported_networks
@@ -24,6 +24,8 @@ module Braintree
24
24
  attr_reader :refund_from_transaction_fee_currency_iso_code
25
25
  attr_reader :refund_id
26
26
  attr_reader :seller_protection_status
27
+ attr_reader :tax_id
28
+ attr_reader :tax_id_type
27
29
  attr_reader :token
28
30
  attr_reader :transaction_fee_amount
29
31
  attr_reader :transaction_fee_currency_iso_code
@@ -61,7 +61,7 @@ module Braintree
61
61
  end
62
62
 
63
63
  def find(id)
64
- raise ArgumentError if id.nil? || id.strip.to_s == ""
64
+ raise ArgumentError, "id can not be empty" if id.nil? || id.strip.to_s == ""
65
65
  response = @config.http.get("#{@config.base_merchant_path}/transactions/#{id}")
66
66
  Transaction._new(@gateway, response[:transaction])
67
67
  rescue NotFoundError
@@ -192,7 +192,7 @@ module Braintree
192
192
  :shared_shipping_address_id, :shipping_address_id, :shipping_amount,
193
193
  :ships_from_postal_code, :tax_amount, :tax_exempt, :three_d_secure_authentication_id,
194
194
  :three_d_secure_token, :transaction_source, :type, :venmo_sdk_payment_method_code,
195
- :sca_exemption, :currency_iso_code,
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
198
  {:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number, {:payment_reader_card_details => [:encrypted_card_data, :key_serial_number]}]},
@@ -0,0 +1,18 @@
1
+ module Braintree
2
+ class TransactionReview
3
+ include BaseModule
4
+
5
+ attr_reader :transaction_id, :decision, :reviewer_email, :reviewer_note, :reviewer_time
6
+
7
+ def initialize(attributes)
8
+ set_instance_variables_from_hash(attributes)
9
+ end
10
+
11
+ class << self
12
+ protected :new
13
+ def _new(*args) # :nodoc:
14
+ self.new(*args)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ module Braintree
2
+ class VenmoProfileData
3
+ include BaseModule
4
+
5
+ attr_reader :username
6
+ attr_reader :first_name
7
+ attr_reader :last_name
8
+ attr_reader :phone_number
9
+ attr_reader :email
10
+
11
+ def initialize(attributes) # :nodoc:
12
+ set_instance_variables_from_hash(attributes)
13
+ end
14
+
15
+ class << self
16
+ protected :new
17
+ end
18
+
19
+ def self._new(*args) # :nodoc:
20
+ self.new(*args)
21
+ end
22
+ end
23
+ end
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 4
4
- Minor = 2
4
+ Minor = 6
5
5
  Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
@@ -28,6 +28,8 @@ module Braintree
28
28
  GrantedPaymentMethodRevoked = "granted_payment_method_revoked"
29
29
 
30
30
  LocalPaymentCompleted = "local_payment_completed"
31
+ LocalPaymentExpired = "local_payment_expired"
32
+ LocalPaymentFunded = "local_payment_funded"
31
33
  LocalPaymentReversed = "local_payment_reversed"
32
34
 
33
35
  OAuthAccessRevoked = "oauth_access_revoked"
@@ -36,6 +38,8 @@ module Braintree
36
38
  PartnerMerchantDisconnected = "partner_merchant_disconnected"
37
39
  PartnerMerchantDeclined = "partner_merchant_declined"
38
40
 
41
+ PaymentMethodCustomerDataUpdated = "payment_method_customer_data_updated"
42
+
39
43
  PaymentMethodRevokedByCustomer = "payment_method_revoked_by_customer"
40
44
 
41
45
  RecipientUpdatedGrantedPaymentMethod = "recipient_updated_granted_payment_method"
@@ -52,6 +56,7 @@ module Braintree
52
56
  SubMerchantAccountDeclined = "sub_merchant_account_declined"
53
57
 
54
58
  TransactionDisbursed = "transaction_disbursed"
59
+ TransactionReviewed = "transaction_reviewed"
55
60
  TransactionSettlementDeclined = "transaction_settlement_declined"
56
61
  TransactionSettled = "transaction_settled"
57
62
  end
@@ -65,13 +70,17 @@ module Braintree
65
70
  attr_reader :revoked_payment_method_metadata
66
71
  attr_reader :kind
67
72
  attr_reader :local_payment_completed
73
+ attr_reader :local_payment_expired
74
+ attr_reader :local_payment_funded
68
75
  attr_reader :local_payment_reversed
69
76
  attr_reader :oauth_access_revocation
70
77
  attr_reader :partner_merchant
78
+ attr_reader :payment_method_customer_data_updated_metadata
71
79
  attr_reader :source_merchant_id
72
80
  attr_reader :subscription
73
81
  attr_reader :timestamp
74
82
  attr_reader :transaction
83
+ attr_reader :transaction_review
75
84
 
76
85
  def self.parse(*args)
77
86
  Configuration.gateway.webhook_notification.parse(*args)
@@ -90,6 +99,7 @@ module Braintree
90
99
  @oauth_access_revocation = OpenStruct.new(@subject[:oauth_application_revocation]) if @subject.has_key?(:oauth_application_revocation)
91
100
  @subscription = Subscription._new(gateway, @subject[:subscription]) if @subject.has_key?(:subscription)
92
101
  @transaction = Transaction._new(gateway, @subject[:transaction]) if @subject.has_key?(:transaction)
102
+ @transaction_review = OpenStruct.new(@subject[:transaction_review]) if @subject.has_key?(:transaction_review)
93
103
  @disbursement = Disbursement._new(gateway, @subject[:disbursement]) if @subject.has_key?(:disbursement)
94
104
  @dispute = Dispute._new(@subject[:dispute]) if @subject.has_key?(:dispute)
95
105
  @account_updater_daily_report = AccountUpdaterDailyReport._new(@subject[:account_updater_daily_report]) if @subject.has_key?(:account_updater_daily_report)
@@ -98,7 +108,11 @@ module Braintree
98
108
  @granted_payment_instrument_update = GrantedPaymentInstrumentUpdate._new(@subject[:granted_payment_instrument_update]) if @subject.has_key?(:granted_payment_instrument_update)
99
109
  @revoked_payment_method_metadata = RevokedPaymentMethodMetadata._new(gateway, @subject) if [Kind::GrantedPaymentInstrumentRevoked, Kind::PaymentMethodRevokedByCustomer, Kind::GrantedPaymentMethodRevoked].include?(@kind)
100
110
  @local_payment_completed = LocalPaymentCompleted._new(@subject[:local_payment]) if @subject.has_key?(:local_payment) && Kind::LocalPaymentCompleted == @kind
111
+ @local_payment_expired = LocalPaymentExpired._new(@subject[:local_payment_expired]) if @subject.has_key?(:local_payment_expired) && Kind::LocalPaymentExpired == @kind
112
+ @local_payment_funded = LocalPaymentFunded._new(@subject[:local_payment_funded]) if @subject.has_key?(:local_payment_funded) && Kind::LocalPaymentFunded == @kind
101
113
  @local_payment_reversed = LocalPaymentReversed._new(@subject[:local_payment_reversed]) if @subject.has_key?(:local_payment_reversed) && Kind::LocalPaymentReversed == @kind
114
+ @payment_method_customer_data_updated_metadata = PaymentMethodCustomerDataUpdatedMetadata._new(gateway, @subject[:payment_method_customer_data_updated_metadata]) if @subject.has_key?(:payment_method_customer_data_updated_metadata) && Kind::PaymentMethodCustomerDataUpdated == @kind
115
+
102
116
  end
103
117
 
104
118
  def merchant_account
@@ -60,6 +60,8 @@ module Braintree
60
60
  _merchant_account_declined_sample_xml(id)
61
61
  when Braintree::WebhookNotification::Kind::TransactionDisbursed
62
62
  _transaction_disbursed_sample_xml(id)
63
+ when Braintree::WebhookNotification::Kind::TransactionReviewed
64
+ _transaction_reviewed_sample_xml(id)
63
65
  when Braintree::WebhookNotification::Kind::TransactionSettled
64
66
  _transaction_settled_sample_xml(id)
65
67
  when Braintree::WebhookNotification::Kind::TransactionSettlementDeclined
@@ -88,8 +90,14 @@ module Braintree
88
90
  _payment_method_revoked_by_customer_sample_xml(id)
89
91
  when Braintree::WebhookNotification::Kind::LocalPaymentCompleted
90
92
  _local_payment_completed_sample_xml(id)
93
+ when Braintree::WebhookNotification::Kind::LocalPaymentExpired
94
+ _local_payment_expired_sample_xml
95
+ when Braintree::WebhookNotification::Kind::LocalPaymentFunded
96
+ _local_payment_funded_sample_xml(id)
91
97
  when Braintree::WebhookNotification::Kind::LocalPaymentReversed
92
- _local_payment_reversed_sample_xml(id)
98
+ _local_payment_reversed_sample_xml
99
+ when Braintree::WebhookNotification::Kind::PaymentMethodCustomerDataUpdated
100
+ _payment_method_customer_data_updated_sample_xml(id)
93
101
  else
94
102
  _subscription_sample_xml(id)
95
103
  end
@@ -244,6 +252,19 @@ module Braintree
244
252
  XML
245
253
  end
246
254
 
255
+ def _transaction_reviewed_sample_xml(id)
256
+
257
+ <<-XML
258
+ <transaction-review>
259
+ <transaction-id>my_id</transaction-id>
260
+ <decision>decision</decision>
261
+ <reviewer-email>hey@girl.com</reviewer-email>
262
+ <reviewer-note>i reviewed this</reviewer-note>
263
+ <reviewed-time type="datetime">2017-06-16T20:44:41Z</reviewed-time>
264
+ </transaction-review>
265
+ XML
266
+ end
267
+
247
268
  def _transaction_settled_sample_xml(id)
248
269
  <<-XML
249
270
  <transaction>
@@ -880,21 +901,7 @@ module Braintree
880
901
  end
881
902
 
882
903
  def _granted_payment_method_revoked_xml(id)
883
- <<-XML
884
- <venmo-account>
885
- <created-at type='dateTime'>2018-10-11T21:28:37Z</created-at>
886
- <updated-at type='dateTime'>2018-10-11T21:28:37Z</updated-at>
887
- <default type='boolean'>true</default>
888
- <image-url>https://assets.braintreegateway.com/payment_method_logo/venmo.png?environment=test</image-url>
889
- <token>#{id}</token>
890
- <source-description>Venmo Account: venmojoe</source-description>
891
- <username>venmojoe</username>
892
- <venmo-user-id>456</venmo-user-id>
893
- <subscriptions type='array'/>
894
- <customer-id>venmo_customer_id</customer-id>
895
- <global-id>cGF5bWVudG1ldGhvZF92ZW5tb2FjY291bnQ</global-id>
896
- </venmo-account>
897
- XML
904
+ _venmo_account_xml(id)
898
905
  end
899
906
 
900
907
  def _payment_method_revoked_by_customer_sample_xml(id)
@@ -935,12 +942,79 @@ module Braintree
935
942
  XML
936
943
  end
937
944
 
938
- def _local_payment_reversed_sample_xml(id)
945
+ def _local_payment_expired_sample_xml
946
+ <<-XML
947
+ <local-payment-expired>
948
+ <payment-id>PAY-XYZ123</payment-id>
949
+ <payment-context-id>cG5b=</payment-context-id>
950
+ </local-payment-expired>
951
+ XML
952
+ end
953
+
954
+ def _local_payment_funded_sample_xml(id)
955
+ <<-XML
956
+ <local-payment-funded>
957
+ <payment-id>PAY-XYZ123</payment-id>
958
+ <payment-context-id>cG5b=</payment-context-id>
959
+ <transaction>
960
+ <id>#{id}</id>
961
+ <status>settled</status>
962
+ <amount>49.99</amount>
963
+ <order-id>order4567</order-id>
964
+ </transaction>
965
+ </local-payment-funded>
966
+ XML
967
+ end
968
+
969
+ def _local_payment_reversed_sample_xml
939
970
  <<-XML
940
971
  <local-payment-reversed>
941
972
  <payment-id>PAY-XYZ123</payment-id>
973
+ <payment-context-id>cG5b=</payment-context-id>
942
974
  </local-payment-reversed>
943
975
  XML
944
976
  end
977
+
978
+ def _payment_method_customer_data_updated_sample_xml(id)
979
+ <<-XML
980
+ <payment-method-customer-data-updated-metadata>
981
+ <token>TOKEN-12345</token>
982
+ <payment-method>
983
+ #{_venmo_account_xml(id)}
984
+ </payment-method>
985
+ <datetime-updated type='dateTime'>2022-01-01T21:28:37Z</datetime-updated>
986
+ <enriched-customer-data>
987
+ <fields-updated type='array'>
988
+ <item>username</item>
989
+ </fields-updated>
990
+ <profile-data>
991
+ <username>venmo_username</username>
992
+ <first-name>John</first-name>
993
+ <last-name>Doe</last-name>
994
+ <phone-number>1231231234</phone-number>
995
+ <email>john.doe@paypal.com</email>
996
+ </profile-data>
997
+ </enriched-customer-data>
998
+ </payment-method-customer-data-updated-metadata>
999
+ XML
1000
+ end
1001
+
1002
+ def _venmo_account_xml(id)
1003
+ <<-XML
1004
+ <venmo-account>
1005
+ <created-at type='dateTime'>2018-10-11T21:28:37Z</created-at>
1006
+ <updated-at type='dateTime'>2018-10-11T21:28:37Z</updated-at>
1007
+ <default type='boolean'>true</default>
1008
+ <image-url>https://assets.braintreegateway.com/payment_method_logo/venmo.png?environment=test</image-url>
1009
+ <token>#{id}</token>
1010
+ <source-description>Venmo Account: venmojoe</source-description>
1011
+ <username>venmojoe</username>
1012
+ <venmo-user-id>456</venmo-user-id>
1013
+ <subscriptions type='array'/>
1014
+ <customer-id>venmo_customer_id</customer-id>
1015
+ <global-id>cGF5bWVudG1ldGhvZF92ZW5tb2FjY291bnQ</global-id>
1016
+ </venmo-account>
1017
+ XML
1018
+ end
945
1019
  end
946
1020
  end
data/lib/braintree.rb CHANGED
@@ -65,6 +65,7 @@ require "braintree/dispute/transaction"
65
65
  require "braintree/dispute/transaction_details"
66
66
  require "braintree/document_upload"
67
67
  require "braintree/document_upload_gateway"
68
+ require "braintree/enriched_customer_data"
68
69
  require "braintree/error_codes"
69
70
  require "braintree/error_result"
70
71
  require "braintree/errors"
@@ -73,6 +74,8 @@ require "braintree/graphql_client"
73
74
  require "braintree/google_pay_card"
74
75
  require "braintree/local_payment_completed"
75
76
  require "braintree/local_payment_reversed"
77
+ require "braintree/local_payment_expired"
78
+ require "braintree/local_payment_funded"
76
79
  require "braintree/transaction/local_payment_details"
77
80
  require "braintree/merchant"
78
81
  require "braintree/merchant_gateway"
@@ -86,6 +89,7 @@ require "braintree/oauth_gateway"
86
89
  require "braintree/oauth_credentials"
87
90
  require "braintree/payment_instrument_type"
88
91
  require "braintree/payment_method"
92
+ require "braintree/payment_method_customer_data_updated_metadata"
89
93
  require "braintree/payment_method_gateway"
90
94
  require "braintree/payment_method_nonce"
91
95
  require "braintree/payment_method_nonce_details"
@@ -153,6 +157,7 @@ require "braintree/dispute_search"
153
157
  require "braintree/validation_error"
154
158
  require "braintree/validation_error_collection"
155
159
  require "braintree/venmo_account"
160
+ require "braintree/venmo_profile_data"
156
161
  require "braintree/version"
157
162
  require "braintree/visa_checkout_card"
158
163
  require "braintree/samsung_pay_card"