2015-02-26 3 views
6

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:

  1. In realtà i messaggi di questo controller
  2. 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 
+0

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

+0

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

+0

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

risposta

4

Penso che sia a causa di un cambiamento API sull'estremità di banda . Se guardi il loro changelog noterai che l'attributo "cards" è stato modificato in "sources" abbastanza recentemente.

UPDATE

È possibile scegliere la versione API che proprio framework PHP di banda sta usando con il seguente metodo statico:

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

(Questo numero di versione ha funzionato per me, ma potrebbe essere che abbiamo bisogno di una versione precedente)

+1

Grazie! Sebbene la risposta non stia certamente declassando la tua versione API (dato che le cose dovrebbero essere aggiornate), ho inviato un PR per ottenere "parte" del problema risolto https://github.com/laravel/cashier/pull/144 – Zach