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

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