Class: OffsitePayments::Integrations::AuthorizeNetSim::Notification

Inherits:
Notification
  • Object
show all
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 #parserparser.gross and it should have been #orderorder.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

FirstData::Notification

Instance Attribute Summary

Attributes inherited from Notification

#params, #raw

Instance Method Summary collapse

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(md5_hash_set_in_authorize_net, )
  Digest::MD5.hexdigest(md5_hash_set_in_authorize_net +  + params['x_trans_id'] + gross) == params['x_MD5_Hash'].downcase
end

#all_custom_values_passed_in_and_now_passed_back_to_usObject

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_codeObject



310
311
312
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 310

def auth_code
  unescape params['x_auth_code']
end

#avs_codeObject

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].

Returns:

  • (Boolean)


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_addressObject

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]

Returns:

  • (Boolean)


497
498
499
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 497

def cavv_matches?
  ['','2','8'].include? cavv_response
end

#cavv_responseObject

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'

Returns:

  • (Boolean)


502
503
504
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 502

def complete?
  params["x_response_code"] == '1'
end

#customer_idObject



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_codeObject

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

Returns:

  • (Boolean)


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

#descriptionObject



375
376
377
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 375

def description
  unescape params['x_description']
end

#dutyObject



365
366
367
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 365

def duty
  unescape params['x_duty']
end

#freightObject 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

#grossObject

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_numObject

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_idObject

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

#methodObject

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_availableObject

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_emailObject

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_numObject



314
315
316
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 314

def po_num
 unescape params['x_po_num']
end

#received_atObject

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_emailObject

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_symbolObject

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_codeObject

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_textObject



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_subcodeObject

'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_keyObject

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_addressObject



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

#statusObject

#method_available alias



550
551
552
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 550

def status
  complete?
end

#taxObject

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_exemptObject

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?

Returns:

  • (Boolean)


545
546
547
# File 'lib/offsite_payments/integrations/authorize_net_sim.rb', line 545

def test?
  params['x_test_request'] == 'true'
end

#transaction_idObject

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_typeObject

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