2017-01-02 3 views
1

Я использую Laravel 5.3 с помощью Cashier. Если клиент обновляет данные своей карты, как я могу проверить, есть ли ожидающий счет-фактура, и попросить Stripe повторно попытаться оплатить новую карту? На данный момент я установил параметры для попыток на панели инструментов Stripe. Но из того, что я понимаю, Stripe не пытается автоматически взимать плату с клиента, если он обновляет свои данные о карте, и ждет следующей попытки, чтобы повторить попытку. Вот почему я хочу вручную попытаться обвинить клиента в ожидающем счете, как только они обновят свою карточку. Я прочитал документацию Кассира и страницу Github, но этот случай там не рассматривается.Laravel Cashier Повторная попытка Ожидание счета после обновления карты

$user->updateCard($token); 
// Next charge customer if there is a pending invoice 

Может кто-нибудь мне помочь.

ответ

0

После тестирования и разговора с поддержкой Stripe, я обнаружил проблему с текущим методом updateCard(), используемым в Laravel Cashier.

С помощью текущего метода updateCard() карта добавляется в список источников, а затем устанавливается новая карта как default_source. результат этого метода имеет 2 исхода:

  1. Несколько карт добавляется в список, хотя в последнее время один устанавливается как default_source

  2. При обновлении карты с помощью этого метода, если есть какие-либо неоплаченные счета (т.е. счета-фактуры в состоянии 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(); 
} 
Смежные вопросы