module ActiveMerchant #:nodoc: module Billing #:nodoc: module Integrations #:nodoc: module PayuIn class Notification < ActiveMerchant::Billing::Integrations::Notification def initialize(post, options = {}) super(post, options) @merchant_id = options[:credential1] @secret_key = options[:credential2] end def complete? status == "success" end # Status of the transaction. List of possible values: # invalid:: transaction id is not present # tampered:: transaction data has been tampered # success:: transaction successful # pending:: transaction is pending for some approval # failure:: transaction failure def status @status ||= if checksum_ok? if transaction_id.blank? 'invalid' else transaction_status.downcase end else 'tampered' end end def invoice_ok?( order_id ) order_id.to_s == invoice.to_s end # Order amount should be equal to gross - discount def amount_ok?( order_amount, order_discount = BigDecimal.new( '0.0' ) ) BigDecimal.new( gross ) == order_amount && BigDecimal.new( discount ) == order_discount end # Status of transaction return from the PayU. List of possible values: # SUCCESS:: # PENDING:: # FAILURE:: def transaction_status params['status'] end # ID of this transaction (PayU.in number) def transaction_id params['mihpayid'] end # Mode of Payment # # 'CC' for credit-card # 'NB' for net-banking # 'CD' for cheque or DD # 'CO' for Cash Pickup def type params['mode'] end # What currency have we been dealing with def currency 'INR' end def item_id params['txnid'] end # This is the invoice which you passed to PayU.in def invoice params['txnid'] end # Merchant Id provided by the PayU.in def account params['key'] end # original amount send by merchant def gross params['amount'] end # This is discount given to user - based on promotion set by merchants. def discount params['discount'] end # Description offer for what PayU given the offer to user - based on promotion set by merchants. def offer_description params['offer'] end # Information about the product as send by merchant def product_info params['productinfo'] end # Email of the customer def customer_email params['email'] end # Phone of the customer def customer_phone params['phone'] end # Firstname of the customer def customer_first_name params['firstname'] end # Lastname of the customer def customer_last_name params['lastname'] end # Full address of the customer def customer_address { :address1 => params['address1'], :address2 => params['address2'], :city => params['city'], :state => params['state'], :country => params['country'], :zipcode => params['zipcode'] } end def user_defined return @user_defined if @user_defined @user_defined = [] 10.times{ |i| @user_defined.push( params[ "udf#{i+1}" ] ) } @user_defined end def checksum params['hash'] end def message @message || params['error'] end def acknowledge checksum_ok? end def checksum_ok? fields = user_defined.dup.push( customer_email, customer_first_name, product_info, gross, invoice, :reverse => true ) fields.unshift( transaction_status ) unless PayuIn.checksum(@merchant_id, @secret_key, *fields ) == checksum @message = 'Return checksum not matching the data provided' return false end true end end end end end end