【问题标题】:Laravel Cashier cancel() throws a BadMethodCallExceptionLaravel Cashier cancel() 抛出 BadMethodCallException
【发布时间】:2018-11-12 21:15:36
【问题描述】:

我使用 Laravel Cashier 处理用户的订阅,但是当我尝试进行基本取消 $user->subscription('main')->cancel() 时,抛出异常

BadMethodCallException: 在

中调用未定义的方法 Illuminate\Database\Query\Builder::asStripeCustomer()

\try\vendor\laravel\framework\src\Illuminate\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 trait,所以我真的不知道是什么导致了这个错误

应用\用户.php

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Cashier\Billable;

class User extends Authenticatable{
   use Billable;

   ...
}

App\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."
        ];
    }

任何帮助和提示将不胜感激,在此先感谢!

【问题讨论】:

    标签: php laravel laravel-5.5 laravel-cashier


    【解决方案1】:

    我的错,我刚刚发现它实际上是我在 /config/services.php 上的条带配置,因为我有两个模型供我的用户使用(因为我还使用 laravel-cashier 以外的另一个包通过 Authorize 处理付款。我最终在其上创建了不同的模型供他们工作)

    '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】:

      您好,我以前从未与 Laravel Cashier 合作过,但是,我认为您问题的根源可能是您正在从请求中访问用户,因此它不是用户实例,这就是它触发未定义方法错误的原因。

      所以创建一个用户实例应该对你有用:

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

      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."
              ];
          }
      }
      

      【讨论】:

      • 感谢您的提示,但我已经尝试过了,直接从模型$user = App\User::find($request->user()->id) 找到用户然后$user->subscription('main')->cancel() 仍然抛出相同的错误。真的很奇怪,因为它总是在我的其他项目上工作,只是这次。 T_T
      • 你可以 dd($user) 也许App\User::find($request->user()->id) 不工作;所以你可以通过请求传递一个实例?我认为 user()->id 不应该返回任何东西,你是如何传递 $user 的?
      • 感谢您花时间帮助我,反正我找到了哪里出错了,实际上是我在/config/services.php 的条带配置上,我觉得很愚蠢哈哈XD
      • 如果您查看 Illuminate\Http\Request,那里有一个 user() 函数,它将返回当前发送请求的用户。这就是为什么我使用$request->user()->id :)
      猜你喜欢
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2021-03-31
      • 2016-04-15
      • 2020-05-09
      • 2013-10-28
      相关资源
      最近更新 更多