johnreitano-activemerchant 1.5.2

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 (131) hide show
  1. data/CHANGELOG +508 -0
  2. data/CONTRIBUTORS +134 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +136 -0
  5. data/gem-public_cert.pem +20 -0
  6. data/lib/active_merchant/billing/avs_result.rb +98 -0
  7. data/lib/active_merchant/billing/base.rb +57 -0
  8. data/lib/active_merchant/billing/check.rb +68 -0
  9. data/lib/active_merchant/billing/credit_card.rb +159 -0
  10. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  11. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  12. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  13. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  14. data/lib/active_merchant/billing/gateway.rb +163 -0
  15. data/lib/active_merchant/billing/gateways/authorize_net.rb +654 -0
  16. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +736 -0
  17. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +244 -0
  18. data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
  19. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  20. data/lib/active_merchant/billing/gateways/bogus.rb +98 -0
  21. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  22. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  23. data/lib/active_merchant/billing/gateways/cyber_source.rb +594 -0
  24. data/lib/active_merchant/billing/gateways/data_cash.rb +593 -0
  25. data/lib/active_merchant/billing/gateways/efsnet.rb +229 -0
  26. data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
  27. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  28. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  29. data/lib/active_merchant/billing/gateways/first_pay.rb +172 -0
  30. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  31. data/lib/active_merchant/billing/gateways/jetpay.rb +270 -0
  32. data/lib/active_merchant/billing/gateways/linkpoint.rb +449 -0
  33. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
  34. data/lib/active_merchant/billing/gateways/merchant_ware.rb +283 -0
  35. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  36. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  37. data/lib/active_merchant/billing/gateways/moneris.rb +205 -0
  38. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  39. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  40. data/lib/active_merchant/billing/gateways/ogone.rb +279 -0
  41. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  42. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  43. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  44. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  45. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  46. data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
  47. data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
  48. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  49. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  50. data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
  51. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +326 -0
  52. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
  53. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  54. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  55. data/lib/active_merchant/billing/gateways/paypal_express.rb +130 -0
  56. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
  57. data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
  58. data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
  59. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  60. data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
  61. data/lib/active_merchant/billing/gateways/realex.rb +200 -0
  62. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  63. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  64. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  65. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  66. data/lib/active_merchant/billing/gateways/sage_pay.rb +309 -0
  67. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  68. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  69. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
  70. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  71. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  72. data/lib/active_merchant/billing/gateways/smart_ps.rb +265 -0
  73. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  74. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  75. data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
  76. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  77. data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
  78. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  79. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  80. data/lib/active_merchant/billing/gateways.rb +18 -0
  81. data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -0
  82. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  83. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  84. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  85. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  86. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  87. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  88. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  89. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  90. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  91. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  92. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  93. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  94. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  95. data/lib/active_merchant/billing/integrations/helper.rb +93 -0
  96. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  97. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  98. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  99. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  100. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  101. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  102. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  103. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  104. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  105. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  106. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  107. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  108. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  109. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  110. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  111. data/lib/active_merchant/billing/integrations/quickpay.rb +17 -0
  112. data/lib/active_merchant/billing/integrations/return.rb +35 -0
  113. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  114. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  115. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  116. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  117. data/lib/active_merchant/billing/integrations.rb +29 -0
  118. data/lib/active_merchant/billing/response.rb +32 -0
  119. data/lib/active_merchant/billing.rb +9 -0
  120. data/lib/active_merchant/lib/connection.rb +170 -0
  121. data/lib/active_merchant/lib/country.rb +319 -0
  122. data/lib/active_merchant/lib/error.rb +4 -0
  123. data/lib/active_merchant/lib/post_data.rb +22 -0
  124. data/lib/active_merchant/lib/posts_data.rb +47 -0
  125. data/lib/active_merchant/lib/requires_parameters.rb +16 -0
  126. data/lib/active_merchant/lib/utils.rb +18 -0
  127. data/lib/active_merchant/lib/validateable.rb +76 -0
  128. data/lib/active_merchant.rb +46 -0
  129. data/lib/certs/cacert.pem +7815 -0
  130. data/lib/support/gateway_support.rb +58 -0
  131. metadata +218 -0
@@ -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
@@ -0,0 +1,189 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class ViaklixGateway < Gateway
4
+ class_inheritable_accessor :test_url, :live_url, :delimiter, :actions
5
+
6
+ self.test_url = 'https://demo.viaklix.com/process.asp'
7
+ self.live_url = 'https://www.viaklix.com/process.asp'
8
+ self.delimiter = "\r\n"
9
+
10
+ self.actions = {
11
+ :purchase => 'SALE',
12
+ :credit => 'CREDIT'
13
+ }
14
+
15
+ APPROVED = '0'
16
+
17
+ self.supported_cardtypes = [:visa, :master, :american_express]
18
+ self.supported_countries = ['US']
19
+ self.display_name = 'ViaKLIX'
20
+ self.homepage_url = 'http://viaklix.com'
21
+
22
+ # Initialize the Gateway
23
+ #
24
+ # The gateway requires that a valid login and password be passed
25
+ # in the +options+ hash.
26
+ #
27
+ # ==== Options
28
+ #
29
+ # * <tt>:login</tt> -- Merchant ID
30
+ # * <tt>:password</tt> -- PIN
31
+ # * <tt>:user</tt> -- Specify a subuser of the account (optional)
32
+ # * <tt>:test => +true+ or +false+</tt> -- Force test transactions
33
+ def initialize(options = {})
34
+ requires!(options, :login, :password)
35
+ @options = options
36
+ super
37
+ end
38
+
39
+ # Make a purchase
40
+ def purchase(money, creditcard, options = {})
41
+ form = {}
42
+ add_invoice(form, options)
43
+ add_creditcard(form, creditcard)
44
+ add_address(form, options)
45
+ add_customer_data(form, options)
46
+ commit(:purchase, money, form)
47
+ end
48
+
49
+ # Make a credit to a card (Void can only be done from the virtual terminal)
50
+ # Viaklix does not support credits by reference. You must pass in the credit card
51
+ def credit(money, creditcard, options = {})
52
+ if creditcard.is_a?(String)
53
+ raise ArgumentError, "Reference credits are not supported. Please supply the original credit card"
54
+ end
55
+
56
+ form = {}
57
+ add_invoice(form, options)
58
+ add_creditcard(form, creditcard)
59
+ add_address(form, options)
60
+ add_customer_data(form, options)
61
+ commit(:credit, money, form)
62
+ end
63
+
64
+ private
65
+ def add_customer_data(form, options)
66
+ form[:email] = options[:email].to_s.slice(0, 100) unless options[:email].blank?
67
+ form[:customer_code] = options[:customer].to_s.slice(0, 10) unless options[:customer].blank?
68
+ end
69
+
70
+ def add_invoice(form,options)
71
+ form[:invoice_number] = (options[:order_id] || options[:invoice]).to_s.slice(0, 10)
72
+ form[:description] = options[:description].to_s.slice(0, 255)
73
+ end
74
+
75
+ def add_address(form,options)
76
+ billing_address = options[:billing_address] || options[:address]
77
+
78
+ if billing_address
79
+ form[:avs_address] = billing_address[:address1].to_s.slice(0, 30)
80
+ form[:address2] = billing_address[:address2].to_s.slice(0, 30)
81
+ form[:avs_zip] = billing_address[:zip].to_s.slice(0, 10)
82
+ form[:city] = billing_address[:city].to_s.slice(0, 30)
83
+ form[:state] = billing_address[:state].to_s.slice(0, 10)
84
+ form[:company] = billing_address[:company].to_s.slice(0, 50)
85
+ form[:phone] = billing_address[:phone].to_s.slice(0, 20)
86
+ form[:country] = billing_address[:country].to_s.slice(0, 50)
87
+ end
88
+
89
+ if shipping_address = options[:shipping_address]
90
+ first_name, last_name = parse_first_and_last_name(shipping_address[:name])
91
+ form[:ship_to_first_name] = first_name.to_s.slice(0, 20)
92
+ form[:ship_to_last_name] = last_name.to_s.slice(0, 30)
93
+ form[:ship_to_address] = shipping_address[:address1].to_s.slice(0, 30)
94
+ form[:ship_to_city] = shipping_address[:city].to_s.slice(0, 30)
95
+ form[:ship_to_state] = shipping_address[:state].to_s.slice(0, 10)
96
+ form[:ship_to_company] = shipping_address[:company].to_s.slice(0, 50)
97
+ form[:ship_to_country] = shipping_address[:country].to_s.slice(0, 50)
98
+ form[:ship_to_zip] = shipping_address[:zip].to_s.slice(0, 10)
99
+ end
100
+ end
101
+
102
+ def parse_first_and_last_name(value)
103
+ name = value.to_s.split(' ')
104
+
105
+ last_name = name.pop || ''
106
+ first_name = name.join(' ')
107
+ [ first_name, last_name ]
108
+ end
109
+
110
+ def add_creditcard(form, creditcard)
111
+ form[:card_number] = creditcard.number
112
+ form[:exp_date] = expdate(creditcard)
113
+
114
+ if creditcard.verification_value?
115
+ add_verification_value(form, creditcard)
116
+ end
117
+
118
+ form[:first_name] = creditcard.first_name.to_s.slice(0, 20)
119
+ form[:last_name] = creditcard.last_name.to_s.slice(0, 30)
120
+ end
121
+
122
+ def add_verification_value(form, creditcard)
123
+ form[:cvv2cvc2] = creditcard.verification_value
124
+ form[:cvv2] = 'present'
125
+ end
126
+
127
+ def preamble
128
+ result = {
129
+ 'merchant_id' => @options[:login],
130
+ 'pin' => @options[:password],
131
+ 'show_form' => 'false',
132
+ 'test_mode' => test? ? 'TRUE' : 'FALSE',
133
+ 'result_format' => 'ASCII',
134
+ }
135
+
136
+ result['user_id'] = @options[:user] unless @options[:user].blank?
137
+ result
138
+ end
139
+
140
+ def test?
141
+ @options[:test] || super
142
+ end
143
+
144
+ def commit(action, money, parameters)
145
+ parameters[:amount] = amount(money)
146
+ parameters[:transaction_type] = self.actions[action]
147
+
148
+ response = parse( ssl_post(test? ? self.test_url : self.live_url, post_data(parameters)) )
149
+
150
+ Response.new(response['result'] == APPROVED, message_from(response), response,
151
+ :test => @options[:test] || test?,
152
+ :authorization => authorization_from(response),
153
+ :avs_result => { :code => response['avs_response'] },
154
+ :cvv_result => response['cvv2_response']
155
+ )
156
+ end
157
+
158
+ def authorization_from(response)
159
+ response['txn_id']
160
+ end
161
+
162
+ def message_from(response)
163
+ response['result_message']
164
+ end
165
+
166
+ def post_data(parameters)
167
+ result = preamble
168
+ result.merge!(parameters)
169
+ result.collect { |key, value| "ssl_#{key}=#{CGI.escape(value.to_s)}" }.join("&")
170
+ end
171
+
172
+ def expdate(creditcard)
173
+ year = sprintf("%.4i", creditcard.year)
174
+ month = sprintf("%.2i", creditcard.month)
175
+ "#{month}#{year[2..3]}"
176
+ end
177
+
178
+ # Parse the response message
179
+ def parse(msg)
180
+ resp = {}
181
+ msg.split(self.delimiter).collect{|li|
182
+ key, value = li.split("=")
183
+ resp[key.strip.gsub(/^ssl_/, '')] = value.to_s.strip
184
+ }
185
+ resp
186
+ end
187
+ end
188
+ end
189
+ end