浦发银行 调用的一些技巧

浦发银行前置机配置很像工商银行。

来回请求的XML居然要加密和解密。。。。。太不人性,太啰嗦了。


调试了一下,终于OK了。


记录几个过程:

    //浦发银行签名及解签名
    public static InputStream send_sign(
            byte[] content,//<body>
            String contentType,//INFOSEC_SIGN/1.0
                    String url//http://ip:port
           )
            throws IOException {
        URL urll = new URL(url);
        HttpURLConnection con1 = (HttpURLConnection) urll.openConnection();
        con1.setDoInput(true);
        con1.setDoOutput(true);
        con1.setRequestMethod("POST");
        con1.setRequestProperty("Content-Type", contentType);
        con1.setRequestProperty(
                "Content-Length",
                String.valueOf(content.length));
        con1.connect();
        con1.getOutputStream().write(content);
        con1.getOutputStream().flush();
        InputStream in = con1.getInputStream();
        return in;
    }

乱码转换,注意GB2312

    //InputStream 转为String
    public String convertStreamToString(InputStream is) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"GB2312"));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
//                sb.append(line + "/n");
                sb.append(line );
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return sb.toString();
    }

字符串前面补0,或者后面补空格

         String xml_send = String.format("%-6s%s", xml_real.length()+6, xml_real);//3508  <?xml version="1.0" 右侧补充空格
//        String xml_send1 = String.format("%6s%s", xml_request.length()+6, xml_request);//  3508<?xml version="1.0"
//        String xml_send2 = String.format("%06d%s", xml_request.getBytes().length+6, xml_request);//003508<?xml version= //文档这个方式不对!!!

JAVA对象转为XML对象:

    //拼接完整请求XML 以取余额为例,测试前置机
    private  String getxml(String tcode,String xml_body) {
        SimpleDateFormat format_date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str_date = format_date.format(new Date());

        SimpleDateFormat format_date1 = new SimpleDateFormat("yyyy-MM-dd");
        String str_d = format_date1.format(new Date()).replace("-","");
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS");
        String str_t = format.format(new Date()).replace(":","");

        System.out.println("Time is:"+str_date);

        String packetID = (str_d+str_t).substring(0,16);//
        System.out.println("packetID is:"+packetID);
        String masterID = "2000040752";//企业号
        String accno = "952A9997220008092";


//Blow 请求形成XML 测试    Req_Balance_4402 实际未来需要修改,并抽象,body部分不同,其他head都一致
        String transCode = "4402";
        Req_Balance_4402 req = new Req_Balance_4402();
        Req_Balance_4402.Head head = new Req_Balance_4402.Head();
        head.setTransCode(transCode);
        head.setSignFlag(1);
        head.setMasterID(masterID);
        head.setPacketID(packetID);
        head.setTimeStamp(str_date);
        req.setHead(head);
        Req_Balance_4402.Rq rq = new Req_Balance_4402.Rq();
        Req_Balance_4402.ALists lists = new Req_Balance_4402.ALists();
        List<String> acntNo = new ArrayList();
        acntNo.add(accno);
        Req_Balance_4402.AList list = new Req_Balance_4402.AList(acntNo);
        lists.setList(list);
        rq.setLists(lists);
        req.setRq(rq);

        XStreamUtil xStreamUtil = new XStreamUtil();
        XStream xs = xStreamUtil.buildCOMBHINAXStream();
        Map aliases = new HashMap();
        aliases.put("packet", Req_Balance_4402.class);
        XStreamMarshaller unmarshaller = xStreamUtil.buildXStreamMarshaller();
        unmarshaller.setAliases(aliases);
        String xml_test = "<?xml version='1.0' encoding='GB2312'?>" + xs.toXML(req);  //
        System.out.println(xml_test);

        //按照单个功能代码的说明,形成如下格式,实际上是不能用的!!!!
        //因为实际上要先形成body内容,而后body去签名,取得sign字段,再形成发送格式的XML 放到signature字段
//        <?xml version='1.0' encoding='GB2312'?><packet>
//        <head>
//        <transCode>4402</transCode>
//        <signFlag>1</signFlag>
//        <packetID>2018011517255396</packetID>
//        <masterID>2000040752</masterID>
//        <timeStamp>2018-01-15 17:25:53</timeStamp>
//        </head>
//        <body>
//        <lists name="acctList">
//        <list>
//        <acctNo>952A9997220008092</acctNo>
//        </list>
//        </lists>
//        </body>
//        </packet>

//Up 请求形成XML 测试


        //BLow 修改后的,JAVA对象转XML
        Req_sign_in re = new Req_sign_in();
        Req_sign_in.Head he = new Req_sign_in.Head();
        he.setTransCode(tcode);
        he.setSignFlag(1);
        he.setMasterID(masterID);
        he.setPacketID(packetID);
        he.setTimeStamp(str_date);
        re.setHead(he);
        Req_sign_in.Body bo = new Req_sign_in.Body();
        bo.setSignature(xml_body);
        re.setBody(bo);

        XStreamUtil xStrUtil = new XStreamUtil();
        XStream xst = xStrUtil.buildXStream();
        Map alis = new HashMap();
        aliases.put("packet", Req_sign_in.class);
        XStreamMarshaller unmarshaller1 = xStrUtil.buildXStreamMarshaller();
        unmarshaller1.setAliases(alis);
        String xml_temp = xst.toXML(re);
        xml_temp = xml_temp.replace("\n","");
        xml_temp = xml_temp.replace(" ","");
        String xml_real = "<?xml version='1.0' encoding='GB2312'?>" + xml_temp;  //
        System.out.println(xml_real);
        //Up  修改后的,JAVA对象转XML

        //BLow 旧测试
//        String xml_request = "<?xml version='1.0' encoding='GB2312'?>" +
//                "<packet>" +
//                "<head>" +
//                "<transCode>"+tcode+"</transCode>" +
//                "<signFlag>1</signFlag>" +
//                "<masterID>"+masterID+"</masterID>" +
//                "<packetID>"+packetID+"</packetID>" +
//                "<timeStamp>"+str_date+"</timeStamp>" +
//                "</head>" +
//                "<body><signature>" +
//                 xml_body +
//                "</signature></body>"+
//                "</packet>";
        //Up 旧测试


         String xml_send = String.format("%-6s%s", xml_real.length()+6, xml_real);//3508  <?xml version="1.0" 右侧补充空格
//        String xml_send1 = String.format("%6s%s", xml_request.length()+6, xml_request);//  3508<?xml version="1.0"
//        String xml_send2 = String.format("%06d%s", xml_request.getBytes().length+6, xml_request);//003508<?xml version= //文档这个方式不对!!!


        return xml_send;

    }

利用jsoup 解析HTML 到变量

           //Step3.解签名 XML除去前面6位,然后用jsoup解析return_code为6个A时,读取signature;发送去解签
            postResult = postResult.substring(6);//去除前6个字符
            Document doc_result = Jsoup.parse(postResult);

            Element e_return_code = doc_result.select("returnCode").first();//返回结果
            String return_code = e_return_code.text();
            if(!return_code.equals("AAAAAAA"))
            {
                System.out.println("调用失败!");
                return;
            }
            Element e_sign = doc_result.select("signature").first();//查找第一个a元素
            String str_sign_re = e_sign.text();

            byte[] srtbyte_result = str_sign_re.getBytes();
            Integer postResult_len = srtbyte_result.length;
            String conType = "INFOSEC_VERIFY_SIGN/1.0; Content-Length/"+postResult_len.toString()+";";

            InputStream in_result = send_sign(srtbyte_result,conType,http_sign_url);
            String xml_request_result =  convertStreamToString(in_result);
            System.out.println("*****************************2:服务器解析结果******************************\n");
            System.out.println(xml_request_result);

            System.out.println("*****************************3:中文乱码处理结果******************************\n");
            String newStr1 = new String(xml_request_result.getBytes("GB2312"), "GB2312");
            System.out.println(newStr1);
//            String newStr2 = EntityUtils.toString(entity1 , "GBK").trim();


            //Step4.解析html结果

//            Document doc_real = Jsoup.parse(xml_request_result,"utf-8");
            Document doc_real = Jsoup.parse(xml_request_result,"GB2312");
//                System.out.println(doc_real.body());
            Elements elementList = doc_real.getElementsByTag("list");
//               System.out.println(elementList.size());

            if(ztype==2){
                Elements ele_totalCount = doc_real.getElementsByTag("totalCount");
                Integer totalCount = 0;//总记录数
                totalCount = Integer.parseInt(ele_totalCount.select("totalCount").first().text().toString());//
                System.out.println("总记录数:"+totalCount.toString());
            }


            for (Element element : elementList) {
                if(ztype==1){
                    //4402余额结果
        //            <sic>
        //            <body>
        //            <lists name="acctBalanceList">
        //            <list>
        //            <acctNo>952A9997220008092</acctNo>
        //            <masterID>2489675304</masterID>
        //            <reserveBalance>0.00</reserveBalance>
        //            <freezeBalance>0.00</freezeBalance>
        //            <cortrolBalance>0.00</cortrolBalance>
        //            <canUseBalance>22259150.38</canUseBalance>
        //            <overdraftBalance>0.00</overdraftBalance>
        //            <balance>22259150.38</balance>
        //            </list>
        //            </lists>
        //            </body>
        //            </sic>

                    String acctNo = "";
                    String balance = "";
                    String canUseBalance = "";//可用余额
                    acctNo = element.select("acctNo").first().text().toString();//
                    balance = element.select("balance").first().text().toString();//
                    canUseBalance = element.select("canUseBalance").first().text().toString();//

                    System.out.println("acctNo:"+acctNo+" balance :"+balance+" ");
                    System.out.println("acctNo:"+acctNo+" canUseBalance :"+canUseBalance+" ");

                }
                else if(ztype==2){
//                    <lists name="HistoryList">
//                    <list>
//                    <voucherNo></voucherNo>
//                    <seqNo>999701700001</seqNo>
//                    <txAmount>2.13</txAmount>
//                    <balance>51827714.57</balance>
//                    <tranFlag>0</tranFlag>
//                    <transDate>20180102</transDate>
//                    <transTime>165952</transTime>
//                    <note>KM����0102170005</note>
//                    <remark>֧�����루���ʣ�</remark>
//                    <payeeBankNo>9520</payeeBankNo>
//                    <payeeBankName>�ַ����ݷ���Ӫҵ��</payeeBankName>
//                    <payeeAcctNo>952A9997220008349</payeeAcctNo>
//                    <payeeName>�ַ�2878487587</payeeName>
//                    <transCode>8801</transCode>
//                    <branchId>9520</branchId>
//                    <customerAcctNo></customerAcctNo>
//                    <payeeAcctType></payeeAcctType>
//                    <transCounter>99970170</transCounter>
//                    <authCounter></authCounter>
//                    <otherChar10></otherChar10>
//                    <otherChar40></otherChar40>
//                    <seqNum>1</seqNum>
//                    <revFlag>0</revFlag>
//                    </list>
//                    <list>
//                    <voucherNo></voucherNo>
//                    <seqNo>999701000001</seqNo>

                    String seqNo = "";//唯一标识ID
                    Integer tranFlag = 0;//借贷标志 0借 1贷
                    Double txAmount = 0.00;//交易金额
                    seqNo = element.select("seqNo").first().text().toString();//
                    tranFlag=Integer.parseInt(element.select("tranFlag").first().text().toString());//
                    txAmount = Double.parseDouble(element.select("txAmount").first().text().toString());
                    System.out.println("seqNo:"+seqNo+" tranFlag :"+tranFlag.toString()+" txAmount: "+txAmount.toString());
                }

            }



        } catch (Exception e) {
            e.printStackTrace();
        }


    }


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫气东来_999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值