Laravel6使用yansongda/pay扩展包进行微信或支付宝支付,异步回调不执行的问题解决
2019-10-26 admin laravel 1982
这几天在做微信和支付宝支付模块,为了开发效率使用yansongda/pay扩展包,但遇到一个问题:异步回调不执行,代码和官网类似的,比如支付宝回调部分:
public function notify() { $config = config('pay.alipay'); $alipay = Pay::alipay($config); try{ $data = $alipay->verify(); //验签 if ($data) { // 验证成功 $trade_status = $data->trade_status;// 交易状态 if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') { //此处支付成功后的业务逻辑处理根据自己需求 $dingdan = $data->out_trade_no; // 订单号 $jyh = $data->trade_no; // 支付宝交易号 $dkje = $data->total_amount; //订单总金额 $body = $data->body; //订单描述128限制字符,用来传递id和bm $sz = explode("-",$body);//分割为数组,前面为id,后面为bm $id = $sz[0]; $bm = $sz[1]; DB::table($bm)->where('id',$id)->update(['审核情况'=> '审核通过','备注'=> $dingdan]); Log::debug('Alipay notify', $data->all()); return $alipay->success(); } } else { // 验证失败 echo "fail"; } } catch (\Exception $e) { // $e->getMessage(); } //return $alipay->success(); }
经过无数次测试,支付成功,但是到try验签这步都不执行了。为了更好的测试,我在try前和try后加入以下代码,写入log文件测试:
$path=storage_path('logs/aaa.log'); $str=time().'回调'; file_put_contents($path,$str);//把字符串内容存储到aaa.log中。
测试证明,是try后面不执行。查看服务器nginx日志,支付宝服务器已回调了,有post记录。百度搜索了许多都是查参数,查链接是否有?等,但我这是不存在这问题的。将路由从post改为any,GET访问该回调页面是正常的,最后想到,回调是post,get正常不代表post正常,用精易网页调试助手post发现了问题:
原来是laravel的csrf安全机制导致的问题,接下来就容易了,关闭相应路由的csrf验证,找到app/Http/Middleware/VerifyCsrfToken.php文件,添加:
namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { /** * Indicates whether the XSRF-TOKEN cookie should be set on the response. * * @var bool */ protected $addHttpCookie = true; /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ '/aliht_url',//支付宝异步回调不启用csrf '/notify_url',//微信支付回调不启用csrf ]; }
这样,异步回调就能正常走下去了。
特此记录,以备今后查询。