使用crmeb小程序微信支付时发现回调失败,查看日志显示
Cannot modify header information - headers already sent by...
按网上说法在程序开始前使用了 ob_start();
设置了php.ini里面的output_buffering=on;
问题仍未解决
手动模拟微信回调请求发现响应信息中包含了请求头
HTTP/1.0 200 OK
Cache-Control: no-cache, private
Date: Thu, 06 Jul 2023 06:17:31 GMT
<xml>
<return_code>
<![CDATA[SUCCESS]]>
</return_code>
<return_msg>
<![CDATA[OK]]>
</return_msg>
</xml>
查看代码发现回调方法中未使用getContent()方法,添加后请求正常
回调方法是app/api/controller/v1/PayController.php中的notify方法
public function notify(string $type)
{
switch (urldecode($type)) {
case 'alipay':
/** @var Pay $pay */
$pay = app()->make(Pay::class, ['ali_pay']);
return $pay->handleNotify();
case 'v3wechat':
return app()->make(Pay::class, ['v3_wechat_pay'])->handleNotify()->getContent();
case 'routine':
//其他方法都调用了getContent();不知道这个为什么没调用
//return MiniProgramService::handleNotify();
//添加后运行正常
return MiniProgramService::handleNotify()->getContent();
case 'wechat':
if (sys_config('pay_wechat_type')) {
/** @var Pay $pay */
$pay = app()->make(Pay::class, ['v3_wechat_pay']);
} else {
/** @var Pay $pay */
$pay = app()->make(Pay::class);
}
return $pay->handleNotify()->getContent();
default:
if (strstr($type, 'allin') !== false) {
/** @var Pay $pay */
$pay = app()->make(Pay::class, ['allin_pay']);
return $pay->handleNotify($type);
}
}
}
另 crmeb\services\app\MiniProgramService.php的handleNotify执行成功没有写return,导致会走最下面的return false导致回调数据已经写入成功,但是回调返回结果是失败