手把手教你光大支付
一、支付流程圖
二、流程分析
1.頁(yè)面ajax訪問(wèn)后臺(tái)(servlet或resetful接口),給后臺(tái)傳支付參數(shù)
2.后臺(tái)根據(jù)參數(shù)組織明文和暗文后,返回給前端ajax
3.前端ajax獲取后臺(tái)組織的明文和暗文,以此作為參數(shù)訪問(wèn)支付網(wǎng)關(guān)
4.支付成功后,光大會(huì)訪問(wèn)設(shè)置的回調(diào)地址,在回調(diào)地址中驗(yàn)簽,通過(guò)則處理訂單,以組織明文和暗文回復(fù)光大,支付完成
?
三、代碼
1.view層
(1)ajax訪問(wèn)后臺(tái)資源
function pay(restfulUrl, formdata){$.get(requestUrl+formdata,function(data, status){if(data.status == -1) {alert(data.msg);return;}else if(data.status == 1)//window.open(payUrl);//open形式qq瀏覽器打不開(kāi),href的形式可以打開(kāi)window.location.href = data.msg.payUrl+"?Plain="+data.msg.plain+"&Signature="+data.msg.signature;},"json"); });?
?
3.service層(restful)
(1)PayService.java
?
1 public class PayService { 2 3 /** 4 * 發(fā)送光大支付請(qǐng)求 5 */ 6 public String pay(Map<String, String> paramMap) throws Exception { 7 8 StringBuilder sb = new StringBuilder(""); 9 String split = "~|~"; 10 sb.append("MerchantId="+Config.merchantId+split); //商戶代碼 11 sb.append("IdentityType=2"+split); //用戶標(biāo)識(shí)類型 固定2, 用戶ID 12 sb.append("MerCifId="+UUID.randomUUID().toString()+split); //客戶在本系統(tǒng)的唯一標(biāo)示(客戶ID),光大據(jù)此來(lái)記錄用戶的銀行卡信息 13 sb.append("PayType=01"+split); //支付類型 01 網(wǎng)上支付(固定值) 14 sb.append("MerchantSeqNo="+order_id+split); //商戶訂單號(hào) 15 sb.append("MerchantDateTime="+new Date()+split); //商戶時(shí)間 16 sb.append("TransAmount="+payAmount+split); //交易金額 單位:元 17 sb.append("TerminalType=0"+split); //終端標(biāo)識(shí)類型 0 IMEI,1 MAC,2 UUID(針對(duì)IOS系統(tǒng)),3 OTHER 18 sb.append("TerminalId=web"+split); //終端號(hào) 19 sb.append("MerSecName="+split); //二級(jí)商戶名,測(cè)試必送中文,生產(chǎn)可以空著 20 sb.append("ProductCataLog=57"+split); //57:綜合服務(wù)(固定值) 21 sb.append("MerProduct="+""+split); //商品名稱 22 sb.append("MerchantUrl="callbackUrl+split); //用于后臺(tái)通知商戶,用servlet響應(yīng) 23 sb.append("MerchantUrl1="+successUrl+split); //用于后臺(tái)通知商戶失敗或者默認(rèn)情況下,引導(dǎo)客戶回商戶頁(yè)面,用servlet響應(yīng) 24 //sb.append("UserIp", "127.0.0.1"); //支付地址,測(cè)試時(shí)127.0.0.1在微信瀏覽器中無(wú)法打開(kāi) 25 sb.append("msgExt="+paramMap.get("biztypeName")); //附加信息 26 27 String plain = sb.toString(); 28 String signature = CebMerchantSignVerify.merchantSignData_ABA(plain); 29 30 sb.delete(0, sb.length()); 31 sb.append("{"); 32 sb.append("\"payUrl\":\""+cebPayUrl+"\","); 33 sb.append("\"plain\":\""+plain+"\","); 34 sb.append("\"signature\":\""+signature+"\""); 35 sb.append("}"); 36 37 return new JSONUtil.toJson(CebBean(1, sb.toString(), "test")); 38 } 39 }?
4.回調(diào)處理
(1)CallBack.java
@Path("/payback") public class CebbackService {@ContextHttpServletRequest req;@ContextHttpServletResponse resp;@POST@Path("/cebback")public String cebBack(@FormParam("Plain") String plain,@FormParam("Signature") String signature) {try {connection = JDBCUtil.getConnection();connection.setAutoCommit(false);//response.setCharacterEncoding("GBK"); //移動(dòng)端 get utf-8,pc端 post GBK;//驗(yàn)簽銀行信息boolean flag = CebMerchantSignVerify.merchantVerifyPayGate_ABA(signature, plain);if(flag){//拆分接收到的plain,提取需要的字段響應(yīng)光大String[] datas = plain.split("~\\|~");Map<String, String> map = new HashMap<String, String>();String [] temp = new String[2];for(int i = 0 ; i < datas.length ; i++){System.out.println(datas[i]);temp = datas[i].split("=");if(temp.length == 1)map.put(temp[0], "");elsemap.put(temp[0], temp[1]);}map.put("signature", signature);//組織響應(yīng)光大的信息StringBuffer sf = new StringBuffer();sf.append("merchantId="+map.get("merchantId")+"~|~"); //商戶代碼 Char 12sf.append("orderId="+map.get("orderId")+"~|~"); //訂單號(hào) Char 30sf.append("transDateTime="+map.get("transDateTime")+"~|~"); //交易時(shí)間 Char 14 訂單發(fā)起的時(shí)間sf.append("procStatus=1~|~"); //處理狀態(tài) Char 1 1: 處理成功sf.append("MerchantUrl2="+Config.successUrl+"?orderId="+map.get("orderId")); //商戶URL2 Char 256 商戶成功接收支付訂單情況下的,商戶展示頁(yè)面String plain = sf.toString();String signature = CebMerchantSignVerify.merchantSignData_ABA(plain);//resp.reset();PrintWriter out = resp.getWriter();resp.getWriter().print("Plain=" + plain);resp.getWriter().print("\n");resp.getWriter().print("Signature=" + signature);resp.getWriter().flush();resp.getWriter().close();return "光大回調(diào)成功!";}else{return "不是光大回調(diào)此方法";}} catch (Exception e) {e.printStackTrace();try {if(connection != null)connection.rollback();log(e.getMessage());} catch (SQLException e1) {e1.printStackTrace();}} finally{JDBCUtil.close(connection);}}/*** 成功響應(yīng)光大后的回調(diào)處理(形式)*/@GET@Path("/paysuccess")public String cebPaySuccess(){try {resp.sendRedirect("cebPaySuccess.html?orderId="+req.getParameterMap().get("Plain").get("orderId"));} catch (IOException e) {e.printStackTrace();}return "支付成功!";}
(2)servlet
callback.java
1 public void service(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 Connection conn = null; 4 try { 5 conn =JDBCUtil.getConn(); 6 conn.setAutoCommit(false); 7 String plain = request.getParameter("Plain"); 8 String signature = request.getParameter("Signature"); 9 10 //驗(yàn)簽銀行信息 11 boolean flag = CebMerchantSignVerify.merchantVerifyPayGate_ABA(signature, plain); 12 if(flag){ 13 //拆分接收到的plain,提取需要的字段響應(yīng)光大 14 Map<String, String> map = CebUtil.getParam(plain, "~\\|~"); 15 map.put("signature", signature); 16 17 //組織響應(yīng)信息 18 StringBuffer sf = new StringBuffer(); 19 sf.append("merchantId="+map.get("merchantId")+"~|~"); //商戶代碼 Char 12 20 sf.append("orderId="+map.get("orderId")+"~|~"); //訂單號(hào) Char 30 21 sf.append("transDateTime="+map.get("transDateTime")+"~|~"); //交易時(shí)間 Char 14 訂單發(fā)起的時(shí)間 22 sf.append("procStatus=1~|~"); //處理狀態(tài) Char 1 1: 處理成功 23 sf.append("MerchantUrl2="+cebSuccessUrl);//商戶URL2 Char 256 商戶成功接收支付訂單情況下的,商戶展示頁(yè)面 用servlet響應(yīng) 24 //sf.append("MerchantUrl2="+cebSuccessUrl/restful/callback/cebsuccess");//報(bào)錯(cuò):java.lang.IllegalArgumentException: Illegal character in query 25 String plain = sf.toString(); 26 String signature = CebMerchantSignVerify.merchantSignData_ABA(plain); 27 28 //響應(yīng)光大支付的回調(diào) 29 //response.reset(); 30 PrintWriter out = response.getWriter(); 31 out.print("Plain=" + resPlain); 32 out.print("\n"); 33 out.print("Signature=" + resSignature); 34 out.flush(); 35 out.close(); 36 //return; //寫(xiě)或不寫(xiě),光大支付都能正確收到響應(yīng) 37 }else{ 38 System.out.println("非光大調(diào)用此方法"); 39 return; 40 } 41 } catch (Exception e) { 42 try { 43 if(conn != null) 44 conn.rollback(); 45 } catch (SQLException e1) { 46 e1.printStackTrace(); 47 } 48 return; 49 } finally{ 50 JDBCUtil.closeConn(conn); 51 } 52 }?
success.java
1 public void service(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 try { 4 response.sendRedirect(cebSuccessUrl+"?orderId="+request.getParameterMap().get("Plain").get("orderId")); 5 } catch (IOException e) { 6 e.printStackTrace(); 7 } 8 } 9?
四、運(yùn)行結(jié)果
?
轉(zhuǎn)載于:https://www.cnblogs.com/shamgod/p/5175106.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: Leetcode题解(20)
- 下一篇: 201602021344_《Javasc