import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;

import java.util.Hashtable;
import java.io.IOException;

import Jp.BuySmart.JPGWLib.*;

/**
 * <p>ベリトランスペイメントゲートウェイに接続するための
 *    サーブレットコントローラー　サンプル</p>
 *
 *
 * @author VeriTrans, Inc.
 * @version 1.0, 2004/10 created.
 */
public class PaymentController extends HttpServlet {
	/**
	* <p>GETリクエストを処理するメソッド</p>
	* @param request HttpServletRequest HTTPサーブレットリクエスト
	* @param response HttpServletResponse HTTPサーブレットレスポンス
	*/
	 public void doGet(HttpServletRequest request,
						HttpServletResponse response)
		throws ServletException, IOException {

		// サーブレットコンテキストを取得
		ServletContext context = getServletContext();
		// JSPテンプレートディレクトリのパスを取得
		// プロパティーファイルを取得
		String propertiesFile
			= (String)context.getInitParameter("propertiesFile");
		
		String jspTemplate
			= (String)context.getInitParameter("jspTemplate");
		// マーチャントIDを取得
		// マーチャントIDを取得
		String merchantID
			= (String)context.getInitParameter("merchantID");
		// 電子署名鍵を取得
		String signatureKey
			= (String)context.getInitParameter("signatureKey");
		// エンコード CHARSET(EUC-JP | Shift_JIS | ISO2022-JP | UTF-8)
		// 送信ページのエンコードによって設定してください。
		String encode = "EUC-JP";

		try {
			// 支払ページからのパラメータを取得
			Hashtable params = Util.getQuery(request, encode);  
			String piCCnumber = (String)params.get("PI__cc_number");
			String piCCname   = (String)params.get("PI_cc_name");
			// 数字以外を除去
			piCCnumber = Util.stripCardNumber(piCCnumber);
			String piCCexp = (String)params.get("PI__cc_expmonth");
			piCCexp += "/";
			piCCexp += (String)params.get("PI__cc_expyear");
			String ccMi  = (String)params.get("CC_MI");
			String ccSig = (String)params.get("CC_SIG");

			// Transactionのインスタンスを作成
			TransactionFactory factory = null;
			factory = new TransactionFactory(propertiesFile);
			Transaction t = factory.createInstance();

			// 署名の確認
			SignatureHelper helper = SignatureHelper.getInstance();
			// 電子署名が正い場合
			if (helper.verify(merchantID, signatureKey, ccMi, ccSig)) {
				// CC_MIから決済情報を取得
				Hashtable mi = Util.urlDecode(ccMi);
				String authtype = (String)mi.get("auth-type");
				Hashtable data = new Hashtable();
				data.put("order-id", (String)mi.get("order-id"));//取引ID
				data.put("card-number", piCCnumber);//カード番号
				data.put("card-exp", piCCexp);//有効期限
				data.put("amount", "jpy " + (String)mi.get("price"));//金額
				// 取引実行
				Hashtable result = t.sendMServer(authtype, data);
				// JSPテンプレートに渡すための情報をセット
				request.setAttribute("result", result);
				// 取引結果ページへディスパッチ
				String status = (String)result.get("MStatus");
				if (status.equals("success")) { // 取引成功
					dispatchTo(jspTemplate + "/thanks.jsp", request, response);
				}
				else { // 取引失敗
					request.setAttribute("order-id",
						(String)mi.get("order-id"));
					dispatchTo(jspTemplate + "/sorry.jsp", request, response);
				}
			}
			// 電子署名が正しくない場合
			else {
				request.setAttribute("errmsg",
					"電子署名エラーが発生しました。");
				dispatchTo(jspTemplate + "/error.jsp", request, response);
			}
		}
		// 例外処理
		catch (Exception e) {
			// 例外処理ページへディスパッチ
			System.out.println(e);
			log(e.getMessage(), e);
			request.setAttribute("errmsg", "処理異常が発生しました。");
			dispatchTo(jspTemplate + "/error.jsp", request, response);
		}
	}

	/**
	* <p>POST リクエストを処理するメソッド</p>
	* @param request HttpServletRequest HTTPサーブレットリクエスト
	* @param response HttpServletResponse HTTPサーブレットレスポンス
	*/
	public void doPost(HttpServletRequest request,
						HttpServletResponse response)
		throws ServletException, IOException {
		doGet(request, response);
	}

	/**
	* <p>JSP ページへディスパッチするメソッド</p>
	* @param jspPage ディスパッチ先の jsp ページ
	* @param request HttpServletRequest HTTPサーブレットリクエスト
	* @param response HttpServletResponse HTTPサーブレットレスポンス
	*/
	private void dispatchTo(String jspPage,
							HttpServletRequest request,
							HttpServletResponse response)
		throws ServletException, IOException {
		RequestDispatcher dispatcher = 
			getServletContext().getRequestDispatcher(jspPage);
		dispatcher.forward(request, response);
	}
}
