Class: Braintree::CreditCardGateway

Inherits:
Object
  • Object
show all
Includes:
BaseModule
Defined in:
lib/braintree/credit_card_gateway.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from BaseModule

included

Methods included from BaseModule::Methods

#copy_instance_variables_from_object, #return_object_or_raise, #set_instance_variables_from_hash, #singleton_class

Constructor Details

#initialize(gateway) ⇒ CreditCardGateway

Returns a new instance of CreditCardGateway.



5
6
7
8
9
# File 'lib/braintree/credit_card_gateway.rb', line 5

def initialize(gateway)
  @gateway = gateway
  @config = gateway.config
  @config.assert_has_access_token_or_keys
end

Class Method Details

._create_signatureObject



86
87
88
# File 'lib/braintree/credit_card_gateway.rb', line 86

def self._create_signature
  _signature(:create)
end

._signature(type) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/braintree/credit_card_gateway.rb', line 94

def self._signature(type)
  billing_address_params = AddressGateway._shared_signature
  # NEXT_MAJOR_VERSION Remove venmo_sdk_session
  # The old venmo SDK class has been deprecated
  options = [
    :fail_on_duplicate_payment_method,
    :make_default,
    :skip_advanced_fraud_checking,
    :venmo_sdk_session, # Deprecated
    :verification_account_type,
    :verification_amount,
    :verification_currency_iso_code,
    :verification_merchant_account_id,
    :verify_card
  ]
  # NEXT_MAJOR_VERSION Remove venmo_sdk_payment_method_code
  # The old venmo SDK class has been deprecated
  signature = [
    :billing_address_id, :cardholder_name, :cvv, :expiration_date, :expiration_month,
    :expiration_year, :number, :token, :venmo_sdk_payment_method_code, # Deprecated
    :device_data, :payment_method_nonce,
    {:external_vault => [:network_transaction_id]},
    {:options => options},
    {:billing_address => billing_address_params}
  ]

  signature << {
    :three_d_secure_pass_thru => [
      :eci_flag,
      :cavv,
      :xid,
      :three_d_secure_version,
      :authentication_response,
      :directory_response,
      :cavv_algorithm,
      :ds_transaction_id,
    ]
  }

  case type
  when :create
    signature << :customer_id
  when :update
    billing_address_params << {:options => [:update_existing]}
  else
    raise ArgumentError
  end

  return signature
end

._update_signatureObject



90
91
92
# File 'lib/braintree/credit_card_gateway.rb', line 90

def self._update_signature
  _signature(:update)
end

Instance Method Details

#_do_create(path, params = nil) ⇒ Object



145
146
147
148
149
150
151
152
153
154
# File 'lib/braintree/credit_card_gateway.rb', line 145

def _do_create(path, params=nil)
  response = @config.http.post("#{@config.base_merchant_path}#{path}", params)
  if response[:credit_card]
    SuccessfulResult.new(:credit_card => CreditCard._new(@gateway, response[:credit_card]))
  elsif response[:api_error_response]
    ErrorResult.new(@gateway, response[:api_error_response])
  else
    raise UnexpectedError, "expected :credit_card or :api_error_response"
  end
end

#_do_update(http_verb, path, params) ⇒ Object



156
157
158
159
160
161
162
163
164
165
# File 'lib/braintree/credit_card_gateway.rb', line 156

def _do_update(http_verb, path, params)
  response = @config.http.send(http_verb, "#{@config.base_merchant_path}#{path}", params)
  if response[:credit_card]
    SuccessfulResult.new(:credit_card => CreditCard._new(@gateway, response[:credit_card]))
  elsif response[:api_error_response]
    ErrorResult.new(@gateway, response[:api_error_response])
  else
    raise UnexpectedError, "expected :credit_card or :api_error_response"
  end
end

#_fetch_expired(ids) ⇒ Object



167
168
169
170
171
# File 'lib/braintree/credit_card_gateway.rb', line 167

def _fetch_expired(ids)
  response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expired", :search => {:ids => ids})
  attributes = response[:payment_methods]
  Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| CreditCard._new(@gateway, attrs) }
end

#_fetch_expiring_between(formatted_start_date, formatted_end_date, ids) ⇒ Object



173
174
175
176
177
178
179
180
# File 'lib/braintree/credit_card_gateway.rb', line 173

def _fetch_expiring_between(formatted_start_date, formatted_end_date, ids)
  response = @config.http.post(
    "#{@config.base_merchant_path}/payment_methods/all/expiring?start=#{formatted_start_date}&end=#{formatted_end_date}",
    :search => {:ids => ids},
  )
  attributes = response[:payment_methods]
  Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| CreditCard._new(@gateway, attrs) }
end

#create(attributes) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
# File 'lib/braintree/credit_card_gateway.rb', line 11

def create(attributes)
  if attributes.has_key?(:expiration_date) && (attributes.has_key?(:expiration_month) || attributes.has_key?(:expiration_year))
    raise ArgumentError.new("create with both expiration_month and expiration_year or only expiration_date")
  end
  # NEXT_MAJOR_VERSION remove this check
  if attributes.has_key?(:venmo_sdk_payment_method_code) || attributes.has_key?(:venmo_sdk_session)
    warn "[DEPRECATED] The Venmo SDK integration is Unsupported. Please update your integration to use Pay with Venmo instead."
  end
  Util.verify_keys(CreditCardGateway._create_signature, attributes)
  _do_create("/payment_methods", :credit_card => attributes)
end

#create!(*args) ⇒ Object



23
24
25
# File 'lib/braintree/credit_card_gateway.rb', line 23

def create!(*args)
  return_object_or_raise(:credit_card) { create(*args) }
end

#credit(token, transaction_attributes) ⇒ Object

NEXT_MAJOR_VERSION remove this method CreditCard.credit has been deprecated in favor of Transaction.credit



29
30
31
32
# File 'lib/braintree/credit_card_gateway.rb', line 29

def credit(token, transaction_attributes)
  warn "[DEPRECATED] CreditCard.credit is deprecated. Use Transaction.credit instead"
  @gateway.transaction.credit(transaction_attributes.merge(:payment_method_token => token))
end

#credit!(*args) ⇒ Object

NEXT_MAJOR_VERSION remove this method CreditCard.credit has been deprecated in favor of Transaction.credit



36
37
38
39
# File 'lib/braintree/credit_card_gateway.rb', line 36

def credit!(*args)
  warn "[DEPRECATED] CreditCard.credit is deprecated. Use Transaction.credit instead"
  return_object_or_raise(:transaction) { credit(*args) }
end

#delete(token) ⇒ Object



41
42
43
# File 'lib/braintree/credit_card_gateway.rb', line 41

def delete(token)
  @config.http.delete("#{@config.base_merchant_path}/payment_methods/credit_card/#{token}")
end

#expired(options = {}) ⇒ Object



45
46
47
48
# File 'lib/braintree/credit_card_gateway.rb', line 45

def expired(options = {})
  response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expired_ids")
  ResourceCollection.new(response) { |ids| _fetch_expired(ids) }
end

#expiring_between(start_date, end_date, options = {}) ⇒ Object



50
51
52
53
54
55
# File 'lib/braintree/credit_card_gateway.rb', line 50

def expiring_between(start_date, end_date, options = {})
  formatted_start_date = start_date.strftime("%m%Y")
  formatted_end_date = end_date.strftime("%m%Y")
  response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expiring_ids?start=#{formatted_start_date}&end=#{formatted_end_date}")
  ResourceCollection.new(response) { |ids| _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) }
end

#find(token) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/braintree/credit_card_gateway.rb', line 57

def find(token)
  raise ArgumentError if token.nil? || token.to_s.strip == ""
  response = @config.http.get("#{@config.base_merchant_path}/payment_methods/credit_card/#{token}")
  CreditCard._new(@gateway, response[:credit_card])
rescue NotFoundError
  raise NotFoundError, "payment method with token #{token.inspect} not found"
end

#from_nonce(nonce) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/braintree/credit_card_gateway.rb', line 65

def from_nonce(nonce)
  raise ArgumentError if nonce.nil? || nonce.to_s.strip == ""
  response = @config.http.get("#{@config.base_merchant_path}/payment_methods/from_nonce/#{nonce}")
  CreditCard._new(@gateway, response[:credit_card])
rescue NotFoundError
  raise NotFoundError, "nonce #{nonce.inspect} locked, consumed, or not found"
end

#update(token, attributes) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/braintree/credit_card_gateway.rb', line 73

def update(token, attributes)
  # NEXT_MAJOR_VERSION remove this check
  if attributes.has_key?(:venmo_sdk_payment_method_code) || attributes.has_key?(:venmo_sdk_session)
    warn "[DEPRECATED] The Venmo SDK integration is Unsupported. Please update your integration to use Pay with Venmo instead."
  end
  Util.verify_keys(CreditCardGateway._update_signature, attributes)
  _do_update(:put, "/payment_methods/credit_card/#{token}", :credit_card => attributes)
end

#update!(*args) ⇒ Object



82
83
84
# File 'lib/braintree/credit_card_gateway.rb', line 82

def update!(*args)
  return_object_or_raise(:credit_card) { update(*args) }
end