You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel安装CoinPayment插件后用户注册报错求助

问题解析与解决方案

嘿,我帮你梳理下这个问题的根源和解决办法:

核心问题在哪?

从错误日志能明显看到,系统在找 App\Providers\App\Jobs\CoinpaymentListener 这个类,但你的 CoinpaymentListener 实际命名空间是 App\Jobs —— 这说明事件监听器的注册路径写错了,多了个多余的 App\Providers\ 前缀。

另外,你的 CoinpaymentListener 代码还有个致命的语法问题:所有业务逻辑直接写在了类的根作用域里,没放在 handle() 方法里——Laravel 的队列任务必须通过 handle() 方法来执行逻辑,不然根本跑不起来。


第一步:修正监听器的注册路径

找到你注册 Illuminate\Auth\Events\Registered 事件的地方(大概率是项目根目录下的 app/Providers/EventServiceProvider.php,或者是插件自带的配置文件),把监听器的路径从 App\Providers\App\Jobs\CoinpaymentListener 改成 App\Jobs\CoinpaymentListener。

举个例子,在 EventServiceProvider 的 $listen 数组里应该改成这样:

protected $listen = [
    Illuminate\Auth\Events\Registered::class => [
        // 把错误的路径换成正确的
        App\Jobs\CoinpaymentListener::class,
    ],
];

第二步:修复 CoinpaymentListener 的语法错误

我帮你把代码修正了,主要是补了 handle() 方法,还顺便改了一处变量名的错误(原代码里把用户ID和支付记录搞混了):

<?php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Payment;
use App\User;
use Illuminate\Support\Facades\Auth;

class CoinpaymentListener implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $transaction;

    /**
     * 创建任务实例
     *
     * @return void
     */
    public function __construct($transaction)
    {
        $this->transaction = $transaction;
    }

    /**
     * 执行任务逻辑
     *
     * @return void
     */
    public function handle()
    {
        if($this->transaction['status'] >= 100 || $this->transaction['status'] == 2) {
            // 支付完成或排队等待夜间结算,标记为已批准
            Payment::where('transactionid', $this->transaction['txn_id'])->update(['status' => 'approved']);
            $paymentRecord = Payment::where('transactionid', $this->transaction['txn_id'])->select(['userid', 'amount'])->first();
            $user = User::where('id', $paymentRecord->userid)->select('amount')->first();
            $newAmount = $user->amount + $paymentRecord->amount;
            User::where('id', $paymentRecord->userid)->update(['amount' => $newAmount]);
        } elseif($this->transaction['status'] < 0){
            // 支付出错,通常是最终状态,但无汇率转换或卖家同意时可能重新开启
            Payment::where('transactionid', $this->transaction['txn_id'])->update(['status' => 'cancelled']);
        } else {
            // 支付待处理,可选择性在订单页添加备注
            if($this->transaction['transaction_type'] == 'new') {
                $table = new Payment();
                $table->userid = Auth::id();
                $table->gateway = 'CoinPayment';
                $table->amount = $this->transaction['payload'];
                $table->status = 'pending';
                $table->transactionid = $this->transaction['txn_id'];
                $table->itemname = 'Add Funds';
                $table->save();
            }
        }
    }
}

第三步:清理缓存(可选但强烈推荐)

执行下面的命令清除 Laravel 的类缓存,确保新的类路径和修正后的代码能立即生效:

php artisan cache:clear
php artisan config:clear
php artisan optimize:clear

做完这三步,用户注册时的 BindingResolutionException 错误应该就消失了,支付监听的逻辑也能正常跑起来啦。

内容的提问来源于stack exchange,提问作者user10975763

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:52:40