module ActiveMerchant module Billing module Integrations module Citrus class Notification < ActiveMerchant::Billing::Integrations::Notification def initialize(post, options = {}) super(post, options) @secret_key = options[:credential2] end def complete? status == "Completed" || status == 'Canceled' end def status @status ||= if checksum_ok? if transaction_id.blank? 'Invalid' else case transaction_status.downcase when 'success' then 'Completed' when 'canceled' then 'Canceled' end end else 'Tampered' end end def invoice_ok?( order_id ) order_id.to_s == invoice.to_s end def amount_ok?( order_amount ) BigDecimal.new( amount ) == order_amount end def item_id params['TxId'] end def invoice item_id end # Status of transaction return from the Citrus. List of possible values: # SUCCESS:: # CANCELED:: def transaction_status params['TxStatus'] end def gross params['amount'] end def amount gross end def transaction_id params['pgTxnNo'] end def issuerrefno params['issuerRefNo'] end def authidcode params['authIdCode'] end def pgrespcode params['pgRespCode'] end def checksum params['signature'] end def paymentmode params['paymentMode'] end def currency params['currency'] end def customer_email params['email'] end def customer_phone params['mobileNo'] end def customer_first_name params['firstName'] end def customer_last_name params['lastName'] end def customer_address { :address1 => params['addressStreet1'], :address2 => params['addressStreet2'], :city => params['addressCity'], :state => params['addressState'], :country => params['addressCountry'], :zip => params['addressZip'] } end def message @message || params['TxMsg'] end def acknowledge(authcode = nil) checksum_ok? end def checksum_ok? fields = [invoice, transaction_status, amount.to_s, transaction_id, issuerrefno, authidcode, customer_first_name, customer_last_name, pgrespcode, customer_address[:zip]].join unless Citrus.checksum(@secret_key, fields ) == checksum @message = 'checksum mismatch...' return false end true end end end end end end