银联接口返回值说明
netpayclient.jar 为用于java和jsp开发的jar包,适用于各个操作系统。jdk版本为1.4。
客户端签名和验签方法说明
public String signOrder(String MerId, String OrdId, String TransAmt, String CuryId, String TransDate, String TransType)
参数说明:
String MerId - 商户号,长度为15个字节的数字串,由ChinaPay或清算银行分配。
String OrdId - 订单号,长度为16个字节的数字串,由商户系统生成,失败的订单号允许重复支付。
String TransAmt - 交易金额,长度为12个字节的数字串,例如:数字串"000000001234"表示12.34元。
String CuryId - 货币代码, 长度为3个字节的数字串,目前只支持人民币,取值为"156" 。
String TransDate - 交易日期,长度为8个字节的数字串,表示格式为:YYYYMMDD。
String TransType - 交易类型,长度为4个字节的数字串,取值范围为:"0001"和"0002", 其中"0001"表示消费交易
返回值:
String CheckValue[256] - 即NetPayClient根据上述输入参数生成的商户数字签名,长度为256字节的字符串。
○ 使用说明
商户在向消费者发送订单确认页面之前,调用本函数或方法产生订单签名(CheckValue),然后生成订单确认页面,供消费者再次确认订单的内容,并允许消费者选择支付或取消订单。订单确认页面中表单(FORM)的具体例子如下(注意各字段的大小写):
<form action="https://payment.chinapay.com/pay/TransGet" METHOD=POST>
<input type=hidden name="MerId" value="123451234512345">
<input type=hidden name="OrdId" value="0000000000000001">
<input type=hidden name="TransAmt" value="000000001234">
<input type=hidden name="CuryId" value="156">
<input type=hidden name="TransDate" value="20000315">
<input type=hidden name="TransType" value="0001">
<input type=hidden name="Version" value="20040916">(接口版本号)
<input type=hidden name="BgRetUrl" value="http://www.XXX.com/pay/payback1.php">(后台交易接收URL,长度不要超过80个字节)
<input type=hidden name="PageRetUrl" value="http://www.XXX.com/pay/payback2.php">(页面交易接收URL,长度不要超过80个字节)
<input type=hidden name="GateId" value="0001">(支付网关号,可选)
<input type=hidden name="Priv1" value="Memo">(商户私有域,可选,长度不要超过60个字节)
<input type=hidden name="ChkValue" value="X…X">(256字节长的ASCII码)
</form>
注:其中GateId和Priv1为可选项,分别表示 “支付网关号”和“保留字段”。 如填写GateId(支付网关号),则消费者将直接进入支付页面,否则进入网关选择页面。具体网关见表1。Priv1为商户私有域,商户通过此字段向Chinapay发送的信息,Chinapay依原样填充返回给商户。当使用版本号“20040916”时,BgRetUrl和PageRetUrl必须填写。
JAVA版安装及调用
7.4.1 安装
将netpayclinet.jar安装到服务器的classpath下。将MerPrk1.key、MerPrk2.key和PgPubk.key复制到服务器上可以访问的路经下,例如/app/usr/chinapay/keys。
7.4.2 使用方法
初始化key文件。方法如下:
chinapay.PrivateKey key1=new chinapay.PrivateKey();
chinapay.SecureLink t;
boolean flag;
flag=key1.buildKey(MerId,0,"app/usr/chinapay/keys/MerPrk1.key"); //注意要用哪一个商户号签名就要用对应的key文件。
if (flag==false)
{
System.out.println("build key error!");
return;
}
t1=new chinapay.SecureLink (key1);
String CheckValue1=t1.signOrder(MerId,OrdId,TransAmt,CuryId,TransDate,TransType); //获得对应商户的签名数据。
//使用另外一个商户key文件
chinapay.PrivateKey key2=new chinapay.PrivateKey();
chinapay.SecureLink t;
boolean flag;
flag=key2.buildKey(MerId,0,"app/usr/chinapay/keys/MerPrk2.key");
if (flag==false)
{
System.out.println("build key error!");
return;
}
t2=new chinapay.SecureLink (key2); //获得对应另外商户的签名数据。
7.4.3 函数说明
○ 订单签名函数
String CheckValue=t1.signOrder(MerId,OrdId,TransAmt,CuryId,TransDate,TransType);
○ 验证交易应答函数
boolean flag=t1.verifyTransResponse( MerId,OrdId, TransAmt, CuryId, TransDate,TransType, OrderStatus, CheckValue);(使用该函数时应使用PgPubk.key进行初始化key文件)
注:ChinaPay post过来的参数为:merid,orderno,amount,currencycode,transdate,transtype,status,checkvalue; 其含义跟上面一一对应。
注:各函数中的参数说明,请查阅函数说明。
典型代码示例
7.6.1 商户发送订单至Chinapay的jsp代码示例
String MerId, OrdId, TransAmt, CuryId, TransDate, TransType,ChkValue;
/* …… 给以上变量分别赋值 */
chinapay.PrivateKey key=new chinapay.PrivateKey();
chinapay.SecureLink t;
boolean flag;
flag=key.buildKey("200401160000001",0,"D:\\MerPrk.key");
if (flag==false)
{
System.out.println("build key error!");
return;
}
t=new chinapay.SecureLink (key);
ChkValue= t.signOrder(MerId, OrdId, TransAmt, CuryId, TransDate, TransType) ;
<form action="https://payment.chinapay.com/pay/TransGet" METHOD=POST>
<input type=hidden name="MerId" value=MerId >
<input type=hidden name="OrdId" value=OrdId >
<input type=hidden name="TransAmt" value="000000001234">
<input type=hidden name="CuryId" value="156">
<input type=hidden name="TransDate" value="20040315">
<input type=hidden name="TransType" value=TransType >
<input type=hidden name="Version" value="20040916">
<input type=hidden name="BgRetUrl" value="http://www.XX.com/pay/payback1.php">
<input type=hidden name="PageRetUrl" value="http://www.XX.com/pay/payback2.php">
<input type=hidden name="GateId" value="0001">
<input type=hidden name="Priv1" value="Memo">
<input type=hidden name="ChkValue" value=ChkValue>
</form>
7.6.2 商户接收Chinapay应答JSP代码示例
商户接收Chinapay应答模块,文件名getChinapayRet.jsp,代码段如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*,java.lang.*,java.util.*,chinapay.*" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link TYPE="text/css" HREF="mystyle.css" REL="stylesheet" TITLE="mystyle">
</head>
<%
String TransDate = null ;
String MerId = null ;
String OrdId = null ;
String TransType = null ;
String TransAmt = null ;
String CuryId = null ;
String ChkValue = null ;
String OrderStatus= null ;
String GateId = null ;
try
{
TransDate = request.getParameter("transdate") ;
MerId = request.getParameter("merid") ;
OrdId = request.getParameter("orderno");
TransType = request.getParameter("transtype") ;
TransAmt = request.getParameter("amount") ;
CuryId = request.getParameter("currencycode") ;
OrderStatus = request.getParameter("status") ;
ChkValue = request.getParameter("checkvalue") ;
chinapay.PrivateKey key=new chinapay.PrivateKey();
chinapay.SecureLink t;
boolean flag;
boolean flag1;
String msg="";
flag=key.buildKey("999999999999999",0,"c:\\winnt\\PgPubk.key");
if (flag==false)
{
msg="build key error!";
return;
}
t=new chinapay.SecureLink (key);
flag1=t.verifyTransResponse( MerId,OrdId, TransAmt, CuryId, TransDate, TransType, OrderStatus, ChkValue);
if (flag1==false)
{
System.out.println("交易验证失败!");
msg="交易验证失败!";
}
else
{
/* …... 数据库更新等相关处理过程 */
}
}
catch(Exception e)
{
out.println(e.getMessage());
return;
}
%>