Class: OffsitePayments::Integrations::AuthorizeNetSim::Notification
- Inherits:
-
Notification
- Object
- Notification
- OffsitePayments::Integrations::AuthorizeNetSim::Notification
- Defined in:
- lib/offsite_payments/integrations/authorize_net_sim.rb
Overview
# Example: parser = AuthorizeNetSim::Notification.new(request.raw_post) passed = parser.complete?
order = Order.find_by_order_number(parser.invoice_num)
unless order
@message = 'Error--unable to find your transaction! Please contact us directly.'
return render :partial => 'authorize_net_sim_payment_response'
end
if order.total != parser.gross.to_f
logger.error "Authorize.Net sim said they paid for #{parser.gross} and it should have been #{order.total}!"
passed = false
end
# Theoretically, Authorize.net will never pass us the same transaction # ID twice, but we can double check that… by using # parser.transaction_id, and checking against previous orders’ transaction # id’s (which you can save when the order is completed).… unless parser.acknowledge MD5_HASH_SET_IN_AUTHORIZE_NET, AUTHORIZE_LOGIN
passed = false
logger.error "ALERT POSSIBLE FRAUD ATTEMPT either that or you haven't setup your md5 hash setting right in #{__FILE__}
because a transaction came back from Authorize.Net with the wrong hash value--rejecting!"
end
unless parser.cavv_matches? and parser.avs_code_matches?
logger.error 'Warning--non matching CC!' + params.inspect
# Could fail them here, as well (recommended)...
end
if passed
# Set up your session, and render something that will redirect them to
# your site, most likely.
else
# Render failure or redirect them to your site where you will render failure
end
Direct Known Subclasses
Instance Attribute Summary
Attributes inherited from Notification
Instance Method Summary collapse
-
#acknowledge(md5_hash_set_in_authorize_net, authorize_net_login_name) ⇒ Object
Called to request back and check if it was a valid request.
-
#all_custom_values_passed_in_and_now_passed_back_to_us ⇒ Object
If you pass any values to authorize that aren’t its expected, it will pass them back to you verbatim, returned by this method.
- #auth_code ⇒ Object
-
#avs_code ⇒ Object
avs [address verification] code A = Address (Street) matches, ZIP does not B = Address information not provided for AVS check E = AVS error G = Non-U.S.
-
#avs_code_matches? ⇒ Boolean
Returns true if their address completely matched [Y or X, P from #avs_code, which mean ‘add+zip match’, ‘address + 9-zip match’, and not applicable, respectively].
-
#billing_address ⇒ Object
Passes a hash of the address the user entered in at Authorize.Net.
-
#cavv_matches? ⇒ Boolean
Check if #cavv_response == ”, ‘2’, ‘8’ one of those [non failing] [blank means no validated, 2 is passed, 8 is passed issuer available].
-
#cavv_response ⇒ Object
cavv_response–‘cardholder authentication verification response code’–most likely not use for SIM Blank or not present = CAVV not validated 0 = CAVV not validated because erroneous data was submitted 1 = CAVV failed validation 2 = CAVV passed validation 3 = CAVV validation could not be performed; issuer attempt incomplete 4 = CAVV validation could not be performed; issuer system error 5 = Reserved for future use 6 = Reserved for future use 7 = CAVV attempt – failed validation – issuer available (U.S.-issued card/non-U.S acquirer) 8 = CAVV attempt – passed validation – issuer available (U.S.-issued card/non-U.S. acquirer) 9 = CAVV attempt – failed validation – issuer.
-
#complete? ⇒ Boolean
Payment is complete – returns true if x_response_code == ‘1’.
- #customer_id ⇒ Object
-
#cvv2_resp_code ⇒ Object
cvv2 response M = Match N = No Match P = Not Processed S = Should have been present U = Issuer unable to process request.
-
#cvv2_resp_code_matches? ⇒ Boolean
check if #cvv2_resp_code == ‘m’ for Match.
- #description ⇒ Object
- #duty ⇒ Object
-
#freight ⇒ Object
(also: #shipping)
Shipping we sent them.
-
#gross ⇒ Object
The money amount we received in X.2 decimal.
-
#invoice_num ⇒ Object
Invoice num we passed in as invoice_num to them.
-
#item_id ⇒ Object
Alias for invoice number–this is the only id they pass back to us that we passed to them, except customer id is also passed back.
-
#method ⇒ Object
Payment method used–almost always CC (for credit card).
-
#method_available ⇒ Object
Ff our payment method is available.
-
#payer_email ⇒ Object
End-user’s email.
- #po_num ⇒ Object
-
#received_at ⇒ Object
When was this payment was received by the client.
-
#receiver_email ⇒ Object
They don’t pass merchant email back to us – unimplemented – always returns nil.
-
#response_code_as_ruby_symbol ⇒ Object
Returns the response code as a symbol.
-
#response_reason_code ⇒ Object
The response reason text’s numeric id [equivalent–just a number].
- #response_reason_text ⇒ Object
-
#response_subcode ⇒ Object
‘used internally by their gateway’.
-
#security_key ⇒ Object
md5 hash used internally.
- #ship_to_address ⇒ Object
-
#status ⇒ Object
#method_available alias.
-
#tax ⇒ Object
Tax amount we sent them.
-
#tax_exempt ⇒ Object
They pass back a tax_exempt value.
-
#test? ⇒ Boolean
Was this a test transaction?.
-
#transaction_id ⇒ Object
They return this number to us [it’s unique to Authorize.net].
-
#transaction_type ⇒ Object
Transaction type (probably going to be auth_capture, since that’s all we set it as).
-
#unescape(val) ⇒ Object
:nodoc:.
Methods inherited from Notification
#amount, #empty!, #gross_cents, #initialize, #iso_currency, #valid_sender?
Constructor Details
This class inherits a constructor from OffsitePayments::Notification
Instance Method Details
#acknowledge(md5_hash_set_in_authorize_net, authorize_net_login_name) ⇒ Object
Called to request back and check if it was a valid request. Authorize.net passes us back a hash that includes a hash of our ‘unique’ MD5 value that we set within their system.
Example: acknowledge(‘my secret md5 hash that I set within Authorize.Net’, ‘authorize_login’)
Note this is somewhat unsafe unless you actually set that md5 hash to something (defaults to ” in their system).
563 564 565 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 563 def acknowledge(, ) Digest::MD5.hexdigest( + + params['x_trans_id'] + gross) == params['x_MD5_Hash'].downcase end |
#all_custom_values_passed_in_and_now_passed_back_to_us ⇒ Object
If you pass any values to authorize that aren’t its expected, it will pass them back to you verbatim, returned by this method. custom values:
355 356 357 358 359 360 361 362 363 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 355 def all_custom_values_passed_in_and_now_passed_back_to_us all = {} params.each do |key, value| if key[0..1] != 'x_' all[key] = unescape value end end all end |
#auth_code ⇒ Object
310 311 312 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 310 def auth_code unescape params['x_auth_code'] end |
#avs_code ⇒ Object
avs [address verification] code A = Address (Street) matches, ZIP does not B = Address information not provided for AVS check E = AVS error G = Non-U.S. Card Issuing Bank N = No Match on Address (Street) or ZIP P = AVS not applicable for this transaction R = Retry – System unavailable or timed out S = Service not supported by issuer U = Address information is unavailable W = Nine digit ZIP matches, Address (Street) does not X = Address (Street) and nine digit ZIP match Y = Address (Street) and five digit ZIP match Z = Five digit ZIP matches Address (Street) does not
433 434 435 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 433 def avs_code params['x_avs_code'] end |
#avs_code_matches? ⇒ Boolean
Returns true if their address completely matched [Y or X, P from #avs_code, which mean ‘add+zip match’, ‘address + 9-zip match’, and not applicable, respectively].
440 441 442 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 440 def avs_code_matches? return ['Y', 'X', 'P'].include? params['x_avs_code'] end |
#billing_address ⇒ Object
Passes a hash of the address the user entered in at Authorize.Net
298 299 300 301 302 303 304 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 298 def billing_address all = {} [:fax, :city, :company, :last_name, :country, :zip, :first_name, :address, :email, :state].each do |key_out| all[key_out] = unescape params['x_' + key_out.to_s] end all end |
#cavv_matches? ⇒ Boolean
Check if #cavv_response == ”, ‘2’, ‘8’ one of those [non failing] [blank means no validated, 2 is passed, 8 is passed issuer available]
497 498 499 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 497 def cavv_matches? ['','2','8'].include? cavv_response end |
#cavv_response ⇒ Object
cavv_response–‘cardholder authentication verification response code’–most likely not use for SIM Blank or not present = CAVV not validated 0 = CAVV not validated because erroneous data was submitted 1 = CAVV failed validation 2 = CAVV passed validation 3 = CAVV validation could not be performed; issuer attempt incomplete 4 = CAVV validation could not be performed; issuer system error 5 = Reserved for future use 6 = Reserved for future use 7 = CAVV attempt – failed validation – issuer available (U.S.-issued card/non-U.S acquirer) 8 = CAVV attempt – passed validation – issuer available (U.S.-issued card/non-U.S. acquirer) 9 = CAVV attempt – failed validation – issuer
490 491 492 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 490 def cavv_response params['x_cavv_response'] end |
#complete? ⇒ Boolean
Payment is complete – returns true if x_response_code == ‘1’
502 503 504 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 502 def complete? params["x_response_code"] == '1' end |
#customer_id ⇒ Object
306 307 308 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 306 def customer_id unescape params['x_cust_id'] end |
#cvv2_resp_code ⇒ Object
cvv2 response M = Match N = No Match P = Not Processed S = Should have been present U = Issuer unable to process request
452 453 454 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 452 def cvv2_resp_code params['x_cvv2_resp_code'] end |
#cvv2_resp_code_matches? ⇒ Boolean
check if #cvv2_resp_code == ‘m’ for Match. otherwise false
457 458 459 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 457 def cvv2_resp_code_matches? return ['M'].include? cvv2_resp_code end |
#description ⇒ Object
375 376 377 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 375 def description unescape params['x_description'] end |
#duty ⇒ Object
365 366 367 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 365 def duty unescape params['x_duty'] end |
#freight ⇒ Object Also known as: shipping
Shipping we sent them.
370 371 372 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 370 def freight unescape params['x_freight'] end |
#gross ⇒ Object
The money amount we received in X.2 decimal. Returns a string
540 541 542 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 540 def gross unescape params['x_amount'] end |
#invoice_num ⇒ Object
Invoice num we passed in as invoice_num to them.
348 349 350 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 348 def invoice_num item_id end |
#item_id ⇒ Object
Alias for invoice number–this is the only id they pass back to us that we passed to them, except customer id is also passed back.
508 509 510 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 508 def item_id unescape params['x_invoice_num'] end |
#method ⇒ Object
Payment method used–almost always CC (for credit card).
338 339 340 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 338 def method unescape params['x_method'] end |
#method_available ⇒ Object
Ff our payment method is available. Almost always “true”.
343 344 345 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 343 def method_available params['x_method_available'] end |
#payer_email ⇒ Object
End-user’s email
524 525 526 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 524 def payer_email unescape params['x_email'] end |
#po_num ⇒ Object
314 315 316 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 314 def po_num unescape params['x_po_num'] end |
#received_at ⇒ Object
When was this payment was received by the client. –unimplemented – always returns nil
519 520 521 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 519 def received_at nil end |
#receiver_email ⇒ Object
They don’t pass merchant email back to us – unimplemented – always returns nil
530 531 532 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 530 def receiver_email nil end |
#response_code_as_ruby_symbol ⇒ Object
Returns the response code as a symbol. => :approved, ‘2’ => :declined, ‘3’ => :error, ‘4’ => :held_for_review
381 382 383 384 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 381 def response_code_as_ruby_symbol map = {'1' => :approved, '2' => :declined, '3' => :error, '4' => :held_for_review} map[params['x_response_code']] end |
#response_reason_code ⇒ Object
The response reason text’s numeric id [equivalent–just a number]
391 392 393 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 391 def response_reason_code unescape params['x_response_reason_code'] end |
#response_reason_text ⇒ Object
386 387 388 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 386 def response_reason_text unescape params['x_response_reason_text'] end |
#response_subcode ⇒ Object
‘used internally by their gateway’
396 397 398 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 396 def response_subcode params['x_response_subcode'] end |
#security_key ⇒ Object
md5 hash used internally
535 536 537 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 535 def security_key params['x_MD5_Hash'] end |
#ship_to_address ⇒ Object
318 319 320 321 322 323 324 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 318 def ship_to_address all = {} [:city, :last_name, :first_name, :country, :zip, :address].each do |key_out| all[key_out] = unescape params['x_ship_to_' + key_out.to_s] end all end |
#status ⇒ Object
#method_available alias
550 551 552 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 550 def status complete? end |
#tax ⇒ Object
Tax amount we sent them.
327 328 329 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 327 def tax unescape params['x_tax'] end |
#tax_exempt ⇒ Object
They pass back a tax_exempt value.
401 402 403 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 401 def tax_exempt params['x_tax_exempt'] end |
#test? ⇒ Boolean
Was this a test transaction?
545 546 547 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 545 def test? params['x_test_request'] == 'true' end |
#transaction_id ⇒ Object
They return this number to us [it’s unique to Authorize.net].
513 514 515 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 513 def transaction_id params['x_trans_id'] end |
#transaction_type ⇒ Object
Transaction type (probably going to be auth_capture, since that’s all we set it as).
333 334 335 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 333 def transaction_type unescape params['x_type'] end |
#unescape(val) ⇒ Object
:nodoc:
289 290 291 292 293 294 295 |
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 289 def unescape(val) #:nodoc: if val CGI::unescape val else val end end |