原由:公司平臺網站須要接入微信支付api
通過:有了新的需求後,做爲最底層的碼農,只能想辦法去碼出代碼。什麼都無論,先看官方文檔。微信
最後使用,掃碼支付中模式二的支付方式。商戶後臺系統先調用微信支付的統一下單接口,微信後臺系統返回連接參數code_url,商戶後臺系統將code_url值生成二維碼圖片,用戶使用微信客戶端掃碼後發起支付。注意:code_url有效期爲2小時,過時後掃碼不能再發起支付。app
支付流程圖:異步
選定模式後,查看api,設置請求參數,接收到code_url,生成二維碼,支付。到這都沒有問題微信支付
接下來問題來了,支付完成後,微信會異步回調商戶網址(notify_url),在這一步出現了幾個問題:網站
1.使用request接收不到返回參數url
2.(在問題1解決後)接收到的參數出現亂碼spa
3.咱們在處理完異步回調的業務邏輯後,須要同步返回信息給微信(文檔中爲一段xmlcode
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>
),代表支付成功,不然微信會屢次請求你的回調地址。我試用response對象輸出,結果微信一直會回調個人地址。xml
通過多方支援,以上問題終得解決,解決方式以下:
1.微信回調的時候,參數信息是在流中,須要經過流來接收
2.在接收流的時候,作一次格式化
3.同步通知微信,任然須要時試用流的方式
下面貼出代碼:
@RequestMapping(value = "/test/wxpaytest6") public void wxPay(HttpServletRequest request, HttpServletResponse response) { BufferedReader bis = null; try { bis = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8")); String line = null; String result = ""; while ((line = bis.readLine()) != null) { result += line + "\r\n"; } Map<String, String> map = WXPayUtil.xmlToMap(result); //簽名驗證 boolean signFlag = WXPayUtil.isSignatureValid(map, BTWXPayConfig.getInstance().getKey()); System.out.println(signFlag); System.out.println(map.get("out_trade_no")); System.out.println(map.get("result_code")); System.out.println(map.get("return_code")); //試用流輸出 BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); out.write("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>".getBytes()); out.flush(); out.close(); //無效代碼 // response.setContentType("text/xml"); // response.getWriter().write("<xml>" + // "<return_code><![CDATA[SUCCESS]]></return_code>" + // "<return_msg><![CDATA[OK]]></return_msg>" + // "</xml>"); } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
至此,結尾。