Laravel Cashier:麻烦更新卡(致命错误)

时间:2015-02-26 05:34:44

标签: php laravel stripe-payments laravel-5

我已经在我的项目中安装了Laravel Cashier(v3.0.4),并且允许用户更新他们的信用卡,但在我尝试这样做时遇到了问题。这是我的控制器处理它的相关部分:

public function __construct() {
    $this->user = Auth::user();
}

/**
 * Update credit card
 * @return \Illuminate\Http\RedirectResponse
 */
public function updateCardPost() {
    $this->user->updateCard(Input::get('stripe-token'));

    session()->flash('flash_message', 'You have updated your credit card');
    return redirect()->route('dashboard.index');
}

我已经验证了理智检查项目:

  1. 实际上发布到此控制器
  2. 成功传递令牌
  3. 但每次我尝试提交时,我在收银员本身都会收到错误:

    FatalErrorException in StripeGateway.php line 454:
    Call to a member function create() on null
    

    我已经调查了这个,看起来它正在将$token传递给以下内容:$card = $customer->cards->create(['card' => $token]);

    因此,我在该方法中通过dd($token)进行了另一次完整性检查,并确切地返回了我的表单所提供的内容。看起来这个区块最近变化不大 - 但是有一些PSR-2和一次性购买更新;这两者似乎与这里发生的事情无关。所以我在这里结束了什么,但任何线索都将是一个巨大的帮助。谢谢!

    更新

    已验证在dd($customer->cards)方法内部运行updateCard()返回null - 可能是因为在创建订阅时它并没有将最后四个保存到数据库中。苦苦挣扎,看看我如何创建订阅(在条纹上验证),取消和恢复,但我的卡详细信息没有在本地更新,也无法交换卡。

    我使用https://www.youtube.com/watch?v=iPaKX7aPczQ作为灵感来说明“应该”这么简单,在这方面是成功的,但不是我的。

    更新2

    如果有帮助,这是我的整个用户控制器和Coffee实现:

    <?php namespace App;
    
    use Illuminate\Auth\Authenticatable;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Auth\Passwords\CanResetPassword;
    use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
    use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
    use Laravel\Cashier\Billable;
    use Laravel\Cashier\Contracts\Billable as BillableContract;
    
    class User extends Model implements AuthenticatableContract, CanResetPasswordContract, BillableContract {
    
        use Authenticatable, CanResetPassword, Billable;
    
        /**
         * The database table used by the model.
         *
         * @var string
         */
        protected $table = 'users';
    
        /**
         * Laravel Cashier
         *
         * @var array
         */
        protected $dates = ['trial_ends_at', 'subscription_ends_at'];
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'email',
            'password',
            'first_name',
            'last_name',
            'phone',
            'biography',
            'twitter',
            'facebook',
            'linkedin'
        ];
    
        /**
         * The attributes excluded from the model's JSON form.
         *
         * @var array
         */
        protected $hidden = ['password', 'remember_token'];
    
        /**
         * A user can have many listings
         * @return \Illuminate\Database\Eloquent\Relations\HasMany
         */
        public function listings() {
            return $this->hasMany('App\Models\Dashboard\Listing');
        }
    }
    

    Stripe.coffee

    (($) ->
      'use strict'
    
      StripeBilling =
        init: ->
          @form = $('.js-subscription__create')
          @submitButton = @form.find '.js-subscription__create__submit'
          @submitButtonText = @submitButton.text()
    
          stripeKey = $('meta[name="publishable_key"]').attr 'content'
          Stripe.setPublishableKey stripeKey
    
          @bindEvents()
          return
    
        bindEvents: ->
          @form.on('submit', $.proxy(@sendToken, @))
          return
    
        sendToken: (event) ->
          event.preventDefault()
          @submitButton.attr("disabled", true).text 'One Moment'
    
          Stripe.createToken(@form, $.proxy(@stripeResponseHandler, @))
          return
    
        stripeResponseHandler: (status, response) ->
          if response.error
            @form.find('.js-form__errors').removeClass("uk-hidden").text response.error.message
            return @submitButton.text(@submitButtonText).attr('disabled', false)
    
          $('<input>'
            type: 'hidden'
            name: 'stripe-token'
            value: response.id
          ).appendTo @form
    
          @form[0].submit()
          return
    
      StripeBilling.init()
    
      return
    ) jQuery
    

1 个答案:

答案 0 :(得分:4)

我认为这是由于Stripe的最终API更改造成的。如果您查看他们的changelog,您会注意到&#34;卡&#34;属性已更改为&#34;来源&#34;最近。

<强>更新

您可以使用以下静态方法选择Stripe自己的PHP框架正在使用的API版本:

Stripe::setApiVersion("2015-02-10");

(该版本号对我有用,但可能是我们需要旧版本。)