第一步.CP提供参数:
Type 可使用此请求的用户类型(可选):yourtype adsl为ADSL用户。若此参数为空,则为所有用户。
ReqType 请求编号:commission
commissionId 代收费项目编号:届时由认证平台分配
Date 时间戳: 任意值,CP自定,CP可由此判断回传结果的时效性
BillNo 商家定单号码,用于对账,一天内不能重复
MerchantUrl 商家处理回传结果的URL,须转义请求示例:
http://218.5.102.58:8080/uass/gate/UAGateServlet.cgi?Type=&commissionId=0000090001&ReqType=commission&Date=20020908060808&BillNo=comm_1032933625402&MerchantUrl=http%3A// yourURL第二步.UASS回传CP参数:
Succeed 成功标志: Y/N
UserId 用户ID号码:或点金卡卡号
Type UserId的类型:1表示普通注册用户,1003表示宽带直上用户
CommissionId 代收费项目编号
Date 回传时间戳:等于CP所传时间戳
BillNo 商家定单号码,用于对账。
Msg 消息代码
Signature 签名以保证交易安全性回传示例:
http://yourURL?Succeed=Y&UserId=1000012345&Type=1&CommissionId=0000090001&Date=20020908060808&BillNo=comm_1032933625402&Amount=null&Msg=000&Signature=9A9%2bktbrEK5A2609lwJu5OgiFXI%2fHw%2biQZei9rknP%2bZ1dY00Yv2CL0ynaJToTBOJ6EeYQXEGrgKV81vm88Hm9tBzPKXQiiOLkQ3%2fUfoZN8L2LU3ThkZvEUpSvuIaON0%2b2%2fG7xmeFcSP7w7HOCGXU%3d第三步.在yourURL程序中验证结果通知信息(即回传示例中的问号后信息)的真实性:
1. 印证Succeed参数的值是否为“Y”2.印证时间戳Date参数的值是否合法(如果时间戳与当前服务器时间相隔太长,可以认为非法)3.印证签名是否合法:
Succeed=Y&UserId=1000012345&Type=1&CommissionId=0000090001&Date=20020908060808&BillNo=comm_1032933625402&Amount=null&Msg=000
的签名是否为
9A9%2bktbrEK5A2609lwJu5OgiFXI%2fHw%2biQZei9rknP%2bZ1dY00Yv2CL0ynaJToTBOJ6EeYQXEGrgKV81vm88Hm9tBzPKXQiiOLkQ3%2fUfoZN8L2LU3ThkZvEUpSvuIaON0%2b2%2fG7xmeFcSP7w7HOCGXU%3d4.印证CommissionId参数的值和BillNo参数的值的合法性:
CommissionId参数的值和BillNo参数的值先从用户请求的参数中得到,然后在商家数据库中印证,看看该订单是否存在,且状态位为等待。说明:以上蓝色表示根据具体情况而不同,所有参数的值应该从用户请求的参数中request得到。
Type 可使用此请求的用户类型(可选):yourtype adsl为ADSL用户。若此参数为空,则为所有用户。
ReqType 请求编号:commission
commissionId 代收费项目编号:届时由认证平台分配
Date 时间戳: 任意值,CP自定,CP可由此判断回传结果的时效性
BillNo 商家定单号码,用于对账,一天内不能重复
MerchantUrl 商家处理回传结果的URL,须转义请求示例:
http://218.5.102.58:8080/uass/gate/UAGateServlet.cgi?Type=&commissionId=0000090001&ReqType=commission&Date=20020908060808&BillNo=comm_1032933625402&MerchantUrl=http%3A// yourURL第二步.UASS回传CP参数:
Succeed 成功标志: Y/N
UserId 用户ID号码:或点金卡卡号
Type UserId的类型:1表示普通注册用户,1003表示宽带直上用户
CommissionId 代收费项目编号
Date 回传时间戳:等于CP所传时间戳
BillNo 商家定单号码,用于对账。
Msg 消息代码
Signature 签名以保证交易安全性回传示例:
http://yourURL?Succeed=Y&UserId=1000012345&Type=1&CommissionId=0000090001&Date=20020908060808&BillNo=comm_1032933625402&Amount=null&Msg=000&Signature=9A9%2bktbrEK5A2609lwJu5OgiFXI%2fHw%2biQZei9rknP%2bZ1dY00Yv2CL0ynaJToTBOJ6EeYQXEGrgKV81vm88Hm9tBzPKXQiiOLkQ3%2fUfoZN8L2LU3ThkZvEUpSvuIaON0%2b2%2fG7xmeFcSP7w7HOCGXU%3d第三步.在yourURL程序中验证结果通知信息(即回传示例中的问号后信息)的真实性:
1. 印证Succeed参数的值是否为“Y”2.印证时间戳Date参数的值是否合法(如果时间戳与当前服务器时间相隔太长,可以认为非法)3.印证签名是否合法:
Succeed=Y&UserId=1000012345&Type=1&CommissionId=0000090001&Date=20020908060808&BillNo=comm_1032933625402&Amount=null&Msg=000
的签名是否为
9A9%2bktbrEK5A2609lwJu5OgiFXI%2fHw%2biQZei9rknP%2bZ1dY00Yv2CL0ynaJToTBOJ6EeYQXEGrgKV81vm88Hm9tBzPKXQiiOLkQ3%2fUfoZN8L2LU3ThkZvEUpSvuIaON0%2b2%2fG7xmeFcSP7w7HOCGXU%3d4.印证CommissionId参数的值和BillNo参数的值的合法性:
CommissionId参数的值和BillNo参数的值先从用户请求的参数中得到,然后在商家数据库中印证,看看该订单是否存在,且状态位为等待。说明:以上蓝色表示根据具体情况而不同,所有参数的值应该从用户请求的参数中request得到。
String success = null;
String userIdStr = null;
String dateStr = null;
String CommissionId;
String BillNo;
success = (String)aRequest.getParameter("Succeed");
userIdStr = (String) aRequest.getParameter("UserId");
dateStr = (String)aRequest.getParameter("Date");
CommissionId = (String)aRequest.getParameter("CommissionId ");
BillNo = (String)aRequest.getParameter("BillNo ");
//根据商家不同印证各自: CommissionId和BillNo的合法性此处略过…
long userId = 0l;
long date = 0l;
try{
userId = Long.parseLong(userIdStr);
date = Long.parseLong(dateStr);
}catch(Exception ex){
System.out.println("userid or date error");
return false;
}
if (!success.equals("Y")){
System.out.println("success error ");
return false;
}
//验证时间戳
long currTime = System.currentTimeMillis();
long diff = currTime - date; if ((diff > 60000)||(diff < -60000)){
System.out.println("diff to large");
return false;
}
//验证签名
String jdoCfgFilePath = System.getProperty("cfg.path"); //公钥路径
String publicKeyFile = jdoCfgFilePath + "uapublic";
boolean valid = false;
valid = validateResponse(aRequest,publicKeyFile);
if (valid == false){
System.out.println("valid false");
return false;
}
return true;
} public static boolean validateResponse(HttpServletRequest request)
{
String cfgFilePath = System.getProperty("cfg.path");
String CfgFile = cfgFilePath + "uapublic";
return validateResponse(request, CfgFile);
} public static boolean validateResponse(HttpServletRequest request, String pkFile)
{
String queryString = request.getQueryString();
int i = queryString.indexOf("&Signature");
String data1 = queryString.substring(0, i);
String data = URLUTF8Encoder.decode(data1);
String signature = request.getParameter("Signature");
return UnSigData(data, pkFile, signature);
} public static boolean UnSigData(String data, String pubkey, String signature)
{
boolean verifies = false;
try
{
char encodedSigData[] = signature.toCharArray();
byte sigToVerify[] = Base64.decode(encodedSigData);
FileInputStream pkfile = new FileInputStream(pubkey);
byte encKey[] = new byte[pkfile.available()];
pkfile.read(encKey);
pkfile.close();
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
java.security.PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
Signature sig = Signature.getInstance("MD5withRSA");
sig.initVerify(pubKey);
byte buffer[] = data.getBytes();
sig.update(buffer);
verifies = sig.verify(sigToVerify);
}
catch(Exception e)
{
System.out.println(e.toString());
}
return verifies;
}