/*********************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKBatClearPassBase
*   ソースファイル名：JKKBatClearPassBase.java
*   作成者          ：富士通
*   日付            ：2011年11月26日
*＜機能概要＞
*   主処理(共通)<BR>
*   ペイジェントHTTPSリクエスト処理部品（基底）です。
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00       2011/11/26  富士通      新規作成
*   v3.00		2012/05/15	FJ)井熊		フロアリミットオーソリURL対応
*   v3.01		2012/06/06	FJ)井熊		【IT1-2012-0000657】フロアリミットオーソリ引数対応
*   v3.02		2012/09/05	FJ)藤原		【ST1-2012-0000477】Proxy設定処理を追加
*   v4.00		2012/10/26	FJ)藤原		【IT1-2012-0001670】Proxy設定のプロパティがキーあり値なしの空定義の場合にエラーになるのを修正
*   v6.00		2013/12/26	FJ)狭間		【OM-2013-0004929】売上オーソリ送受信ログ追加対応
*	v19.00.00	2015/08/31	FJ) 抱		【IT1-2015-0000094】
*	v19.00.01	2015/09/14	FJ) 抱		【IT1-2015-0000096】クレジットカード番号マスク処理
*   v20.00.01	2015/12/02	FJ)木庭		【IT1-2015-0000142】カード預りIDの追加
*   v20.00.02	2015/12/08	FJ)木庭		【ANK-2565-00-00】save_idの取得処理変更
*   v58.00.00	2022/05/11	FJ)南		【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
*   v58.00.00	2022/06/27  FJ)北村		【ANK-3846-09-00】【クレカ】クリアパス→ペイジェント移行
*   v75.00.00	2025/04/24  FJ)吉田賢	【ANK-4682-00-00】VMルール変更に伴うクラリス対応
**********************************************************************/

package eo.business.common;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.http.HTTPException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYbpmLog;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;

import eo.business.util.file.JBSbatKKIFE001;
import eo.business.util.file.JBSbatKKIFM008;
import eo.business.util.table.JBSbatKK_T_CARD_UK_INFO;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JCNAuthResultCdConvertUtil;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.log.JBSbatLogPrintControl;
import eo.framework.util.JBSbatOracleSeqUtil;

/**
 * <p>
 * ペイジェントHTTPSリクエスト独自処理部品（基底）クラスです。
 * </p>
 * @author 富士通
 */
public abstract class JKKBatClearPassBase
{
	/** 部品ID*/
	private static final String PGID = "JKKBatClearPassBase";
	
	/** パラメータセパレート文字:=*/
	protected static final String S_SEP_EQ = JKKBatConst.S_SEP_EQ;
	
	/** パラメータセパレート文字:&*/
	protected static final String S_SEP_AN = JKKBatConst.S_SEP_AN;
	
	/** パラメータキー文字列*/
	protected static final String S_KEY_HEAD = JKKBatConst.S_KEY_HEAD;
	
	/** 通信方式パラメータ*/
	protected static final String S_SSL = JKKBatConst.S_SSL;
	
	/** リクエスト種別パラメータ*/
	protected static final String S_POST = JKKBatConst.S_POST;
	
	/** 文字コード*/
	protected static final String S_CHR_CODE = JKKBatConst.S_CHR_CODE;
	
	/** クリアパスAPIシステムエラー*/
	protected static final String S_AUTH_SYSERR = JKKBatConst.S_AUTH_SYSERR;
	
	/** レスポンス区切り文字*/
	protected static final String S_DELIM_TAB = JKKBatConst.S_DELIM_TAB;
	
	/** 通信方式SSL*/
	protected static final String S_HTTPS = "https";
	
	/** クリアパス実行結果 */
	public static final String EXE_STATUS = "status";

	/** ログ用インスタンス */
	protected JBSbatLogPrintControl log = null;
	
// IT1-2015-0000094 2015/08/31 ADD START
	/** コマンドタイプ */
	protected static final String CMD = "cmd";
	
	/** 処理区分 */
	protected static final String EXEC_TYPE = "exec_type";
	
	/** システム接続設定番号 */
	protected static final String CONNECT_NO = "connect_no";
	
	/** 接続キー */
	protected static final String CONNECT_KEY = "connect_key";
	
	/** グループコード */
	protected static final String COMP_CD = "comp_cd";
	
	/** 事業者コード */
	protected static final String SHOP_CD = "shop_cd";
	
	/** カード預かりID */
	protected static final String SAVE_ID = "save_id";
	
	/** カードブランド */
	protected static final String CARD_BRAND_CD = "card_brand_cd";
	
	/** カード番号 */
	protected static final String CARD_NO = "card_no";

// ANK-2565-00-00 DEL START
// IT1-2015-0000142 ADD START
//	/** カード番号預りID */
//	protected static final String CARD_AZKRI_ID = "card_azkri_id";
// IT1-2015-0000142 ADD END
// ANK-2565-00-00 DEL END
	
	/** カード有効期限 */
	protected static final String CARD_EXP_DATE = "card_exp_date";
	
	/** カード名義人 */
	protected static final String CARD_USER_NAME = "card_user_name";
	
	/** セキュリティコード */
	protected static final String CARD_SEC_CD = "card_sec_cd";
	
	/** 決済金額 */
	protected static final String AMOUNT = "amount";
	
	/** 再掲額 */
	protected static final String SUB_AMOUNT = "sub_amount";
	
	/** 支払区分 */
	protected static final String PAY_TYPE = "pay_type";
	
	/** 分割回数 */
	protected static final String PAY_COUNT = "pay_count";
	
	/** 事業者請求番号 */
	protected static final String ORDER_NO = "order_no";
	
	/** 顧客ID */
	protected static final String SHOP_MB_ID = "shop_mb_id";
	
	/** 顧客名 */
	protected static final String SHOP_MB_NAME = "shop_mb_name";
	
	/** IPアドレス */
	protected static final String IP_ADDRESS = "ip_address";
	
	/** 結果コード */
	protected static final String RESULT_CD  = "result_cd";
	
	/** 詳細コード */
	protected static final String RESULT_INFO_CD = "result_info_cd";
	
	/** エラーコード */
	protected static final String ERR_CD = "err_cd";
	
	/** オーソリ結果 */
	protected static final String AUTH_RESULT = "auth_result";
	
	/** オーソリ結果コード */
	protected static final String AUTH_RESULT_CD = "auth_result_cd";
	
	/** 承認番号 */
	protected static final String RECOGNIZED_NO = "recognized_no";
	
	/** 仕向会社コード */
	protected static final String CARD_CORP_CD = "card_corp_cd";
// IT1-2015-0000094 2015/08/31 ADD END
	
	// ANK-3846-00-00 ADD START
	/** 文字コード(Shift-JIS) */
	protected static final String SJIS = JKKBatConst.SJIS;
	
	/** ペイジェントシステム接続モード（本番） */
	protected static final String PAYGENT_SYSTEM = "PAYGENT_SYSTEM";
	
	/** ペイジェントシステム接続モード（スタブ） */
	protected static final String PAYGENT_STUB = "PAYGENT_STUB";
	
	/** マーチャントID */
	protected static final String MERCHANT_ID = "merchant_id";
	
	/** 接続ID */
	protected static final String CONNECT_ID = "connect_id";
	
	/** 接続パスワード */
	protected static final String CONNECT_PASSWORD = "connect_password";
	
	/** 電文種別ID */
	protected static final String TELEGRAM_KIND = "telegram_kind";
	
	/** 電文バージョン番号 */
	protected static final String TELEGRAM_VERSION = "telegram_version";
	
	/** マーチャント取引ID */
	protected static final String TRADING_ID = "trading_id";
	
	/** 決済ID */
	protected static final String PAYMENT_ID = "payment_id";
	
	/** 決済金額 */
	protected static final String PAYMENT_AMOUNT = "payment_amount";
	
	/** カード番号 */
	protected static final String CARD_NUMBER = "card_number";
	
	/** カード有効期限 */
	protected static final String CARD_VALID_TERM = "card_valid_term";
	
	/** カード確認番号 */
	protected static final String CARD_CONF_NUMBER = "card_conf_number";
	
	/** 支払区分 */
	protected static final String PAYMENT_CLASS = "payment_class";
	
	/** 分割回数 */
	protected static final String SPLIT_COUNT = "split_count";
	
	/** 3Dセキュア不要区分 */
	protected static final String DSECURE_RYAKU = "3dsecure_ryaku";
	
	/** 3Dセキュア利用タイプ */
	protected static final String DSECURE_USE_TYPE = "3dsecure_use_type";
	
	/** HttpAccept */
	protected static final String HTTP_ACCEPT = "http_accept";
	
	/** HttpUserAgent */
	protected static final String HTTP_USER_AGENT = "http_user_agent";
	
	/** 3-Dセキュア戻りURL */
	protected static final String TERM_URL = "term_url";
	
	/** 参照マーチャント取引ＩＤ */
	protected static final String REF_TRADING_ID = "ref_trading_id";
	
	/** カード情報お預りモード */
	protected static final String STOCK_CARD_MODE = "stock_card_mode";
	
	/** 顧客ID */
	protected static final String CUSTOMER_ID = "customer_id";
	
	/** 顧客カードID */
	protected static final String CUSTOMER_CARD_ID = "customer_card_id";
	
	/** サイトID */
	protected static final String SITE_ID = "site_id";
	
	/** カード情報トークン */
	protected static final String CARD_TOKEN = "card_token";
	
	/** 同時売上モード */
	protected static final String SALES_MODE = "sales_mode";
	
	/** セキュリティーコードトークン利用 */
	protected static final String SECURITY_CODE_TOKEN = "security_code_token";
	
	/** セキュリティコード利用 */
	protected static final String SECURITY_CODE_USE = "security_code_use";
	
	/** 処理結果 */
	protected static final String RESULT = "result";
	
	/** レスポンスコード */
	protected static final String RESPONSE_CODE = "response_code";
	
	/** レスポンス詳細 */
	protected static final String RESPONSE_DETAIL = "response_detail";
	
	/** 仕向会社コード */
	protected static final String TB_ACQ_ID = "acq_id";
	
	/** 承認番号 */
	protected static final String SHONIN_NO = "shonin_no";
	// ANK-3846-00-00 ADD END
	// ANK-4682-00-00 ADD START
	/** イシュア区分 */
	protected static final String ISSUR_CLASS = "issur_class";
	
	/** フィンガープリント */
	protected static final String FINGERPRINT = "fingerprint";
	
	/** マスクされたカード番号 */
	protected static final String MASKED_CARD_NUMBER = "masked_card_number";
	
	/** デビット・プリペイド判定結果 */
	protected static final String DEBIT_PREPAID_TYPE = "debit_prepaid_type";
	
	/** カードブランド */
	protected static final String CARD_BRAND = "card_brand";
	// ANK-4682-00-00 ADD END
	
// IT1-2015-0000094 2015/09/03 ADD START
	/**
	 * コマンド実行結果
	 */
    public static final String CMD_RESULT_CD = "CMD_RESULT_CD";
    
    /**
	 * レコード
	 */
    public static final String RECORD = "record";
    
    /**
	 * サービスIF
	 */
	public static final String SERVICEIF = "service_if";
    
	/**
	 * タグ属性(=TYPE)
	 */
	private static final String[] typeValues = {"service_if","service_if_list"};
	
	/**
	 * タグ名
	 */
	private static final String[] tagNames = {"Envelope","Body","Header","initResponse"};
	
	/**
	 * コマンド実行結果（エラー）
	 */
    public static final String CMD_ERROR_MESSAGE = "CMD_ERROR_MESSAGE";
    
    /**
	 * SOALFAULT（処理例外）
	 */
	private static final String SOAP_FAULT = "fault";

	/**
	 * SOALFAULT（エラーコード）
	 */
	private static final String SOAP_FAULT_CODE = "reason";
	
	/**
	 * SOALFAULT（エラー詳細）
	 */
	private static final String SOAP_FAULT_STRING = "detail";
// IT1-2015-0000094 2015/09/03 ADD START
	
	// ■■■■■ 改修 フロアリミット対応 2012/05/15 M.IKUMA START ■■■■■
		// ■■■■■ 改修 フロアリミットCH向け対応 2012/06/06 M.IKUMA START ■■■■■
	/** 入会オーソリ .*/
	private static final String NYKI_O = "02";
	/** フロアリミットオーソリ .*/
	private static final String F_LIMIT_O = "01";
		// ■■■■■ 改修 フロアリミットCH向け対応 2012/06/06 M.IKUMA END ■■■■■
	// ■■■■■ 改修 フロアリミット対応 2012/05/15 M.IKUMA END ■■■■■

	// ANK-3846-09-00 ADD START
	// ANK-4682-00-00 MOD START オーバーライド先で使用するためアクセス修飾子をpublicに変更
//	/** テーブル(カード受付情報)*/
//	private static final String D_TBL_NAME_KK_T_CARD_UK_INFO = "KK_T_CARD_UK_INFO";
//
//	/** シーケンス(カード受付情報履歴番号)*/
//	private static final String SEQ_CARD_UK_INFO_RIREKI_NO = "SEQ_CARD_UK_INFO_RIREKI_NO";
	/** テーブル(カード受付情報)*/
	public static final String D_TBL_NAME_KK_T_CARD_UK_INFO = "KK_T_CARD_UK_INFO";

	/** シーケンス(カード受付情報履歴番号)*/
	public static final String SEQ_CARD_UK_INFO_RIREKI_NO = "SEQ_CARD_UK_INFO_RIREKI_NO";
	// ANK-4682-00-00 MOD END オーバーライド先で使用するためアクセス修飾子をpublicに変更

	/** 電文種別判定用項目（カード決済オーソリ電文） */
	public static final String TELEGRAM_KIND_020 = "020";

	/** 決済金額 */
	public static final String CR_AMOUNT = "CR_amount";

	/** カード預りＩＤ */
	public static final String CR_CARDAZKRIID = "CR_cardAzkriId";

	/** マーチェント取引ID */
	public static final String CR_MERCHANTDEALID = "CR_merchantDealId";

	/** オーソリ実施区分：2(有効性チェック) */
	public static final String AUTHORI_JSSI_DIV_KBN_2 = "2";

	/** オーソリ実施区分：3(実額オーソリ) */
	public static final String AUTHORI_JSSI_DIV_KBN_3 = "3";

	// ANK-3846-09-00 ADD END

	/**
	 * ロガー設定
	 * 
	 * @param commonItem
	 */
	protected void setlogger(JBSbatCommonItem commonItem)
	{
		log = commonItem.getLogPrint();
	}
	
	/**
	 * ペイジェントHTTPSリクエスト独自処理部品です。
	 * @param inMap メッセージ
	 * @param toType 01:フロアリミットオーソリ 02:入会オーソリ
	 * @throws Exception エラー全般
	 */
	@SuppressWarnings("unchecked")
	// ■■■■■ 改修 フロアリミット対応 2012/05/15 M.IKUMA START ■■■■■
		// ■■■■■ 改修 フロアリミットCH向け対応 2012/06/06 M.IKUMA START ■■■■■
	// 引数で宛先URLを入会オーソリかフロアリミットオーソリか分ける
	// ANK-3846-00-00 MOD START
	// protected void execute(HashMap inMap, String toType) throws Exception
	protected void execute(HashMap inMap, String toType, JBSbatCommonItem commonItem) throws Exception
	// ANK-3846-00-00 MOD END
		// ■■■■■ 改修 フロアリミットCH向け対応 2012/06/06 M.IKUMA END ■■■■■
	// ■■■■■ 改修 フロアリミット対応 2012/05/15 M.IKUMA END ■■■■■
	{
		log.printDebugLog(PGID + "#execute start");
		// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA START -----
		// 情報ログを出力する
		log.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1140AI, new String[] {});
		// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA END -----
		
		// ANK-3846-00-00 ADD START
		// スタブ利用フラグ設定
		String stb_use_flg = "";
		
		// ペイジェントシステム接続モードを取得
		String sys_mode = JCCBatCommon.getApplicationConst("PAYGENT_CONNECTION_MODE");
		
		// スタブ利用フラグを決定
		if(sys_mode.equals(PAYGENT_SYSTEM))
		{
			// "利用なし"を設定
			stb_use_flg = "0";
		}
		else if(sys_mode.equals(PAYGENT_STUB))
		{
			// "利用あり"を設定
			stb_use_flg = "1";
		}
		
		// オーソリ依頼連携を実施
		// 預かりIDを取得
		String card_azkri_id = (String)inMap.get(JBSbatKKIFE001.CR_CARDAZKRIID);
		
		// 取得した預かりIDの1文字目を保持
		String stb_key = card_azkri_id.substring(0, 1);
		
		// スタブ利用フラグが"1：利用あり"かつ預かりIDの1文字目が"9"以外の場合、スタブテーブルを利用
		if ("1".equals(stb_use_flg) && !"9".equals(stb_key))
		{
			try
			{
				// テーブル取得スタブ用、
				JKKBatPaygentStbInfo instance = JKKBatPaygentStbInfo.getInstance();
				// テーブルのコネクションを取得して、部品に受け渡しを行う。
				Connection con = commonItem.getConnection();
				// ロガー設定
				instance.setlogger(commonItem);
				// ペイジェントシステムオーソリ連携処理部品（スタブ）処理を実行
				Hashtable<String,Object> ret = instance.ctrlPaygentAuthStb(inMap, con);
				// 処理結果コード変換部品
				resultPut(inMap, ret);

				// ANK-3846-09-00 ADD START
				// カード受付情報登録処理の呼出し
				entryKkTCardUkInfo(commonItem, inMap, ret);
				// ANK-3846-09-00 ADD END

				log.printDebugLog(PGID + "#execute end");
				// 情報ログを出力する
				log.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1190AI, new String[] {});
			}
			catch(Exception ex)
			{
				throw new CAANRuntimeException(ex);
			}
		}
		else
		{
		// ANK-3846-00-00 ADD END
			HttpURLConnection conn = null;
			BufferedReader reader = null;
			URL url = null;
			String strUrl = null;
			String strApiNm = null;
			int timeout = 0;
			int retryCount = 0;
			int retryInterval = 0;
			
			/*-----------------------------
			 * パラメータ設定
			 *----------------------------*/
			try
			{
				//system.properties設定値取得
				// ■■■■■ 改修 フロアリミット対応 2012/05/15 M.IKUMA START ■■■■■
					// ■■■■■ 改修 フロアリミットCH向け対応 2012/06/06 M.IKUMA START ■■■■■
				if(F_LIMIT_O.equals(toType))
				{
					// フロアリミットオーソリ対応
					// ANK-3846-00-00 MOD START
					// strUrl = JCCBatCommon.getApplicationConst("CH_CLEARPASS_URL");
					// strApiNm = JCCBatCommon.getApplicationConst("CH_CLEARPASS_APINAME");
					strUrl = JCCBatCommon.getApplicationConst("KK_PAYGENT_URL");
					strApiNm = JCCBatCommon.getApplicationConst("KK_PAYGENT_APINAME");
					// ANK-3846-00-00 MOD END
				}
				else if(NYKI_O.equals(toType))
				{
					// フロアリミットオーソリ以外は入会オーソリ対応
					strUrl = JCCBatCommon.getApplicationConst("KK_CLEARPASS_URL");
					strApiNm = JCCBatCommon.getApplicationConst("KK_CLEARPASS_APINAME");
				}
				else
				{
					// 宛先引数が不正
					String[] msgParam = new String[] { "オーソリ種別コード:" + toType };
					throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0090TE, msgParam);
				}
					// ■■■■■ 改修 フロアリミットCH向け対応 2012/06/06 M.IKUMA END ■■■■■
				// ■■■■■ 改修 フロアリミット対応 2012/05/15 M.IKUMA END ■■■■■
				// ANK-3846-00-00 MOD START
				// timeout = Integer.parseInt(JCCBatCommon.getApplicationConst("KK_CLEARPASS_TIMEOUT"));
				// retryCount = Integer.parseInt(JCCBatCommon.getApplicationConst("KK_CLEARPASS_RETRYCOUNT"));
				// retryInterval = Integer.parseInt(JCCBatCommon.getApplicationConst("KK_CLEARPASS_RETRYINTERVAL"));
				timeout = Integer.parseInt(JCCBatCommon.getApplicationConst("KK_PAYGENT_TIMEOUT"));
				retryCount = Integer.parseInt(JCCBatCommon.getApplicationConst("KK_PAYGENT_RETRYCOUNT"));
				retryInterval = Integer.parseInt(JCCBatCommon.getApplicationConst("KK_PAYGENT_RETRYINTERVAL"));
				// ANK-3846-00-00 MOD END
				
				// ANK-3846-00-00 ADD START
				// マーチャントID取得
				String merchantId = JKKBatCommon.getWorkParamSetteValue(commonItem,"PAYGENT_MERCHANT_ID");
				inMap.put(MERCHANT_ID, merchantId);
				// ANK-3846-00-00 ADD END

				// アプリケーションプロパティ設定チェック
				if(isNullBlunk(strUrl) || isNullBlunk(strApiNm))
				{
					inMap.put(EXE_STATUS, S_AUTH_SYSERR);
					return;
				}
			}
			catch (NumberFormatException ne)
			{
				inMap.put(EXE_STATUS, S_AUTH_SYSERR);
				return;
			}

			/*-----------------------------
			 * ＳＳＬ通信設定
			 *----------------------------*/
			// 通信方式判定
			boolean bSslFlg = false;
			if(strUrl.startsWith(S_HTTPS))
			{
				bSslFlg = true;
			}
			
			// SSL通信の場合、キーマネージャを生成
			if(bSslFlg)
			{
				KeyManager[] km = null;
				TrustManager[] tm = { new X509TrustManager() {

					/**
					 * X509Certificateスタブメソッド
					 * @return null
					 */
					public java.security.cert.X509Certificate[] getAcceptedIssuers() 
					{
						return null;
					}

					/**
					 * checkClientTrustedスタブメソッド
					 * @param arg0
					 * @param arg1
					 * @throws CertificateException
					 */
					public void checkClientTrusted(
							java.security.cert.X509Certificate[] arg0, String arg1)
							throws CertificateException 
					{
						// 自動生成されたメソッドスタブ
					}

					/**
					 * checkServerTrustedスタブメソッド
					 * @param arg0
					 * @param arg1
					 * @throws CertificateException
					 */
					public void checkServerTrusted(
							java.security.cert.X509Certificate[] arg0, String arg1)
							throws CertificateException 
					{
						// 自動生成されたメソッドスタブ
					}
				} };
				SSLContext sslcontext = SSLContext.getInstance(S_SSL);
				sslcontext.init(km, tm, new SecureRandom());
				HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
					
					/**
					 * verifyスタブメソッド
					 * @param aHostname
					 * @param aSession
					 * @return ペイジェントAPIへのリクエストパラメータ
					 */
					public boolean verify(String aHostname, SSLSession aSession) 
					{
						return true;
					}
				});
				HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
			}
			
			/*-----------------------------
			 * ペイジェント呼び出し
			 *----------------------------*/
			// URL生成
			url = new URL(strUrl + strApiNm);
			// ■■■■■ 改修 フロアリミットCH向け対応 2012/06/06 M.IKUMA START ■■■■■
			log.printDebugLog(PGID + "#送信URLパラメータ" + url);
			// ■■■■■ 改修 フロアリミットCH向け対応 2012/06/06 M.IKUMA END ■■■■■
// IT1-2015-0000094 2015/09/03 ADD START
			// リクエスト結果読込用ストリーム
			InputStream is = null;
// IT1-2015-0000094 2015/09/03 ADD END

			for(int i = 0 ; i < retryCount ; i++)
			{
				try
				{
// 2012/09/05 ST1-2012-0000477 add start
					// アプリケーションプロパティよりProxy設定値を取得
					String strPrxyHost = JCCBatCommon.getApplicationConst("KK_HTTPS_PROXY_HOST");
					String strPrxyPort = JCCBatCommon.getApplicationConst("KK_HTTPS_PROXY_PORT");
					
					int intProxyPort = 0;
// 2012/10/26 IT1-2012-0001670 chg start
//					if(strPrxyHost != null)
					if(strPrxyHost != null && !"".equals(strPrxyHost))
// 2012/10/26 IT1-2012-0001670 chg end
					{
						intProxyPort = Integer.parseInt(strPrxyPort);
					}
// 2012/09/05 ST1-2012-0000477 add end
					
					// SSLの場合、HttpsURLConnectionへキャスト
					if(bSslFlg)
					{
// 2012/09/05 ST1-2012-0000477 add start
						// Proxy設定値がある場合はProxyをセットしてコネクションをオープン
// 2012/10/26 IT1-2012-0001670 chg start
//						if(strPrxyHost != null
//								&& strPrxyPort != null)
						if(strPrxyHost != null && !"".equals(strPrxyHost)
								&& strPrxyPort != null && !"".equals(strPrxyPort))
// 2012/10/26 IT1-2012-0001670 chg end
						{
							Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(strPrxyHost, intProxyPort));
							conn = (HttpsURLConnection)url.openConnection(proxy);
						}
						else
						{
							conn = (HttpsURLConnection)url.openConnection();
						}
// 2012/09/05 ST1-2012-0000477 add end
// 2012/09/05 ST1-2012-0000477 del start
//						conn = (HttpsURLConnection)url.openConnection();
// 2012/09/05 ST1-2012-0000477 del end
						log.printDebugLog(PGID + "#HttpsURLConnection openConnection");
					}
					else
					{
						conn = (HttpURLConnection)url.openConnection();
						log.printDebugLog(PGID + "#HttpURLConnection openConnection");
					}
					
					// リクエスト設定
					conn.setRequestMethod(S_POST);
					conn.setDoOutput(true);
					conn.setInstanceFollowRedirects(true);
					// ANK-3846-00-00 ADD START
					conn.setRequestProperty("Accept-Language", "jp");
					// 未設定の場合は「Content-Type:application/x-www-form-urlencoded」となる
					conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + S_CHR_CODE);
					// ANK-3846-00-00 ADD END
					
					//タイムアウト設定
					conn.setReadTimeout(timeout);
					
					//POSTパラメータストリームの生成
					OutputStream os = conn.getOutputStream();
					PrintStream ps = new PrintStream(os);

					/*
					 * 送信パラメータ作成
					 */
					String reqStr = requestParamMake(inMap);
					log.printDebugLog(PGID + "#reqParam=" + reqStr);
					ps.print(reqStr);
					ps.close();
					
					// 接続開始ログ
					log.printDebugLog(PGID + "#connect start");
					// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA START -----
					// 情報ログを出力する
					log.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1150AI, new String[] {String.valueOf(i + 1)});
					// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA END -----
					
					/*
					 * 接続実行
					 */
					conn.connect();
					
					// 接続終了ログ
					log.printDebugLog(PGID + "#connect end");
					// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA START -----
					// 情報ログを出力する
					log.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1160AI, new String[] {});
					// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA END -----
					
					int statusCode = 500;
					statusCode = conn.getResponseCode();
					
// IT1-2015-0000096 2015/09/14 ADD START
					log.printDebugLog(PGID + "#statusCode=" + statusCode);
// IT1-2015-0000096 2015/09/14 ADD END

// IT1-2015-0000094 2015/09/03 DEL START
//					// リクエスト結果読み出し
//					InputStream is = conn.getInputStream();
//					// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA START -----
//					// 情報ログを出力する
//					log.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1170AI, new String[] {});
//					// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA END -----
//					reader = new BufferedReader(new InputStreamReader(is, S_CHR_CODE));
//					
//					String s = null;
//// IT1-2015-0000094 2015/08/31 ADD START
//					HashMap<String,String> resultMap = new HashMap<String,String>(25);
//// IT1-2015-0000094 2015/08/31 ADD END
//					for(s = reader.readLine() ; null != s ; s = reader.readLine())
//					{
//// IT1-2015-0000094 2015/08/31 DEL START
////						if(s.startsWith(S_KEY_HEAD)) 
////						{
//// IT1-2015-0000094 2015/08/31 DEL END
//							String delim = S_DELIM_TAB;
//							// レスポンス読込結果をキーと値に分割
//							StringTokenizer token = new StringTokenizer(s, delim);
//							if (token.countTokens() != 2) 
//							{
//								continue;
//							}
//							String key = token.nextToken();
//							String value = token.nextToken();
//// IT1-2015-0000094 2015/08/31 DEL START
//						// クリアパスAPI処理結果をmapへ格納
////						resultPut(inMap, key, value);
//// IT1-2015-0000094 2015/08/31 DEL END
//// IT1-2015-0000094 2015/08/31 ADD START
//						// クリアパスAPI処理結果をマップに格納する
//						resultMap.put(key, value);
//// IT1-2015-0000094 2015/08/31 ADD END
//							log.printDebugLog(PGID + "#resKey=" + key);
//							log.printDebugLog(PGID + "#resValue=" + value);
//// IT1-2015-0000094 2015/08/31 DEL START
////						}
//// IT1-2015-0000094 2015/08/31 DEL END
//					}
//					
//// IT1-2015-0000094 2015/08/31 ADD START
//					resultPut(inMap, resultMap);
//// IT1-2015-0000094 2015/08/31 ADD END
//					
//					reader.close();
// IT1-2015-0000094 2015/09/03 DEL END
					
// IT1-2015-0000094 2015/09/03 ADD START
				Hashtable<String, Object> ret = new Hashtable<String, Object>();
				// ANK-3846-00-00 DEL START
//				Transformer transformer = null;
//				Document responseXml = null;
//				StringWriter sw = null;
//				Document requestXml = null;
//				String request = null;
//				String response = null;
//				
//				TransformerFactory transformerFactory = TransformerFactory.newInstance();
//				transformer = transformerFactory.newTransformer();
//				
//				//XML形式
//				transformer.setOutputProperty(OutputKeys.METHOD, "xml");
				// ANK-3846-00-00 DEL END

// IT1-2015-0000096 2015/09/14 ADD START
					log.printDebugLog(PGID + "#SOAPレスポンス受信 START");
// IT1-2015-0000096 2015/09/14 ADD END
					is = conn.getInputStream();
					// ANK-3846-00-00 ADD START
					reader = new BufferedReader(new InputStreamReader(is, SJIS));
					String s = null;
					
					for(s = reader.readLine() ; null != s ; s = reader.readLine())
					{
						// 読込んだ文字列が空白またはnullの場合、
						if (isNullBlank(s)) {
							// レスポンスの読込処理をスキップする
							continue;
						}
						
						String delim = S_SEP_EQ;
						// レスポンス読込結果をキーと値に分割
						StringTokenizer token = new StringTokenizer(s, delim);
						// 値がない場合
						if (token.countTokens() != 2) 
						{
							String key = token.nextToken();
							String value = "";
							//ペイジェントAPI処理結果をマップに格納する
							ret.put(key, value);	
						}
						// 値がある場合
						else
						{
							String key = token.nextToken();
							String value = token.nextToken();
							//ペイジェントAPI処理結果をマップに格納する
							ret.put(key, value);	
						}
					}
					// ANK-3846-00-00 ADD END
					// ANK-3846-00-00 DEL START
//					DOMResult dr = new DOMResult();
//					transformer.transform(new StreamSource(is), dr);
//					responseXml = (Document)dr.getNode();
					// ANK-3846-00-00 DEL END
// IT1-2015-0000096 2015/09/14 ADD START
					log.printDebugLog(PGID + "#SOAPレスポンス受信 END");
// IT1-2015-0000096 2015/09/14 ADD END

					// ANK-3846-00-00 DEL START
//					/**
//					 * 下り電文のログ出力
//					 */
//					sw = new StringWriter();
//					transformer.transform(new DOMSource(responseXml), new StreamResult(sw));
//					response = sw.toString();
					// ANK-3846-00-00 DEL END

					/**
					 * SOAPレスポンス読込処理
					 */
// IT1-2015-0000096 2015/09/14 ADD START
					log.printDebugLog(PGID + "#SOAPレスポンス読込処理 START");
// IT1-2015-0000096 2015/09/14 ADD END
					// ANK-3846-00-00 DEL START
//					ret = read(responseXml);
					// ANK-3846-00-00 DEL END
					log.printDebugLog(PGID + "#retParam=" + ret);
					
// IT1-2015-0000096 2015/09/14 ADD START
					log.printDebugLog(PGID + "#SOAPレスポンス読込処理 END");
					
					StringBuffer sb = new StringBuffer();
					// ANK-3846-00-00 MOD START
					// sb.append("クリアパス出力結果=statusCode=");
					sb.append("ペイジェント出力結果=statusCode=");
					// ANK-3846-00-00 MOD END
					sb.append(statusCode);
					sb.append(makeLogStr(ret));
					log.printBusinessErrorLog("EKKB1200AI",
							new String[]{PGID + "#" + sb.toString()});
// IT1-2015-0000096 2015/09/14 ADD END
					
					resultPut(inMap, ret);
// IT1-2015-0000094 2015/09/03 ADD END

					// ANK-3846-09-00 ADD START
					// カード受付情報登録処理の呼出し
					entryKkTCardUkInfo(commonItem, inMap, ret);
					// ANK-3846-09-00 ADD END

					// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA START -----
					// 情報ログを出力する
					log.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1180AI, new String[] {});
					// ----- 【OM-2013-0004929】売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA END -----
					
					// ANK-3846-00-00 DEL START
//					/*
//					 * HTTP 応答メッセージから状態コードを取得し設定する。 
//					 * HTTP/1.0 200 OK
//					 * HTTP/1.0 401 Unauthorized
//					 */
//					inMap.put(EXE_STATUS, Integer.toString(statusCode));
					// ANK-3846-00-00 DEL END
					// ANK-3846-00-00 ADD START
					// 通信レスポンスコードが異常だった場合は処理結果にシステムエラーを設定
					if (statusCode != 200) 
					{
						inMap.put(JBSbatKKIFM008.CR_RESULTCODE, S_AUTH_SYSERR);
					}
					// ANK-3846-00-00 ADD END
				}

				catch(HTTPException he)
				{
					if (i < retryCount - 1)
					{
						// スリープした後、再度ペイジェント呼び出し
						log.printDebugLog(PGID + "#(HTTPException)sleep start");
						Thread.sleep(retryInterval);
						log.printDebugLog(PGID + "#(HTTPException)sleep end");
						log.printDebugLog(PGID + "#(HTTPException)retryCount=" + i);
						continue;
					}
					else
					{
						throw he;
					}
				}
				catch(IOException ie)
				{
					if (i < retryCount - 1)
					{
						// スリープした後、再度ペイジェント呼び出し
						log.printDebugLog(PGID + "#(IOException)sleep start");
						Thread.sleep(retryInterval);
						log.printDebugLog(PGID + "#(IOException)sleep end");
						log.printDebugLog(PGID + "#(IOException)retryCount=" + i);
						continue;
					}
					else
					{
						throw ie;
					}
				}
				finally
				{
					if (reader != null)
					{
						reader.close();
					}
					if (conn != null)
					{
						conn.disconnect();
						conn = null;
					}
					log.printDebugLog(PGID + "#execute end");
				}
				// ----- 改修 売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA START -----
				// 情報ログを出力する
				log.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1190AI, new String[] {});
				// ----- 改修 売上オーソリ送受信ログ追加対応 2013/12/26 H.HAZAMA END -----
				break;
			}
		// ANK-3846-00-00 ADD START	
		}
		// ANK-3846-00-00 ADD END
	}

	/**
	 * ペイジェントAPIに対して送信するリクエストパラメータを作成する。
	 * @param inMap メッセージキャリア
	 * @return ペイジェントAPIへのリクエストパラメータ
	 */
	@SuppressWarnings("unchecked")
	protected abstract String requestParamMake(HashMap inMap);
	
	
	/**
	 * ペイジェントAPI処理結果を格納する。
	 * @param inMap メッセージキャリア
	 * @param key レスポンスキー
	 * @param value レスポンスバリュー
	 */
	@SuppressWarnings("unchecked")
// IT1-2015-0000094 2015/08/31 MOD START
//	protected abstract void resultPut(HashMap inMap, String key, String value);
	protected abstract void resultPut(HashMap inMap, Hashtable<String,Object> resultMap);
// IT1-2015-0000094 2015/08/31 MOD END
	
	/**
	 * ＮＵＬＬ、空文字の場合はtrueを返却します。
	 * 
	 * @param str
	 * @return boolean
	 */
	protected boolean isNullBlunk(String str)
	{
		if (str == null || "".equals(str))
		{
			return true;
		}
		return false;
	}
	
// IT1-2015-0000094 2015/09/03 ADD START
	/**
	 * 電文読み込み処理
	 * @param soapResponse
	 * @return XML電文解析結果
	 * @throws IOException
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 */
	private Hashtable<String, Object> read(Document soapResponse) 
	throws IOException,ParserConfigurationException,SAXException
	{
		// レスポンス解析
		Element root =  soapResponse.getDocumentElement();//ルート要素(<SOAP-ENV:Envelope>)	
		Hashtable<String, Object> result = analyzeXml(root, true);

		return result;
	}
	
	/**
	 * XMLFAULT電文解析処理
	 * 
	 * @param elem XMLFAULT電文
	 * @return ArrayListエラー情報
	 */
	private String analyzeFaultXml(Node elem) 
	{
		Node node = elem.getFirstChild();
		String errmsg = "";
		
		while(node != null)
		{
			if(node.getNodeType() == Node.ELEMENT_NODE) 
			{
				String nodename = node.getLocalName();
				
				if(SOAP_FAULT_CODE.equals(nodename.toLowerCase()))
				{
					Node child = node.getFirstChild();
					if(child != null)
					{
						errmsg = errmsg + "エラーコード：" + child.getTextContent();
					}
				}
				if(SOAP_FAULT_STRING.equals(nodename.toLowerCase()))
				{
					errmsg = errmsg + "エラー詳細：" + node.getTextContent();
				}
			}
			
			node = node.getNextSibling();
		}
		
		return errmsg;
	}
	
	/**
	 * コマンド送信戻り電文解析処理
	 * @param elem コマンド解析電文rootXML要素
	 * @param rootflag ルートフラグ
	 * @return XML解析結果
	 */
	public Hashtable<String, Object> analyzeXml(Node elem, boolean rootflag) 
	{
		Node node = elem.getFirstChild();
		Hashtable<String, Object> resultMap = null;
		List<Map<String, Object>>Bodynodelist = new ArrayList<Map<String, Object>>();
		
		//電文の要素をすべて解析する。
		while(node != null)
		{
// IT1-2015-0000096 2015/09/14 ADD START
			log.printDebugLog(PGID + "#" + node.getLocalName() + "：" + node.getTextContent());
// IT1-2015-0000096 2015/09/14 ADD END
			
			if(node.getNodeType() == Node.ELEMENT_NODE) 
			{
				
				String nodename = node.getLocalName();
				String typeValue = null;
				if(node.getAttributes().getNamedItem("type") != null){
					typeValue = node.getAttributes().getNamedItem("type").getNodeValue();
				}
				
				String childname = "";
				
				NodeList nodelist = node.getChildNodes();
				if(nodelist != null)
				{
					for(int i = 0 ; i < nodelist.getLength() ; i++)
					{
						Node child = nodelist.item(i);
						
						if(child.getNodeType() == Node.ELEMENT_NODE)
						{
							childname = child.getLocalName();
							break;
						}
					}
				}
				
				// SOAP例外の場合
				if(SOAP_FAULT.equals(nodename.toLowerCase()) || SOAP_FAULT.equals(childname.toLowerCase()))
				{
					resultMap = new Hashtable<String, Object>();
					String faultinfo = analyzeFaultXml(node);
					resultMap.put(CMD_RESULT_CD,"1");
					resultMap.put(CMD_ERROR_MESSAGE,faultinfo);	
					return resultMap;
				}
				else
				{
					if(resultMap == null) {
						resultMap = new Hashtable<String, Object>();
					}
					Hashtable<String, Object>resultinfo = analyzeXml(node, false);
					if(RECORD.equals(nodename) || SERVICEIF.equals(nodename) || Arrays.asList(typeValues).contains(typeValue))
					{
						if(resultinfo != null && !resultinfo.isEmpty())
						{
							Bodynodelist.add(resultinfo);
						}
						
						resultMap.put(nodename,Bodynodelist);
					
					}
					
					else if(Arrays.asList(tagNames).contains(nodename))
					{
						resultMap.putAll(analyzeXml(node, false));
					}
					else
					{
						resultMap.put(nodename,node.getTextContent());
						if(node.getAttributes().getNamedItem("err") != null)
						{
							String StrErr = node.getAttributes().getNamedItem("err").getTextContent();
							resultMap.put(nodename + "_ERR", StrErr);
						}
					}
					
				}
			}
			
			node = node.getNextSibling();
		}
		
		if(rootflag)
		{
			if(resultMap == null)
			{
				resultMap = new Hashtable<String, Object>();
			}
			
			resultMap.put(CMD_RESULT_CD,"0");
			return resultMap;
		}
		
		return resultMap;
	}
	
// IT1-2015-0000094 2015/09/03 ADD END

// IT1-2015-0000096 2015/09/14 ADD START	
	/**
	 * ペイジェントからの返却結果をログに出力するため編集を行う
	 * 編集内容
	 *   key名がカード番号(card_no)の場合はマスキング処理を行う
	 * @param ret ペイジェントからの返却結果
	 * @return ログ出力用文字列
	 */
	private String makeLogStr(Hashtable<String, Object> ret){
	
		//ログ用文字列組み立て用の変数を宣言する
		StringBuilder sb = new StringBuilder();
		
		//ペイジェントからの返却結果よりkeyリストを取得する
		Enumeration keys = ret.keys();
		
		//取得したkeyの件数分ループを行う
		while(keys.hasMoreElements()){
			
			//valueを取得するためkeyを取得する
			String key = (String)keys.nextElement();
			//keyを元にvalueを取得する
			String value = (String)ret.get(key);
			
			//keyがカード番号（card_no)の場合value(カード番号）をマスキングする
			if("inquire_card_no".equals(key)){
				value = "***";
			}
	
			//カード番号以外の場合は、返却結果のそのまま出力する
			sb.append(key + "=" + value + ",");
			
		}
		
	
		return sb.toString();
	}
// IT1-2015-0000096 2015/09/14 ADD END
// ANK-3846-09-00 ADD START
	/**
	 * カード受付情報登録
	 * @param commonItem バッチ共通パラメータ電文
	 * @param inData  API呼出し時の送信情報
	 * @param retData API呼出し時の返却情報
	 */
	@SuppressWarnings("unchecked")
	// ANK-4682-00-00 MOD START オーバーライド先で使用するためアクセス修飾子をprotectedに変更
//	private void entryKkTCardUkInfo(JBSbatCommonItem commonItem, HashMap inData, Hashtable<String, Object> retData) 
	protected void entryKkTCardUkInfo(JBSbatCommonItem commonItem, HashMap inData, Hashtable<String, Object> retData) 
	// ANK-4682-00-00 MOD END オーバーライド先で使用するためアクセス修飾子をprotectedに変更
	throws Exception
	{
		// カード受付情報
		JBSbatSQLAccess dbKkCardUkInfo = JCRBatCommon.getDataAccessObj(commonItem, D_TBL_NAME_KK_T_CARD_UK_INFO);
		JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface();

		// カード受付情報履歴番号をシーケンスより取得
		String cardUkInfoRrkNO = JBSbatOracleSeqUtil.getFormatedNextSeq(commonItem.getConnection(), SEQ_CARD_UK_INFO_RIREKI_NO, "", 12);

		// カード受付情報履歴番号
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.CARD_UK_INFO_RIREKI_NO, cardUkInfoRrkNO);

		// 処理年月日
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.TRN_YMD, JCCBatCommon.getSysDate());
		
		// レスポンス詳細を取得
		String response_detail = (String)retData.get(RESPONSE_DETAIL);
		
		if (!isNullBlank(response_detail)) {
			// レスポンス詳細がnullまたは""でない場合、
			// レスポンス詳細より"(ダブルクォーテーション)を削除する
			response_detail = response_detail.replaceAll("\"", "");
		} else {
			response_detail = "";
		}
		
		// オーソリ結果変換部品インスタンスを作成
		JCNAuthResultCdConvertUtil convertUtil = new JCNAuthResultCdConvertUtil(
							(String)retData.get(RESULT), 
							(String)retData.get(RESPONSE_CODE), 
							response_detail, 
							(String)retData.get("masked_card_number"), 
							(String)retData.get("debit_prepaid_type"),
							(String)retData.get("card_brand"),
							(String)retData.get("card_valid_term"));

		String seikyAmnt = (String) inData.get(CR_AMOUNT);
		if ("1".equals(seikyAmnt))
		{
			// オーソリ実績区分
			inMap.setValue(JBSbatKK_T_CARD_UK_INFO.AUTHORI_JSSI_DIV, AUTHORI_JSSI_DIV_KBN_2);
		}
		else 
		{
			// オーソリ実績区分
			inMap.setValue(JBSbatKK_T_CARD_UK_INFO.AUTHORI_JSSI_DIV, AUTHORI_JSSI_DIV_KBN_3);
		}
		// サイトID（コンシューマ）
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.SITE_ID, JKKBatConst.CONSUMER_SITE_ID);
		// マーチャント取引ID
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.MERCHANT_DEAL_ID, (String)inData.get(CR_MERCHANTDEALID));
		// 決済金額
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.KSSAI_AMNT, seikyAmnt);
		// カード預かりID
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.CARD_AZKRI_ID, (String)inData.get(CR_CARDAZKRIID));

		// 決済ID
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.KSSAI_ID, retData.get("payment_id"));
		// 処理結果
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.TRN_RSLT, retData.get("result"));
		// オーソリ結果応答コード
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.AUTH_RSLT_RSP_CD, retData.get("response_code"));
		// オーソリ結果応答詳細
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.AUTH_RSLT_RSP_DTL, response_detail);
		// カード発行会社コード
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.CARD_HAKKO_COMP_CD, retData.get("issur_id"));
		// カード発行会社名
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.CARD_HAKKO_COMP_NM, retData.get("issur_name"));
		// フィンガープリント
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.FINGERPRINT, retData.get("fingerprint"));
		// カード番号の変換処理
		String card_no = convertUtil.convertCreCardNo();
		// マスクされたカード番号が存在しない場合、""(空)を返却
		if (!isNullBlank(card_no)) {
			// カード番号への暗号化処理
			card_no = JCCBatCommon.getEncryptResultPassword(card_no);
		}
		
		// マスク済カード番号
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.MASKZM_CARD_NO, card_no);
		// カード有効期限
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.CARD_YK_KIGEN, retData.get("card_valid_term"));
		// 仕向先カード会社コード
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.SHIKOSAKI_CARD_COMP_CD, retData.get("acq_id"));
		// 仕向先カード会社名
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.SHIKOSAKI_CARD_COMP_NM, retData.get("acq_name"));
		// イシュア区分
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.ISSUER_DIV, retData.get("issur_class"));
		// カード種別
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.CARD_SBT, retData.get("debit_prepaid_type"));
		// カードブランド
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.CARD_BRAND, retData.get("card_brand"));
		// ACS支払人認証要求HTML
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.ACSPAYER_NINSHO_YOKYU_HTML, retData.get("out_acs_html"));
		// ATTEMPT区分
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.ATTEMPT_DIV, retData.get("attempt_kbn"));
		// 承認番号
		inMap.setValue(JBSbatKK_T_CARD_UK_INFO.SHONIN_NO, retData.get("shonin_no"));
		
		// ◆ 登録
		dbKkCardUkInfo.insertByPrimaryKeys(inMap);
	}

	/**
	 * null又は空文字の場合、trueを返却する
	 * 
	 * @param str 検査対象文字列
	 * @return true:null、又は空文字／false:左記以外
	 */
	private boolean isNullBlank(String str)
	{
		if (null == str || "".equals(str))
		{
			return true;
		}
		return false;
	}
// ANK-3846-09-00 ADD END
}
