1、公钥还有银行卡号和密码等银联会提供,私钥按照银联提供的文档申请就可以了,需要说明的是申请的时候要用ie,并且在internet 选项-->安全-->自定义级别中,
将Active X 控件和插件 下的所有禁用都改为启用,如图:
2、在银联提供的测试网址登陆,如图:
3、输入登陆信息,第一次登陆需要修改密码,然后重新登陆,选择机构管理,生成商户密钥,如图:
4、选择生成的私钥路径,保存后,记得要点提交按钮,私钥第二天生效。
5、在src下创建config.properties文件,里面存放商户号、支付网关申请、公钥和私钥的存放路径,如:
merid = xxxxxxxxxxxxxxxx
merkeyfilepath = E\:\\key\\XXX
pubkeyfilepath = E\:\\key\\XXX
url = http://XXXXXXXXX
6、申请的servlet:
private static final String MERID = "merid";
private static final String PaymentUrl = "url";
private static final String MERKEYFILEPATH = "merkeyfilepath";
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String MerKeyPath = null;
String merId = null;
String msg="";
try{
Properties config = Config.getInstance().getProperties();
MerKeyPath = config.getProperty(MERKEYFILEPATH);
merId = config.getProperty(MERID);
}catch (Exception e){
msg="私钥初始化失败!";
}
if (msg!="") {
request.setAttribute("errors", msg);
request.getRequestDispatcher(XXXXX).forward(request, response);
return;
}
String ordId="0000000000000001";//订单号只能提交一次
String transAmt="000000000001";//金额
String curyId="156";//币种
String transDate="20150601";//日期
String transType="0001";//类型
String version="20070129";//版本
String bgRetUrl="http://XXXXXXXXX";//后台action
String pageRetUrl="http://xxxxx.jsp";//前台jsp
String gateId="";
String priv1 = "";
String chkValue = null;
boolean flage= false;
PrivateKey key = new PrivateKey();
try{
flage= key.buildKey(merId, 0, MerKeyPath);
}catch (Exception e){
System.out.print("创建失败");
}
//签名
String data=merId+ordId+transAmt+curyId+transDate+transType+priv1;
SecureLink sl = new SecureLink(key);
chkValue = sl.Sign(data);
//将要提交的数据显示到页面
Bean cbb=new Bean();
cbb.setMerId(merId);
cbb.setOrdId(ordId);
cbb.setTransAmt(transAmt);
cbb.setCuryId(curyId);
cbb.setTransDate(transDate);
cbb.setTransType(transType);
cbb.setPriv1(priv1);
cbb.setVersion(version);
cbb.setBgRetUrl(bgRetUrl);
cbb.setPageRetUrl(pageRetUrl);
cbb.setGateId(gateId);
cbb.setChkValue(chkValue);
request.setAttribute("cbbInput", cbb);
request.getRequestDispatcher(xxxxxxxx).forward(request, response);
return;
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
7、上面的servlet跳转到下面的页面:
<%@ page language="java" import="model.bean.*" pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<jsp:useBean id="cbbInput" scope="request" class="model.Bean" />
<form name="corpor" action="测试提交路径" method="post">
<input type="hidden" name="MerId" value=“xxxxx”/>
<input type="hidden" name="OrdId" value="xxxx"/>
<input type="hidden" name="TransAmt" value="xxx"/>
<input type="hidden" name="CuryId" value="xxx"/>
<input type="hidden" name="TransDate" value="xxx"/>
<input type="hidden" name="TransType" value="xxx"/>
<input type="hidden" name="Version" value="xxx"/>
<input type="hidden" name="BgRetUrl" value="xxx"/>
<input type="hidden" name="PageRetUrl" value="xxx"/>
<input type="hidden" name="GateId" value="xxxx"/>
<input type="hidden" name="Priv1" value=""/>
<input type="hidden" name="ChkValue" value="xxxx"/>
<input type="submit" name="submit Button" value="提交" class="cmd"/>
</form>
8、点击提交,就会到企业网银登陆页面,如图:
9、输入卡号和密码登陆,会提示交易结果,如图:
10、PageRetUrl为上面的页面跳转回网站的页面,BgRetUrl 为后台action,用来验证和保存数据,servlet如下:
private static final String url = "url"; private static final String MERKEYFILEPATH = "merkeyfilepath"; private static final String PUBKEYFILEPATH = "pubkeyfilepath"; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); /* 获取服务器返回数据 */ String status=request.getParameter("status"); String merId=request.getParameter("merid"); String ordno=request.getParameter("orderno"); String transdate=request.getParameter("transdate"); String amount=request.getParameter("amount"); String currencycode=request.getParameter("currencycode"); String transtype=request.getParameter("transtype"); String checkvalue=request.getParameter("checkvalue"); String gateId=request.getParameter("GateId"); String priv1=request.getParameter("Priv1"); // String s=readReqStr(request); //此处将上面数据存入数据库 //验签 String PubKeyPath = null; try { Properties config = Config.getInstance().getProperties(); PubKeyPath = config.getProperty(PUBKEYFILEPATH); } catch (Exception e) { } chinapay.PrivateKey key=new chinapay.PrivateKey(); chinapay.SecureLink t; boolean flage=false; boolean flage1=false; int int = 0; try{ flage=key.buildKey("999999999999999",int,PubKeyPath); }catch (Exception e){ } if(!flage){ return; } t=new chinapay.SecureLink(key); flage1=t.verifyTransResponse(merId,ordno,amount,currencycode,transdate,transtype,status,checkvalue); if(!flage1){ System.out.print("验签失败"); // return; }else{ if(status.equals("1001")){ System.out.print("支付成功"); }else { System.out.print("支付失败"); } }
支付测试代码完成!!!!//告诉银联你接收到消息了,否则银联会不停的发送信息resp.getWriter().write(JSON.toJSONString(cpCyberBankRes)); resp.getWriter().flush();
} public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }