代码之家  ›  专栏  ›  技术社区  ›  Dexter Bengil

laravel cashier cancel()引发BadMethodCallException

  •  0
  • Dexter Bengil  · 技术社区  · 7 年前

    我使用了laravel cashier来处理用户的订阅,但是当我尝试执行基本的取消操作时 $user->subscription('main')->cancel() ,正在引发异常

    BadMethodCallException:调用中的Undefined Method Illuminate\Database\query\Builder::asstripecustomer()

    \ try\vendor\laravel\framework\src\illumed\database\query\builder.php:2483

    堆栈跟踪:

    \try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(1470): Illuminate\Database\Eloquent\Builder->__call('asStripeCustome...', Array)

    \try\vendor\laravel\cashier\src\Subscription.php(345): Illuminate\Database\Eloquent\Model->__call('asStripeCustome...', Array)

    \try\vendor\laravel\cashier\src\Subscription.php(256): Laravel\Cashier\Subscription->asStripeSubscription()

    我正确地设置了模型并使用 Billable 所以我真的不知道是什么导致了这个错误

    应用程序\用户.php

    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Laravel\Cashier\Billable;
    
    class User extends Authenticatable{
       use Billable;
    
       ...
    }
    

    应用程序\http\controllers\usercontroller.php

    public function cancelSubscription(Request $request)
    {
        $user = $request->user();
    
        try {
            if ($user->subscription('main')->onTrial()) {
                $user->subscription('main')->cancelNow();
            } else {
                $user->subscription('main')->cancel();
            }
        } catch (\Exception $e) {
            \Log::error($e);
            return [
                'success' => 0,
                'message' => "Something went wrong while trying cancel your subscription. Please try again later."
            ];
        }
    

    任何帮助和提示将不胜感激,谢谢提前!

    2 回复  |  直到 7 年前
        1
  •  1
  •   Dexter Bengil    7 年前

    我的错,我刚发现它实际上是我的条纹配置 /config/services.php 因为我有两个模型给我的用户(因为我也在使用另一个包 laravel-cashier 通过authorize.net处理付款,最后我为他们创建了不同的模型)

    'stripe' => [
        // 'model' => App\AnetUser::class, => this actually caused the error as
                   // ->asStripeCustomer() doesn't exists on an Authorize.net's Billable trait 
        'model' => App\User::class,
        'key' => env('STRIPE_KEY'),
        'secret' => env('STRIPE_SECRET'),
    ],
    

    我觉得自己很蠢。除息的

        2
  •  0
  •   Pol Lluis    7 年前

    嗨,我以前从来没有和laravel cashier合作过,但是,我认为问题的根源可能是您正在从请求访问用户,因此它不是一个用户实例,这就是为什么它会触发未定义的方法错误。

    因此,创建一个用户实例可能适合您:

    注意:我不知道$request->用户是主键还是整个用户实例,所以我添加了不同的解决方案

    public function cancelSubscription(Request $request)
    {
        // if $request->user is the user instance you can do this:
        $user = App\User::findOrFail($request->user->id);
    
        // if $request->user was any other field from user you could retrieve
        // the user using something like-> 
       // App\User::where('fieldName', 'LIKE', $request->user)->firstOrFail();
    
    
        try {
            if ($user->subscription('main')->onTrial()) {
                $user->subscription('main')->cancelNow();
            } else {
                $user->subscription('main')->cancel();
            }
        } catch (\Exception $e) {
            \Log::error($e);
            return [
                'success' => 0,
                'message' => "Something went wrong while trying cancel your subscription. Please try again later."
            ];
        }
    }