最近在用Yii2寫一個微信商城,在調用微信支付接口時遇到了問題。
支付環節是正常的,微信端能收到支付成功的系統提示,然而回調url始終收不到微信服務器的POST,經過手動測試,回調頁面的邏輯也沒有問題。
問題究竟出在哪呢,忽然想到在開發者中心里面可以掃碼加入一個接口報警群…… 加進去,果然5分鍾后發來了報警信息:
天啊,這是個啥!劇本不是這么寫的啊,開起來像極了首頁頭部了。。開始懷疑指定的notify_url是不是有問題了,重新檢查了下單邏輯,用硬編碼死死的又寫了一遍
$notify_url = 'http://www.xxx.com/index.php?r=pay/wx-notify';
再次支付一分錢:),等待提示吧。。。
好吧,如我所願,要抓狂了,提示信息還是一樣。既然我下單邏輯填的地址沒有問題,那只能判定是微信服務器訪問回調url的時候出錯。好,這次我要在controller的init函數中看看你的原型!
echo Yii::$app->request->absoluteUrl; exit;
然后繼續等待下次接口報警信息:
嗯哼,微信開發團隊你們滾出來,我保證不打死你!
寫文檔的孫子,還有你!參數全都忽略了,是否故意為之?然而文檔又沒有任何解釋,讓開發者們猜啊!
——————————————————————————我是正義的分割線—————————————————————————————
那么問題來了,解決方案那家強?這個就不用回答了,博主是藍翔黑客班畢業的!!!
翠花,上解決方案!
寫個不帶參的腳本notify.php ,把該腳本地址作為回調url。
它將作為中間人,把微信服務器發回來的支付通知數據post到我們先前寫的支付回調接口,並將處理結果回復給微信服務器。
1 <?php 2 $data = file_get_contents('php://input'); 3 if(empty($data)) 4 { 5 return; 6 } 7 $url = 'http://'.$_SERVER['HTTP_HOST'].'/index.php?r=pay/wx-notify'; 8 $curl = curl_init(); 9 curl_setopt($curl, CURLOPT_URL, $url); 10 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 11 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 12 curl_setopt($curl,CURLOPT_SSLVERSION,CURL_SSLVERSION_TLSv1); 13 curl_setopt($curl, CURLOPT_POST, 1); 14 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 15 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 16 $output = curl_exec($curl); 17 curl_close($curl); 18 echo $output; 19 ?>
寫完 ,收工!