最近在用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 ?>
写完 ,收工!