Ho installato Laravel Cashier (v3.0.4) nel mio progetto e sto al punto di consentire agli utenti di aggiornare le loro carte di credito, ma sto incontrando problemi quando cerco di fare così. Ecco i pezzi rilevanti di mio controller che gestisce:Casella di Laravel: Errore aggiornamento scheda (errore irreversibile)
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');
}
Ho verificato gli elementi sanity-check:
- In realtà i messaggi di questo controller
- passando con successo in segno
Ma ogni volta che provo a inviarlo, sto ricevendo un errore in Cassa stessa:
FatalErrorException in StripeGateway.php line 454:
Call to a member function create() on null
Ho guardato in questo e sembra che sta passando il $token
al seguente: $card = $customer->cards->create(['card' => $token]);
Così, ho poi fatto un altro controllo di integrità da dd($token)
in questo metodo e che restituisce esattamente ciò che la mia forma sta fornendo. Non sembra che questo blocco sia cambiato molto recentemente, ma c'erano alcuni aggiornamenti di acquisto PSR-2 e una tantum; nessuno dei quali sembra avere nulla a che fare con quello che sta succedendo qui. Quindi sono al mio limite per quello che succede qui, ma qualsiasi indizio sarebbe di grande aiuto. Grazie!
Aggiornamento
hanno verificato l'esecuzione dd($customer->cards)
all'interno del metodo updateCard()
restituisce null - probabilmente perché non è mai salvare gli ultimi quattro alla base di dati durante la creazione della sottoscrizione. Lottando per vedere come posso creare un abbonamento (verificato su Stripe), annullare e riprendere, ma i dettagli della mia carta non vengono aggiornati localmente, né posso scambiare le carte.
Ho usato https://www.youtube.com/watch?v=iPaKX7aPczQ come ispirazione per quanto semplice "dovrebbe essere" fare questo, con successo a tal fine, ma non il mio.
Update 2
Ecco tutta la mia dell'utente del controller e l'attuazione del caffè se aiuta:
<?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
Bene, l'errore è abbastanza ovvio: la proprietà pubblica 'cards' deve essere un'istanza ** di qualche classe **, ma per qualche motivo non è stata istanziata.Probabilmente dovresti guardare dentro quella classe e vedere quando e in base a quale proprietà 'card' delle carte viene istanziata? Ho bisogno di cogliere quel momento, in modo che sarebbe molto più facile gestire quel problema. – Yang
Grazie per il commento @bad_boy - la parte difficile è che si accede a 'carte' tramite un metodo magico, quindi ho un po 'di problemi a rintracciarlo. – Zach
Sono abbastanza sicuro che questo sia un bug che dovresti segnalare. Il codice che causa il tuo errore (nella libreria della cassa) è scarsamente testato e sembra non corretto. – Andreas