2015-02-26 3 views
6

Я установил Laravel Cashier (v3.0.4) в свой проект и нахожусь в состоянии разрешить пользователям обновлять свои кредитные карты, но я сталкиваюсь с проблемами при попытке Сделай так. Вот соответствующие отрывки из моего контроллера, который обрабатывает его:Laravel Cashier: карточка с исправлением ошибок (Fatal Error)

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. Успешно проходя лексем

Но каждый раз, когда я пытаюсь отправить его, я получаю сообщение об ошибке в самом кассовом аппарате:

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 и одноразовые покупки; ни одна из которых, похоже, не имеет никакого отношения к тому, что происходит здесь. Поэтому я нахожусь на своем конце, что здесь, но любые подсказки будут огромной помощью. Благодаря!

Update

проверил работает dd($customer->cards) внутри метода updateCard() возвращает нуль - вероятно, потому, что это никогда не экономя последние четыре к базе данных при создании подписки. Борясь, чтобы увидеть, как я могу создать подписку (проверено на Stripe), отменить и возобновить, но мои данные о карте не обновляются локально, и я не могу обменять карты.

Я использовал https://www.youtube.com/watch?v=iPaKX7aPczQ как вдохновение для того, насколько просто он «должен быть» для этого, с успехом на этом конце, но не с моим.

Update 2

Вот весь мой контроллер пользователя и реализация кофе, если это поможет:

<?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 
+0

Ну, ошибка довольно очевидна: публичное свойство 'cards' должно быть экземпляром ** некоторого класса **, но по какой-то причине оно не было создано.Вероятно, вы должны заглянуть внутрь этого класса и посмотреть, когда и в зависимости от того, какое условие создается в свойствах 'cards'? Вам нужно поймать этот момент, так что было бы намного легче справиться с этой проблемой. – Yang

+0

Спасибо за комментарий @bad_boy - сложная часть здесь заключается в том, что доступ к «картам» осуществляется с помощью магического метода, поэтому у меня немного проблемы с отслеживанием этого. – Zach

+0

Я уверен, что это ошибка, о которой вы должны сообщить. Код, вызывающий вашу ошибку (в библиотеке кассира), плохо протестирован и выглядит некорректно. – Andreas

ответ

4

Я думаю, что это связано с изменением API на конце нашивку в , Если вы посмотрите на их changelog, вы заметите, что атрибут «карты» был изменен на «источники» довольно недавно.

UPDATE

Вы можете выбрать версию API, что собственные рамки PHP Stripe является использованием со следующим статическим методом:

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

(что номер версии работал для меня, но это может быть, нам нужна более старая версия.)

+1

Спасибо! Хотя ответ, конечно же, не понижает вашу версию API (так как все должно быть актуально), я представил PR, чтобы получить «часть» проблемы, разрешенной https://github.com/laravel/cashier/pull/144 – Zach

Смежные вопросы