aklaiber/activepayment

View on GitHub
lib/activepayment/wirecard/gateway.rb

Summary

Maintainability
A
1 hr
Test Coverage
module ActivePayment
  module Wirecard
    class Gateway < ActivePayment::Gateway::Base

      class_attribute :login, :password, :signature, :mode

      attr_accessor :amount, :transaction_id, :jop_id

      self.gateway_name = "wirecard"
      self.test_url = 'https://c3-test.wirecard.com/secure/ssl-gateway'
      self.live_url = 'https://c3.wirecard.com/secure/ssl-gateway'

      def authorization(credit_card)
        post_request(self.authorization_request(credit_card))
      end

      def authorization_request(credit_card)
        build_request(:authorization) do |xml|
          xml.tag! 'TransactionID', self.transaction_id
          xml.tag! 'Currency', Gateway.default_currency
          xml.tag! 'Amount', self.amount.cents

          add_optional_node(xml, :commerce_type)
          add_optional_node(xml, :country_code)
          add_optional_node(xml, :credit_card_data, credit_card)
          add_optional_node(xml, :contact_data)
          add_optional_node(xml, :corptrustcenter_data)
        end
      end

      def capture_authorization(guwid)
        post_request(self.capture_authorization_request(guwid))
      end

      def capture_authorization_request(guwid)
        build_request(:capture_authorization) do |xml|
          xml.tag! 'TransactionID', self.transaction_id
          xml.tag! 'GuWID', guwid
          xml.tag! 'Amount', self.amount.cents

          add_optional_node(xml, :country_code)
        end
      end

      def purchase(credit_card, pares = nil, guwid = nil)
        post_request(self.purchase_request(credit_card, pares, guwid))
      end

      def purchase_request(credit_card, pares = nil, guwid = nil)
        build_request(:purchase) do |xml|
          xml.tag! 'TransactionID', self.transaction_id
          xml.tag! 'Currency', Gateway.default_currency
          xml.tag! 'Amount', self.amount.cents
          xml.tag! 'GuWID', guwid unless guwid.blank?
          xml.tag! 'THREE-D_SECURE' do
            xml.tag! 'PARes', pares
          end unless pares.blank?

          add_optional_node(xml, :commerce_type)
          add_optional_node(xml, :country_code)
          add_optional_node(xml, :credit_card_data, credit_card)
          add_optional_node(xml, :contact_data)
          add_optional_node(xml, :corptrustcenter_data)
        end
      end

      def enrollment_check(credit_card)
        post_request(self.enrollment_check_request(credit_card))
      end

      def enrollment_check_request(credit_card)
        build_request(:enrollment_check) do |xml|
          xml.tag! 'TransactionID', self.transaction_id
          xml.tag! 'Currency', Gateway.default_currency
          xml.tag! 'Amount', self.amount.cents

          add_optional_node(xml, :country_code)
          add_optional_node(xml, :credit_card_data, credit_card)
        end
      end

      private

      def add_optional_node(xml, name, value = nil)
        if value.blank? && self.transaction_params.include?(name) && !self.transaction_params[name].blank?
          value = self.transaction_params[name]
        end
        unless value.blank?
          if value.kind_of?(Hash)
            xml.tag! name.to_s.upcase do
              value.each do |node_name, node_value|
                add_optional_node(xml, node_name, node_value)
              end
            end
          else
            xml.tag! name.to_node_name, value
          end
        end
      end

      def transaction_node(xml, &block)
        options = {}
        options[:mode] = Gateway.mode unless Gateway.mode.blank?
        xml.tag! 'CC_TRANSACTION', options do
          block.call(xml)
        end
      end

      def build_request(method, &block)
        xml = Builder::XmlMarkup.new :indent => 2
        xml.instruct!
        xml.tag! 'WIRECARD_BXML' do
          xml.tag! 'W_REQUEST' do
            xml.tag! 'W_JOB' do
              xml.tag! 'JobID', self.jop_id
              xml.tag! 'BusinessCaseSignature', Gateway.signature
              xml.tag! "FNC_CC_#{method.to_s.upcase}" do
                xml.tag! 'FunctionID', 'Test dummy FunctionID'
                transaction_node(xml, &block)
              end
            end
          end
        end
        xml.target!
      end

      def post_request(xml)
        http_connection do |http|
          request = Net::HTTP::Post.new(self.url.path)
          unless request.blank?
            request.content_type = "text/xml"
            request.content_length = xml.size
            request.basic_auth(Gateway.login, Gateway.password)
            request.body = xml
            response = http.request(request)
            if response
              return Response.new(response.body)
            end
          end
        end
      end

    end
  end
end