中國電信翼支付網關接口接入


 

  最近在做中國電信的翼支付網關接口的接入,正好拿Java練練手。到目前為止,唯一不太適應的就是自己的Java積累幾乎為0,什么都要重頭寫起,不像C#有這么多年的沉淀,可以隨手拿來用。

    廢話先不多說。這個支付接口就和支付寶差不多,無非就是把一些必要的數據參數,POST到指定的接口地址,然后接收它返回的支付結果。接口沒有什么復雜的邏輯處理,所以可以直接采用JSP+Servlet+JDBC來做簡單處理。對於WEB支付請求的發起,可以從JSP把用戶輸入或選擇的相關數據傳到Servlet,然后在Servlet里把商戶的基本信息以及用戶數據封裝下,再統一POST到網關接口地址:

 1        StringBuffer stb = new StringBuffer();
 2        stb.append("<html>");
 3        stb.append("<head><title>你的Title</title></head>");
 4        stb.append("<body onload=\"document.form1.submit()\">");
 5        stb.append("<form name=\"form1\" method=\"post\" action=\"https://webpaywg.bestpay.com.cn/payWeb.do\" >");
 6        stb.append(String.format("<input name=\"MERCHANTID\" type=\"hidden\" value=\"%s\">", merchantId)); //商戶號
 7        stb.append(String.format("<input name=\"ORDERSEQ\" type=\"hidden\" value=\"%s\">", orderSeq)); //訂單號
 8        stb.append(String.format("<input name=\"ORDERREQTRANSEQ\" type=\"hidden\" value=\"%s\">", orderSeq)); //訂單請求交易流水號
 9        stb.append(String.format("<input name=\"ORDERDATE\" type=\"hidden\" value=\"%s\">", orderDate)); //訂單日期
10        stb.append(String.format("<input name=\"ORDERAMOUNT\" type=\"hidden\" value=\"%s\">", orderAmount)); //訂單總金額
11        stb.append(String.format("<input name=\"PRODUCTAMOUNT\" type=\"hidden\" value=\"%s\">", orderAmount)); //產品金額
12        stb.append("<input name=\"ATTACHAMOUNT\" type=\"hidden\" value=\"0\">"); //附加金額
13        stb.append("<input name=\"CURTYPE\" type=\"hidden\" value=\"RMB\">"); //幣種
14        stb.append("<input name=\"ENCODETYPE\" type=\"hidden\" value=\"1\">"); //加密方式 MD5
15        stb.append(String.format("<input name=\"MERCHANTURL\" type=\"hidden\" value=\"%s\">", merchantUrl)); //前台返回地址
16        stb.append(String.format("<input name=\"BACKMERCHANTURL\" type=\"hidden\" value=\"%s\">", backMerchantUrl)); //后台返回地址
17        stb.append(String.format("<input name=\"ATTACH\" type=\"hidden\" value=\"%s\">", attach)); //商戶附加信息
18        stb.append("<input name=\"BUSICODE\" type=\"hidden\" value=\"0001\">"); //業務類型
19        stb.append("<input name=\"PRODUCTID\" type=\"hidden\" value=\"08\">"); // 業務標識
20        stb.append(String.format("<input name=\"TMNUM\" type=\"hidden\" value=\"%s\">", tmNum)); //終端號碼
21        stb.append(String.format("<input name=\"CUSTOMERID\" type=\"hidden\" value=\"%s\">", customerId)); //客戶標識
22        stb.append(String.format("<input name=\"PRODUCTDESC\" type=\"hidden\" value=\"%s\">", productDes)); //產品描述
23        stb.append(String.format("<input name=\"MAC\" type=\"hidden\" value=\"%s\">", mac)); //MAC校驗域
24        stb.append(String.format("<input name=\"CLIENTIP\" type=\"hidden\" value=\"%s\">", clientIp)); //客戶端IP
25        stb.append("</form></body>");
26        stb.append("</html>");
27        //入庫、記錄日志等
28        response.setContentType("text/html");
29        response.setCharacterEncoding("UTF-8");
30        PrintWriter out = response.getWriter();
31        out.write(stb.toString());

這里需要注意的是MAC這個值,翼支付網關會對這個值做校驗;接口文檔中提供了這個值的加密和MD5摘要算法樣例,所以只要按照文檔描述的規則來,一般不會有沒有什么問題。上面的參數中,有一個前台返回地址和后台返回地址,當用戶通過網銀完成支付后,翼支付網關會把用戶此次的支付結果POST到這2個地址,所以前台地址可以把支付結果展示給用戶,后台地址的話就用來處理商戶的業務邏輯吧。畢竟前台地址可能不會達到用戶側,或者用戶在支付完成后就直接關了當前窗口。另外后台地址在接收到支付結果數據后,一定要原路響應網關,不然網關那邊會不定時的持續發送重復的支付結果過來:

 1         request.setCharacterEncoding("UTF-8");
 2         String uptranSeq = request.getParameter("UPTRANSEQ"); //翼支付網關平台交易流水號
 3         String tranDate = request.getParameter("TRANDATE"); //翼支付網關平台交易日期
 4         String returnCode = request.getParameter("RETNCODE"); //處理結果碼 “0000” 表示支付成功,其他值則表示支付失敗
 5         String retuInfo = request.getParameter("RETNINFO"); //處理結果解釋碼
 6         if(retuInfo != null && !retuInfo.isEmpty()) {
 7             retuInfo = URLDecoder.decode(retuInfo, "UTF-8");
 8         }
 9         String orderReqTranseq = request.getParameter("ORDERREQTRANSEQ"); //訂單請求交易流水號
10         String orderReq = request.getParameter("ORDERSEQ"); //訂單號
11         String orderAmount = request.getParameter("ORDERAMOUNT"); //訂單總金額
12         String productAmount = request.getParameter("PRODUCTAMOUNT"); //產品金額
13         String attachMount = request.getParameter("ATTACHAMOUNT"); //附加金額
14         String curType = request.getParameter("CURTYPE"); //幣種
15         String encodeType = request.getParameter("ENCODETYPE"); //加密方式
16         String bankId = request.getParameter("BANKID"); //銀行編碼
17         String attach = request.getParameter("ATTACH"); //商戶附加信息
18         String upreqTranseq = request.getParameter("UPREQTRANSEQ"); //網關平台請求銀行流水號
19         String upbankTranseq = request.getParameter("UPBANKTRANSEQ"); //銀行流水號
20         String productNo = request.getParameter("PRODUCTNO"); //產品號碼
21         String sign = request.getParameter("SIGN"); //數字簽名
22         //對sign做數字簽名校驗(信息沒有被篡改)
23         //商戶業務邏輯處理、入庫、日志等
24         String returnContent = "UPTRANSEQ_" + uptranSeq;
25         PrintWriter out = response.getWriter();
26         out.write(returnContent); //回寫響應數據

    WEB支付的處理主要就是這塊,很好理解吧!
  至於退款接口,則是需要調用網關提供的WebService接口,如下所示,refundResult就是返回的退款結果了:

1         //Axis
2         refundV2.webservice.ideal.com.RefundServiceFenImplProxy teStub = new RefundServiceFenImplProxy();
3         String refundResult = teStub.refund(commCode, "", commPwd, oldOrderId, oldOrderPayId, orderRefundId, transamt, reqTime, mac);

  最后再記錄下,在寫一個簡單的日志記錄類時,本機開發環境的路徑中又有空格又有中文。。。這樣的話,采用 .getResource("").toURI().getPath() 方法來獲取路徑,就不怕任何奇特格式的路徑了~~~

 


免責聲明!

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



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