第一步.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得到。

解决方案 »

  1.   

    private boolean checkAuthResult(HttpervletRequest aRequest){
    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;
        }