activemerchant 1.14.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG +18 -0
  3. data/CONTRIBUTORS +4 -0
  4. data/README.rdoc +1 -0
  5. data/lib/active_merchant.rb +1 -1
  6. data/lib/active_merchant/billing/credit_card.rb +53 -42
  7. data/lib/active_merchant/billing/gateway.rb +6 -6
  8. data/lib/active_merchant/billing/gateways/authorize_net.rb +4 -2
  9. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +1 -1
  10. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +3 -3
  11. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +1 -1
  12. data/lib/active_merchant/billing/gateways/bogus.rb +12 -0
  13. data/lib/active_merchant/billing/gateways/braintree_blue.rb +77 -16
  14. data/lib/active_merchant/billing/gateways/eway.rb +0 -4
  15. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +1 -1
  16. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +1 -1
  17. data/lib/active_merchant/billing/gateways/orbital.rb +1 -1
  18. data/lib/active_merchant/billing/gateways/pay_junction.rb +1 -1
  19. data/lib/active_merchant/billing/gateways/payflow.rb +22 -8
  20. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +10 -10
  21. data/lib/active_merchant/billing/gateways/payflow_express.rb +115 -36
  22. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +1 -1
  23. data/lib/active_merchant/billing/gateways/qbms.rb +1 -1
  24. data/lib/active_merchant/billing/gateways/realex.rb +7 -20
  25. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +5 -5
  26. data/lib/active_merchant/billing/gateways/viaklix.rb +1 -1
  27. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +18 -10
  28. data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
  29. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
  30. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
  31. data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
  32. data/lib/active_merchant/billing/integrations/helper.rb +4 -4
  33. data/lib/active_merchant/billing/integrations/notification.rb +1 -1
  34. data/lib/active_merchant/common/post_data.rb +1 -1
  35. data/lib/active_merchant/common/posts_data.rb +1 -1
  36. data/lib/active_merchant/common/validateable.rb +20 -15
  37. data/lib/active_merchant/version.rb +1 -1
  38. metadata +20 -21
  39. metadata.gz.sig +0 -0
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG CHANGED
@@ -1,5 +1,23 @@
1
1
  = ActiveMerchant CHANGELOG
2
2
 
3
+ == Version 1.15.0 (May 12, 2011)
4
+ * DirecPay: Fix address to not include address2 twice in some cases [Soleone]
5
+ * DirecPay: Send company if available [Soleone]
6
+ * Realex: Fix hash signature [ntalbott/Soleone]
7
+ * SecurePay AU: Update remote tests [ntalbott]
8
+ * SecurePay AU: Fix method arity for #capture, #refund, #credit and #void [Soleone]
9
+ * Barclays ePDQ: Make response parsing more robust [Soleone]
10
+ * Payflow Express: Add line item support [wolframarnold]
11
+ * Payflow Express: Add comment field support [wolframarnold]
12
+ * Payflow: Add more optional fields [wolframarnold]
13
+ * Beanstream/Paypal: Fix CREDIT_DEPRECATION_MESSAGE errors [Jonathan Rudenberg]
14
+ * BraintreeBlue: Return a hash instead of a transaction object [braintreeps]
15
+ * BraintreeBlue: Return proper AVS/CVV values [braintreeps]
16
+ * Bogus: Add #recurring [trwomey]
17
+ * Make Validateable compatible with ActiveModel [CodeMonkeySteve]
18
+ * Add DirectEBanking offsite gateway [Gerwin Brunner/Soleone]
19
+ * ActiveSupport 3.1 beta support [cgriego]
20
+
3
21
  == Version 1.14.0 (Apr 29, 2011)
4
22
 
5
23
  * SagePayForm: Implement #cancelled? for Return. [wisq]
data/CONTRIBUTORS CHANGED
@@ -227,3 +227,7 @@ WorldPay Gateway
227
227
  Orbital Paymentech Gateway (July, 2009)
228
228
 
229
229
  * Sam Vincent - http://ecommerce.versapay.com
230
+
231
+ DIRECTebanking - Payment Network AG (May, 2011)
232
+
233
+ * Gerwin Brunner (Vilango)
data/README.rdoc CHANGED
@@ -83,6 +83,7 @@ The {ActiveMerchant Wiki}[http://github.com/Shopify/active_merchant/wikis] conta
83
83
  * {2 Checkout}[http://www.2checkout.com]
84
84
  * {Banca Sella GestPay}[https://www.sella.it/banca/ecommerce/gestpay/gestpay.jsp]
85
85
  * {Chronopay}[http://www.chronopay.com]
86
+ * {Direct-eBanking / sofortueberweisung.de by Payment-Networks AG}[https://www.payment-network.com/deb_com_en/merchantarea/home] - DE, AT, CH, BE, UK, NL
86
87
  * {DirecPay}[http://www.timesofmoney.com/direcpay/jsp/home.jsp]
87
88
  * {HiTRUST}[http://www.hitrust.com.hk/]
88
89
  * {Moneybookers}[http://www.moneybookers.com]
@@ -27,7 +27,7 @@ require 'active_support'
27
27
  require 'active_support/core_ext/string/inflections'
28
28
  require 'active_support/core_ext/hash/indifferent_access'
29
29
  require 'active_support/core_ext/hash/conversions'
30
- require 'active_support/core_ext/class/inheritable_attributes'
30
+ require 'active_support/core_ext/class/attribute'
31
31
  require 'active_support/core_ext/class/attribute_accessors'
32
32
  require 'active_support/core_ext/class/delegating_attributes'
33
33
  require 'active_support/core_ext/module/attribute_accessors'
@@ -7,49 +7,49 @@ module ActiveMerchant #:nodoc:
7
7
  # == Description
8
8
  # This credit card object can be used as a stand alone object. It acts just like an ActiveRecord object
9
9
  # but doesn't support the .save method as its not backed by a database.
10
- #
11
- # For testing purposes, use the 'bogus' credit card type. This card skips the vast majority of
12
- # validations. This allows you to focus on your core concerns until you're ready to be more concerned
10
+ #
11
+ # For testing purposes, use the 'bogus' credit card type. This card skips the vast majority of
12
+ # validations. This allows you to focus on your core concerns until you're ready to be more concerned
13
13
  # with the details of particular creditcards or your gateway.
14
- #
14
+ #
15
15
  # == Testing With CreditCard
16
- # Often when testing we don't care about the particulars of a given card type. When using the 'test'
17
- # mode in your Gateway, there are six different valid card numbers: 1, 2, 3, 'success', 'fail',
16
+ # Often when testing we don't care about the particulars of a given card type. When using the 'test'
17
+ # mode in your Gateway, there are six different valid card numbers: 1, 2, 3, 'success', 'fail',
18
18
  # and 'error'.
19
- #
19
+ #
20
20
  #--
21
21
  # For details, see CreditCardMethods#valid_number?
22
22
  #++
23
- #
23
+ #
24
24
  # == Example Usage
25
25
  # cc = CreditCard.new(
26
- # :first_name => 'Steve',
27
- # :last_name => 'Smith',
28
- # :month => '9',
29
- # :year => '2010',
30
- # :type => 'visa',
26
+ # :first_name => 'Steve',
27
+ # :last_name => 'Smith',
28
+ # :month => '9',
29
+ # :year => '2010',
30
+ # :type => 'visa',
31
31
  # :number => '4242424242424242'
32
32
  # )
33
- #
33
+ #
34
34
  # cc.valid? # => true
35
35
  # cc.display_number # => XXXX-XXXX-XXXX-4242
36
36
  #
37
37
  class CreditCard
38
38
  include CreditCardMethods
39
39
  include Validateable
40
-
40
+
41
41
  ## Attributes
42
-
42
+
43
43
  cattr_accessor :require_verification_value
44
44
  self.require_verification_value = true
45
-
45
+
46
46
  # Essential attributes for a valid, non-bogus creditcards
47
47
  attr_accessor :number, :month, :year, :type, :first_name, :last_name
48
-
48
+
49
49
  # Required for Switch / Solo cards
50
50
  attr_accessor :start_month, :start_year, :issue_number
51
51
 
52
- # Optional verification_value (CVV, CVV2 etc). Gateways will try their best to
52
+ # Optional verification_value (CVV, CVV2 etc). Gateways will try their best to
53
53
  # run validation on the passed in value if it is supplied
54
54
  attr_accessor :verification_value
55
55
 
@@ -63,23 +63,23 @@ module ActiveMerchant #:nodoc:
63
63
  def expired?
64
64
  expiry_date.expired?
65
65
  end
66
-
66
+
67
67
  def name?
68
68
  first_name? || last_name?
69
69
  end
70
-
70
+
71
71
  def first_name?
72
72
  @first_name.present?
73
73
  end
74
-
74
+
75
75
  def last_name?
76
76
  @last_name.present?
77
77
  end
78
-
78
+
79
79
  def name
80
80
  [@first_name, @last_name].compact.join(' ')
81
81
  end
82
-
82
+
83
83
  def verification_value?
84
84
  !@verification_value.blank?
85
85
  end
@@ -88,11 +88,11 @@ module ActiveMerchant #:nodoc:
88
88
  def display_number
89
89
  self.class.mask(number)
90
90
  end
91
-
91
+
92
92
  def last_digits
93
93
  self.class.last_digits(number)
94
94
  end
95
-
95
+
96
96
  def validate
97
97
  validate_essential_attributes
98
98
 
@@ -104,14 +104,14 @@ module ActiveMerchant #:nodoc:
104
104
  validate_verification_value
105
105
  validate_switch_or_solo_attributes
106
106
  end
107
-
107
+
108
108
  def self.requires_verification_value?
109
109
  require_verification_value
110
110
  end
111
-
111
+
112
112
  private
113
-
114
- def before_validate #:nodoc:
113
+
114
+ def before_validate #:nodoc:
115
115
  self.month = month.to_i
116
116
  self.year = year.to_i
117
117
  self.start_month = start_month.to_i unless start_month.nil?
@@ -120,27 +120,38 @@ module ActiveMerchant #:nodoc:
120
120
  self.type.downcase! if type.respond_to?(:downcase)
121
121
  self.type = self.class.type?(number) if type.blank?
122
122
  end
123
-
123
+
124
124
  def validate_card_number #:nodoc:
125
- errors.add :number, "is not a valid credit card number" unless CreditCard.valid_number?(number)
125
+ if number.blank?
126
+ errors.add :number, "is required"
127
+ elsif !CreditCard.valid_number?(number)
128
+ errors.add :number, "is not a valid credit card number"
129
+ end
130
+
126
131
  unless errors.on(:number) || errors.on(:type)
127
132
  errors.add :type, "is not the correct card type" unless CreditCard.matching_type?(number, type)
128
133
  end
129
134
  end
130
-
135
+
131
136
  def validate_card_type #:nodoc:
132
- errors.add :type, "is required" if type.blank?
133
- errors.add :type, "is invalid" unless CreditCard.card_companies.keys.include?(type)
137
+ errors.add :type, "is required" if type.blank? && number.present?
138
+ errors.add :type, "is invalid" unless type.blank? || CreditCard.card_companies.keys.include?(type)
134
139
  end
135
-
140
+
136
141
  def validate_essential_attributes #:nodoc:
137
142
  errors.add :first_name, "cannot be empty" if @first_name.blank?
138
143
  errors.add :last_name, "cannot be empty" if @last_name.blank?
139
- errors.add :month, "is not a valid month" unless valid_month?(@month)
140
- errors.add :year, "expired" if expired?
141
- errors.add :year, "is not a valid year" unless valid_expiry_year?(@year)
144
+
145
+ if @month.to_i.zero? || @year.to_i.zero?
146
+ errors.add :month, "is required" if @month.to_i.zero?
147
+ errors.add :year, "is required" if @year.to_i.zero?
148
+ else
149
+ errors.add :month, "is not a valid month" unless valid_month?(@month)
150
+ errors.add :year, "expired" if expired?
151
+ errors.add :year, "is not a valid year" unless valid_expiry_year?(@year)
152
+ end
142
153
  end
143
-
154
+
144
155
  def validate_switch_or_solo_attributes #:nodoc:
145
156
  if %w[switch solo].include?(type)
146
157
  unless valid_month?(@start_month) && valid_start_year?(@start_year) || valid_issue_number?(@issue_number)
@@ -150,10 +161,10 @@ module ActiveMerchant #:nodoc:
150
161
  end
151
162
  end
152
163
  end
153
-
164
+
154
165
  def validate_verification_value #:nodoc:
155
166
  if CreditCard.requires_verification_value?
156
- errors.add :verification_value, "is required" unless verification_value?
167
+ errors.add :verification_value, "is required" unless verification_value?
157
168
  end
158
169
  end
159
170
  end
@@ -76,22 +76,22 @@ module ActiveMerchant #:nodoc:
76
76
  # The format of the amounts used by the gateway
77
77
  # :dollars => '12.50'
78
78
  # :cents => '1250'
79
- class_inheritable_accessor :money_format
79
+ class_attribute :money_format
80
80
  self.money_format = :dollars
81
81
 
82
82
  # The default currency for the transactions if no currency is provided
83
- class_inheritable_accessor :default_currency
83
+ class_attribute :default_currency
84
84
 
85
85
  # The countries of merchants the gateway supports
86
- class_inheritable_accessor :supported_countries
86
+ class_attribute :supported_countries
87
87
  self.supported_countries = []
88
88
 
89
89
  # The supported card types for the gateway
90
- class_inheritable_accessor :supported_cardtypes
90
+ class_attribute :supported_cardtypes
91
91
  self.supported_cardtypes = []
92
92
 
93
- class_inheritable_accessor :homepage_url
94
- class_inheritable_accessor :display_name
93
+ class_attribute :homepage_url
94
+ class_attribute :display_name
95
95
 
96
96
  # The application making the calls to the gateway
97
97
  # Useful for things like the PayPal build notation (BN) id fields
@@ -26,7 +26,7 @@ module ActiveMerchant #:nodoc:
26
26
  class AuthorizeNetGateway < Gateway
27
27
  API_VERSION = '3.1'
28
28
 
29
- class_inheritable_accessor :test_url, :live_url, :arb_test_url, :arb_live_url
29
+ class_attribute :test_url, :live_url, :arb_test_url, :arb_live_url
30
30
 
31
31
  self.test_url = "https://test.authorize.net/gateway/transact.dll"
32
32
  self.live_url = "https://secure.authorize.net/gateway/transact.dll"
@@ -34,7 +34,7 @@ module ActiveMerchant #:nodoc:
34
34
  self.arb_test_url = 'https://apitest.authorize.net/xml/v1/request.api'
35
35
  self.arb_live_url = 'https://api.authorize.net/xml/v1/request.api'
36
36
 
37
- class_inheritable_accessor :duplicate_window
37
+ class_attribute :duplicate_window
38
38
 
39
39
  APPROVED, DECLINED, ERROR, FRAUD_REVIEW = 1, 2, 3, 4
40
40
 
@@ -131,6 +131,7 @@ module ActiveMerchant #:nodoc:
131
131
  # * <tt>authorization</tt> - The authorization returned from the previous authorize request.
132
132
  def void(authorization, options = {})
133
133
  post = {:trans_id => authorization}
134
+ add_duplicate_window(post)
134
135
  commit('VOID', nil, post)
135
136
  end
136
137
 
@@ -155,6 +156,7 @@ module ActiveMerchant #:nodoc:
155
156
  :card_num => options[:card_number]
156
157
  }
157
158
  add_invoice(post, options)
159
+ add_duplicate_window(post)
158
160
 
159
161
  commit('CREDIT', money, post)
160
162
  end
@@ -27,7 +27,7 @@ module ActiveMerchant #:nodoc:
27
27
  # 5. Click Submit
28
28
  class AuthorizeNetCimGateway < Gateway
29
29
 
30
- class_inheritable_accessor :test_url, :live_url
30
+ class_attribute :test_url, :live_url
31
31
 
32
32
  self.test_url = 'https://apitest.authorize.net/xml/v1/request.api'
33
33
  self.live_url = 'https://api.authorize.net/xml/v1/request.api'
@@ -136,15 +136,15 @@ module ActiveMerchant #:nodoc:
136
136
 
137
137
  def parse
138
138
  doc = REXML::Document.new(@response)
139
- auth_type = find(doc, "//Transaction/Type").to_sym
139
+ auth_type = find(doc, "//Transaction/Type").to_s
140
140
 
141
141
  message = find(doc, "//Message/Text")
142
142
  if message.blank?
143
143
  message = find(doc, "//Transaction/CardProcResp/CcReturnMsg")
144
144
  end
145
145
 
146
- case auth_type.to_sym
147
- when :Credit, :Void
146
+ case auth_type
147
+ when 'Credit', 'Void'
148
148
  success = find(doc, "//CcReturnMsg") == "Approved."
149
149
  else
150
150
  success = find(doc, "//Transaction/AuthCode").present?
@@ -84,7 +84,7 @@ module ActiveMerchant #:nodoc:
84
84
  end
85
85
 
86
86
  def credit(money, source, options = {})
87
- deprecated CREDIT_DEPRECATION_MESSAGE
87
+ deprecated Gateway::CREDIT_DEPRECATION_MESSAGE
88
88
  refund(money, source, options)
89
89
  end
90
90
 
@@ -42,6 +42,18 @@ module ActiveMerchant #:nodoc:
42
42
  end
43
43
  end
44
44
 
45
+ def recurring(money, creditcard, options = {})
46
+ money = amount(money)
47
+ case creditcard.number
48
+ when '1'
49
+ Response.new(true, SUCCESS_MESSAGE, {:paid_amount => money}, :test => true)
50
+ when '2'
51
+ Response.new(false, FAILURE_MESSAGE, {:paid_amount => money, :error => FAILURE_MESSAGE },:test => true)
52
+ else
53
+ raise Error, ERROR_MESSAGE
54
+ end
55
+ end
56
+
45
57
  def credit(money, creditcard, options = {})
46
58
  if creditcard.is_a?(String)
47
59
  deprecated CREDIT_DEPRECATION_MESSAGE
@@ -12,7 +12,7 @@ module ActiveMerchant #:nodoc:
12
12
  module Billing #:nodoc:
13
13
  class BraintreeBlueGateway < Gateway
14
14
  include BraintreeCommon
15
-
15
+
16
16
  self.display_name = 'Braintree (Blue Platform)'
17
17
 
18
18
  def initialize(options = {})
@@ -55,7 +55,7 @@ module ActiveMerchant #:nodoc:
55
55
  commit do
56
56
  result = Braintree::Transaction.refund(transaction_id, money)
57
57
  Response.new(result.success?, message_from_result(result),
58
- {:braintree_transaction => (result.transaction if result.success?)},
58
+ {:braintree_transaction => (transaction_hash(result.transaction) if result.success?)},
59
59
  {:authorization => (result.transaction.id if result.success?)}
60
60
  )
61
61
  end
@@ -65,7 +65,7 @@ module ActiveMerchant #:nodoc:
65
65
  commit do
66
66
  result = Braintree::Transaction.void(authorization)
67
67
  Response.new(result.success?, message_from_result(result),
68
- {:braintree_transaction => (result.transaction if result.success?)},
68
+ {:braintree_transaction => (transaction_hash(result.transaction) if result.success?)},
69
69
  {:authorization => (result.transaction.id if result.success?)}
70
70
  )
71
71
  end
@@ -86,7 +86,7 @@ module ActiveMerchant #:nodoc:
86
86
  )
87
87
  Response.new(result.success?, message_from_result(result),
88
88
  {
89
- :braintree_customer => (result.customer if result.success?),
89
+ :braintree_customer => (customer_hash(result.customer) if result.success?),
90
90
  :customer_vault_id => (result.customer.id if result.success?)
91
91
  }
92
92
  )
@@ -104,7 +104,7 @@ module ActiveMerchant #:nodoc:
104
104
  :email => options[:email]
105
105
  )
106
106
  Response.new(result.success?, message_from_result(result),
107
- :braintree_customer => (Braintree::Customer.find(vault_id) if result.success?)
107
+ :braintree_customer => (customer_hash(Braintree::Customer.find(vault_id)) if result.success?)
108
108
  )
109
109
  end
110
110
  return customer_update_result unless customer_update_result.success?
@@ -115,7 +115,7 @@ module ActiveMerchant #:nodoc:
115
115
  :expiration_year => creditcard.year.to_s
116
116
  )
117
117
  Response.new(result.success?, message_from_result(result),
118
- :braintree_customer => (Braintree::Customer.find(vault_id) if result.success?)
118
+ :braintree_customer => (customer_hash(Braintree::Customer.find(vault_id)) if result.success?)
119
119
  )
120
120
  end
121
121
  end
@@ -190,26 +190,23 @@ module ActiveMerchant #:nodoc:
190
190
  result = Braintree::Transaction.send(transaction_type, parameters)
191
191
  response_params, response_options, avs_result, cvv_result = {}, {}, {}, {}
192
192
  if result.success?
193
- response_params[:braintree_transaction] = result.transaction
193
+ response_params[:braintree_transaction] = transaction_hash(result.transaction)
194
194
  response_params[:customer_vault_id] = result.transaction.customer_details.id
195
195
  response_options[:authorization] = result.transaction.id
196
196
  end
197
197
  if result.transaction
198
- avs_result = {
199
- 'code' => '', 'message' => '',
200
- 'street_match' => result.transaction.avs_street_address_response_code == 'M',
201
- 'postal_match' => result.transaction.avs_postal_code_response_code == 'M'
202
- }
203
- cvv_result = {
204
- 'code' => result.transaction.cvv_response_code, 'message' => ''
198
+ response_options[:avs_result] = {
199
+ :code => nil, :message => nil,
200
+ :street_match => result.transaction.avs_street_address_response_code,
201
+ :postal_match => result.transaction.avs_postal_code_response_code
205
202
  }
203
+ response_options[:cvv_result] = result.transaction.cvv_response_code
206
204
  message = result.transaction.processor_response_code + " " + result.transaction.processor_response_text
207
205
  else
208
206
  message = message_from_result(result)
209
207
  end
210
208
  response = Response.new(result.success?, message, response_params, response_options)
211
- response.instance_variable_set("@avs_result", avs_result)
212
- response.instance_variable_set("@cvv_result", cvv_result)
209
+ response.cvv_result['message'] = ''
213
210
  response
214
211
  end
215
212
  end
@@ -226,6 +223,70 @@ module ActiveMerchant #:nodoc:
226
223
  raise ArgumentError, "wrong number of arguments (#{args.length} for 2)"
227
224
  end
228
225
  end
226
+
227
+ def customer_hash(customer)
228
+ credit_cards = customer.credit_cards.map do |cc|
229
+ {
230
+ "bin" => cc.bin,
231
+ "expiration_date" => cc.expiration_date
232
+ }
233
+ end
234
+
235
+ {
236
+ "email" => customer.email,
237
+ "first_name" => customer.first_name,
238
+ "last_name" => customer.last_name,
239
+ "credit_cards" => credit_cards
240
+ }
241
+ end
242
+
243
+ def transaction_hash(transaction)
244
+ if transaction.vault_customer
245
+ vault_customer = {
246
+ }
247
+ vault_customer["credit_cards"] = transaction.vault_customer.credit_cards.map do |cc|
248
+ {
249
+ "bin" => cc.bin
250
+ }
251
+ end
252
+ else
253
+ vault_customer = nil
254
+ end
255
+
256
+ customer_details = {
257
+ "id" => transaction.customer_details.id,
258
+ "email" => transaction.customer_details.email
259
+ }
260
+
261
+ billing_details = {
262
+ "street_address" => transaction.billing_details.street_address,
263
+ "extended_address" => transaction.billing_details.extended_address,
264
+ "company" => transaction.billing_details.company,
265
+ "locality" => transaction.billing_details.locality,
266
+ "region" => transaction.billing_details.region,
267
+ "postal_code" => transaction.billing_details.postal_code,
268
+ "country_name" => transaction.billing_details.country_name,
269
+ }
270
+
271
+ shipping_details = {
272
+ "street_address" => transaction.shipping_details.street_address,
273
+ "extended_address" => transaction.shipping_details.extended_address,
274
+ "company" => transaction.shipping_details.company,
275
+ "locality" => transaction.shipping_details.locality,
276
+ "region" => transaction.shipping_details.region,
277
+ "postal_code" => transaction.shipping_details.postal_code,
278
+ "country_name" => transaction.shipping_details.country_name,
279
+ }
280
+
281
+ {
282
+ "order_id" => transaction.order_id,
283
+ "status" => transaction.status,
284
+ "customer_details" => customer_details,
285
+ "billing_details" => billing_details,
286
+ "shipping_details" => shipping_details,
287
+ "vault_customer" => vault_customer
288
+ }
289
+ end
229
290
  end
230
291
  end
231
292
  end