Я установил 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');
}
Я проверил здравомыслие-контрольные пункты:
- На самом деле сообщения для этого контроллера
- Успешно проходя лексем
Но каждый раз, когда я пытаюсь отправить его, я получаю сообщение об ошибке в самом кассовом аппарате:
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
Ну, ошибка довольно очевидна: публичное свойство 'cards' должно быть экземпляром ** некоторого класса **, но по какой-то причине оно не было создано.Вероятно, вы должны заглянуть внутрь этого класса и посмотреть, когда и в зависимости от того, какое условие создается в свойствах 'cards'? Вам нужно поймать этот момент, так что было бы намного легче справиться с этой проблемой. – Yang
Спасибо за комментарий @bad_boy - сложная часть здесь заключается в том, что доступ к «картам» осуществляется с помощью магического метода, поэтому у меня немного проблемы с отслеживанием этого. – Zach
Я уверен, что это ошибка, о которой вы должны сообщить. Код, вызывающий вашу ошибку (в библиотеке кассира), плохо протестирован и выглядит некорректно. – Andreas