記一次微信支付走過的坑


 起因:公司平台網站需要接入微信支付

 經過:有了新的需求后,作為最底層的碼農,只能想辦法去碼出代碼。什么都不管,先看官方文檔。

    最后使用,掃碼支付中模式二的支付方式。商戶后台系統先調用微信支付的統一下單接口,微信后台系統返回鏈接參數code_url,商戶后台系統將code_url值生成二維碼圖片,用戶使用微信客戶端掃碼后發起支付。注意:code_url有效期為2小時,過期后掃碼不能再發起支付。

           支付流程圖

   

   選定模式后,查看api,設置請求參數,接收到code_url,生成二維碼,支付。到這都沒有問題

   接下來問題來了,支付完成后,微信會異步回調商戶網址(notify_url),在這一步出現了幾個問題:

    1.使用request接收不到返回參數

               2.(在問題1解決后)接收到的參數出現亂碼

    3.我們在處理完異步回調的業務邏輯后,需要同步返回信息給微信(文檔中為一段xml

<xml>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[OK]]></return_msg>
</xml>

),表明支付成功,否則微信會多次請求你的回調地址。我試用response對象輸出,結果微信一直會回調我的地址

 

經過多方支援,以上問題終得解決,解決方式如下:

   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();
                }
            }

        }
    }

至此,結尾。


免責聲明!

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



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