authorizenet 1.8.1 → 1.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/lib/authorize_net.rb +5 -0
  3. data/lib/authorize_net.rb~ +95 -0
  4. data/lib/authorize_net/aim/response.rb~ +131 -0
  5. data/lib/authorize_net/arb/fields.rb +24 -0
  6. data/lib/authorize_net/arb/fields.rb~ +13 -0
  7. data/lib/authorize_net/arb/paging.rb +33 -0
  8. data/lib/authorize_net/arb/paging.rb~ +25 -0
  9. data/lib/authorize_net/arb/response.rb~ +68 -0
  10. data/lib/authorize_net/arb/sorting.rb +43 -0
  11. data/lib/authorize_net/arb/sorting.rb~ +43 -0
  12. data/lib/authorize_net/arb/subscription.rb +5 -5
  13. data/lib/authorize_net/arb/subscription_detail.rb +14 -0
  14. data/lib/authorize_net/arb/subscription_detail.rb~ +56 -0
  15. data/lib/authorize_net/arb/subscription_list_response.rb +43 -0
  16. data/lib/authorize_net/arb/subscription_list_response.rb~ +45 -0
  17. data/lib/authorize_net/arb/transaction.rb +35 -4
  18. data/lib/authorize_net/arb/transaction.rb~ +176 -0
  19. data/lib/authorize_net/fields.rb +21 -3
  20. data/lib/authorize_net/fields.rb~ +767 -0
  21. data/lib/authorize_net/key_value_transaction.rb +0 -2
  22. data/lib/authorize_net/payment_methods/credit_card.rb +20 -32
  23. data/lib/authorize_net/xml_response.rb~ +173 -0
  24. data/lib/authorize_net/xml_transaction.rb +5 -5
  25. data/lib/authorize_net/xml_transaction.rb~ +276 -0
  26. data/lib/generators/authorize_net/{direct_post_generator.rb → direct_post/direct_post_generator.rb} +4 -2
  27. data/lib/generators/authorize_net/direct_post/templates/README-AuthorizeNet +49 -0
  28. data/lib/generators/authorize_net/direct_post/templates/config.yml.erb +8 -0
  29. data/lib/generators/authorize_net/direct_post/templates/config.yml.rails3.erb +8 -0
  30. data/lib/generators/authorize_net/direct_post/templates/controller.rb.erb +31 -0
  31. data/lib/generators/authorize_net/direct_post/templates/initializer.rb +4 -0
  32. data/lib/generators/authorize_net/direct_post/templates/layout.erb +18 -0
  33. data/lib/generators/authorize_net/direct_post/templates/payment.erb +10 -0
  34. data/lib/generators/authorize_net/direct_post/templates/payment.rails3.erb +10 -0
  35. data/lib/generators/authorize_net/direct_post/templates/receipt.erb +1 -0
  36. data/lib/generators/authorize_net/direct_post/templates/relay_response.erb +1 -0
  37. data/lib/generators/authorize_net/{sim_generator.rb → sim/sim_generator.rb} +2 -2
  38. data/lib/generators/authorize_net/sim/templates/README-AuthorizeNet +52 -0
  39. data/lib/generators/authorize_net/sim/templates/config.yml.erb +8 -0
  40. data/lib/generators/authorize_net/sim/templates/config.yml.rails3.erb +8 -0
  41. data/lib/generators/authorize_net/sim/templates/controller.rb.erb +21 -0
  42. data/lib/generators/authorize_net/sim/templates/initializer.rb +4 -0
  43. data/lib/generators/authorize_net/sim/templates/layout.erb +18 -0
  44. data/lib/generators/authorize_net/sim/templates/payment.erb +6 -0
  45. data/lib/generators/authorize_net/sim/templates/payment.rails3.erb +6 -0
  46. data/lib/generators/authorize_net/sim/templates/thank_you.erb +1 -0
  47. data/lib/generators/generator_extensions.rb +75 -0
  48. metadata +41 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0cff60bfbd16f4de9a46d9b4e34193cd3480dcd7
4
- data.tar.gz: 2c4fd6d232a0cc895bfa8264b418c3325ad5a4b8
3
+ metadata.gz: ff5759dc180906c1a4e49eaa3806666c21e97d80
4
+ data.tar.gz: 8f68a83f8feb9df35fbbf41c5802666c3a0dd451
5
5
  SHA512:
6
- metadata.gz: 5f01e13e78ba4ded7e83e6fd1cc981357adb5510333d97b2a40e9ef805d95c2935738d44604fa9fe3bf1f84a5594ef467c9ad6b2641c96730eb7c3aa7141c398
7
- data.tar.gz: 538b6a17b2a6d198bfe572f995666a8a5539c9c97b4e2793af5408664c845915c33cc617b4c03cc3e33bd89757314b63233eb77862741102f5f35f55d161790d
6
+ metadata.gz: 0ff763839bf9cc2f6fda6f0a4ac93e86ed93c6d9774af353d8f79a9a398f8a20e2894ad928c16b5810f6f10ebbf8775bbaca08fce87c06f0a346107849dccb65
7
+ data.tar.gz: 5bdf56b8ffa4586f9a93d964147d167b9e644a1b9eb57948184713d9f91ee6c83612180c35f3e8064a7fa89d8341e1539746fae527fdffad85097d18acb60201
@@ -52,6 +52,11 @@ require "authorize_net/sim/response"
52
52
 
53
53
  # ARB
54
54
 
55
+ require "authorize_net/arb/paging"
56
+ require "authorize_net/arb/sorting"
57
+ require "authorize_net/arb/subscription_list_response"
58
+ require "authorize_net/arb/subscription_detail"
59
+ require "authorize_net/arb/fields"
55
60
  require "authorize_net/arb/subscription"
56
61
  require "authorize_net/arb/response"
57
62
  require "authorize_net/arb/transaction"
@@ -0,0 +1,95 @@
1
+ # The SDK initialization enters here. Loads all needed libraries and files. Inspects
2
+ # the current runtime to see if Rails is present. If it is, we inject our helper into
3
+ # ActiveSupport.
4
+
5
+ require "cgi"
6
+ require "net/https"
7
+ require "uri"
8
+ require "openssl"
9
+ require 'bigdecimal'
10
+ require 'nokogiri'
11
+ require 'date'
12
+
13
+ # TODO: Add local data validation where possible
14
+
15
+ $:.unshift File.dirname(__FILE__)
16
+
17
+ require "authorize_net/authorize_net"
18
+ require "authorize_net/payment_methods/credit_card"
19
+ require "authorize_net/payment_methods/echeck"
20
+ require "authorize_net/addresses/address"
21
+ require "authorize_net/addresses/shipping_address"
22
+ require "authorize_net/customer"
23
+ require "authorize_net/email_receipt"
24
+ require "authorize_net/order"
25
+ require "authorize_net/line_item"
26
+ require "authorize_net/cim/payment_profile"
27
+ require "authorize_net/cim/customer_profile"
28
+ require "authorize_net/reporting/batch"
29
+ require "authorize_net/reporting/batch_statistics"
30
+ require "authorize_net/reporting/transaction_details"
31
+ require "authorize_net/reporting/fds_filter"
32
+ require "authorize_net/reporting/returned_item"
33
+ require "authorize_net/response"
34
+ require "authorize_net/key_value_response"
35
+ require "authorize_net/xml_response"
36
+ require "authorize_net/transaction"
37
+ require "authorize_net/key_value_transaction"
38
+ require "authorize_net/xml_transaction"
39
+ require "authorize_net/fields"
40
+
41
+ # AIM
42
+
43
+ require "authorize_net/aim/transaction"
44
+ require "authorize_net/aim/response"
45
+
46
+ # SIM
47
+
48
+ require "authorize_net/sim/hosted_payment_form"
49
+ require "authorize_net/sim/hosted_receipt_page"
50
+ require "authorize_net/sim/transaction"
51
+ require "authorize_net/sim/response"
52
+
53
+ # ARB
54
+
55
+ require "authorize_net/arb/subscription_detail"
56
+ require "authorize_net/arb/fields"
57
+ require "authorize_net/arb/subscription"
58
+ require "authorize_net/arb/response"
59
+ require "authorize_net/arb/transaction"
60
+
61
+ # CIM
62
+
63
+ require "authorize_net/cim/response"
64
+ require "authorize_net/cim/transaction"
65
+
66
+ # Reporting
67
+
68
+ require "authorize_net/reporting/response"
69
+ require "authorize_net/reporting/transaction"
70
+
71
+ # Load our Rails plugin
72
+
73
+ if defined?(Rails)
74
+ if defined?(Rails::Railtie)
75
+ module AuthorizeNet
76
+ class Railtie < Rails::Railtie
77
+ initializer "authorize_net.load_path_initialize" do |app|
78
+ %w{ models controllers helpers }.each do |dir|
79
+ path = File.join(File.dirname(__FILE__), 'app', dir)
80
+ $LOAD_PATH << path
81
+ ActiveSupport::Dependencies.autoload_paths << path
82
+ ActiveSupport::Dependencies.autoload_once_paths.delete(path)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ else
88
+ %w{ models controllers helpers }.each do |dir|
89
+ path = File.join(File.dirname(__FILE__), 'app', dir)
90
+ $LOAD_PATH << path
91
+ ActiveSupport::Dependencies.load_paths << path
92
+ ActiveSupport::Dependencies.load_once_paths.delete(path)
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,131 @@
1
+ module AuthorizeNet::AIM
2
+
3
+ # The AIM response class. Handles parsing the response from the gateway.
4
+ class Response < AuthorizeNet::KeyValueResponse
5
+
6
+ # Our MD5 digest generator.
7
+ @@digest = OpenSSL::Digest.new('md5')
8
+
9
+ include AuthorizeNet::AIM::Fields
10
+
11
+ # Fields to convert to/from booleans.
12
+ @@boolean_fields = [:tax_exempt]
13
+
14
+ # Fields to convert to/from BigDecimal.
15
+ @@decimal_fields = [:amount, :tax, :freight, :duty, :requested, :balance_on_card]
16
+
17
+
18
+ # Constructs a new response object from a +raw_response+ and the +transaction+ that generated
19
+ # the +raw_response+. You don't typically construct this object yourself, as AuthorizeNet::AIM::Transaction
20
+ # will build one for you when it makes the request to the gateway.
21
+ def initialize(raw_response, transaction)
22
+ @version = transaction.version
23
+ raise "AuthorizeNet gem only supports AIM version 3.1" unless @version.to_s == '3.1'
24
+ @raw_response = raw_response
25
+ @fields = {}
26
+ @transaction = transaction
27
+ custom_field_names = transaction.custom_fields.keys.collect(&:to_s).sort.collect(&:to_sym)
28
+ @custom_fields = {}
29
+ split_on = transaction.delimiter
30
+ if @raw_response.kind_of?(Net::HTTPOK) || @raw_response.kind_of?(Nokogiri::XML::Element)
31
+ if @raw_response.kind_of?(Net::HTTPOK)
32
+ raw_data = @raw_response.body
33
+ else
34
+ raw_data = @raw_response.text
35
+ end
36
+ unless transaction.encapsulation_character.nil?
37
+ split_on = transaction.encapsulation_character + split_on + transaction.encapsulation_character
38
+ raw_data = raw_data[1..raw_data.length - 2]
39
+ end
40
+ raw_data.split(split_on).each_with_index do |field, index|
41
+ if transaction.cp_version.nil?
42
+ field_desc = FIELDS
43
+ else
44
+ field_desc = CP_FIELDS
45
+ end
46
+ if index < field_desc.length
47
+ @fields[field_desc[index]] = field
48
+ else
49
+ @custom_fields[custom_field_names[index - field_desc.length]] = field
50
+ end
51
+ end
52
+ @fields.delete(nil)
53
+ @fields.each do |k, v|
54
+ if @@boolean_fields.include?(k)
55
+ @fields[k] = value_to_boolean(v)
56
+ elsif @@decimal_fields.include?(k)
57
+ @fields[k] = value_to_decimal(v)
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ # Returns True if the MD5 hash found in the response payload validates using
64
+ # the supplied api_login and secret merchant_value (THIS IS NOT YOUR API KEY).
65
+ def valid_md5?(api_login, merchant_value)
66
+ if @fields[:md5_hash].nil?
67
+ return false
68
+ end
69
+ @@digest.hexdigest("#{merchant_value}#{api_login}#{@fields[:transaction_id]}#{@transaction.fields[:amount]}").downcase == @fields[:md5_hash].downcase
70
+ end
71
+
72
+ # Returns the current API version that we are adhering to.
73
+ def version
74
+ @version
75
+ end
76
+
77
+ # Check to see if the response indicated success. Success is defined as a 200 OK response indicating
78
+ # that the transaction was approved.
79
+ def success?
80
+ !connection_failure? && approved?
81
+ end
82
+
83
+ # Returns true if we failed to open a connection to the gateway or got back a non-200 OK HTTP response.
84
+ def connection_failure?
85
+ !@raw_response.kind_of?(Net::HTTPOK) && !@raw_response.kind_of?(Nokogiri::XML::Element)
86
+ end
87
+
88
+ # Returns the underlying Net::HTTPResponse object. This has the original response body along with
89
+ # headers and such. Note that if an exception is generated while making the request (which happens
90
+ # if there is no internet connection for example), you will get the exception object here instead of
91
+ # a Net::HTTPResponse object.
92
+ def raw
93
+ @raw_response
94
+ end
95
+
96
+ # Returns the AuthorizeNet::Transaction instance that owns this response.
97
+ def transaction
98
+ @transaction
99
+ end
100
+
101
+ # Returns the transaction's authorization code. This should be shown to the
102
+ # end user.
103
+ def authorization_code
104
+ @fields[:authorization_code]
105
+ end
106
+
107
+ # Returns the transaction's authorization id. You will need this for future void, refund
108
+ # and prior authorization capture requests.
109
+ def transaction_id
110
+ @fields[:transaction_id]
111
+ end
112
+
113
+ # Returns the customer id from the response.
114
+ def customer_id
115
+ @fields[:customer_id]
116
+ end
117
+
118
+ # Returns a response code (from AVSResponseCode) indicating the result of any Address Verification
119
+ # Service checks.
120
+ def avs_response
121
+ @fields[:avs_response]
122
+ end
123
+
124
+ # Returns the credit card type used in the transaction. The values returned can be found in CardType.
125
+ def card_type
126
+ @fields[:card_type]
127
+ end
128
+
129
+ end
130
+
131
+ end
@@ -0,0 +1,24 @@
1
+ module AuthorizeNet::ARB
2
+ module Fields
3
+ EntityDescription = Struct.new(:node_structure, :entity_class, :arg_mapping)
4
+
5
+ SUBSCRIPTION_DETAIL_ENTITY_DESCRIPTION = EntityDescription.new(
6
+ [
7
+ {:id => :id},
8
+ {:name => :name},
9
+ {:status => :status},
10
+ {:createTimeStampUTC => :create_time_stamp_utc},
11
+ {:firstName => :first_name},
12
+ {:lastName => :last_name},
13
+ {:totalOccurrences => :total_occurrences},
14
+ {:pastOccurrences => :past_occurrences},
15
+ {:paymentMethod => :payment_method},
16
+ {:accountNumber => :account_number},
17
+ {:invoice => :invoice},
18
+ {:amount => :amount},
19
+ {:currencyId => :currency_id}
20
+ ],
21
+ AuthorizeNet::ARB::SubscriptionDetail
22
+ )
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ module AuthorizeNet::ARB
2
+ module Fields
3
+ EntityDescription = Struct.new(:node_structure, :entity_class, :arg_mapping)
4
+
5
+ SUBSCRIPTION_DETAIL_ENTITY_DESCRIPTION = EntityDescription.new(
6
+ [
7
+ {:id => :id},
8
+ {:name => :name}
9
+ ],
10
+ AuthorizeNet::ARB::SubscriptionDetail
11
+ )
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ module AuthorizeNet::ARB
2
+
3
+ class Paging
4
+
5
+ # Models Paging
6
+ include AuthorizeNet::Model
7
+
8
+ attr_accessor :offset,:limit
9
+
10
+ # Initializes Paging object.
11
+ #
12
+ # Typical usage:
13
+ # paging = AuthorizeNet::ARB::Paging.new(1,1000)
14
+ #
15
+ # Valid values for offset: 1 to 100000
16
+ # Valid values for limit: 1 to 1000
17
+ #
18
+ def initialize(offset,limit)
19
+ @offset = offset
20
+ @limit = limit
21
+ end
22
+
23
+ def to_hash
24
+ hash = {
25
+ :offset => @offset,
26
+ :limit => @limit
27
+ }
28
+ hash.delete_if {|k, v| v.nil?}
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,25 @@
1
+ module AuthorizeNet::ARB
2
+
3
+ class Paging
4
+
5
+ # Models Paging
6
+ include AuthorizeNet::Model
7
+
8
+ attr_accessor :offset,:limit
9
+
10
+ def initialize(offset,limit)
11
+ @offset = offset
12
+ @limit = limit
13
+ end
14
+
15
+ def to_hash
16
+ hash = {
17
+ :offset => @offset,
18
+ :limit => @limit
19
+ }
20
+ hash.delete_if {|k, v| v.nil?}
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,68 @@
1
+ module AuthorizeNet::ARB
2
+
3
+ # The ARB response class.
4
+ class Response < AuthorizeNet::XmlResponse
5
+ # Constructs a new response object from a +raw_response. You don't typically
6
+ # construct this object yourself, as AuthorizeNet::ARB::Transaction will
7
+ # build one for you when it makes the request to the gateway.
8
+ def initialize(raw_response, transaction)
9
+ super
10
+ unless connection_failure?
11
+ begin
12
+ @subscription_id = node_content_unless_nil(@root.at_css('subscriptionId'))
13
+ @subscription_status = node_content_unless_nil(@root.at_css('Status'))
14
+
15
+ rescue
16
+ @raw_response = $!
17
+ end
18
+ end
19
+ end
20
+
21
+ # Returns the subscriptionId from the response if there is one. Otherwise returns nil.
22
+ def subscription_id
23
+ @subscription_id
24
+ end
25
+
26
+ # Returns the status of the Subscription from the response if there is one. Otherwise returns nil. This value
27
+ # is only returned in response to a get_status transaction.
28
+ def subscription_status
29
+ @subscription_status
30
+ end
31
+
32
+ end #Response
33
+
34
+ class SubscriptionListResponse < AuthorizeNet::XmlResponse
35
+ def initialize(raw_response, transaction)
36
+ super
37
+ unless connection_failure?
38
+ begin
39
+ @subscription_details = @root.at_css('subscriptionDetails')
40
+ @subscription_detail = @root.at_css('subscriptionDetail')
41
+ @total_num_in_resultset = node_content_unless_nil(@root.at_css('totalNumInResultSet'))
42
+
43
+ rescue
44
+ @raw_response = $!
45
+ end
46
+ end
47
+ end
48
+
49
+ def total_num_in_resultset
50
+ @total_num_in_resultset
51
+ end
52
+
53
+ # Returns an Array of SubscriptionDetail objects built from the entities returned in the response. Returns nil if no subscriptions were returned.
54
+ def subscription_details
55
+ unless @subscription_details.nil?
56
+ subscription_details = []
57
+ @subscription_details.element_children.each do |child|
58
+ unless child.nil?
59
+ subscription_detail = build_entity(child, Fields::SUBSCRIPTION_DETAIL_ENTITY_DESCRIPTION)
60
+
61
+ subscription_details <<= subscription_detail
62
+ end
63
+ end
64
+ return subscription_details unless subscription_details.length == 0
65
+ end
66
+ end
67
+ end #SubscriptionListResponse
68
+ end
@@ -0,0 +1,43 @@
1
+ module AuthorizeNet::ARB
2
+
3
+ class Sorting
4
+
5
+ # Models Sorting
6
+ include AuthorizeNet::Model
7
+
8
+ attr_accessor :order_by, :order_descending
9
+
10
+ # Initializes Sorting object.
11
+ #
12
+ # Typical usage:
13
+ # sorting = AuthorizeNet::ARB::Sorting.new('name',true)
14
+ #
15
+ # Valid values for order_by values of the AuthorizeNet::ARB::Sorting:
16
+ # id
17
+ # name
18
+ # status
19
+ # createTimeStampUTC
20
+ # lastName
21
+ # firstName
22
+ # accountNumber
23
+ # amount
24
+ # pastOccurrences
25
+ #
26
+ # Valid values for order_descending: true, false, 1, 0
27
+ #
28
+ def initialize(order_by, order_descending)
29
+ @order_by = order_by
30
+ @order_descending = order_descending
31
+ end
32
+
33
+ def to_hash
34
+ hash = {
35
+ :order_by => @order_by,
36
+ :order_descending => @order_descending
37
+ }
38
+ hash.delete_if {|k, v| v.nil?}
39
+ end
40
+
41
+ end
42
+
43
+ end