微信支付-支付結果通知接收

微信支付-支付結果通知接收

最近在做微信支付功能在微信成功後,微信通過異步方式返回支付結果是遇到了問題:參數接收不到。後來通過查閱資料纔將問題解決,現在將解決方法分享一下。

官方文檔解釋

這裏寫圖片描述

如上圖所示:通過微信支付時要先在微信支付系統生成預付訂單,然後才能在前臺發起支付請求。生成預付訂單時會向微信支付系統傳遞一個參數:notify_url。下面是該參數的解釋:

這裏寫圖片描述

微信對這個回調路徑沒有特殊要求,不需要授權目錄下,也不需要在同一個域名下,端口也沒要求。

支付完成後,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。
對後臺通知交互時,如果微信收到商戶的應答不是成功或超時,微信認爲通知失敗,微信會通過一定的策略定期重新發起通知,儘可能提高通知的成功率,但微信不保證通知最終能成功。 (通知頻率爲15/15/30/180/1800/1800/1800/1800/3600,單位:秒)

注意:微信調用notify_url時不會攜帶參數,所以說商戶後臺系統不能直接獲得微信返回的支付信息,返回信息是以數據流的方式返回的,必須先將流信息轉化成XML形式才能獲得支付信息。微信返回的支付信息如下所示:

<xml>
  <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
  <attach><![CDATA[支付測試]]></attach>
  <bank_type><![CDATA[CFT]]></bank_type>
  <fee_type><![CDATA[CNY]]></fee_type>
  <is_subscribe><![CDATA[Y]]></is_subscribe>
  <mch_id><![CDATA[10000100]]></mch_id>
  <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
  <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
  <out_trade_no><![CDATA[1409811653]]></out_trade_no>
  <result_code><![CDATA[SUCCESS]]></result_code>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
  <sub_mch_id><![CDATA[10000100]]></sub_mch_id>
  <time_end><![CDATA[20140903131540]]></time_end>
  <total_fee>1</total_fee>
  <trade_type><![CDATA[JSAPI]]></trade_type>
  <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml> 

具體含義請參照官方文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7

實現方式

public String getWeChatPayReturn(HttpServletRequest httpServletRequest){
    try {
            InputStream inStream = request.getInputStream();
            int _buffer_size = 1024;
            if (inStream != null) {
                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                byte[] tempBytes = new byte[_buffer_size];
                int count = -1;
                while ((count = inStream.read(tempBytes, 0, _buffer_size)) != -1) {
                    outStream.write(tempBytes, 0, count);
                }
                tempBytes = null;
                outStream.flush();
                //將流轉換成字符串
                String result = new String(outStream.toByteArray(), "UTF-8");
                //將字符串解析成XML
                Document doc = DocumentHelper.parseText(result);
                //將XML格式轉化成MAP格式數據
                Map<String, Object> resultMap = XmlMapHandle.Dom2Map(doc);
                //後續具體自己實現
            }
            //通知微信支付系統接收到信息
        return "<xml><return_code><![CDATA[SUCCESS]]></return_code>
                      <return_msg><![CDATA[OK]]></return_msg>
                 </xml>";
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        //如果失敗返回錯誤,微信會再次發送支付信息
        return "fail";
}

通過上面的操作,應該不會有太大的問題了。

發佈了47 篇原創文章 · 獲贊 195 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章