工商银行B2C支付接口JAVA版(未完)

工商银行银联支付接口。




发现网上的资料对于JAVA版本并不是很详细。
正好公司要做,我也边摸索边学习一下~



要做银联支付,先是测这个工商银行的接口。


给我发了一个文件:


我是用的JAVA,你们看自己用的什么看对应demo哈~微笑


首先当然是看最下面那个doc文档,里面有个发送数据和接受数据的表单,定义了很多字段。我们就是要把这个发送数据表单构造出来,传给银行,然后银行再把接收数据的表单发给我们。文档我不截图了,自己去看~百度文库也一大堆的。


参考了这个:http://www.tuicool.com/articles/YBRZNnz


下面是纯JAVA的说明。按照步骤做。测试证书和key(不在上面的文件夹里,是另外发给我的)放在D盘(之后会改成配置文件获取),导入jar包,把javaApiDemo.jsp里的password改成银行发给你的那个密码。


放到服务器上,返回如下页面:



欧卡~接下来开始正式的。


建立了一个表单对应的ICBC类和TranData类(放在一个类就可以了,我开始弄错了就分开了 ,一个类里面更省事儿)


ICBC:

package com.mvc.product.model;


public class ICBC {
	
	//必输:1,选输:2
	
    // 
//	private String orderPostUrl = "https://B2C.icbc.com.cn/servlet/ICBCINBSEBusinessServlet";
    // 1接口版本号
    private String interfaceName = "ICBC_PERBANK_B2C";
    // 1交易日期时间
    private String interfaceVersion = "1.0.0.11";

    
    // 1交易数据
    // 整合所有交易数据形成的xml明文串,并做BASE64编码;
    // 具体格式定义见下文;
    // 注意:
    // 需有xml头属性;整个字段使用BASE64编码;
    // xml明文中没有回车换行和多余空格;
    private String tranData;

    //  1订单签名数据
    //  必输,
    //	商户使用工行提供的签名API和商户证书将tranData的xml明文串进行签名,得到二进制签名数据,然后进行BASE64编码后得到可视的merSignMsg;
    //	注意:签名时是针对tranData的xml明文,不是将tranData进行BASE64编码后的串;
    private String merSignMsg;

    //  1商城证书公钥
    //  商户用二进制方式读取证书公钥文件后,进行BASE64编码后产生的字符串;
    private String merCert;

	public String getInterfaceName() {
		return interfaceName;
	}

	public void setInterfaceName(String interfaceName) {
		this.interfaceName = interfaceName;
	}

	public String getInterfaceVersion() {
		return interfaceVersion;
	}

	public void setInterfaceVersion(String interfaceVersion) {
		this.interfaceVersion = interfaceVersion;
	}

	public String getTranData() {
		return tranData;
	}

	public void setTranData(String tranData) {
		this.tranData = tranData;
	}

	public String getMerSignMsg() {
		return merSignMsg;
	}

	public void setMerSignMsg(String merSignMsg) {
		this.merSignMsg = merSignMsg;
	}

	public String getMerCert() {
		return merCert;
	}

	public void setMerCert(String merCert) {
		this.merCert = merCert;
	}

}

TranData:

public class TranData {
	
	//必输:1,选输:2
    // 1接口版本号
    private String interfaceName = "ICBC_PERBANK_B2C";
    // 1交易日期时间
    private String interfaceVersion = "1.0.0.11";
    // 1交易日期时间:目前要求在银行系统当前时间的前后十分钟范围内,否则判定交易时间非法。
    private String orderDate;
    // 1订单号:客户支付后商户网站产生的一个唯一的定单号,该订单号应该在相当长的时间内不重复。工行通过订单号加订单日期来唯一确认一笔订单的重复性。
    private Long orderid;
    // 1订单金额:客户支付订单的总金额,一笔订单一个,以分为单位。不可以为零,必需符合金额标准。
    private Double amount;
    // 1分期付款期数:取值:1、3、6、9、12、18、24;1代表全额付款,必须为以上数值,否则订单校验不通过。
    private Integer installmentTimes = 1;
    // TODO
    // 1商户账号:商户入账账号,只能交易时指定。(商户付给银行手续费的账户,可以在开户的时候指定,也可以用交易指定方式;用交易指定方式则使用此商户账号)
    private String merAcct;
	// 2商品编号
    private String goodsID = "";
    // 1商品名称
    private String goodsName = "";
    // 2商品数量
    private Integer goodsNum = 1;
    // 2已含运费金额
    private Double carriageAmt;
    // 1检验联名标志:取值“1”:客户支付时,网银判断该客户是否与商户联名,是则按上送金额扣帐,否则展现未联名错误;取值“0”:不检验客户是否与商户联名,按上送金额扣帐。
    private Integer verifyJoinFlag = 0;
    // 2语言版本:默认为中文版 。取值:“EN_US”为英文版;取值:“ZH_CN”或其他为中文版。注意:大小写敏感。
    private String language = "ZH_CN";
    // 1支付币种:用来区分一笔支付的币种,目前工行只支持使用人民币(001)支付。 取值: “001”
    private String curType = "001";
    
    //TODO
    // 1商户代码:唯一确定一个商户的代码,由商户在工行开户时,由工行告知商户。
    private String merID;
    
    // 1支持订单支付的银行卡种类:默认“2”。取值范围为0、1、2,其中0表示仅允许使用借记卡支付,1表示仅允许使用信用卡支付,2表示借记卡和信用卡都能对订单进行支付
    private Integer creditType = 2;
    // 1通知类型
    // 在交易转账处理完成后把交易结果通知商户的处理模式。
    // 取值“HS”:在交易完成后实时将通知信息以HTTP协议POST方式,主动发送给商户,发送地址为商户端随订单数据提交的接收工行支付结果的URL即表单中的merURL字段;
    // 取值“AG”:在交易完成后不通知商户。商户需使用浏览器登录工行的B2C商户服务网站,或者使用工行提供的客户端程序API主动获取通知信息。
    private String notifyType = "HS";
    // 2结果发送类型
    // 选输
    // 取值“0”:无论支付成功或者失败,银行都向商户发送交易通知信息;
    // 取值“1”,银行只向商户发送交易成功的通知信息。
    // 只有通知方式为HS时此值有效,如果使用AG方式,可不上送此项,但签名数据中必须包含此项,取值可为空。
    private Integer resultType = 1;
    
    //TODO
    // 2商户reference:上送商户网站域名(支持通配符,例如“*.某B2C商城.com”),如果上送,工行会在客户支付订单时,校验商户上送域名与客户跳转工行支付页面之前网站域名的一致性。
    private String merReference = "";
    //TODO
    // 2客户端IP:选输,工行在支付页面显示该信息。   注意: 1、	使用IPV4格式。 2、	上送的是客户端的公网IP。 3、	当商户reference项送空时,该项必输。
    private String merCustomIp = "";
    //TODO
    // 2虚拟商品/实物商品标志位:选输,取值“0”:虚拟商品; 取值“1”,实物商品。
    private Integer goodsType = 0;
    // 2买家用户号:选输,工行在支付页面显示该信息。
    private String merCustomID = "";
    // 2买家联系电话:选输,工行在支付页面显示该信息。
    private String merCustomPhone = "";
    // 2收货地址:选输,工行在支付页面显示该信息。
    private String goodsAddress = "";
    // 2订单备注:选输,工行在支付页面显示该信息。
    private String merOrderRemark = "";

    // 2商城提示
    private String merHint = "";
    // 2备注字段1
    private String remark1 = "";
    // 2备注字段2
    private String remark2 = "";
    
    // 1返回商户URL
    // 必须合法的URL,交易结束,将客户引导到商户的此url,即通过客户浏览器post交易结果信息到商户的此URL
    // 注意:该URL应使用http协议(不能使用https协议),端口号应为80或不指定。
    private String merURL = "";
    // 2返回商户变量:商户自定义,当返回银行结果时,作为一个隐藏域变量,商户可以用此变量维护session等等。由客户端浏览器支付完成后提交通知结果时是明文传输,建议商户对此变量使用额外安全防范措施,如签名、base64
    private String merVAR = "";
    
    
    // 2工银e支付注册标志:工银e支付注册标志,标识客户在支付该笔订单时,是否使用订单指定的下述信息注册工银e支付。 0-否,1-是
    private String e_isMerFlag = "";
    // 2客户姓名
    private String e_Name = "";
    // 2客户手机号:如果工银e支付注册标志e_isMerFlag上送1,则此字段必输
    private String e_TelNum = "";
    // 2客户证件类型:0:身份证     1:护照 2:军官证     3:士兵证     4:回乡证(港澳台往来通行证)     5:临时身份证     6:户口本     7:其他       9:警官证     12:外国人永久居住证       21:边民证 
    private String e_CredType = "";
    // 2客户证件号
    private String e_CredNum = "";
	public String getInterfaceName() {
		return interfaceName;
	}
	public void setInterfaceName(String interfaceName) {
		this.interfaceName = interfaceName;
	}
	public String getInterfaceVersion() {
		return interfaceVersion;
	}
	public void setInterfaceVersion(String interfaceVersion) {
		this.interfaceVersion = interfaceVersion;
	}
	public String getOrderDate() {
		return orderDate;
	}
	public void setOrderDate(String orderDate) {
		this.orderDate = orderDate;
	}
	public Long getOrderid() {
		return orderid;
	}
	public void setOrderid(Long orderid) {
		this.orderid = orderid;
	}
	public Double getAmount() {
		return amount;
	}
	public void setAmount(Double amount) {
		this.amount = amount;
	}
	public Integer getInstallmentTimes() {
		return installmentTimes;
	}
	public void setInstallmentTimes(Integer installmentTimes) {
		this.installmentTimes = installmentTimes;
	}
	public String getMerAcct() {
		return merAcct;
	}
	public void setMerAcct(String merAcct) {
		this.merAcct = merAcct;
	}
	public String getGoodsID() {
		return goodsID;
	}
	public void setGoodsID(String goodsID) {
		this.goodsID = goodsID;
	}
	public String getGoodsName() {
		return goodsName;
	}
	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}
	public Integer getGoodsNum() {
		return goodsNum;
	}
	public void setGoodsNum(Integer goodsNum) {
		this.goodsNum = goodsNum;
	}
	public Double getCarriageAmt() {
		return carriageAmt;
	}
	public void setCarriageAmt(Double carriageAmt) {
		this.carriageAmt = carriageAmt;
	}
	public Integer getVerifyJoinFlag() {
		return verifyJoinFlag;
	}
	public void setVerifyJoinFlag(Integer verifyJoinFlag) {
		this.verifyJoinFlag = verifyJoinFlag;
	}
	public String getLanguage() {
		return language;
	}
	public void setLanguage(String language) {
		this.language = language;
	}
	public String getCurType() {
		return curType;
	}
	public void setCurType(String curType) {
		this.curType = curType;
	}
	public String getMerID() {
		return merID;
	}
	public void setMerID(String merID) {
		this.merID = merID;
	}
	public Integer getCreditType() {
		return creditType;
	}
	public void setCreditType(Integer creditType) {
		this.creditType = creditType;
	}
	public String getNotifyType() {
		return notifyType;
	}
	public void setNotifyType(String notifyType) {
		this.notifyType = notifyType;
	}
	public Integer getResultType() {
		return resultType;
	}
	public void setResultType(Integer resultType) {
		this.resultType = resultType;
	}
	public String getMerReference() {
		return merReference;
	}
	public void setMerReference(String merReference) {
		this.merReference = merReference;
	}
	public String getMerCustomIp() {
		return merCustomIp;
	}
	public void setMerCustomIp(String merCustomIp) {
		this.merCustomIp = merCustomIp;
	}
	public Integer getGoodsType() {
		return goodsType;
	}
	public void setGoodsType(Integer goodsType) {
		this.goodsType = goodsType;
	}
	public String getMerCustomID() {
		return merCustomID;
	}
	public void setMerCustomID(String merCustomID) {
		this.merCustomID = merCustomID;
	}
	public String getMerCustomPhone() {
		return merCustomPhone;
	}
	public void setMerCustomPhone(String merCustomPhone) {
		this.merCustomPhone = merCustomPhone;
	}
	public String getGoodsAddress() {
		return goodsAddress;
	}
	public void setGoodsAddress(String goodsAddress) {
		this.goodsAddress = goodsAddress;
	}
	public String getMerOrderRemark() {
		return merOrderRemark;
	}
	public void setMerOrderRemark(String merOrderRemark) {
		this.merOrderRemark = merOrderRemark;
	}
	public String getMerHint() {
		return merHint;
	}
	public void setMerHint(String merHint) {
		this.merHint = merHint;
	}
	public String getRemark1() {
		return remark1;
	}
	public void setRemark1(String remark1) {
		this.remark1 = remark1;
	}
	public String getRemark2() {
		return remark2;
	}
	public void setRemark2(String remark2) {
		this.remark2 = remark2;
	}
	public String getMerURL() {
		return merURL;
	}
	public void setMerURL(String merURL) {
		this.merURL = merURL;
	}
	public String getMerVAR() {
		return merVAR;
	}
	public void setMerVAR(String merVAR) {
		this.merVAR = merVAR;
	}
	public String getE_isMerFlag() {
		return e_isMerFlag;
	}
	public void setE_isMerFlag(String e_isMerFlag) {
		this.e_isMerFlag = e_isMerFlag;
	}
	public String getE_Name() {
		return e_Name;
	}
	public void setE_Name(String e_Name) {
		this.e_Name = e_Name;
	}
	public String getE_TelNum() {
		return e_TelNum;
	}
	public void setE_TelNum(String e_TelNum) {
		this.e_TelNum = e_TelNum;
	}
	public String getE_CredType() {
		return e_CredType;
	}
	public void setE_CredType(String e_CredType) {
		this.e_CredType = e_CredType;
	}
	public String getE_CredNum() {
		return e_CredNum;
	}
	public void setE_CredNum(String e_CredNum) {
		this.e_CredNum = e_CredNum;
	}


	
}



这些就是文档里定义的要传过去的表单实体类。。

构造一个表单提交给银行给的那个地址。


跳转到表单页面构造表单的方法:


	@RequestMapping("toPayOrder/{orderId}")
	public String toPayOrder(HttpServletRequest request, HttpServletResponse response,@PathVariable Long orderId){
		
		Order order =  orderManager.getByObjectId(orderId);
		List<OrderItem> orderItems = orderItemManager.getOrderItemsByOrderId(orderId);
		String goodsID = "";
		String goodsName = "";
//        for (OrderItem item : orderItems) {
//			goodsID += item.getObjectId()+ ",";
//			goodsName += item.getProduct().getName() + ",";
//		}
//        goodsID.substring(0, goodsID.length()-1);
//        goodsName.substring(0, goodsID.length()-1);
//		if (goodsID.length()>=30) {
//			goodsID.substring(0, 25);
//			goodsID += "等";
//		}
//		if (goodsName.length()>=60) {
//			goodsName.substring(0, 55);
//			goodsName += "等";
//		}
		
		String merURL = "http://localhost:8000/ys/order/getReturnValue";
		
		ICBC icbcModel = new ICBC();
		TranData tranData = new TranData();
        SimpleDateFormat myFmt=new SimpleDateFormat("yyyyMMddHHmmss");      
        tranData.setOrderDate(myFmt.format(new Date()));
        tranData.setOrderid(orderId);
        tranData.setAmount((order.getTotal()*100));
        tranData.setGoodsName("50jin订单");
        tranData.setGoodsID("");
        tranData.setGoodsName("测试订单");
        tranData.setMerReference("localhost");
        tranData.setMerCustomIp("127.0.0.1");
        // TODO  商户账号
        tranData.setMerAcct("10011********017989");
        // TODO  商户代码
        tranData.setMerID("1001******4821");
        // TODO  返回商户URL
        tranData.setMerURL(merURL);
       
        
        StringBuilder strXml = new StringBuilder();
        strXml.append("<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\"?>");
        strXml.append("<B2CReq>");
        //接口名称
        strXml.append("<interfaceName>" + tranData.getInterfaceName() + "</interfaceName>");
        //接口版本号
        strXml.append("<interfaceVersion>" + tranData.getInterfaceVersion() + "</interfaceVersion>");
        //订单信息
        strXml.append("<orderInfo>");
        //交易日期时间
        strXml.append("<orderDate>20141130144920</orderDate>");
        //支付币种
        strXml.append("<curType>" + tranData.getCurType() + "</curType>");
        //商户代码
        strXml.append("<merID>" + tranData.getMerID() + "</merID>");
        //订单信息列表
        strXml.append("<subOrderInfoList>");
        
       
    	//订单信息
    	strXml.append("<subOrderInfo>");
    	//订单编号
    	strXml.append("<orderid>" + orderId + "</orderid>");
    	//订单金额
    	strXml.append("<amount>" + tranData.getAmount().intValue() + "</amount> ");
    	//分期付款期数 1代表全额付款
    	strXml.append("<installmentTimes>" + tranData.getInstallmentTimes() + "</installmentTimes>");
    	//商户账号
    	strXml.append("<merAcct>1001********0017989</merAcct>");
    	//商品编号
    	strXml.append("<goodsID>" + tranData.getGoodsID() + "</goodsID>");
    	//商品名称
    	strXml.append("<goodsName>" + tranData.getGoodsName() + "</goodsName>");
    	//商品数量
    	strXml.append("<goodsNum>" + order.getItemCount() + "</goodsNum>");
    	//已含运费金额
    	strXml.append("<carriageAmt></carriageAmt>");
    	strXml.append("</subOrderInfo>");
        
        strXml.append("</subOrderInfoList>");
        strXml.append("</orderInfo>");
        strXml.append("<custom>");
        //检验联名标志 取值“1”:客户支付时,网银判断该客户是否与商户联名
        strXml.append("<verifyJoinFlag>" + tranData.getVerifyJoinFlag() + "</verifyJoinFlag>");
        //语言版本 取值:“EN_US”为英文版;取值:“ZH_CN”或其他为中文版
        strXml.append("<Language>" + tranData.getLanguage() + "</Language>");
        strXml.append("</custom>");
        strXml.append("<message>");
        //支持订单支付的银行卡种类
        strXml.append("<creditType>" + tranData.getCreditType() + "</creditType>");
        //通知类型
        strXml.append("<notifyType>" + tranData.getNotifyType() + "</notifyType>");
        //结果发送类型
        strXml.append("<resultType>" + tranData.getResultType() + "</resultType>");
        //商户reference
        strXml.append("<merReference>" + tranData.getMerReference() + "</merReference>");
        //客户端IP 当商户reference项送空时,该项必输
        strXml.append("<merCustomIp>" + tranData.getMerCustomIp() + "</merCustomIp>");
        //虚拟商品/实物商品标志位 取值“0”:虚拟商品 取值“1”,实物商品
        strXml.append("<goodsType>" + tranData.getGoodsType() + "</goodsType>");
        //买家用户号
        strXml.append("<merCustomID></merCustomID>");
        //买家联系电话
        strXml.append("<merCustomPhone></merCustomPhone>");
        //收货地址
        strXml.append("<goodsAddress></goodsAddress>");
        //订单备注
        strXml.append("<merOrderRemark></merOrderRemark>");
        //商城提示
        strXml.append("<merHint></merHint>");
        //备注字段1
        strXml.append("<remark1></remark1>");
        //备注字段2
        strXml.append("<remark2></remark2>");
        //返回商户URL
        strXml.append("<merURL>" + tranData.getMerURL() + "</merURL>");
        //返回商户变量
        strXml.append("<merVAR>" + tranData.getMerVAR() + "</merVAR>");
        strXml.append("</message>");
        strXml.append("<extend>");
        strXml.append("<e_isMerFlag>" + tranData.getE_isMerFlag() + "</e_isMerFlag>");
        strXml.append("<e_Name>" + tranData.getE_Name() + "</e_Name>");
        strXml.append("<e_TelNum>" + tranData.getE_TelNum() + "</e_TelNum>");
        strXml.append("<e_CredType>" + tranData.getE_CredType() + "</e_CredType>");
        strXml.append("<e_CredNum>" + tranData.getE_CredNum() + "</e_CredNum>");
        strXml.append("</extend>");
        strXml.append("</B2CReq>");

        //获取工商银行验证
//        CBCPayOnline.getCheckInfo(icbcModel);
//        byte[] temp =  ReturnValue.base64enc(strXml.toString().getBytes());
        icbcModel.setTranData(strXml.toString());
        
        CBCPayOnline cbcPayOnline = new CBCPayOnline();
         cbcPayOnline.getBase64ICBC(icbcModel);
//        icbcModel.setTranData(returnValue);
        
        //将订单数据送往页面提交
        request.setAttribute("ICBC", icbcModel);
        request.setAttribute("tranData", tranData);
        request.setAttribute("order", order);
//		return getFileBasePath() + "javaApiDemo";
		return getFileBasePath() + "toPayOrder";
	}
	

工行base64加密:

我们需要加密的有三个字段:tranData,merSignMsg,merCert

其中merSignMsg和merCert的加密,在javaApiDemo.jsp里已经有了。tranData就是自己把它base64加密。


public class CBCPayOnline {

	public static final String ICBC_PROPERTIES = "icbc.properties";
	private static String propFileName = "icbc.properties"; // 指定资源文件保存的位置
	private static Properties prop = new Properties(); // 创建并实例化Properties对象的实例
	private static String groupName;// 集团名称
	private static String groupNo;// 集团编号
	private static String account;// 基本账号
	private static String shopName;// 商城中文名
	private static String shopCode;// 商城代码
	private static String crtName;// 证书名称
	private static String crtPasswd;// 证书密码

	private static String icbcUrl;// B2C商户支付页面连接地址

	static {
		// 相关参数定义

		CBCPayOnline _client = new CBCPayOnline();
		try {
			prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(ICBC_PROPERTIES));
			groupName = prop.getProperty("groupName");
			groupNo = prop.getProperty("groupNo");
			account = prop.getProperty("account");
			shopName = prop.getProperty("shopName");
			shopCode = prop.getProperty("shopCode");
			crtName = prop.getProperty("crtName");
			crtPasswd = prop.getProperty("crtPasswd");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public ICBC getBase64ICBC(ICBC icbcModel) {
		String tranData = icbcModel.getTranData();
		System.out.println("明文:" + tranData);
		String password = crtPasswd;
		String returnTransData = "";
		String returnSignMsg = "";
		String returnCert = "";
		try {
			byte[] byteSrc = tranData.getBytes();
			char[] keyPass = password.toCharArray();

			FileInputStream in1 = new FileInputStream("d:\\user.crt");
			byte[] bcert = new byte[in1.available()];
			in1.read(bcert);
			in1.close();
			FileInputStream in2 = new FileInputStream("d:\\user.key");
			byte[] bkey = new byte[in2.available()];
			in2.read(bkey);
			in2.close();

			byte[] sign = ReturnValue.sign(byteSrc, byteSrc.length, bkey, keyPass);
			if (sign == null) {
				System.out.println("签名失败,签名返回为空。请检查证书私钥和私钥保护口令是否正确。");
			} else {
				System.out.println("签名成功");

				byte[] transDataByte = ReturnValue.base64enc(tranData.getBytes());
				String transDataBase64 = new String(transDataByte).toString();
				System.out.println("XML明文BASE64编码:" + transDataBase64);

				byte[] EncSign = ReturnValue.base64enc(sign);
				String SignMsgBase64 = new String(EncSign).toString();
				System.out.println("签名信息BASE64编码:" + SignMsgBase64);

				byte[] EncCert = ReturnValue.base64enc(bcert);
				String CertBase64 = new String(EncCert).toString();
				System.out.println("证书公钥BASE64编码:" + CertBase64);

				byte[] DecSign = ReturnValue.base64dec(EncSign);
				if (DecSign != null) {
					System.out.println("签名信息BASE64解码成功");
					byte[] DecCert = ReturnValue.base64dec(EncCert);
					if (DecCert != null) {
						System.out.println("证书公钥BASE64解码成功");
						int a = ReturnValue.verifySign(byteSrc, byteSrc.length, DecCert, DecSign);
						if (a == 0)
							System.out.println("验签成功");
						else
							System.out.println("验签失败<br>验证返回码:" + a);
					} else
						System.out.println("证书BASE64解码失败");
				} else
					System.out.println("签名信息BASE64解码失败");
				returnTransData = transDataBase64;
				returnSignMsg = SignMsgBase64;
				returnCert = CertBase64;
			}

		} catch (Exception e) {
			System.out.println(e);
		}
		icbcModel.setTranData(returnTransData);
		icbcModel.setMerSignMsg(returnSignMsg);
		icbcModel.setMerCert(returnCert);
		return icbcModel;
	}


}





传送表单到银行的页面toPayOrder.jsp:


<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ include file="../common/header.jsp"%>
	<base target="_self"/>
<title><jdf:message code="跳转到支付页面" /></title>
</head>
<body>
	<div class="box border">
		<div class="box-title">
			<h2><span class="glyphicon glyphicon-user"></span><jdf:message code="跳转到支付页面"/></h2>
		</div>
		<div class="box-body">
			<form id="order" name="order" action="${ ICBC.orderPostUrl}" method="post">
				<input type="hidden" name="interfaceName" value="${ICBC.interfaceName}" /> 
				<input type="hidden" name="interfaceVersion" value="${ICBC.interfaceVersion}" /> 
				<input type="hidden" name="tranData" value="${ ICBC.tranData}" />
				<input type="hidden" name="merSignMsg" value="${ ICBC.merSignMsg}" />
				<input type="hidden" name="merCert" value="${ICBC.merCert } " />
			</form>
			<script type="text/javascript">
				document.getElementById("order").submit();
			</script>
		</div>
	</div>
</body>
</html>


注意orderDate!!!!没错,就是表单里那个订单时间!!!!!

你们八成会遇到这个错。。。96112025.。就是下面这样、、、、



你们别去看你们代码里时间对不对了,没有用!!为什么?因为工行测试环境的时间和本地时间!不!一!样!

知道原因了,打电话找银行吧。问问测试环境的时间是多少。


然后银行又发来一个获取测试环境时间的exe,如下:



用这个日期就没问题了,如果还报错,注意文档里写的

格式为:yyyyMMddHHmmss

目前要求在银行系统当前时间的前后十分钟范围内,否则判定交易时间非法。



好了,这些都搞定了。。。然后他喵的又报错。。



http://www.360doc.cn/article.aspx?id=146002674

这个是工商银行出错代码原因。96110445.。。。我不知道你们会不会报这个错。。。怎么都错,最后发邮件给银行,原来是他们系统的错误。。不是自己这边的问题。。so..有问题找银行~



这个错也搞定了,测试~发现可以进入页面了。




点下一步,又报错。。98001033.。。。




未完~~~~别走哈

阅读更多

更多精彩内容