n8_activemerchant 1.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. data/CHANGELOG +574 -0
  2. data/CONTRIBUTORS +175 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +151 -0
  5. data/gem-public_cert.pem +20 -0
  6. data/lib/active_merchant.rb +49 -0
  7. data/lib/active_merchant/billing.rb +9 -0
  8. data/lib/active_merchant/billing/avs_result.rb +98 -0
  9. data/lib/active_merchant/billing/base.rb +57 -0
  10. data/lib/active_merchant/billing/check.rb +68 -0
  11. data/lib/active_merchant/billing/credit_card.rb +161 -0
  12. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  13. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  14. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  15. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  16. data/lib/active_merchant/billing/gateway.rb +169 -0
  17. data/lib/active_merchant/billing/gateways.rb +18 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net.rb +654 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +736 -0
  20. data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
  21. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +244 -0
  22. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  23. data/lib/active_merchant/billing/gateways/bogus.rb +102 -0
  24. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  25. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  26. data/lib/active_merchant/billing/gateways/braintree_blue.rb +210 -0
  27. data/lib/active_merchant/billing/gateways/braintree_orange.rb +17 -0
  28. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  29. data/lib/active_merchant/billing/gateways/cyber_source.rb +406 -0
  30. data/lib/active_merchant/billing/gateways/data_cash.rb +593 -0
  31. data/lib/active_merchant/billing/gateways/efsnet.rb +229 -0
  32. data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
  33. data/lib/active_merchant/billing/gateways/epay.rb +263 -0
  34. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  35. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  36. data/lib/active_merchant/billing/gateways/first_pay.rb +172 -0
  37. data/lib/active_merchant/billing/gateways/garanti.rb +222 -0
  38. data/lib/active_merchant/billing/gateways/inspire.rb +221 -0
  39. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  40. data/lib/active_merchant/billing/gateways/iridium.rb +253 -0
  41. data/lib/active_merchant/billing/gateways/jetpay.rb +270 -0
  42. data/lib/active_merchant/billing/gateways/linkpoint.rb +449 -0
  43. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
  44. data/lib/active_merchant/billing/gateways/merchant_ware.rb +283 -0
  45. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  46. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  47. data/lib/active_merchant/billing/gateways/moneris.rb +205 -0
  48. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  49. data/lib/active_merchant/billing/gateways/netaxept.rb +234 -0
  50. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  51. data/lib/active_merchant/billing/gateways/ogone.rb +279 -0
  52. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  53. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  54. data/lib/active_merchant/billing/gateways/paybox_direct.rb +203 -0
  55. data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
  56. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  57. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  58. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  59. data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
  60. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  61. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  62. data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
  63. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  64. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +326 -0
  65. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
  66. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  67. data/lib/active_merchant/billing/gateways/paypal_express.rb +145 -0
  68. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
  69. data/lib/active_merchant/billing/gateways/paysimple/paysimple.rb +333 -0
  70. data/lib/active_merchant/billing/gateways/paysimple/usaepay.wsdl +1596 -0
  71. data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
  72. data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
  73. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  74. data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
  75. data/lib/active_merchant/billing/gateways/realex.rb +200 -0
  76. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  77. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  78. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  79. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  80. data/lib/active_merchant/billing/gateways/sage_pay.rb +315 -0
  81. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  82. data/lib/active_merchant/billing/gateways/secure_net.rb +330 -0
  83. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  84. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
  85. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  86. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  87. data/lib/active_merchant/billing/gateways/smart_ps.rb +265 -0
  88. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  89. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  90. data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
  91. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  92. data/lib/active_merchant/billing/gateways/usa_epay_soap.rb +154 -0
  93. data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
  94. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  95. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  96. data/lib/active_merchant/billing/integrations.rb +17 -0
  97. data/lib/active_merchant/billing/integrations/action_view_helper.rb +68 -0
  98. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  99. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  100. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  101. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  102. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  103. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  104. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  105. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  106. data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
  107. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +188 -0
  108. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
  109. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
  110. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
  111. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  112. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  113. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  114. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  115. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  116. data/lib/active_merchant/billing/integrations/helper.rb +96 -0
  117. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  118. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  119. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  120. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  121. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  122. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  123. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  124. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  125. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  126. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  127. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  128. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  129. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  130. data/lib/active_merchant/billing/integrations/quickpay.rb +17 -0
  131. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  132. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  133. data/lib/active_merchant/billing/integrations/return.rb +37 -0
  134. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
  135. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
  136. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +109 -0
  137. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +204 -0
  138. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +27 -0
  139. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  140. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  141. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  142. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  143. data/lib/active_merchant/billing/response.rb +32 -0
  144. data/lib/active_merchant/common.rb +14 -0
  145. data/lib/active_merchant/common/connection.rb +162 -0
  146. data/lib/active_merchant/common/country.rb +328 -0
  147. data/lib/active_merchant/common/error.rb +26 -0
  148. data/lib/active_merchant/common/post_data.rb +24 -0
  149. data/lib/active_merchant/common/posts_data.rb +61 -0
  150. data/lib/active_merchant/common/requires_parameters.rb +16 -0
  151. data/lib/active_merchant/common/utils.rb +18 -0
  152. data/lib/active_merchant/common/validateable.rb +76 -0
  153. data/lib/active_merchant/version.rb +3 -0
  154. data/lib/activemerchant.rb +1 -0
  155. data/lib/certs/cacert.pem +7815 -0
  156. data/lib/support/gateway_support.rb +58 -0
  157. data/lib/support/outbound_hosts.rb +25 -0
  158. metadata +270 -0
@@ -0,0 +1,194 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+
4
+ class UsaEpayGateway < Gateway
5
+ URL = 'https://www.usaepay.com/gate.php'
6
+
7
+ self.supported_cardtypes = [:visa, :master, :american_express]
8
+ self.supported_countries = ['US']
9
+ self.homepage_url = 'http://www.usaepay.com/'
10
+ self.display_name = 'USA ePay'
11
+
12
+ TRANSACTIONS = {
13
+ :authorization => 'authonly',
14
+ :purchase => 'sale',
15
+ :capture => 'capture'
16
+ }
17
+
18
+ def initialize(options = {})
19
+ requires!(options, :login)
20
+ @options = options
21
+ super
22
+ end
23
+
24
+ def authorize(money, credit_card, options = {})
25
+ post = {}
26
+
27
+ add_amount(post, money)
28
+ add_invoice(post, options)
29
+ add_credit_card(post, credit_card)
30
+ add_address(post, credit_card, options)
31
+ add_customer_data(post, options)
32
+
33
+ commit(:authorization, post)
34
+ end
35
+
36
+ def purchase(money, credit_card, options = {})
37
+ post = {}
38
+
39
+ add_amount(post, money)
40
+ add_invoice(post, options)
41
+ add_credit_card(post, credit_card)
42
+ add_address(post, credit_card, options)
43
+ add_customer_data(post, options)
44
+
45
+ commit(:purchase, post)
46
+ end
47
+
48
+ def capture(money, authorization, options = {})
49
+ post = {
50
+ :refNum => authorization
51
+ }
52
+
53
+ add_amount(post, money)
54
+ commit(:capture, post)
55
+ end
56
+
57
+ private
58
+
59
+ def add_amount(post, money)
60
+ post[:amount] = amount(money)
61
+ end
62
+
63
+ def expdate(credit_card)
64
+ year = format(credit_card.year, :two_digits)
65
+ month = format(credit_card.month, :two_digits)
66
+
67
+ "#{month}#{year}"
68
+ end
69
+
70
+ def add_customer_data(post, options)
71
+ address = options[:billing_address] || options[:address] || {}
72
+ post[:street] = address[:address1]
73
+ post[:zip] = address[:zip]
74
+
75
+ if options.has_key? :email
76
+ post[:custemail] = options[:email]
77
+ post[:custreceipt] = 'No'
78
+ end
79
+
80
+ if options.has_key? :customer
81
+ post[:custid] = options[:customer]
82
+ end
83
+
84
+ if options.has_key? :ip
85
+ post[:ip] = options[:ip]
86
+ end
87
+ end
88
+
89
+ def add_address(post, credit_card, options)
90
+ billing_address = options[:billing_address] || options[:address]
91
+
92
+ add_address_for_type(:billing, post, credit_card, billing_address) if billing_address
93
+ add_address_for_type(:shipping, post, credit_card, options[:shipping_address]) if options[:shipping_address]
94
+ end
95
+
96
+ def add_address_for_type(type, post, credit_card, address)
97
+ prefix = address_key_prefix(type)
98
+
99
+ post[address_key(prefix, 'fname')] = credit_card.first_name
100
+ post[address_key(prefix, 'lname')] = credit_card.last_name
101
+ post[address_key(prefix, 'company')] = address[:company] unless address[:company].blank?
102
+ post[address_key(prefix, 'street')] = address[:address1] unless address[:address1].blank?
103
+ post[address_key(prefix, 'street2')] = address[:address2] unless address[:address2].blank?
104
+ post[address_key(prefix, 'city')] = address[:city] unless address[:city].blank?
105
+ post[address_key(prefix, 'state')] = address[:state] unless address[:state].blank?
106
+ post[address_key(prefix, 'zip')] = address[:zip] unless address[:zip].blank?
107
+ post[address_key(prefix, 'country')] = address[:country] unless address[:country].blank?
108
+ post[address_key(prefix, 'phone')] = address[:phone] unless address[:phone].blank?
109
+ end
110
+
111
+ def address_key_prefix(type)
112
+ case type
113
+ when :shipping then 'ship'
114
+ when :billing then 'bill'
115
+ end
116
+ end
117
+
118
+ def address_key(prefix, key)
119
+ "#{prefix}#{key}".to_sym
120
+ end
121
+
122
+ def add_invoice(post, options)
123
+ post[:invoice] = options[:order_id]
124
+ end
125
+
126
+ def add_credit_card(post, credit_card)
127
+ post[:card] = credit_card.number
128
+ post[:cvv2] = credit_card.verification_value if credit_card.verification_value?
129
+ post[:expir] = expdate(credit_card)
130
+ post[:name] = credit_card.name
131
+ end
132
+
133
+ def parse(body)
134
+ fields = {}
135
+ for line in body.split('&')
136
+ key, value = *line.scan( %r{^(\w+)\=(.*)$} ).flatten
137
+ fields[key] = CGI.unescape(value)
138
+ end
139
+
140
+ {
141
+ :status => fields['UMstatus'],
142
+ :auth_code => fields['UMauthCode'],
143
+ :ref_num => fields['UMrefNum'],
144
+ :batch => fields['UMbatch'],
145
+ :avs_result => fields['UMavsResult'],
146
+ :avs_result_code => fields['UMavsResultCode'],
147
+ :cvv2_result => fields['UMcvv2Result'],
148
+ :cvv2_result_code => fields['UMcvv2ResultCode'],
149
+ :vpas_result_code => fields['UMvpasResultCode'],
150
+ :result => fields['UMresult'],
151
+ :error => fields['UMerror'],
152
+ :error_code => fields['UMerrorcode'],
153
+ :acs_url => fields['UMacsurl'],
154
+ :payload => fields['UMpayload']
155
+ }.delete_if{|k, v| v.nil?}
156
+ end
157
+
158
+
159
+ def commit(action, parameters)
160
+ response = parse( ssl_post(URL, post_data(action, parameters)) )
161
+
162
+ Response.new(response[:status] == 'Approved', message_from(response), response,
163
+ :test => @options[:test] || test?,
164
+ :authorization => response[:ref_num],
165
+ :cvv_result => response[:cvv2_result_code],
166
+ :avs_result => {
167
+ :street_match => response[:avs_result_code].to_s[0,1],
168
+ :postal_match => response[:avs_result_code].to_s[1,1],
169
+ :code => response[:avs_result_code].to_s[2,1]
170
+ }
171
+ )
172
+ end
173
+
174
+ def message_from(response)
175
+ if response[:status] == "Approved"
176
+ return 'Success'
177
+ else
178
+ return 'Unspecified error' if response[:error].blank?
179
+ return response[:error]
180
+ end
181
+ end
182
+
183
+ def post_data(action, parameters = {})
184
+ parameters[:command] = TRANSACTIONS[action]
185
+ parameters[:key] = @options[:login]
186
+ parameters[:software] = 'Active Merchant'
187
+ parameters[:testmode] = @options[:test] ? 1 : 0
188
+
189
+ parameters.collect { |key, value| "UM#{key}=#{CGI.escape(value.to_s)}" }.join("&")
190
+ end
191
+ end
192
+ end
193
+ end
194
+
@@ -0,0 +1,154 @@
1
+ require File.dirname(__FILE__) + '/paysimple/paysimple'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+
6
+ class UsaEpaySoapGateway < Gateway
7
+ self.supported_cardtypes = [:visa, :master, :american_express]
8
+ self.supported_countries = ['US']
9
+ self.homepage_url = 'http://www.usaepay.com/'
10
+ self.display_name = 'USA ePay'
11
+
12
+ def initialize(options = {})
13
+ requires!(options, :login)
14
+ requires!(options, :password)
15
+ @options = options
16
+
17
+ PaySimple.key = options[:login]
18
+ PaySimple.pin = options[:password]
19
+
20
+ super
21
+ end
22
+
23
+ def store(creditcard, options = {})
24
+
25
+ @error = nil
26
+ begin
27
+ @paysimple_response = PaySimple::Subscription.create(
28
+ :CustomerID => "#{Time.now.to_i}#{rand(999999)}",
29
+ :BillingAddress => {
30
+ :FirstName => creditcard.first_name,
31
+ :LastName => creditcard.last_name
32
+ },
33
+ :CreditCardData => {
34
+ :CardNumber => creditcard.number,
35
+ :CardExpiration => expdate(creditcard)
36
+ },
37
+ :Schedule => :monthly,
38
+ :Next => "2008-09-05", # in the past, paysimple seems to need this
39
+ :Enabled => false
40
+ )
41
+ rescue Exception => @error
42
+ puts "An error occurred: #{@error.message}"
43
+ end
44
+
45
+ success = @error ? false : true
46
+
47
+ message = @paysimple_response
48
+ if @error
49
+ message = @error
50
+ end
51
+
52
+ USAEpaySoapResponse.new(success == true, message, {:token => @paysimple_response})
53
+
54
+ end
55
+
56
+ def purchase(money, customer_number, options = {})
57
+ success = false
58
+ begin
59
+
60
+ @paysimple_response = PaySimple::Subscription.charge(customer_number, :Amount => sprintf("%.2f", money.to_f/100))
61
+
62
+ if @paysimple_response["Result"] == "Approved"
63
+ success = true
64
+ end
65
+ rescue Exception => @error
66
+ puts "An error occurred: #{@error.message}"
67
+ end
68
+
69
+ parse_paysimple_response(success, @paysimple_response)
70
+
71
+ end
72
+
73
+ def unstore(customer_number, options={})
74
+ @error = nil
75
+ begin
76
+ @paysimple_response = PaySimple::Subscription.delete(customer_number)
77
+
78
+ puts "Subscription removed from active use."
79
+ rescue Exception => @error
80
+ puts "An error occurred: #{@error.message}"
81
+ end
82
+
83
+ success = @error ? false : true
84
+ message = @paysimple_response
85
+ if @error
86
+ message = @error
87
+ end
88
+
89
+ USAEpaySoapResponse.new(success == true, message, {:token => @paysimple_response})
90
+
91
+ end
92
+
93
+ def update(customer_number, creditcard, options = {})
94
+ @error = nil
95
+ begin
96
+ @paysimple_response = PaySimple::Subscription.update(
97
+ customer_number,
98
+ :CreditCardData => {
99
+ :CardNumber => creditcard.number,
100
+ :CardExpiration => expdate(creditcard)
101
+ }
102
+ )
103
+
104
+ rescue Exception => @error
105
+ puts "An error occurred: #{@error.message}"
106
+ end
107
+
108
+ success = @error ? false : true
109
+
110
+ parse_paysimple_response(success, @paysimple_response.to_s)
111
+
112
+ end
113
+
114
+ private
115
+
116
+ def expdate(credit_card)
117
+ year = format(credit_card.year, :two_digits)
118
+ month = format(credit_card.month, :two_digits)
119
+
120
+ "#{month}#{year}"
121
+ end
122
+
123
+ def message_from(response)
124
+ if response[:Result] == "Approved"
125
+ return 'Success'
126
+ else
127
+ return 'Unspecified error' if response[:Error].blank?
128
+ return response[:Error]
129
+ end
130
+ end
131
+
132
+ def parse_paysimple_response(success, paysimple_response, params={})
133
+ paysimple_response = {} if paysimple_response.nil?
134
+
135
+ USAEpaySoapResponse.new(success == true, message_from(paysimple_response), params,
136
+ :authorization => paysimple_response["RefNum"],
137
+ :cvv_result => paysimple_response["CardCodeResult"],
138
+ :avs_result => { :code => paysimple_response["AvsResultCode"] }
139
+ )
140
+ end
141
+
142
+ end
143
+
144
+ class USAEpaySoapResponse < Response
145
+ # add a method to response so we can easily get the token
146
+ # for vault transactions
147
+ def token
148
+ @params["token"]
149
+ end
150
+ end
151
+
152
+ end
153
+ end
154
+
@@ -0,0 +1,228 @@
1
+ require 'rexml/document'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class VerifiGateway < Gateway
6
+ class VerifiPostData < PostData
7
+ # Fields that will be sent even if they are blank
8
+ self.required_fields = [ :amount, :type, :ccnumber, :ccexp, :firstname, :lastname,
9
+ :company, :address1, :address2, :city, :state, :zip, :country, :phone ]
10
+ end
11
+
12
+ URL = 'https://secure.verifi.com/gw/api/transact.php'
13
+
14
+ RESPONSE_CODE_MESSAGES = {
15
+ "100" => "Transaction was Approved",
16
+ "200" => "Transaction was Declined by Processor",
17
+ "201" => "Do Not Honor",
18
+ "202" => "Insufficient Funds",
19
+ "203" => "Over Limit",
20
+ "204" => "Transaction not allowed",
21
+ "220" => "Incorrect payment Data",
22
+ "221" => "No Such Card Issuer",
23
+ "222" => "No Card Number on file with Issuer",
24
+ "223" => "Expired Card",
25
+ "224" => "Invalid Expiration Date",
26
+ "225" => "Invalid Card Security Code",
27
+ "240" => "Call Issuer for Further Information",
28
+ "250" => "Pick Up Card",
29
+ "251" => "Lost Card",
30
+ "252" => "Stolen Card",
31
+ "253" => "Fraudulent Card",
32
+ "260" => "Declined With further Instructions Available (see response text)",
33
+ "261" => "Declined - Stop All Recurring Payments",
34
+ "262" => "Declined - Stop this Recurring Program",
35
+ "263" => "Declined - Update Cardholder Data Available",
36
+ "264" => "Declined - Retry in a few days",
37
+ "300" => "Transaction was Rejected by Gateway",
38
+ "400" => "Transaction Error Returned by Processor",
39
+ "410" => "Invalid Merchant Configuration",
40
+ "411" => "Merchant Account is Inactive",
41
+ "420" => "Communication Error",
42
+ "421" => "Communication Error with Issuer",
43
+ "430" => "Duplicate Transaction at Processor",
44
+ "440" => "Processor Format Error",
45
+ "441" => "Invalid Transaction Information",
46
+ "460" => "Processor Feature Not Available",
47
+ "461" => "Unsupported Card Type"
48
+ }
49
+
50
+ SUCCESS = 1
51
+
52
+ TRANSACTIONS = {
53
+ :authorization => 'auth',
54
+ :purchase => 'sale',
55
+ :capture => 'capture',
56
+ :void => 'void',
57
+ :credit => 'credit',
58
+ :refund => 'refund'
59
+ }
60
+
61
+ self.supported_countries = ['US']
62
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
63
+ self.homepage_url = 'http://www.verifi.com/'
64
+ self.display_name = 'Verifi'
65
+
66
+ def initialize(options = {})
67
+ requires!(options, :login, :password)
68
+ @options = options
69
+ super
70
+ end
71
+
72
+ def purchase(money, credit_card, options = {})
73
+ sale_authorization_or_credit_template(:purchase, money, credit_card, options)
74
+ end
75
+
76
+ def authorize(money, credit_card, options = {})
77
+ sale_authorization_or_credit_template(:authorization, money, credit_card, options)
78
+ end
79
+
80
+ def capture(money, authorization, options = {})
81
+ capture_void_or_refund_template(:capture, money, authorization, options)
82
+ end
83
+
84
+ def void(authorization, options = {})
85
+ capture_void_or_refund_template(:void, 0, authorization, options)
86
+ end
87
+
88
+ def credit(money, credit_card_or_authorization, options = {})
89
+ if credit_card_or_authorization.is_a?(String)
90
+ capture_void_or_refund_template(:refund, money, credit_card_or_authorization, options)
91
+ else
92
+ sale_authorization_or_credit_template(:credit, money, credit_card_or_authorization, options)
93
+ end
94
+ end
95
+
96
+ private
97
+
98
+ def sale_authorization_or_credit_template(trx_type, money, credit_card, options = {})
99
+ post = VerifiPostData.new
100
+ add_security_key_data(post, options, money)
101
+ add_credit_card(post, credit_card)
102
+ add_addresses(post, options)
103
+ add_customer_data(post, options)
104
+ add_invoice_data(post, options)
105
+ add_optional_data(post, options)
106
+ commit(trx_type, money, post)
107
+ end
108
+
109
+ def capture_void_or_refund_template(trx_type, money, authorization, options)
110
+ post = VerifiPostData.new
111
+ post[:transactionid] = authorization
112
+
113
+ commit(trx_type, money, post)
114
+ end
115
+
116
+ def add_credit_card(post, credit_card)
117
+ post[:ccnumber] = credit_card.number
118
+ post[:ccexp] = expdate(credit_card)
119
+ post[:firstname] = credit_card.first_name
120
+ post[:lastname] = credit_card.last_name
121
+ post[:cvv] = credit_card.verification_value
122
+ end
123
+
124
+ def expdate(credit_card)
125
+ year = sprintf("%.4i", credit_card.year)
126
+ month = sprintf("%.2i", credit_card.month)
127
+
128
+ "#{month}#{year[-2..-1]}"
129
+ end
130
+
131
+ def add_addresses(post, options)
132
+ if billing_address = options[:billing_address] || options[:address]
133
+ post[:company] = billing_address[:company]
134
+ post[:address1] = billing_address[:address1]
135
+ post[:address2] = billing_address[:address2]
136
+ post[:city] = billing_address[:city]
137
+ post[:state] = billing_address[:state]
138
+ post[:zip] = billing_address[:zip]
139
+ post[:country] = billing_address[:country]
140
+ post[:phone] = billing_address[:phone]
141
+ post[:fax] = billing_address[:fax]
142
+ end
143
+
144
+ if shipping_address = options[:shipping_address]
145
+ post[:shipping_firstname] = shipping_address[:first_name]
146
+ post[:shipping_lastname] = shipping_address[:last_name]
147
+ post[:shipping_company] = shipping_address[:company]
148
+ post[:shipping_address1] = shipping_address[:address1]
149
+ post[:shipping_address2] = shipping_address[:address2]
150
+ post[:shipping_city] = shipping_address[:city]
151
+ post[:shipping_state] = shipping_address[:state]
152
+ post[:shipping_zip] = shipping_address[:zip]
153
+ post[:shipping_country] = shipping_address[:country]
154
+ post[:shipping_email] = shipping_address[:email]
155
+ end
156
+ end
157
+
158
+ def add_customer_data(post, options)
159
+ post[:email] = options[:email]
160
+ post[:ipaddress] = options[:ip]
161
+ end
162
+
163
+ def add_invoice_data(post, options)
164
+ post[:orderid] = options[:order_id]
165
+ post[:ponumber] = options[:invoice]
166
+ post[:orderdescription] = options[:description]
167
+ post[:tax] = options[:tax]
168
+ post[:shipping] = options[:shipping]
169
+ end
170
+
171
+ def add_optional_data(post, options)
172
+ post[:billing_method] = options[:billing_method]
173
+ post[:website] = options[:website]
174
+ post[:descriptor] = options[:descriptor]
175
+ post[:descriptor_phone] = options[:descriptor_phone]
176
+ post[:cardholder_auth] = options[:cardholder_auth]
177
+ post[:cavv] = options[:cavv]
178
+ post[:xid] = options[:xid]
179
+ post[:customer_receipt] = options[:customer_receipt]
180
+ end
181
+
182
+ def add_security_key_data(post, options, money)
183
+ # MD5(username|password|orderid|amount|time)
184
+ now = Time.now.to_i.to_s
185
+ md5 = Digest::MD5.new
186
+ md5 << @options[:login].to_s + "|"
187
+ md5 << @options[:password].to_s + "|"
188
+ md5 << options[:order_id].to_s + "|"
189
+ md5 << amount(money).to_s + "|"
190
+ md5 << now
191
+ post[:key] = md5.hexdigest
192
+ post[:time] = now
193
+ end
194
+
195
+ def commit(trx_type, money, post)
196
+ post[:amount] = amount(money)
197
+
198
+ response = parse( ssl_post(URL, post_data(trx_type, post)) )
199
+
200
+ Response.new(response[:response].to_i == SUCCESS, message_from(response), response,
201
+ :test => test?,
202
+ :authorization => response[:transactionid],
203
+ :avs_result => { :code => response[:avsresponse] },
204
+ :cvv_result => response[:cvvresponse]
205
+ )
206
+ end
207
+
208
+ def message_from(response)
209
+ response[:response_code_message] ? response[:response_code_message] : ""
210
+ end
211
+
212
+ def parse(body)
213
+ results = {}
214
+ CGI.parse(body).each { |key, value| results[key.intern] = value[0] }
215
+ results[:response_code_message] = RESPONSE_CODE_MESSAGES[results[:response_code]] if results[:response_code]
216
+ results
217
+ end
218
+
219
+ def post_data(trx_type, post)
220
+ post[:username] = @options[:login]
221
+ post[:password] = @options[:password]
222
+ post[:type] = TRANSACTIONS[trx_type]
223
+
224
+ post.to_s
225
+ end
226
+ end
227
+ end
228
+ end