【问题标题】:Laravel Cashier: Trouble Updating Card (Fatal Error)Laravel 收银员:无法更新卡(致命错误)
【发布时间】:2015-04-28 09:37:16
【问题描述】:

我已经在我的项目中安装了 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. 成功传入令牌

但是每次我尝试提交时,我都会在 Cashier 中收到错误:

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 和一次性购买更新;这两者似乎都与这里发生的事情无关。所以我对这里的情况一无所知,但任何线索都会有很大的帮助。谢谢!

更新

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

我以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');
    }
}

条纹咖啡

(($) ->
  '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 public property must be an instance of some class ,但由于某种原因它没有被实例化。也许您应该查看该类的内部,看看何时以及根据哪个条件 cards 属性被实例化?即你需要抓住那个时刻,这样处理这个问题就会容易得多。
  • 感谢@bad_boy 的评论——这里的棘手部分是cards 是通过一种神奇的方法访问的,所以我在追踪它时遇到了一些麻烦。
  • 我很确定这是您应该报告的错误。导致错误的代码(在收银员库中)测试不佳,看起来不正确。
  • 该 repo 没有启用问题(仅限 PR),因此尝试使用其他渠道可能会有所启发。
  • 为部分问题创建了 PR:github.com/laravel/cashier/pull/144 检索最后四个仍然存在问题,因为客户对象不再返回卡信息

标签: php laravel stripe-payments laravel-5


【解决方案1】:

我认为这是由于 Stripe 的 API 更改所致。如果您查看他们的changelog,您会注意到“cards”属性最近已更改为“sources”。

更新

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

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

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

【讨论】:

  • 谢谢!虽然答案肯定不是降级您的 API 版本(因为事情应该是最新的),但我确实提交了一个 PR 以解决问题的“部分”github.com/laravel/cashier/pull/144
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 2017-09-27
  • 2019-01-08
  • 2020-11-27
  • 2021-02-18
  • 2014-10-28
  • 2018-03-28
  • 2018-06-17
相关资源
最近更新 更多