# class Veritrans::Tercerog::Mdk::MdkTransaction

MdkTransactionクラス

    VeriTrans GW 通信制御クラス

### Public Class Methods

new(logger=nil) click to toggle source

### コンストラクタ¶ ↑

@param

  logger ログ出力用クラス 未指定の場合は、Mdk用デフォルトロガークラスを使用します。

    # File tgMdk/lib/tg_mdk/mdk_transaction.rb, line 47
    def initialize(logger=nil)
      unless logger
        logger = Veritrans::Tercerog::Mdk::MdkLogger.new(self.class.name)
      end
      Veritrans::Tercerog::Mdk.const_set(:MDK_DEFAULT_LOGGER, logger) unless Veritrans::Tercerog::Mdk.const_defined?(:MDK_DEFAULT_LOGGER)
    end

### Public Instance Methods

execute(request_dto) click to toggle source

### VeriTrans GWとの通信を実行します。¶ ↑

@param

  request_dto リクエストに利用するDTOクラス

@return

  リクエストに対応するレスポンスDTOクラス 対応するレスポンスが取得できない場合、Nilレスポンスクラスのインスタンスを返却します。

    # File tgMdk/lib/tg_mdk/mdk_transaction.rb, line 60
    def execute(request_dto)
      Veritrans::Tercerog::Mdk::logger.debug("MdkTransaction.execute() start")

      # コンフィグファイルの設定内容チェック
      Veritrans::Tercerog::Mdk::MdkConfig.instance.valid?

      if Veritrans::Tercerog::Mdk::MdkConfig.instance.mdk_error_mode == "1"
        Veritrans::Tercerog::Mdk::logger.debug("mdk erorr mode is on")
        raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MA99_SYSTEM_INTERNAL_ERROR
      end

      # Requestに対応するResponseを取得する
      response_dto = get_response_dto(request_dto)

      # DTOのパラメータから接続先URL作成
      target_url = create_send_url(request_dto)
      Veritrans::Tercerog::Mdk::logger.info("connect url   ==> #{target_url}")

      # User Agent
      Veritrans::Tercerog::Mdk::logger.info("user agent    ==> #{Veritrans::Tercerog::Mdk::MdkConfig.instance.get_user_agent}")

      # MdkJsonQuery作成
      json_query = Veritrans::Tercerog::Mdk::MdkJsonQuery.new(request_dto)
      mdk_param_hash = json_param(json_query.name_array)

      # ログ出力用のマスクパラメータ取得
      masked_request_json = Veritrans::Tercerog::Mdk::MdkUtils::mdk_mask_json(mdk_param_hash['params'].to_json)
      request_dto._set_result_xml = masked_request_json
      Veritrans::Tercerog::Mdk::logger.info("request data  ==> #{masked_request_json}")

      # URL Encoding
      json_mdk_param = mdk_param_hash.to_json
      enc_json_text = CGI.escape(json_mdk_param)

      # 通信処理
      con = MdkConnection.new
      response_json = con.execute(target_url, enc_json_text)

      # 結果マッピング処理
      content_handler = MdkContentHandler.new
      content_handler.parse(response_json, response_dto)

      # XMLのマスク処理と設定
      masked_response_json = Veritrans::Tercerog::Mdk::MdkUtils::mdk_mask_json(response_json)
      response_dto._set_result_xml = masked_response_json
      masked_response_json = Veritrans::Tercerog::Mdk::MdkUtils::mdk_delete_r_n(masked_response_json)
      Veritrans::Tercerog::Mdk::logger.info("response data ==> #{masked_response_json}")

    rescue => e
      if e.is_a? Veritrans::Tercerog::Mdk::MdkError
        if Veritrans::Tercerog::Mdk::logger
          Veritrans::Tercerog::Mdk::logger.error(e)
          if !e.backtrace.nil?
            Veritrans::Tercerog::Mdk::logger.error(e.backtrace.join("\n"))
          end
        end
      else
        if Veritrans::Tercerog::Mdk::logger
          Veritrans::Tercerog::Mdk::logger.fatal(e)
          if !e.backtrace.nil?
            Veritrans::Tercerog::Mdk::logger.fatal(e.backtrace.join("\n"))
          end
        end
      end
      Veritrans::Tercerog::Mdk::logger.debug("MdkTransaction.execute() end")
      response_dto = get_error_response_dto(request_dto, e)

    else
      Veritrans::Tercerog::Mdk::logger.debug("MdkTransaction.execute() end")
      response_dto
    end

### Private Instance Methods

create_send_url(dto) click to toggle source

### 指定したDTOのパラメータから接続先URLを作成します。¶ ↑

@param

  dto DTOのパラメータ

@return

  接続先URL

    # File tgMdk/lib/tg_mdk/mdk_transaction.rb, line 137
    def create_send_url(dto)

      config = Veritrans::Tercerog::Mdk::MdkConfig.instance

      host_url = config[:HOST_URL]
      service_name = config[:ADD_URL_PAYMENT]
      version = config[:ADD_URL_PAYMENT_VERSION]

      paynowid_service_types = config[:PAYNOWID_SERVICE_TYPE]
      paynowid_service_type_array = paynowid_service_types.split(",")

      service_type = dto.service_type
      service_command = dto.service_command

      paynowid_service_type_array.each do |paynowid_service_type|
        if paynowid_service_type == service_type
          service_name = config[:ADD_URL_VTID]
          version = config[:ADD_URL_VTID_VERSION]

          # ペイナウAPIコンテキストが設定されている場合はservice_nameを上書き
          paynowid_api_context = config[:PAYNOWID_API_CONTEXT]
          if !(paynowid_api_context.nil?) && !(paynowid_api_context.empty?)
              service_name = paynowid_api_context
          end

          break
        end
      end

      # サービスコマンドがSearchの場合はservice_nameを上書き
      if service_name == config[:ADD_URL_PAYMENT] && service_command == SERVICE_COMMAND_SEARCH
          service_name = service_name + HYPHEN + SEARCH_SERVER

          search_parameters = dto.search_parameters
          order_id = nil

          if (!search_parameters.nil?)
            common_search_parameter = search_parameters.common

            if (!common_search_parameter.nil?)
              order_id = common_search_parameter.order_id
            end
          end

          request_id= dto.request_id

          if (!order_id.nil? && !order_id.empty? && !order_id.include?("*")) || (!request_id.nil? && !request_id.empty?)
            # フル指定の場合 or リクエストID指定時はの場合はserviceNameを上書き
            service_name = service_name + SEARCH_STRICT_SERVER
          end

      end

      # ダミーリクエストがONの場合はservice_nameを上書き
      dummy_request = config[:DUMMY_REQUEST]
      if dummy_request == MdkConst::DUMMY_MODE_TRUE
          service_name = DUMMY_SERVER + HYPHEN + service_name
      end

      return host_url + SLASH + service_name + SLASH + version + SLASH + service_command + SLASH + service_type
    end

get_error_response_dto(request_dto, e) click to toggle source

### エラー発生時のレスポンス用DTOを取得します。¶ ↑

@param

  request_dto レスポンス取得対象となるリクエストDTO

@param

  e レスポンスDTOに設定するエラーを保持する例外クラス

@return

  エラー用レスポンスDTO メソッド内でエラーが発生した場合は、NilレスポンスDTO [MdkNilResponseDto] を返却します。

    # File tgMdk/lib/tg_mdk/mdk_transaction.rb, line 267
    def get_error_response_dto(request_dto, e)
      response_dto = get_response_dto(request_dto)
      response_dto.v_result_code = Veritrans::Tercerog::Mdk::MdkMessage::MA99_SYSTEM_INTERNAL_ERROR
      response_dto.mstatus = "failure"
      response_dto.merr_msg = e.message
      if e.is_a? Veritrans::Tercerog::Mdk::MdkError
        response_dto.v_result_code = e.v_result_code
      end

    rescue
      response_dto = MdkNilResponseDto.new
    else
      response_dto
    end

get_response_dto(request_dto) click to toggle source

### リクエストDTOに対応するレスポンスDTOを取得します。¶ ↑

@param

  request_dto レスポンス取得対象となるリクエストDTO

@return

  レスポンスDTO

    # File tgMdk/lib/tg_mdk/mdk_transaction.rb, line 236
    def get_response_dto(request_dto)
      if request_dto.nil?
        return nil
      end

      tmp = request_dto.class.name.dup
      res_dto_name = tmp.sub!(/RequestDto$/, "ResponseDto")
      unless res_dto_name
        raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MA99_SYSTEM_INTERNAL_ERROR
      end

      response_dto = nil
      res_dto_class = res_dto_name.split(/::/).inject(Object) do |obj, name|
        obj.const_get(name)
      end
      response_dto = res_dto_class.new

    rescue => e
      raise e
    else
      response_dto
    end

json_param(param_array) click to toggle source

### 連想配列から、実行時パラメータを付加した通信用の連想配列を生成します。¶ ↑

@param

  name_array パラメータと値の連想配列

@return

  実行時パラメータを付加した通信用の連想配列

    # File tgMdk/lib/tg_mdk/mdk_transaction.rb, line 205
    def json_param(param_array)
      conf = Veritrans::Tercerog::Mdk::MdkConfig.instance

      # 追加パラメータ
      other_param_array = {
        "txnVersion" => conf.mdk_dto_version,
        "dummyRequest" => conf.dummy_request,
        "merchantCcid" => conf.merchant_cc_id
      }

      param_array.delete("serviceType")
      param_array.delete("serviceCommand")
      merge_param_array = param_array.merge(other_param_array)

      # 認証ハッシュ作成
      data = [conf.merchant_cc_id, merge_param_array.to_json, conf.merchant_secret_key].join
      digest = Veritrans::Tercerog::Mdk::MdkUtils::mdk_digest(data)

      # 返却用の連想配列作成
      return_param_array = {PARAM_KEY => merge_param_array}
      return_param_array.store(AUTH_HASH_KEY, digest)

      return return_param_array
    end