После тестирования и разговора с поддержкой Stripe, я обнаружил проблему с текущим методом updateCard()
, используемым в Laravel Cashier.
С помощью текущего метода updateCard()
карта добавляется в список источников, а затем устанавливается новая карта как default_source
. результат этого метода имеет 2 исхода:
Несколько карт добавляется в список, хотя в последнее время один устанавливается как default_source
При обновлении карты с помощью этого метода, если есть какие-либо неоплаченные счета (т.е. счета-фактуры в состоянии past_due
), они не заряжаются автоматически.
Для того, чтобы полоса вновь попытка зарядки клиента на все счета-фактуры в past_due
состояния параметр source
должен быть принят. Таким образом, я создал новый метод что-то вроде этого:
public function replaceCard($token)
{
$customer = $this->asStripeCustomer();
$token = StripeToken::retrieve($token, ['api_key' => $this->getStripeKey()]);
// If the given token already has the card as their default source, we can just
// bail out of the method now. We don't need to keep adding the same card to
// a model's account every time we go through this particular method call.
if ($token->card->id === $customer->default_source) {
return;
}
// Just pass `source: tok_xxx` in order for the previous default source
// to be deleted and any unpaid invoices to be retried
$customer->source = $token;
$customer->save();
// Next we will get the default source for this model so we can update the last
// four digits and the card brand on the record in the database. This allows
// us to display the information on the front-end when updating the cards.
$source = $customer->default_source
? $customer->sources->retrieve($customer->default_source)
: null;
$this->fillCardDetails($source);
$this->save();
}
Я создал Pull request для этого добавления. Поскольку редактирование файла Billable
непосредственно для каких-либо изменений не является хорошей идеей, если это не получает добавлен в Кассе, то вы можете использовать следующие в файле контроллера, чтобы сделать это прямо оттуда:
$user = Auth::User();
$customer = $user->asStripeCustomer();
$token = StripeToken::retrieve($token, ['api_key' => config('services.stripe.secret')]);
if (!($token->card->id === $customer->default_source)) {
$customer->source = $token;
$customer->save();
// Next synchronise user's card details and update the database
$user->updateCardFromStripe();
}