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 46
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 59
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)
      Veritrans::Tercerog::Mdk::logger.error(e.backtrace.join("\n"))
    end
  else
    if Veritrans::Tercerog::Mdk::logger
      Veritrans::Tercerog::Mdk::logger.fatal(e)
      Veritrans::Tercerog::Mdk::logger.fatal(e.backtrace.join("\n"))
    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 132
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]
      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
  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 236
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 205
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 174
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