//
//  VeriTrans BuySmart Flex
//  adapter kit sample　CCPayment.java　Version 1.0.1
//  Copyright (c) 2001-2002 VeriTrans Inc.
//  Note: CCPayment for BuySmart Flex.
//

// CUSTOM:
//   URL を変えたいときはカスタマイズしてください
package CCAdapterSamples;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import CCKK.CCBSXLib.*;

//
// PURPOSE：
//   決済処理をおこない結果画面を出力する
//
// ATTENTION:
//
public class CCPayment extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	// Content-Type を設定する.
	response.setContentType(CCUtil.getContent());

	// 出力先をえる
	PrintWriter out = null;
	try {
	    out = CCUtil.getWriter(response);
	}
	catch (Exception e) {
	    CCCustom.temporaryDifficulties(out, "レスポンスエラー。");
	    return;
	}

	// データをえる
	Hashtable query = CCUtil.getQuery(request);

	// MI メッセージの抽出
	String ccMi = (String)query.get("CC_MI");
	if (ccMi == null) {
	    CCCustom.temporaryDifficulties(out, "MI が空です。");
	    return;
	}

	// MI メッセージの署名抽出
	String ccSig = (String)query.get("CC_SIG");
	if (ccSig == null) {
	    CCCustom.temporaryDifficulties(out, "MI の署名が空です。");
	    return;
	}

	// MDK のインスタンスを作成
	CCTransaction t = new CCTransaction(CCCustom.config);

	// 署名の確認
	String sig = t.genHash(CCCustom.merchantID, CCCustom.key, ccMi);
	if (sig.compareTo(ccSig) != 0) {
	    CCCustom.signatureError(out);
	    return;
	}

	// カード番号をえる
	String piCCnumber = (String)query.get("PI__cc_number");

	// 数字以外の除外
	piCCnumber = CCUtil.stripCardNumber(piCCnumber);

	// 入力エラーメッセージコレクション初期化
	ArrayList piErrs = new ArrayList();

	// カード番号の長さ判定
       	//if (piCCnumber.length() < 14 || piCCnumber.length() > 16) {
	if (piCCnumber.length() <= 0) {
	    piErrs.add(new String("カード番号に誤りがあります。"));
         }

	// 有効期限をえる
	String piCCexp = (String)query.get("PI__cc_expmonth");
	piCCexp += "/";
	piCCexp += (String)query.get("PI__cc_expyear");

	// カード名義をえる
	String piCCname = (String)query.get("PI_cc_name");
	if (piCCname.length() <= 0) {
	    piErrs.add(new String("カードの名前に誤りがあります。"));
	}

	// エラーメッセージの表示
	if (piErrs.size() > 0) {
	    CCCustom.piError(out, piErrs);
	    return;
	}

	// MI メッセージのデコード
	Hashtable mi = null;
	try {
	    mi = CCUtil.urlDecode(ccMi);
	}
	catch (Exception e) {
	    CCCustom.temporaryDifficulties(out, "MI メッセージのデコードに失敗しました。");
	    return;
	}

	// パラメータの生成
	Hashtable params = new Hashtable();
	String orderID = (String)mi.get("order-id");
        params.put("order-id", orderID);
        params.put("amount", (String)mi.get("price"));
	params.put("card-number", piCCnumber);
	params.put("card-exp", piCCexp);
    
	// 取引をなげる
	Hashtable result = t.sendMServer(CCCustom.authType, params);

	// 結果表示のためにレスポンスに情報を付加
	result.put("merchant-id", CCCustom.merchantID);
	result.put("version", (String)mi.get("version"));

	if (((String)result.get("MStatus")).compareTo("success") == 0) { // 成功
	    // 成功の場合の後処理を実行
	    CCCustom.storeFulfillmentInfo();

	    // 成功結果を表示
	    try {
		CCUtil.printTemplate(out, CCCustom.thanks, result);
	    }
	    catch (IOException e) {
		CCCustom.temporaryDifficulties(out, CCCustom.thanks + "&nbsp;が開けません。");
	    }
	}
	else { // 失敗
	    // 結果表示のためにレスポンスに情報を付加
	    result.put("order-id", orderID);

	    // 失敗の場合の後処理を実行
	    CCCustom.cleanUpFulfillmentInfo();

	    // 失敗結果を表示
	    try {
		CCUtil.printTemplate(out, CCCustom.sorry, result);
	    }
	    catch (IOException e) {
		CCCustom.temporaryDifficulties(out, CCCustom.sorry + "&nbsp;が開けません。");
	    }
	}
    }

}
