天天看點

微信支付結果通知

支付完成後,微信會把相關支付結果及使用者資訊通過資料流的形式發送給商戶,商戶需要接收處理,并按文檔規範傳回應答,官方說明如下:

微信支付結果通知

編碼思路:通過流擷取微信官方傳過來的資料,再根據官方提示進行驗簽以及業務校驗

代碼如下:此代碼僅供思路參考,具體需因個人不同的業務稍作修改

/**
     * 傳回成功xml
     */
    private String resSuccessXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";

    /**
     * 傳回失敗xml
     */
    private String resFailXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[封包為空]]></return_msg></xml>";
	/**
     * 微信支付回報
     *
     * @param request
     * @throws Exception
     */
    @RequestMapping(value = "notifyWxPay", method = RequestMethod.POST)
    public String notifyWxPay(HttpServletRequest request) throws Exception {
        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);

        InputStream inputStream = request.getInputStream();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        String resultxml = new String(outputStream.toByteArray(), "utf-8");
        Map<String, String> notifyMap = WXPayUtil.xmlToMap(resultxml);
        System.out.println("回調Map:" + notifyMap);
        outputStream.close();
        inputStream.close();
        // 簽名正确,進行處理
        if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
            //支付成功
            if ("SUCCESS".equals(notifyMap.get("return_code")) && "SUCCESS".equals(notifyMap.get("result_code"))) {
                //校驗訂單号是否存在
                if ("此處為自己的業務代碼") {
                    System.err.println("微信支付結果通知訂單号不存在");
                    return resFailXml;
                }
                //判斷微信支付重複回調,如果是處理過的業務直接傳回success
                if ("此處為自己的業務代碼") {
                    //已處理過業務,直接傳回成功
                    System.out.println("已處理過業務,直接傳回成功");
                    return resSuccessXml;
                }
                //校驗傳回的訂單金額是否與商戶側的訂單金額一緻,防止資料洩漏導緻出現“假通知”,造成資金損失
                if ("此處為自己的業務代碼") {
                    System.out.println("微信支付結果通知金額與訂單金額不比對");
                    return resFailXml;
                }
                //...
                //處理業務
                //...
                
            } else {
                System.out.println("沒有處理微信回調業務,微信交易狀态:" + notifyMap.get("err_code") + notifyMap);
            }
            return resSuccessXml;
        } else {
            // 簽名錯誤,如果資料裡沒有sign字段,也認為是簽名錯誤
            System.out.println("簽名錯誤,可能存在篡改資料風險!");
            return resFailXml;
        }
    }
           

代碼中的 MyConfig 類以及 WXPay 類都是微信官方提供的SDK類,SDK下載下傳位址:點選此處跳轉

如調用wxpay.isPayResultNotifySignatureValid 方法驗簽時傳回簽名錯誤,可檢視我另一篇文章:

微信支付結果通知簽名錯誤問題分析與解決辦法

SDK的MyConfig類初始化失敗時,可檢視:微信支付 java_sdk MyConfig類編譯錯誤解決辦法

上一篇: 感覺

繼續閱讀