package com.unionpay.acp.demo;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.unionpay.acp.sdk.AcpService;
import com.unionpay.acp.sdk.LogUtil;
import com.unionpay.acp.sdk.SDKConfig;

/**
 * 重要：联调测试时请仔细阅读注释！
 * 
 * 产品：综合认证服务产品<br>
 * 交易：企业信息认证（前台）<br>
 * 日期： 2018-03<br>
 * 版本： 1.0.0 
 * 版权： 中国银联<br>
 * 声明：以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己需要，按照技术文档编写。该代码仅供参考，不提供编码，性能，规范性等方面的保障<br>
 */
public class Form_5_21_Enterprise_Info_Identification_Front extends HttpServlet {

	@Override
	public void init(ServletConfig config) throws ServletException {
		/**
		 * 请求银联接入地址，获取证书文件，证书路径等相关参数初始化到SDKConfig类中
		 * 在java main 方式运行时必须每次都执行加载
		 * 如果是在web应用开发里,这个方法可使用监听的方式写入缓存,无须在这出现
		 */
		//这里已经将加载属性文件的方法挪到了web/AutoLoadServlet.java中
		//SDKConfig.getConfig().loadPropertiesFromSrc(); //从classpath加载ccs_sdk.properties文件
		super.init();
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		String merId = req.getParameter("merId");
		String orderId = req.getParameter("orderId");
		String txnTime = req.getParameter("txnTime");
		String productId = req.getParameter("productId");
		String businessLicenseRegNo = req.getParameter("businessLicenseRegNo");
		String legalRepreNm = req.getParameter("legalRepreNm");
		String registeredAddr = req.getParameter("registeredAddr");
		String comNm = req.getParameter("comNm");
		
		Map<String, String> data = new HashMap<String, String>();
		
		/***银联全渠道系统，产品参数，除了encoding自行选择外其他不需修改***/
		data.put("version", DemoBase.version);                 //版本号
		data.put("encoding", DemoBase.encoding);               //字符集编码 可以使用UTF-8,GBK两种方式
		data.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法
		data.put("txnType", "83");                             //交易类型 00-默认
		data.put("txnSubType", "00");                          //交易子类型  默认00
		data.put("bizType", "000803");                         //业务类型 代收

		/***商户接入参数***/
		data.put("merId", merId);                  			   //商户号码，请改成自己申请的商户号或者open上注册得来的777商户号测试
		data.put("backUrl", DemoBase.backUrl);           //后台通知地址
		data.put("orderId", orderId);                 //****商户订单号，每次发交易测试需修改为被查询的交易的订单号
		data.put("txnTime", txnTime);                 //****订单发送时间，每次发交易测试需修改为被查询的交易的订单发送时间
		data.put("backUrl", DemoBase.backUrl);                           //后台通知地址
		data.put("frontUrl", DemoBase.frontUrl);                           //在交易成功时，页面跳转至商户该URL
		data.put("frontFailUrl", DemoBase.frontFailUrl);                           //在交易失败时，页面跳转至商户该URL（不带交易信息，仅跳转）
		
		//G008：工商-企业存续状态验证（营业执照号）
		//G009：工商-注册地址验证（营业执照号、注册地址）
		//G010：工商-企业名称验证（营业执照号、企业名称）
		//G011：工商-名称+注册地验证（营业执照号、企业名称、注册地址）
		//G012：工商-法人代表验证（营业执照号、法人代表姓名）
		//G013：工商-法人+注册地验证（营业执照号、法人代表姓名、注册地址）
		//G014：工商-名称+法人验证（营业执照号、法人代表姓名、企业名称）
		//G015：工商-四要素验证（营业执照号、法人代表姓名、企业名称、注册地址）
		data.put("productId", productId);
		//如下businessLicenseRegNo,legalRepreNm，registeredAddr，comNm可以不送，在银联界面输入
		if("G008".equals(productId)) {
			data.put("businessLicenseRegNo", businessLicenseRegNo);	//营业执照号码
		} else if("G009".equals(productId)) {
			data.put("businessLicenseRegNo", businessLicenseRegNo);	//营业执照号码
			data.put("registeredAddr", registeredAddr);	//注册地址
		} else if("G010".equals(productId)) {
			data.put("businessLicenseRegNo", businessLicenseRegNo);	//营业执照号码
			data.put("comNm", comNm);//企业名称
		} else if("G011".equals(productId)) {
			data.put("businessLicenseRegNo", businessLicenseRegNo);	//营业执照号码
			data.put("registeredAddr", registeredAddr);	//注册地址
			data.put("comNm", comNm);//企业名称
		} else if("G012".equals(productId)) {
			data.put("businessLicenseRegNo", businessLicenseRegNo);	//营业执照号码
			data.put("legalRepreNm", legalRepreNm);  //法定代表人姓名
		} else if("G013".equals(productId)) {
			data.put("businessLicenseRegNo", businessLicenseRegNo);	//营业执照号码
			data.put("legalRepreNm", legalRepreNm);  //法定代表人姓名
			data.put("registeredAddr", registeredAddr);	//注册地址
		} else if("G014".equals(productId)) {
			data.put("businessLicenseRegNo", businessLicenseRegNo);	//营业执照号码
			data.put("legalRepreNm", legalRepreNm);  //法定代表人姓名
			data.put("comNm", comNm);//企业名称
		} else if("G015".equals(productId)) {
			data.put("businessLicenseRegNo", businessLicenseRegNo);	//营业执照号码
			data.put("legalRepreNm", legalRepreNm);  //法定代表人姓名
			data.put("registeredAddr", registeredAddr);	//注册地址
			data.put("comNm", comNm);//企业名称
		}
		 
		/**请求参数设置完毕，以下对请求参数进行签名并发送http post请求，接收同步应答报文------------->**/
		Map<String, String> reqData = AcpService.sign(data,DemoBase.encoding);			//报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
		String url = SDKConfig.getConfig().getZhrzFrontRequestUrl();								//交易请求url从配置文件读取对应属性文件ccs_sdk.properties中的 ccssdk.singleQueryUrl
		String html = AcpService.createAutoFormHtml(url,reqData,DemoBase.encoding);   //生成自动跳转的Html表单
		
		LogUtil.writeLog("打印请求HTML，此为请求报文，为联调排查问题的依据："+html);
		//将生成的html写到浏览器中完成自动跳转打开银联支付页面；这里调用signData之后，将html写到浏览器跳转到银联页面之前均不能对html中的表单项的名称和值进行修改，如果修改会导致验签不通过
		resp.getWriter().write(html);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
}
