laravel5.7 easywechat~4.0微信支付回调

回调函数

$response = $app->handlePaidNotify(function ($message, $fail) {
    // 你的逻辑
    return true;
    // 或者错误消息
    $fail('Order not exists.');
});

$response->send(); // Laravel 里请使用:return $response;

注意

(1).wechat发送回调是通过post方式,在路由处定义了之后,还需要在laravel项目中排除token验证,我建议在中间件中VerifyCsrfToken.php进行排除路由。

protected $except = [

    '/pay_success_notify',
    
];
  • 重点!重点!重点! 回调这里的处理可以说是重中之重,这里出岔子,可能会造成 用户支付成功后,微信的 * 回调没有进来 * ,后台回调的逻辑就没有执行,导致用户钱花了,东西没买上(即你的服务器上没有执行给付费用户修改支付状态等数据库操作)。
    另一种后果,如果没有正确返回微信参数,微信会多次发送回调信息来提醒你支付成功了,导致你的服务器 * 接受回调函数多遍 * 。而此时你也马马虎虎,没有在支付成功的逻辑上对用户的支付状态进行判断,导致逻辑用户充一次钱,在数据库却重复执行了好几次相关数据库操作。前者坑了付费用户,后者坑了你的公司,这里如果不注意的话,后果只会很严重,涉及到钱的地方要倍加小心。
  • 在回调路由指向的方法内,如果你的支付成功的逻辑成功运行了,需要return true;如果没有成功进行数据库操作,需要返回false;或不返回,微信会再一次发送回调信息(post方式)。

一些easywechat官方的建议:

这里需要注意的有几个点:

  • 退款结果通知和扫码支付通知的使用方法均类似。

  • handlePaidNotify 只接收一个 Closure 匿名函数。

  • 该匿名函数接收两个参数,这两个参数分别为:

  • $message 为微信推送过来的通知信息,为一个数组; - $fail 为一个函数,触发该函数可向微信服务器返回对应的错误信息,微信会稍后重试再通知

  • 该函数返回值就是告诉微信 “我是否处理完成”。如果你触发 $fail 函数,那么微信会在稍后再次继续通知你,直到你明确的告诉它:“我已经处理完成了”,只有在函数里 return true; 才代表处理完成。

  • handlePaidNotify 返回值 $response 是一个 Response 对象,如果你要直接输出,使用 $response->send(), 在一些框架里(如 Laravel)不是输出而是返回:return $response

通常我们的处理逻辑大概是下面这样(以下只是伪代码):

$response = $app->handlePaidNotify(function($message, $fail){
    // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
    $order = 查询订单($message['out_trade_no']);

    if (!$order || $order->paid_at) { // 如果订单不存在 或者 订单已经支付过了
        return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
    }

    ///////////// <- 建议在这里调用微信的【订单查询】接口查一下该笔订单的情况,确认是已经支付 /////////////

    if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
        // 用户是否支付成功
        if (array_get($message, 'result_code') === 'SUCCESS') {
            $order->paid_at = time(); // 更新支付时间为当前时间
            $order->status = 'paid';

        // 用户支付失败
        } elseif (array_get($message, 'result_code') === 'FAIL') {
            $order->status = 'paid_fail';
        }
    } else {
        return $fail('通信失败,请稍后再通知我');
    }

    $order->save(); // 保存订单

    return true; // 返回处理完成
});

$response->send(); // return $response;

你可能感兴趣的:(laravel5.7 easywechat~4.0微信支付回调)