braintree 2.67.0 → 2.68.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d6db2c62056e32d2ef6c7060ce28324b008a7696
4
+ data.tar.gz: f5327389fcb1427621298edabf956b991596db2e
5
+ SHA512:
6
+ metadata.gz: dd2988502a41934d4701474d03b846762833aa7028a78ec8b48ead61b637fab6d07da6670955d87b6f76b61915b18752d50989edbe3839e743dfea4e23cb65e1
7
+ data.tar.gz: 5bdfb66f715f35c0c70fe6038aa2d0d7e93598b9bfaffd382dd067a0820e8ad92dcce3925ee9fd7b7243b3e4d14ceb21920ddbeae32d9009bc9245337822bf08
@@ -2,6 +2,9 @@
2
2
 
3
3
  The Braintree gem provides integration access to the Braintree Gateway.
4
4
 
5
+ = Please Note
6
+ <b>The Payment Card Industry (PCI) Council has {mandated}[http://blog.pcisecuritystandards.org/migrating-from-ssl-and-early-tls] that early versions of TLS be retired from service. All organizations that handle credit card information are required to comply with this standard. As part of this obligation, Braintree is updating its services to require TLS 1.2 for all HTTPS connections. Braintree will also require HTTP/1.1 for all connections. Please see our {technical documentation}[https://github.com/paypal/tls-update] for more information.</b>
7
+
5
8
  == Dependencies
6
9
 
7
10
  * builder
@@ -81,6 +81,9 @@ require "braintree/settlement_batch_summary_gateway"
81
81
  require "braintree/resource_collection"
82
82
  require "braintree/europe_bank_account"
83
83
  require "braintree/europe_bank_account_gateway"
84
+ require "braintree/us_bank_account"
85
+ require "braintree/us_bank_account_gateway"
86
+ require "braintree/transaction/us_bank_account_details"
84
87
  require "braintree/sha256_digest"
85
88
  require "braintree/signature_service"
86
89
  require "braintree/subscription"
@@ -56,6 +56,10 @@ module Braintree
56
56
  PayPalAccountGateway.new(self)
57
57
  end
58
58
 
59
+ def us_bank_account
60
+ UsBankAccountGateway.new(self)
61
+ end
62
+
59
63
  def merchant
60
64
  MerchantGateway.new(self)
61
65
  end
@@ -19,6 +19,8 @@ module Braintree
19
19
  SuccessfulResult.new(:payment_method => PayPalAccount._new(@gateway, response[:paypal_account]))
20
20
  elsif response[:coinbase_account]
21
21
  SuccessfulResult.new(:payment_method => CoinbaseAccount._new(@gateway, response[:coinbase_account]))
22
+ elsif response[:us_bank_account]
23
+ SuccessfulResult.new(:payment_method => UsBankAccount._new(@gateway, response[:us_bank_account]))
22
24
  elsif response[:europe_bank_account]
23
25
  SuccessfulResult.new(:payment_method => EuropeBankAccount._new(@gateway, response[:europe_bank_account]))
24
26
  elsif response[:apple_pay_card]
@@ -122,6 +122,7 @@ module Braintree
122
122
  attr_reader :risk_data
123
123
  attr_reader :facilitator_details
124
124
  attr_reader :three_d_secure_info
125
+ attr_reader :us_bank_account_details
125
126
 
126
127
  def self.create(attributes)
127
128
  Configuration.gateway.transaction.create(attributes)
@@ -267,6 +268,7 @@ module Braintree
267
268
  @risk_data = RiskData.new(attributes[:risk_data]) if attributes[:risk_data]
268
269
  @facilitator_details = FacilitatorDetails.new(attributes[:facilitator_details]) if attributes[:facilitator_details]
269
270
  @three_d_secure_info = ThreeDSecureInfo.new(attributes[:three_d_secure_info]) if attributes[:three_d_secure_info]
271
+ @us_bank_account_details = UsBankAccountDetails.new(attributes[:us_bank_account]) if attributes[:us_bank_account]
270
272
  end
271
273
 
272
274
  # True if <tt>other</tt> is a Braintree::Transaction with the same id.
@@ -0,0 +1,13 @@
1
+ module Braintree
2
+ class Transaction
3
+ class UsBankAccountDetails # :nodoc:
4
+ include BaseModule
5
+
6
+ attr_reader :routing_number, :last_4, :account_type, :account_description, :account_holder_name, :token, :image_url
7
+
8
+ def initialize(attributes)
9
+ set_instance_variables_from_hash attributes unless attributes.nil?
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,36 @@
1
+ module Braintree
2
+ class UsBankAccount
3
+ include BaseModule
4
+
5
+ attr_reader :routing_number, :last_4, :account_type, :account_description, :account_holder_name, :token, :image_url
6
+
7
+ def initialize(gateway, attributes) # :nodoc:
8
+ @gateway = gateway
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
+
20
+ def self.find(token)
21
+ Configuration.gateway.us_bank_account.find(token)
22
+ end
23
+
24
+ def self.sale(token, transaction_attributes)
25
+ Configuration.gateway.transaction.sale(transaction_attributes.merge(
26
+ :payment_method_token => token,
27
+ :options => { :submit_for_settlement => true }
28
+ )
29
+ )
30
+ end
31
+
32
+ def self.sale!(token, transaction_attributes)
33
+ return_object_or_raise(:transaction) { sale(token, transaction_attributes) }
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ module Braintree
2
+ class UsBankAccountGateway
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/us_bank_account/#{token}")
12
+ UsBankAccount._new(@gateway, response[:us_bank_account])
13
+ rescue NotFoundError
14
+ raise NotFoundError, "payment method with token #{token.inspect} not found"
15
+ end
16
+
17
+ end
18
+ end
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 2
4
- Minor = 67
4
+ Minor = 68
5
5
  Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
@@ -25,6 +25,8 @@ module Braintree
25
25
  SubMerchantAccountApproved = "sub_merchant_account_approved"
26
26
  SubMerchantAccountDeclined = "sub_merchant_account_declined"
27
27
  TransactionDisbursed = "transaction_disbursed"
28
+ TransactionSettlementDeclined = "transaction_settlement_declined"
29
+ TransactionSettled = "transaction_settled"
28
30
  PartnerMerchantConnected = "partner_merchant_connected"
29
31
  PartnerMerchantDisconnected = "partner_merchant_disconnected"
30
32
  PartnerMerchantDeclined = "partner_merchant_declined"
@@ -47,6 +47,10 @@ module Braintree
47
47
  _merchant_account_declined_sample_xml(id)
48
48
  when Braintree::WebhookNotification::Kind::TransactionDisbursed
49
49
  _transaction_disbursed_sample_xml(id)
50
+ when Braintree::WebhookNotification::Kind::TransactionSettled
51
+ _transaction_settled_sample_xml(id)
52
+ when Braintree::WebhookNotification::Kind::TransactionSettlementDeclined
53
+ _transaction_settlement_declined_sample_xml(id)
50
54
  when Braintree::WebhookNotification::Kind::DisbursementException
51
55
  _disbursement_exception_sample_xml(id)
52
56
  when Braintree::WebhookNotification::Kind::Disbursement
@@ -188,6 +192,48 @@ module Braintree
188
192
  XML
189
193
  end
190
194
 
195
+ def _transaction_settled_sample_xml(id)
196
+ <<-XML
197
+ <transaction>
198
+ <id>#{id}</id>
199
+ <status>settled</status>
200
+ <type>sale</type>
201
+ <currency-iso-code>USD</currency-iso-code>
202
+ <amount>100.00</amount>
203
+ <merchant-account-id>ogaotkivejpfayqfeaimuktty</merchant-account-id>
204
+ <payment-instrument-type>us_bank_account</payment-instrument-type>
205
+ <us-bank-account>
206
+ <routing-number>123456789</routing-number>
207
+ <last-4>1234</last-4>
208
+ <account-type>checking</account-type>
209
+ <account-description>PayPal Checking - 1234</account-description>
210
+ <account-holder-name>Dan Schulman</account-holder-name>
211
+ </us-bank-account>
212
+ </transaction>
213
+ XML
214
+ end
215
+
216
+ def _transaction_settlement_declined_sample_xml(id)
217
+ <<-XML
218
+ <transaction>
219
+ <id>#{id}</id>
220
+ <status>settlement_declined</status>
221
+ <type>sale</type>
222
+ <currency-iso-code>USD</currency-iso-code>
223
+ <amount>100.00</amount>
224
+ <merchant-account-id>ogaotkivejpfayqfeaimuktty</merchant-account-id>
225
+ <payment-instrument-type>us_bank_account</payment-instrument-type>
226
+ <us-bank-account>
227
+ <routing-number>123456789</routing-number>
228
+ <last-4>1234</last-4>
229
+ <account-type>checking</account-type>
230
+ <account-description>PayPal Checking - 1234</account-description>
231
+ <account-holder-name>Dan Schulman</account-holder-name>
232
+ </us-bank-account>
233
+ </transaction>
234
+ XML
235
+ end
236
+
191
237
  def _dispute_opened_sample_xml(id)
192
238
 
193
239
  <<-XML
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ access_token="integratexxxxxx_xxxxxx_xxxxxx_xxxxxx_xx1"
5
+
6
+ params="{
7
+ \"type\": \"us_bank_account\",
8
+ \"billing_address\": {
9
+ \"street_address\": \"123 Ave\",
10
+ \"region\": \"CA\",
11
+ \"locality\": \"San Francisco\",
12
+ \"postal_code\": \"94112\"
13
+ },
14
+ \"routing_number\": \"123456789\",
15
+ \"account_number\": \"567891234\",
16
+ \"account_type\": \"checking\",
17
+ \"account_holder_name\": \"Dan Schulman\",
18
+ \"account_description\": \"PayPal Checking - 1234\",
19
+ \"ach_mandate\": {
20
+ \"text\": \"\"
21
+ }
22
+ }"
23
+
24
+ output=`curl -s -H "Content-type: application/json"\
25
+ -H "Braintree-Version: 2015-11-01"\
26
+ -H "Authorization: Bearer $access_token"\
27
+ -d "$params"\
28
+ -XPost "https://atmosphere-qa-us-west-2.dev.cosmos.braintreepayments.com/tokens"`
29
+
30
+ token=$(echo $output | ruby -e 'require "json";input=JSON.parse(STDIN.read);puts(input["data"]["id"])')
31
+ echo $token
32
+
@@ -1 +1 @@
1
- 32475
1
+ 15168
@@ -1,5 +1,6 @@
1
1
  require 'json'
2
2
 
3
+
3
4
  def decode_client_token(raw_client_token)
4
5
  decoded_client_token_string = Base64.decode64(raw_client_token)
5
6
  JSON.parse(decoded_client_token_string)
@@ -55,6 +56,22 @@ def nonce_for_paypal_account(paypal_account_details)
55
56
  body["paypalAccounts"][0]["nonce"]
56
57
  end
57
58
 
59
+ def generate_valid_us_bank_account_nonce
60
+ out = `./spec/client.sh`
61
+ out.strip
62
+ end
63
+
64
+ def sample(arr)
65
+ 6.times.map { arr[rand(arr.length)] }.join
66
+ end
67
+
68
+ def generate_invalid_us_bank_account_nonce
69
+ nonce_characters = "bcdfghjkmnpqrstvwxyz23456789".chars.to_a
70
+ nonce = "tokenusbankacct_"
71
+ nonce += 4.times.map { sample(nonce_characters) }.join("_")
72
+ nonce += "_xxx"
73
+ end
74
+
58
75
  class ClientApiHttp
59
76
  attr_reader :config, :options
60
77
 
@@ -481,6 +481,36 @@ describe Braintree::PaymentMethod do
481
481
  found_credit_card.billing_address.street_address.should == "456 Xyz Way"
482
482
  end
483
483
 
484
+ context "us bank account" do
485
+ it "creates a payment method from a us bank account nonce" do
486
+ customer = Braintree::Customer.create.customer
487
+ result = Braintree::PaymentMethod.create(
488
+ :payment_method_nonce => generate_valid_us_bank_account_nonce,
489
+ :customer_id => customer.id
490
+ )
491
+
492
+ result.should be_success
493
+ us_bank_account = result.payment_method
494
+ us_bank_account.should be_a(Braintree::UsBankAccount)
495
+ us_bank_account.routing_number.should == "123456789"
496
+ us_bank_account.last_4.should == "1234"
497
+ us_bank_account.account_type.should == "checking"
498
+ us_bank_account.account_description.should == "PayPal Checking - 1234"
499
+ us_bank_account.account_holder_name.should == "Dan Schulman"
500
+ end
501
+
502
+ it "does not creates a payment method from an invalid us bank account nonce" do
503
+ customer = Braintree::Customer.create.customer
504
+ result = Braintree::PaymentMethod.create(
505
+ :payment_method_nonce => generate_invalid_us_bank_account_nonce,
506
+ :customer_id => customer.id
507
+ )
508
+
509
+ result.should_not be_success
510
+ result.errors.for(:payment_method).on(:payment_method_nonce)[0].code.should == Braintree::ErrorCodes::PaymentMethod::PaymentMethodNonceUnknown
511
+ end
512
+ end
513
+
484
514
  context "paypal" do
485
515
  it "creates a payment method from an unvalidated future paypal account nonce" do
486
516
  nonce = nonce_for_paypal_account(:consent_code => "PAYPAL_CONSENT_CODE")
@@ -2103,6 +2103,89 @@ describe Braintree::Transaction do
2103
2103
  end
2104
2104
  end
2105
2105
  end
2106
+
2107
+ context "us bank account nonce" do
2108
+ let!(:valid_nonce) { generate_valid_us_bank_account_nonce }
2109
+ let!(:invalid_nonce) { generate_invalid_us_bank_account_nonce }
2110
+ it "returns a successful result for tansacting on a us bank account nonce" do
2111
+ result = Braintree::Transaction.create(
2112
+ :type => "sale",
2113
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2114
+ :merchant_account_id => "us_bank_merchant_account",
2115
+ :payment_method_nonce => valid_nonce,
2116
+ :options => {
2117
+ :submit_for_settlement => true,
2118
+ }
2119
+ )
2120
+ result.success?.should == true
2121
+ result.transaction.id.should =~ /^\w{6,}$/
2122
+ result.transaction.type.should == "sale"
2123
+ result.transaction.amount.should == BigDecimal.new(Braintree::Test::TransactionAmounts::Authorize)
2124
+ result.transaction.status.should == Braintree::Transaction::Status::SettlementPending
2125
+ result.transaction.us_bank_account_details.routing_number.should == "123456789"
2126
+ result.transaction.us_bank_account_details.last_4.should == "1234"
2127
+ result.transaction.us_bank_account_details.account_type.should == "checking"
2128
+ result.transaction.us_bank_account_details.account_description.should == "PayPal Checking - 1234"
2129
+ result.transaction.us_bank_account_details.account_holder_name.should == "Dan Schulman"
2130
+ end
2131
+
2132
+ it "return successful result for vaulting and transacting on vaulted token" do
2133
+ result = Braintree::Transaction.create(
2134
+ :type => "sale",
2135
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2136
+ :merchant_account_id => "us_bank_merchant_account",
2137
+ :payment_method_nonce => valid_nonce,
2138
+ :options => {
2139
+ :submit_for_settlement => true,
2140
+ :store_in_vault => true,
2141
+ }
2142
+ )
2143
+ result.success?.should == true
2144
+ result.transaction.id.should =~ /^\w{6,}$/
2145
+ result.transaction.type.should == "sale"
2146
+ result.transaction.amount.should == BigDecimal.new(Braintree::Test::TransactionAmounts::Authorize)
2147
+ result.transaction.status.should == Braintree::Transaction::Status::SettlementPending
2148
+ result.transaction.us_bank_account_details.routing_number.should == "123456789"
2149
+ result.transaction.us_bank_account_details.last_4.should == "1234"
2150
+ result.transaction.us_bank_account_details.account_type.should == "checking"
2151
+ result.transaction.us_bank_account_details.account_description.should == "PayPal Checking - 1234"
2152
+ result.transaction.us_bank_account_details.account_holder_name.should == "Dan Schulman"
2153
+
2154
+ result = Braintree::Transaction.create(
2155
+ :type => "sale",
2156
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2157
+ :merchant_account_id => "us_bank_merchant_account",
2158
+ :payment_method_token=> result.transaction.us_bank_account_details.token,
2159
+ :options => {
2160
+ :submit_for_settlement => true,
2161
+ }
2162
+ )
2163
+ result.success?.should == true
2164
+ result.transaction.id.should =~ /^\w{6,}$/
2165
+ result.transaction.type.should == "sale"
2166
+ result.transaction.amount.should == BigDecimal.new(Braintree::Test::TransactionAmounts::Authorize)
2167
+ result.transaction.status.should == Braintree::Transaction::Status::SettlementPending
2168
+ result.transaction.us_bank_account_details.routing_number.should == "123456789"
2169
+ result.transaction.us_bank_account_details.last_4.should == "1234"
2170
+ result.transaction.us_bank_account_details.account_type.should == "checking"
2171
+ result.transaction.us_bank_account_details.account_description.should == "PayPal Checking - 1234"
2172
+ result.transaction.us_bank_account_details.account_holder_name.should == "Dan Schulman"
2173
+ end
2174
+
2175
+ it "returns failure for token that doesn't exist" do
2176
+ result = Braintree::Transaction.create(
2177
+ :type => "sale",
2178
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2179
+ :merchant_account_id => "us_bank_merchant_account",
2180
+ :payment_method_nonce => invalid_nonce,
2181
+ :options => {
2182
+ :submit_for_settlement => true,
2183
+ }
2184
+ )
2185
+ result.success?.should == false
2186
+ result.errors.for(:transaction).on(:payment_method_nonce)[0].code.should == Braintree::ErrorCodes::Transaction::PaymentMethodNonceUnknown
2187
+ end
2188
+ end
2106
2189
  end
2107
2190
 
2108
2191
  describe "self.create!" do
@@ -0,0 +1,86 @@
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::UsBankAccount do
5
+ describe "self.find" do
6
+ it "returns a UsBankAccount" do
7
+ customer = Braintree::Customer.create!
8
+ nonce = generate_valid_us_bank_account_nonce
9
+
10
+ result = Braintree::PaymentMethod.create(
11
+ :payment_method_nonce => nonce,
12
+ :customer_id => customer.id
13
+ )
14
+ result.should be_success
15
+
16
+ us_bank_account = Braintree::UsBankAccount.find(result.payment_method.token)
17
+ us_bank_account.should be_a(Braintree::UsBankAccount)
18
+ us_bank_account.routing_number.should == "123456789"
19
+ us_bank_account.last_4.should == "1234"
20
+ us_bank_account.account_type.should == "checking"
21
+ us_bank_account.account_description.should == "PayPal Checking - 1234"
22
+ us_bank_account.account_holder_name.should == "Dan Schulman"
23
+ end
24
+
25
+ it "raises if the payment method token is not found" do
26
+ expect do
27
+ Braintree::UsBankAccount.find(generate_invalid_us_bank_account_nonce)
28
+ end.to raise_error(Braintree::NotFoundError)
29
+ end
30
+ end
31
+
32
+ context "self.sale" do
33
+ it "creates a transaction using a us bank account and returns a result object" do
34
+ customer = Braintree::Customer.create!
35
+ nonce = generate_valid_us_bank_account_nonce
36
+
37
+ result = Braintree::PaymentMethod.create(
38
+ :payment_method_nonce => nonce,
39
+ :customer_id => customer.id
40
+ )
41
+ result.should be_success
42
+
43
+ result = Braintree::UsBankAccount.sale(result.payment_method.token, :merchant_account_id => "us_bank_merchant_account", :amount => "100.00")
44
+
45
+ result.success?.should == true
46
+ result.transaction.amount.should == BigDecimal.new("100.00")
47
+ result.transaction.type.should == "sale"
48
+ us_bank_account = result.transaction.us_bank_account_details
49
+ us_bank_account.routing_number.should == "123456789"
50
+ us_bank_account.last_4.should == "1234"
51
+ us_bank_account.account_type.should == "checking"
52
+ us_bank_account.account_description.should == "PayPal Checking - 1234"
53
+ us_bank_account.account_holder_name.should == "Dan Schulman"
54
+ end
55
+ end
56
+
57
+ context "self.sale!" do
58
+ it "creates a transaction using a us bank account and returns a result object" do
59
+ customer = Braintree::Customer.create!
60
+ nonce = generate_valid_us_bank_account_nonce
61
+
62
+ result = Braintree::PaymentMethod.create(
63
+ :payment_method_nonce => nonce,
64
+ :customer_id => customer.id
65
+ )
66
+ result.should be_success
67
+
68
+ transaction = Braintree::UsBankAccount.sale!(result.payment_method.token, :merchant_account_id => "us_bank_merchant_account", :amount => "100.00")
69
+
70
+ transaction.amount.should == BigDecimal.new("100.00")
71
+ transaction.type.should == "sale"
72
+ us_bank_account = transaction.us_bank_account_details
73
+ us_bank_account.routing_number.should == "123456789"
74
+ us_bank_account.last_4.should == "1234"
75
+ us_bank_account.account_type.should == "checking"
76
+ us_bank_account.account_description.should == "PayPal Checking - 1234"
77
+ us_bank_account.account_holder_name.should == "Dan Schulman"
78
+ end
79
+
80
+ it "does not creates a transaction using a us bank account and returns raises an exception" do
81
+ expect do
82
+ Braintree::UsBankAccount.sale!(generate_invalid_us_bank_account_nonce, :merchant_account_id => "us_bank_merchant_account", :amount => "100.00")
83
+ end.to raise_error(Braintree::ValidationsFailed)
84
+ end
85
+ end
86
+ end
@@ -39,6 +39,7 @@ unless defined?(SPEC_HELPER_LOADED)
39
39
  ThreeDSecureMerchantAccountId = "three_d_secure_merchant_account"
40
40
  FakeAmexDirectMerchantAccountId = "fake_amex_direct_usd"
41
41
  FakeVenmoAccountMerchantAccountId = "fake_first_data_venmo_account"
42
+ UsBankMerhantAccountId = "us_bank_merchant_account"
42
43
 
43
44
  TrialPlan = {
44
45
  :description => "Plan for integration tests -- with trial",
@@ -166,6 +166,44 @@ describe Braintree::WebhookNotification do
166
166
  end
167
167
  end
168
168
 
169
+ context "us bank account transactions" do
170
+ it "builds a sample notification for a settlement webhook" do
171
+ sample_notification = Braintree::WebhookTesting.sample_notification(
172
+ Braintree::WebhookNotification::Kind::TransactionSettled,
173
+ "my_id"
174
+ )
175
+
176
+ notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
177
+
178
+ notification.kind.should == Braintree::WebhookNotification::Kind::TransactionSettled
179
+
180
+ notification.transaction.status.should == "settled"
181
+ notification.transaction.us_bank_account_details.account_description.should == "PayPal Checking - 1234"
182
+ notification.transaction.us_bank_account_details.account_type.should == "checking"
183
+ notification.transaction.us_bank_account_details.account_holder_name.should == "Dan Schulman"
184
+ notification.transaction.us_bank_account_details.routing_number.should == "123456789"
185
+ notification.transaction.us_bank_account_details.last_4.should == "1234"
186
+ end
187
+
188
+ it "builds a sample notification for a settlement declined webhook" do
189
+ sample_notification = Braintree::WebhookTesting.sample_notification(
190
+ Braintree::WebhookNotification::Kind::TransactionSettlementDeclined,
191
+ "my_id"
192
+ )
193
+
194
+ notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
195
+
196
+ notification.kind.should == Braintree::WebhookNotification::Kind::TransactionSettlementDeclined
197
+
198
+ notification.transaction.status.should == "settlement_declined"
199
+ notification.transaction.us_bank_account_details.account_description.should == "PayPal Checking - 1234"
200
+ notification.transaction.us_bank_account_details.account_type.should == "checking"
201
+ notification.transaction.us_bank_account_details.account_holder_name.should == "Dan Schulman"
202
+ notification.transaction.us_bank_account_details.routing_number.should == "123456789"
203
+ notification.transaction.us_bank_account_details.last_4.should == "1234"
204
+ end
205
+ end
206
+
169
207
  context "merchant account" do
170
208
  it "builds a sample notification for a merchant account approved webhook" do
171
209
  sample_notification = Braintree::WebhookTesting.sample_notification(
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: braintree
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.67.0
5
- prerelease:
4
+ version: 2.68.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Braintree
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2016-10-04 00:00:00.000000000 Z
11
+ date: 2016-10-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: builder
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: 2.0.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 2.0.0
30
27
  description: Ruby library for integrating with the Braintree Gateway
@@ -33,231 +30,235 @@ executables: []
33
30
  extensions: []
34
31
  extra_rdoc_files: []
35
32
  files:
36
- - README.rdoc
37
33
  - LICENSE
38
- - lib/braintree/transaction_gateway.rb
39
- - lib/braintree/settlement_batch_summary.rb
34
+ - README.rdoc
35
+ - braintree.gemspec
36
+ - lib/braintree.rb
37
+ - lib/braintree/account_updater_daily_report.rb
40
38
  - lib/braintree/add_on.rb
41
- - lib/braintree/sha256_digest.rb
39
+ - lib/braintree/add_on_gateway.rb
40
+ - lib/braintree/address.rb
41
+ - lib/braintree/address/country_names.rb
42
+ - lib/braintree/address_gateway.rb
43
+ - lib/braintree/advanced_search.rb
44
+ - lib/braintree/amex_express_checkout_card.rb
45
+ - lib/braintree/android_pay_card.rb
46
+ - lib/braintree/apple_pay_card.rb
47
+ - lib/braintree/base_module.rb
48
+ - lib/braintree/client_token.rb
49
+ - lib/braintree/client_token_gateway.rb
50
+ - lib/braintree/coinbase_account.rb
51
+ - lib/braintree/configuration.rb
52
+ - lib/braintree/credentials_parser.rb
53
+ - lib/braintree/credit_card.rb
54
+ - lib/braintree/credit_card_gateway.rb
55
+ - lib/braintree/credit_card_verification.rb
56
+ - lib/braintree/credit_card_verification_gateway.rb
57
+ - lib/braintree/credit_card_verification_search.rb
58
+ - lib/braintree/customer.rb
59
+ - lib/braintree/customer_gateway.rb
60
+ - lib/braintree/customer_search.rb
61
+ - lib/braintree/descriptor.rb
62
+ - lib/braintree/digest.rb
63
+ - lib/braintree/disbursement.rb
64
+ - lib/braintree/discount.rb
65
+ - lib/braintree/discount_gateway.rb
66
+ - lib/braintree/dispute.rb
67
+ - lib/braintree/dispute/transaction_details.rb
68
+ - lib/braintree/error_codes.rb
69
+ - lib/braintree/error_result.rb
70
+ - lib/braintree/errors.rb
71
+ - lib/braintree/europe_bank_account.rb
72
+ - lib/braintree/europe_bank_account_gateway.rb
73
+ - lib/braintree/exceptions.rb
74
+ - lib/braintree/facilitator_details.rb
75
+ - lib/braintree/gateway.rb
76
+ - lib/braintree/http.rb
77
+ - lib/braintree/merchant.rb
42
78
  - lib/braintree/merchant_account.rb
43
- - lib/braintree/xml/rexml.rb
44
- - lib/braintree/xml/generator.rb
45
- - lib/braintree/xml/libxml.rb
46
- - lib/braintree/xml/parser.rb
47
- - lib/braintree/account_updater_daily_report.rb
79
+ - lib/braintree/merchant_account/address_details.rb
80
+ - lib/braintree/merchant_account/business_details.rb
81
+ - lib/braintree/merchant_account/funding_details.rb
82
+ - lib/braintree/merchant_account/individual_details.rb
48
83
  - lib/braintree/merchant_account_gateway.rb
84
+ - lib/braintree/merchant_gateway.rb
85
+ - lib/braintree/modification.rb
86
+ - lib/braintree/oauth_credentials.rb
87
+ - lib/braintree/oauth_gateway.rb
88
+ - lib/braintree/payment_instrument_type.rb
89
+ - lib/braintree/payment_method.rb
49
90
  - lib/braintree/payment_method_gateway.rb
91
+ - lib/braintree/payment_method_nonce.rb
92
+ - lib/braintree/payment_method_nonce_gateway.rb
93
+ - lib/braintree/paypal_account.rb
94
+ - lib/braintree/paypal_account_gateway.rb
50
95
  - lib/braintree/plan.rb
96
+ - lib/braintree/plan_gateway.rb
97
+ - lib/braintree/resource_collection.rb
98
+ - lib/braintree/risk_data.rb
99
+ - lib/braintree/settlement_batch.rb
100
+ - lib/braintree/settlement_batch_summary.rb
101
+ - lib/braintree/settlement_batch_summary_gateway.rb
102
+ - lib/braintree/sha256_digest.rb
103
+ - lib/braintree/signature_service.rb
104
+ - lib/braintree/subscription.rb
105
+ - lib/braintree/subscription/status_details.rb
106
+ - lib/braintree/subscription_gateway.rb
107
+ - lib/braintree/subscription_search.rb
108
+ - lib/braintree/successful_result.rb
109
+ - lib/braintree/test/credit_card.rb
51
110
  - lib/braintree/test/merchant_account.rb
111
+ - lib/braintree/test/nonce.rb
52
112
  - lib/braintree/test/transaction_amounts.rb
53
113
  - lib/braintree/test/venmo_sdk.rb
54
- - lib/braintree/test/credit_card.rb
55
- - lib/braintree/test/nonce.rb
56
- - lib/braintree/amex_express_checkout_card.rb
57
- - lib/braintree/descriptor.rb
58
- - lib/braintree/address_gateway.rb
59
- - lib/braintree/settlement_batch_summary_gateway.rb
60
- - lib/braintree/version.rb
61
- - lib/braintree/transaction/paypal_details.rb
62
- - lib/braintree/transaction/android_pay_details.rb
63
- - lib/braintree/transaction/status_details.rb
114
+ - lib/braintree/test_transaction.rb
115
+ - lib/braintree/testing_gateway.rb
116
+ - lib/braintree/three_d_secure_info.rb
117
+ - lib/braintree/transaction.rb
118
+ - lib/braintree/transaction/address_details.rb
64
119
  - lib/braintree/transaction/amex_express_checkout_details.rb
65
- - lib/braintree/transaction/customer_details.rb
66
- - lib/braintree/transaction/subscription_details.rb
67
- - lib/braintree/transaction/venmo_account_details.rb
120
+ - lib/braintree/transaction/android_pay_details.rb
121
+ - lib/braintree/transaction/apple_pay_details.rb
68
122
  - lib/braintree/transaction/coinbase_details.rb
69
123
  - lib/braintree/transaction/credit_card_details.rb
124
+ - lib/braintree/transaction/customer_details.rb
70
125
  - lib/braintree/transaction/disbursement_details.rb
71
- - lib/braintree/transaction/address_details.rb
72
- - lib/braintree/transaction/apple_pay_details.rb
73
- - lib/braintree/successful_result.rb
74
- - lib/braintree/advanced_search.rb
75
- - lib/braintree/webhook_notification.rb
76
- - lib/braintree/facilitator_details.rb
77
- - lib/braintree/subscription/status_details.rb
126
+ - lib/braintree/transaction/paypal_details.rb
127
+ - lib/braintree/transaction/status_details.rb
128
+ - lib/braintree/transaction/subscription_details.rb
129
+ - lib/braintree/transaction/us_bank_account_details.rb
130
+ - lib/braintree/transaction/venmo_account_details.rb
131
+ - lib/braintree/transaction_gateway.rb
78
132
  - lib/braintree/transaction_search.rb
79
- - lib/braintree/merchant_account/funding_details.rb
80
- - lib/braintree/merchant_account/individual_details.rb
81
- - lib/braintree/merchant_account/address_details.rb
82
- - lib/braintree/merchant_account/business_details.rb
83
- - lib/braintree/transaction.rb
84
- - lib/braintree/plan_gateway.rb
85
- - lib/braintree/xml.rb
86
- - lib/braintree/paypal_account_gateway.rb
87
- - lib/braintree/subscription_gateway.rb
88
- - lib/braintree/client_token.rb
89
- - lib/braintree/payment_method_nonce.rb
90
- - lib/braintree/webhook_notification_gateway.rb
91
- - lib/braintree/merchant_gateway.rb
92
- - lib/braintree/unknown_payment_method.rb
93
- - lib/braintree/customer_gateway.rb
94
- - lib/braintree/europe_bank_account.rb
95
- - lib/braintree/discount_gateway.rb
96
- - lib/braintree/android_pay_card.rb
97
- - lib/braintree/gateway.rb
98
- - lib/braintree/address/country_names.rb
99
- - lib/braintree/settlement_batch.rb
100
- - lib/braintree/disbursement.rb
101
- - lib/braintree/merchant.rb
102
- - lib/braintree/validation_error_collection.rb
103
- - lib/braintree/customer_search.rb
133
+ - lib/braintree/transparent_redirect.rb
104
134
  - lib/braintree/transparent_redirect_gateway.rb
105
- - lib/braintree/http.rb
106
- - lib/braintree/modification.rb
107
- - lib/braintree/exceptions.rb
108
- - lib/braintree/paypal_account.rb
109
- - lib/braintree/credit_card.rb
135
+ - lib/braintree/unknown_payment_method.rb
136
+ - lib/braintree/us_bank_account.rb
137
+ - lib/braintree/us_bank_account_gateway.rb
110
138
  - lib/braintree/util.rb
111
- - lib/braintree/apple_pay_card.rb
112
- - lib/braintree/dispute.rb
113
- - lib/braintree/risk_data.rb
114
- - lib/braintree/webhook_testing_gateway.rb
115
- - lib/braintree/dispute/transaction_details.rb
116
- - lib/braintree/credit_card_gateway.rb
117
- - lib/braintree/payment_method.rb
118
- - lib/braintree/three_d_secure_info.rb
119
- - lib/braintree/error_codes.rb
120
- - lib/braintree/credentials_parser.rb
121
- - lib/braintree/credit_card_verification_gateway.rb
122
- - lib/braintree/configuration.rb
123
- - lib/braintree/webhook_testing.rb
124
- - lib/braintree/transparent_redirect.rb
125
- - lib/braintree/digest.rb
126
- - lib/braintree/oauth_credentials.rb
127
- - lib/braintree/errors.rb
128
- - lib/braintree/testing_gateway.rb
129
- - lib/braintree/europe_bank_account_gateway.rb
130
- - lib/braintree/discount.rb
131
- - lib/braintree/customer.rb
132
- - lib/braintree/venmo_account.rb
133
- - lib/braintree/client_token_gateway.rb
134
- - lib/braintree/resource_collection.rb
135
- - lib/braintree/error_result.rb
136
- - lib/braintree/subscription.rb
137
- - lib/braintree/base_module.rb
138
- - lib/braintree/subscription_search.rb
139
- - lib/braintree/credit_card_verification_search.rb
140
- - lib/braintree/payment_method_nonce_gateway.rb
141
- - lib/braintree/oauth_gateway.rb
142
- - lib/braintree/add_on_gateway.rb
143
139
  - lib/braintree/validation_error.rb
144
- - lib/braintree/credit_card_verification.rb
145
- - lib/braintree/payment_instrument_type.rb
146
- - lib/braintree/signature_service.rb
147
- - lib/braintree/test_transaction.rb
148
- - lib/braintree/address.rb
149
- - lib/braintree/coinbase_account.rb
150
- - lib/braintree.rb
140
+ - lib/braintree/validation_error_collection.rb
141
+ - lib/braintree/venmo_account.rb
142
+ - lib/braintree/version.rb
143
+ - lib/braintree/webhook_notification.rb
144
+ - lib/braintree/webhook_notification_gateway.rb
145
+ - lib/braintree/webhook_testing.rb
146
+ - lib/braintree/webhook_testing_gateway.rb
147
+ - lib/braintree/xml.rb
148
+ - lib/braintree/xml/generator.rb
149
+ - lib/braintree/xml/libxml.rb
150
+ - lib/braintree/xml/parser.rb
151
+ - lib/braintree/xml/rexml.rb
151
152
  - lib/ssl/api_braintreegateway_com.ca.crt
152
153
  - lib/ssl/securetrust_ca.crt
154
+ - spec/client.sh
155
+ - spec/hacks/tcp_socket.rb
156
+ - spec/httpsd.pid
157
+ - spec/integration/braintree/add_on_spec.rb
158
+ - spec/integration/braintree/address_spec.rb
159
+ - spec/integration/braintree/advanced_search_spec.rb
160
+ - spec/integration/braintree/client_api/client_token_spec.rb
161
+ - spec/integration/braintree/client_api/spec_helper.rb
162
+ - spec/integration/braintree/coinbase_spec.rb
163
+ - spec/integration/braintree/credit_card_spec.rb
164
+ - spec/integration/braintree/credit_card_verification_search_spec.rb
165
+ - spec/integration/braintree/credit_card_verification_spec.rb
166
+ - spec/integration/braintree/customer_search_spec.rb
167
+ - spec/integration/braintree/customer_spec.rb
168
+ - spec/integration/braintree/disbursement_spec.rb
169
+ - spec/integration/braintree/discount_spec.rb
170
+ - spec/integration/braintree/error_codes_spec.rb
171
+ - spec/integration/braintree/http_spec.rb
172
+ - spec/integration/braintree/merchant_account_spec.rb
173
+ - spec/integration/braintree/merchant_spec.rb
174
+ - spec/integration/braintree/oauth_spec.rb
175
+ - spec/integration/braintree/payment_method_nonce_spec.rb
176
+ - spec/integration/braintree/payment_method_spec.rb
177
+ - spec/integration/braintree/paypal_account_spec.rb
178
+ - spec/integration/braintree/plan_spec.rb
179
+ - spec/integration/braintree/settlement_batch_summary_spec.rb
180
+ - spec/integration/braintree/subscription_spec.rb
181
+ - spec/integration/braintree/test/transaction_amounts_spec.rb
182
+ - spec/integration/braintree/test_transaction_spec.rb
183
+ - spec/integration/braintree/transaction_search_spec.rb
184
+ - spec/integration/braintree/transaction_spec.rb
185
+ - spec/integration/braintree/transparent_redirect_spec.rb
186
+ - spec/integration/braintree/us_bank_account_spec.rb
187
+ - spec/integration/spec_helper.rb
188
+ - spec/oauth_test_helper.rb
189
+ - spec/script/httpsd.rb
190
+ - spec/spec.opts
153
191
  - spec/spec_helper.rb
154
- - spec/unit/spec_helper.rb
155
- - spec/unit/braintree/error_result_spec.rb
156
- - spec/unit/braintree/xml/rexml_spec.rb
157
- - spec/unit/braintree/xml/parser_spec.rb
158
- - spec/unit/braintree/xml/libxml_spec.rb
192
+ - spec/ssl/certificate.crt
193
+ - spec/ssl/geotrust_global.crt
194
+ - spec/ssl/privateKey.key
195
+ - spec/unit/braintree/address_spec.rb
196
+ - spec/unit/braintree/apple_pay_card_spec.rb
197
+ - spec/unit/braintree/base_module_spec.rb
198
+ - spec/unit/braintree/client_token_spec.rb
199
+ - spec/unit/braintree/configuration_spec.rb
159
200
  - spec/unit/braintree/credentials_parser_spec.rb
160
- - spec/unit/braintree/webhook_notification_spec.rb
161
- - spec/unit/braintree/successful_result_spec.rb
162
- - spec/unit/braintree/transaction/credit_card_details_spec.rb
163
- - spec/unit/braintree/transaction/deposit_details_spec.rb
164
- - spec/unit/braintree/transaction/customer_details_spec.rb
165
- - spec/unit/braintree/three_d_secure_info_spec.rb
166
- - spec/unit/braintree/resource_collection_spec.rb
167
- - spec/unit/braintree/subscription_search_spec.rb
168
- - spec/unit/braintree/merchant_account_spec.rb
169
201
  - spec/unit/braintree/credit_card_spec.rb
202
+ - spec/unit/braintree/credit_card_verification_search_spec.rb
203
+ - spec/unit/braintree/credit_card_verification_spec.rb
204
+ - spec/unit/braintree/customer_spec.rb
205
+ - spec/unit/braintree/digest_spec.rb
170
206
  - spec/unit/braintree/disbursement_spec.rb
207
+ - spec/unit/braintree/dispute_spec.rb
208
+ - spec/unit/braintree/error_result_spec.rb
209
+ - spec/unit/braintree/errors_spec.rb
171
210
  - spec/unit/braintree/http_spec.rb
172
- - spec/unit/braintree/subscription_spec.rb
173
- - spec/unit/braintree/client_token_spec.rb
211
+ - spec/unit/braintree/merchant_account_spec.rb
212
+ - spec/unit/braintree/modification_spec.rb
213
+ - spec/unit/braintree/payment_method_spec.rb
174
214
  - spec/unit/braintree/paypal_account_spec.rb
175
- - spec/unit/braintree/digest_spec.rb
176
- - spec/unit/braintree/validation_error_collection_spec.rb
177
- - spec/unit/braintree/apple_pay_card_spec.rb
215
+ - spec/unit/braintree/resource_collection_spec.rb
216
+ - spec/unit/braintree/risk_data_spec.rb
217
+ - spec/unit/braintree/sha256_digest_spec.rb
218
+ - spec/unit/braintree/signature_service_spec.rb
219
+ - spec/unit/braintree/subscription_search_spec.rb
220
+ - spec/unit/braintree/subscription_spec.rb
221
+ - spec/unit/braintree/successful_result_spec.rb
222
+ - spec/unit/braintree/three_d_secure_info_spec.rb
223
+ - spec/unit/braintree/transaction/credit_card_details_spec.rb
224
+ - spec/unit/braintree/transaction/customer_details_spec.rb
225
+ - spec/unit/braintree/transaction/deposit_details_spec.rb
178
226
  - spec/unit/braintree/transaction_search_spec.rb
179
227
  - spec/unit/braintree/transaction_spec.rb
180
- - spec/unit/braintree/credit_card_verification_search_spec.rb
181
- - spec/unit/braintree/credit_card_verification_spec.rb
182
- - spec/unit/braintree/risk_data_spec.rb
183
- - spec/unit/braintree/errors_spec.rb
228
+ - spec/unit/braintree/transparent_redirect_spec.rb
229
+ - spec/unit/braintree/unknown_payment_method_spec.rb
184
230
  - spec/unit/braintree/util_spec.rb
185
- - spec/unit/braintree/sha256_digest_spec.rb
186
- - spec/unit/braintree/base_module_spec.rb
187
- - spec/unit/braintree/dispute_spec.rb
188
- - spec/unit/braintree/configuration_spec.rb
231
+ - spec/unit/braintree/validation_error_collection_spec.rb
189
232
  - spec/unit/braintree/validation_error_spec.rb
233
+ - spec/unit/braintree/webhook_notification_spec.rb
234
+ - spec/unit/braintree/xml/libxml_spec.rb
235
+ - spec/unit/braintree/xml/parser_spec.rb
236
+ - spec/unit/braintree/xml/rexml_spec.rb
190
237
  - spec/unit/braintree/xml_spec.rb
191
- - spec/unit/braintree/modification_spec.rb
192
- - spec/unit/braintree/payment_method_spec.rb
193
- - spec/unit/braintree/unknown_payment_method_spec.rb
194
- - spec/unit/braintree/transparent_redirect_spec.rb
195
- - spec/unit/braintree/customer_spec.rb
196
- - spec/unit/braintree/signature_service_spec.rb
197
- - spec/unit/braintree/address_spec.rb
198
238
  - spec/unit/braintree_spec.rb
199
- - spec/hacks/tcp_socket.rb
200
- - spec/script/httpsd.rb
201
- - spec/oauth_test_helper.rb
202
- - spec/integration/spec_helper.rb
203
- - spec/integration/braintree/test/transaction_amounts_spec.rb
204
- - spec/integration/braintree/coinbase_spec.rb
205
- - spec/integration/braintree/merchant_account_spec.rb
206
- - spec/integration/braintree/credit_card_spec.rb
207
- - spec/integration/braintree/disbursement_spec.rb
208
- - spec/integration/braintree/http_spec.rb
209
- - spec/integration/braintree/subscription_spec.rb
210
- - spec/integration/braintree/plan_spec.rb
211
- - spec/integration/braintree/add_on_spec.rb
212
- - spec/integration/braintree/paypal_account_spec.rb
213
- - spec/integration/braintree/customer_search_spec.rb
214
- - spec/integration/braintree/client_api/spec_helper.rb
215
- - spec/integration/braintree/client_api/client_token_spec.rb
216
- - spec/integration/braintree/transaction_search_spec.rb
217
- - spec/integration/braintree/transaction_spec.rb
218
- - spec/integration/braintree/credit_card_verification_search_spec.rb
219
- - spec/integration/braintree/settlement_batch_summary_spec.rb
220
- - spec/integration/braintree/credit_card_verification_spec.rb
221
- - spec/integration/braintree/oauth_spec.rb
222
- - spec/integration/braintree/merchant_spec.rb
223
- - spec/integration/braintree/test_transaction_spec.rb
224
- - spec/integration/braintree/error_codes_spec.rb
225
- - spec/integration/braintree/discount_spec.rb
226
- - spec/integration/braintree/payment_method_spec.rb
227
- - spec/integration/braintree/advanced_search_spec.rb
228
- - spec/integration/braintree/transparent_redirect_spec.rb
229
- - spec/integration/braintree/customer_spec.rb
230
- - spec/integration/braintree/address_spec.rb
231
- - spec/integration/braintree/payment_method_nonce_spec.rb
232
- - spec/spec.opts
233
- - spec/ssl/privateKey.key
234
- - spec/ssl/geotrust_global.crt
235
- - spec/ssl/certificate.crt
236
- - spec/httpsd.pid
237
- - braintree.gemspec
239
+ - spec/unit/spec_helper.rb
238
240
  homepage: http://www.braintreepayments.com/
239
241
  licenses:
240
242
  - MIT
243
+ metadata: {}
241
244
  post_install_message:
242
245
  rdoc_options: []
243
246
  require_paths:
244
247
  - lib
245
248
  required_ruby_version: !ruby/object:Gem::Requirement
246
- none: false
247
249
  requirements:
248
- - - ! '>='
250
+ - - ">="
249
251
  - !ruby/object:Gem::Version
250
252
  version: '0'
251
253
  required_rubygems_version: !ruby/object:Gem::Requirement
252
- none: false
253
254
  requirements:
254
- - - ! '>='
255
+ - - ">="
255
256
  - !ruby/object:Gem::Version
256
257
  version: '0'
257
258
  requirements: []
258
259
  rubyforge_project: braintree
259
- rubygems_version: 1.8.24
260
+ rubygems_version: 2.4.6
260
261
  signing_key:
261
- specification_version: 3
262
+ specification_version: 4
262
263
  summary: Braintree Gateway Ruby Client Library
263
264
  test_files: []