Laravel6使用yansongda/pay扩展包进行微信或支付宝支付,异步回调不执行的问题解决

发布于2019-10-27 08:34:30  分类:laravel   阅读( 1455 ) 

这几天在做微信和支付宝支付模块,为了开发效率使用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
    ];
}

这样,异步回调就能正常走下去了。

特此记录,以备今后查询。

最后更新于:2019-10-27 16:37:51


上一篇: Laravel-admin删除行操作回调无法获得模型id的解决办法

下一篇: Laravel6.* 集成阿里云短信,发送验证码或其它信息(废弃)


  • 最新评论(共1条)
  •  闲心 :老哥你这个是将回调路由放在了webroute中的吗?? 假如放在api route中是不是不会走csrf的middware呢?
需要登录才能发表评论

加入组织

  • QQ
  • 1. 手Q扫左侧二维码

    2. 搜Q群:617719749

    3. 点击加入学习群

最新评论