php對微信支付回調處理的方法

應用場景

支付完成後,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。

對後臺通知交互時,如果微信收到商戶的應答不是成功或超時,微信認爲通知失敗,微信會通過一定的策略定期重新發起通知,儘可能提高通知的成功率,但微信不保證通知最終能成功。 (通知頻率爲15/15/30/180/1800/1800/1800/1800/3600,單位:秒)

注意:同樣的通知可能會多次發送給商戶系統。商戶系統必須能夠正確處理重複的通知。

推薦的做法是,當收到通知進行處理時,首先檢查對應業務數據的狀態,判斷該通知是否已經處理過,如果沒有處理過再進行處理,如果處理過直接返回結果成功。在對業務數據進行狀態檢查和處理之前,要採用數據鎖進行併發控制,以避免函數重入造成的數據混亂。

特別提醒:商戶系統對於支付結果通知的內容一定要做簽名驗證,並校驗返回的訂單金額是否與商戶側的訂單金額一致,防止數據泄漏導致出現“假通知”,造成資金損失。

微信支付回調處理分爲

1.同步
2.異步

這裏微信官方推薦使用 第二種

php對微信回調異步處理

?

1

2

3

4

5

6

7

8

9

10

11

12

//獲取返回的xml

$testxml = file_get_contents("php://input");

//將xml轉化爲json格式

$jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));

//轉成數組

$result = json_decode($jsonxml, true);

if($result){

     //如果成功返回了

     if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){

     //進行改變訂單狀態等操作。。。。

  }

}

本次微信支付返回的xml轉化爲json格式如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

{

  "appid": "12345",

  "attach": "pay",

  "bank_type": "CFT",

  "cash_fee": "1",

  "fee_type": "CNY",

  "is_subscribe": "Y",

  "mch_id": "12345",

  "nonce_str": "dZYFpaDYRpF5rwhv",

  "openid": "onhwF1hiutUySKCsrV21A6MCtT5Q",

  "out_trade_no": "SH201808222055598628",

  "result_code": "SUCCESS",

  "return_code": "SUCCESS",

  "sign": "5A019F52BEF1C3A98AE0F1FF29D01574",

  "time_end": "20180822205606",

  "total_fee": "1",

  "trade_type": "MWEB",

  "transaction_id": "4200000171201808221550954201"

}

其中

?

1

2

"result_code": "SUCCESS",

"return_code": "SUCCESS",

是判斷用戶是否已經支付的依據

 

 

 

 

 

 

第二種處理方式↓

因爲微信在後臺通知交互時,如果微信收到商戶的應答不符合規範或超時,微信會判定本次通知失敗,重新發送通知,直到成功爲止(在通知一直不成功的情況下,微信總共會發起10次通知,每次通知時間距離最近一次的間隔爲15/15/30/180/1800/1800/1800/1800/3600,單位:秒),但微信不保證通知最終一定能成功。

 

所以進來回調方法就要判斷這筆訂單在我們後臺數據庫是否支付成功了!

 

PHP處理微信支付回調

我們已經知道,微信無論是微信內置JSAPI支付、H5外部瀏覽器支付、掃碼支付,都需要通過異步回調接收支付結果。

本文簡介如何獲取微信支付通知。

僅需要一個在之前設置好的回調地址的方法裏寫上如下:

複製代碼

    //處理微信支付回調
    public function notify(){
    
        $testxml  = file_get_contents("php://input");
        
        $jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));

        $result = json_decode($jsonxml, true);//轉成數組,
        if($result){
            //如果成功返回了
            $out_trade_no = $result['out_trade_no'];
                    if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
      //執行業務邏輯
                    }
        }
    }    

複製代碼

需要特別注意的地方:微信支付結果通知,會按一定規則重複發送通知,因此執行業務邏輯之前,需要判斷是否是重複通知。

如果自己的業務邏輯執行成功後,可以return一個規定格式的XML,來告訴微信你已成功收到通知,並做好了相應處理。(當然不return也行。。。做好重複驗證機制就好)

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章