在微信支付中,當用戶支付成功後,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。 在經歷了千幸萬苦之,填完了所有的JSAPI支付的坑後(微信JSAPI支付 跟 所遇到的那些坑),好不容易調起了微信支付介面,看到了親愛的支付頁面,支付成功後發現自己還有個叫做微信回調的忘了處理, ...
在微信支付中,當用戶支付成功後,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。
在經歷了千幸萬苦之,填完了所有的JSAPI支付的坑後(微信JSAPI支付 跟 所遇到的那些坑),好不容易調起了微信支付介面,看到了親愛的支付頁面,支付成功後發現自己還有個叫做微信回調的忘了處理,內心一萬隻草泥馬在狂奔中。
首先:
檢查在統一下單的時候,通知地址是否填寫正確。
接收微信支付非同步通知回調地址也是有要求:通知url必須為直接可訪問的url,不能攜帶參數。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
在微信支付開發,支付結果通用通知介紹說明頁面→https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3。
說明瞭:支付完成後,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。
一開始我是蒙逼的,不知道這個是要用頁面來做還是用一般處理程式來弄,回調回來後,更新支付狀態,然後做應答,啥應答,我要咋應答??what??
而且如果如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,微信會通過一定的策略定期重新發起通知,儘可能提高通知的成功率,但微信不保證通知最終能成功。 (通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)
意味著,有可能用戶支付成功了,微信也不能保證通知成功。
如果我不做出應答微信會重新發起通知,回調支付成功頁面。
還有個坑是 註意:同樣的通知可能會多次發送給商戶系統。商戶系統必須能夠正確處理重覆的通知。
所以說,在微信回調時候,還要判斷這個訂單是否回調過,併成功了。
這個回調頁面的地址不能泄露哦,防止惡意虛假有人模擬微信回調,出現“假通知”,造成資金損失。
在看完微信的官方文檔後,以及各種搜索後,開始了微信支付回調的處理。
(1)在微信支付授權目錄下新建一個aspx頁面作為微信回調頁面。
(2)代碼
string returnResutStr = ""; try { Logger.Info("微信支付回調進入頁面"); #region 獲取參數值 根據需要解析對應的參數 ResponseHandler resHandler = new ResponseHandler(null); string result_code = resHandler.GetParameter("result_code");//業務結果 string return_code = resHandler.GetParameter("return_code");//返回狀態嗎 string out_trade_no = resHandler.GetParameter("out_trade_no");//商戶訂單號 string WEXIN_OPENID = resHandler.GetParameter("openid");//微信openid string transaction_id = resHandler.GetParameter("transaction_id");//微信支付單號 #endregion if (result_code == "SUCCESS" && return_code == "SUCCESS") //驗證 是否 微信 回調 { #region 日誌處理 Logger.Info("微信支付回調,驗證成功,訂單號:" + orderno); #endregion #region 驗證成功 邏輯處理
if (//判斷是否為真實訂單){
//更新支付狀態 if (fals) //更新支付狀態成功 { #region 日誌處理 Logger.Info("微信支付回調更新訂單支付狀態,更新訂單支付狀態成功,訂單號:" + orderno); #endregion returnResutStr ="<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; } else //更新支付狀態失敗 { #region 日誌處理 Logger.Info("微信支付回調更新訂單支付狀態,更新訂單支付狀態失敗,訂單號:" + orderno); #endregion returnResutStr ="<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[error]]></return_msg></xml>"; } } else { Logger.Info("微信支付回調更新訂單支付狀態,查無此單,訂單號:" + out_trade_no); } #endregion } else //微信回調失敗 { #region 日誌處理 Logger.Error("微信支付回調更新訂單支付狀態,驗證失敗,回調參數是非法的"); #endregion returnResutStr ="<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[error]]></return_msg></xml>"; } } catch (Exception exception) { #region 添加錯誤日誌 Logger.Error("微信支付回調更新訂單支付狀態,出現異常:" + exception.Message + ",堆棧:" + exception.StackTrace); #endregion returnResutStr = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[error]]></return_msg></xml>"; } Response.Write(returnResutStr);
returnResutStr 就是返回的應答。
一開始,支付成功後,仔細檢查回調地址沒問題。可是微信回調一直沒有進入頁面,日誌也沒有記錄到有回調進入界面。
後來發現這個回調頁面繼承了基類,把回調地址攔截。我這個大傻逼。
參考:
微信開發文檔之支付結果通用通知:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3