中國建設銀行網上支付接口以及自動對賬


一、關於支付:

     最近用java語言做了一個建行網上支付的系統,和建行做的接口。現在整理一下發布出來。

     開發之前,參考了同道中人蘇飛同學的一篇文章,他寫的非常好,非常完善和細致。用.net語言所寫,見鏈接:

     http://www.cnblogs.com/sufei/archive/2010/07/22/1783168.html,我呢,用java來改善補充了一下。

          MD5算法,在.net中,有框架自帶可以直接調用。在java中調用java.security.MessageDigest即可。

      當然也可以網上找,很多。

          把銀行所需要的參數和值拼成sql串,加密后傳送。鏈接上建行的網站。支付后會有成功或失敗的返回結果。

      這個結果需要用來接收。商戶下載證書后生成的密鑰和銀行處理完返回的sign簽名需要一致,才更改訂單。

二、關於自動對賬:

            銀行會在晚上處理當天的流水賬,所以第二天可以進行已支付流水的查詢和對賬。我們可以以操作員的身份

      下載對賬文件,也可以完全交給程序來自動完成。

            在銀行提供的 “一點接入網上支付商戶批量查詢接口技術文檔V1.2.doc”中,我選擇了返回xml方式來獲取。

            原理是,提供文檔中所需要的參數和值傳入指定URL,然后銀行處理完畢會返回xml以網頁形式,

       我們用 HttpClient 程序來讀取其中的內容即可。該jar包見附件。

    

Java代碼   收藏代碼
  1. HttpClient client = new HttpClient();  
  2. HttpMethod method = new PostMethod(url);  
  3.       
  4. method.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)");  
  5. method.setRequestHeader("Content-Encoding","text/html");  
  6. method.setRequestHeader("Content-Type","text/xml; charset=UTF-8");  
  7. method.setRequestHeader("Accept-Language", "zh-cn");  
  8. method.setRequestHeader("Connection","close");  
  9.       
  10. client.executeMethod(method);  
  11. byte[] bytes = method.getResponseBody();  
  12. String xmlString = new String(bytes);  
  13. System.out.println(xmlString.trim());  

       由於返回的xml開頭空了4行,所以需要setRequestHeader來設置后才可以獲取。

       解析此xml,我選擇jdom方式,不過處理前還是需要處理下,如下:

 

Java代碼   收藏代碼
  1.     String tempString = "";  
  2. InputStream is = new ByteArrayInputStream(xmlString.getBytes());   
  3. BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));  
  4. for (String temp = br.readLine(); temp != null;   
  5.         tempString += temp, temp = br.readLine()  
  6. );  
  7. logger.info("銀行返回的xml字符串:"+tempString);  
  8.      
  9. InputStream stream = new ByteArrayInputStream(tempString.getBytes());  
  10. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  11. DocumentBuilder builder = factory.newDocumentBuilder();  
  12. Document doc = builder.parse(stream);  

      繼續

  

Java代碼   收藏代碼
  1. //看是否能返回正確的xml格式數據  
  2. NodeList nodeList = doc.getElementsByTagName("DOCUMENT");  
  3. for (int i = 0; i < nodeList.getLength(); i++) {  
  4.     Element be = (Element) nodeList.item(i);  
  5.     NodeList childNodes = be.getChildNodes();  
  6.     for (int j = 0; j < childNodes.getLength(); j++) {  
  7.         if("RETURN_CODE".equals(childNodes.item(j).getNodeName())){  
  8.             if("000000".equals(childNodes.item(j).getTextContent())){       //000000表示返回的是正確的對賬數據  
  9.                 logger.info("返回正確的數據格式!");    
  10.                 //讀取 QUERYORDER 內容  
  11.                 readXML(doc);  
  12.             }else{  
  13.                 logger.error("返回數據格式錯誤!");  
  14.             }  
  15.         }  
  16.     }  
  17.     //循環結束  
  18.     stream.close();  
  19.    }  

 

Java代碼   收藏代碼
  1. NodeList nlCurrent = doc.getElementsByTagName("QUERYORDER");  
  2.     for (int j = 0; j < nlCurrent.getLength(); j++) {  
  3.         Element elmtLesson = (Element) nlCurrent.item(j);  
  4.         NodeList nlLesson = elmtLesson.getElementsByTagName("ORDERID");  
  5.         System.out.println(nlLesson.item(0).getFirstChild().getNodeValue());  
  6.   
  7.         NodeList code = elmtLesson.getElementsByTagName("STATUSCODE");  
  8.         String ORDERID = nlLesson.item(0).getFirstChild().getNodeValue();  
  9.         String STATUSCODE = code.item(0).getFirstChild().getNodeValue();  
  10.     }  

      ORDERID  即是訂單號,接下來就是處理訂單對象了,此處省略200字 。。。。

      還有,程序要每天執行一次,可以用java.util下的Timer來設定調用,方法不難,網上例子很多。

 這里我用了spring的quartz來調用,代碼如下:

Java代碼   收藏代碼
  1. <bean name="quartzQueryBean"  
  2.     class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  3.     <property name="targetObject" ref="CCBBankQueryService" />  
  4.     <!-- 調用CCBBankQueryService類的autoQuery方法 -->  
  5.     <property name="targetMethod" value="autoQuery" />  
  6.     <property name="concurrent" value="false" />  
  7. </bean>  
  8.   
  9. <bean name="quartzAutoQuery" class="org.springframework.scheduling.quartz.CronTriggerBean">  
  10.     <property name="jobDetail" ref="quartzQueryBean" />  
  11.     <property name="cronExpression">  
  12.         <!-- 每天晚上1點30分 執行一次 > -->  
  13.         <value>30 1 * * ?</value>  
  14.     </property>  
  15. </bean>  
  16. <!-- quartz觸發管理器 -->  
  17. <bean name="quartzScheduler"  
  18.     class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  19.     <property name="triggers">  
  20.         <list>  
  21.             <ref bean="quartzAutoQuery" />  
  22.         </list>  
  23.     </property>  
  24. </bean>  

   時間關系,說的不很詳細,如果有疑問處或想深入交流的童鞋們,可以加我QQ:361570665.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM