工商银行银联支付接口。
发现网上的资料对于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;
}
}
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";
}
我们需要加密的有三个字段: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.。。。
未完~~~~别走哈