ThinkPHP6+easywechat做微信支付掃碼支付遇到的回調問題

代碼環境:thinkPHP6 + php7.2 + windows server

框架運行方式:worker (命令行裏運行 php think worker)

遇到的問題:

1.支付成功後,微信沒有請求(沒有進到)配置的回調接口;

2.請求接口後,接口裏未獲取到相應的xml參數。

問題1詳細描述:在統一生成訂單接口中配置的回調地址(notify_url),外網可直接訪問且能訪問成功,服務器也沒有做防火牆策略限制。

導致問題的原因:我們項目的所有接口都是走的統一網關,網關那邊限制了raw方式的請求(微信請求回調地址是用的POST方式,參數是用的raw方式傳輸)。

解決方法:公司大佬幫忙更改網關限制問題後,微信可正常訪問設置的回調地址。

問題2詳細描述:使用easywechat的回調處理方法handlePaidNotify(),一直報"Invalid request XML"錯誤,不知道是不是因爲使用命令行運行框架的原因,所以easywechat一直拿不到xml數據,但是在$GLOBALS['HTTP_RAW_POST_DATA']中能獲取到。

注意:如果在命令行中(cmd)使用的"php think worker"命令來運行框架的話,通過$GLOBALS['HTTP_RAW_POST_DATA']可以拿到xml數據,但如果在命令行中(cmd)使用的"php think run"命令來運行框架的話,只有通過file_get_contents("php://input")來獲得xml數據。另外,有網友說php升級到7以後,沒有$GLOBALS['HTTP_RAW_POST_DATA']了,但是目前我們使用的7.2版本,暫時還能獲取到。

解決方法:放棄使用easywechat提供的handlePaidNotify()方法來處理回調邏輯,直接使用easywechat中的XML::parse()來解析數據,根據獲取到的微信返回的狀態來完成自己的代碼邏輯。

    // 從$GLOBALS['HTTP_RAW_POST_DATA']裏和file_get_contents("php://input")裏都獲取一下數據
    $message = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
    if(empty($message)) $message = file_get_contents("php://input");
    if(empty($message))  return false;

    // 將xml數據解析位數組
    $message = XML::parse($message);

    //你自己處理訂單的代碼邏輯
    ………………
    

by the way:可以使用easywechat中的 XML::build($data)方法來組裝你要返給微信的xml數據。

$data= ['return_code' => 'FAIL', 'return_msg' => $res];
echo XML::build($data);
return toJson('');  // toJson是我們自己封裝的返回json格式的方法

寫在最後:可能文章我的描述不是很清楚,如果你遇到相同的問題需要諮詢的話,請留言或聯繫QQ:2639134322

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