Подтвердить что ты не робот

Обновление карточки клиента по умолчанию (PHP)

Я хотел бы обновить карточку по умолчанию для клиента с помощью Stripe.

В update customer API-документах неясно, что нужно подавать для параметра card.

В PHP я попытался установить card на основе метода retrieve card следующим образом:

$customer->card=$card['id']

но это не работает. Также не используется токен:

$customer->source=$_POST['stripe_token]

поэтому я немного не понимаю. Мысли?

4b9b3361

Ответ 1

Я смог ответить на свой вопрос с поддержкой Stripe на IRС#stripe channel:

Параметр card указан default_source следующим образом:

Stripe::setApiKey($stripe_private_key);
$customer = Stripe_Customer::retrieve($stripe_cus_id);
$customer->default_source=$card['id'];
$customer->save();  

Ответ 2

1. Обзор

Ответ на

@tim peterson завершен и удовлетворяет первоначально заданному вопросу. Однако этот вопрос Stackoverflow является одним из первых обращений к настройке карты по умолчанию для Stripe - поэтому я хотел немного документировать мои собственные выводы.

 

2. Поток

Прежде всего важно понять поток сохранения карты, и это важно для надежного хранения ссылок на кредитные карты.

Как правило, вы либо добавляете карту, либо устанавливаете ее по умолчанию на месте, либо храните идентификатор кредитной карты (а не номер кредитной карты!) в своей базе данных для выполнения действий против.

Примечание, что при добавлении первой карты пользователю, это будет по умолчанию, ну, по умолчанию.

 

2,1. Создание клиента

  • Из вашего приложения создайте клиента в Stripe с помощью api
  • Объект клиента возвращается Stripe, включая customer->id
  • Как минимум, сохраните customer->id в приложении. Обычно это будет в таблице user или аналогичной.

A VARCHAR по 255 символов кажется подходящим - однако, после беседуя с Stripe напрямую, у них нет длины документа id в их системе.

 

2,2. Создание карты

На более позднем этапе вы захотите добавить карту.

  • Сначала используйте библиотеку Stripe JS, которая задокументирована на сайте. Идея здесь заключается в том, что форма представляет пункты действия непосредственно на серверах Stripe, поэтому, когда форма отправляется, данные реальной кредитной карты никогда не попадают на ваш сервер. Хотя технически возможно создавать карты без Stripe JS, если нет веской причины, я бы придерживался рекомендуемого способа и позволял ему делать тяжелую работу.
  • Пользователь находится в вашей кредитной карточке, и происходит следующее:
  • Они вводят данные своей кредитной карты в вашу форму.
  • Они нажали submit
  • Все входные данные формы отправляются в Stripe через ajax
  • После успеха Stripe JS вернет ответ со следующими данными:

    • response.id
    • response.card.id
    • response.card.last4
    • response.card.brand
    • response.card.exp_month
    • response.card.exp_year
  • В примерах Stripe они добавляют к DOM кучу скрытых элементов формы, заполняют вышеуказанные данные, а затем "присылают форму для realz на этот раз".

  • Ваш сервер, независимо от того, что может быть, получит вышеуказанные данные, и вы можете сохранить его, как вы сочтете нужным.

 

2,3. Установка значения по умолчанию

Теперь вернемся к исходному вопросу. На каком-то этапе у вас может быть пользователь с несколькими картами и ему нужно установить его по умолчанию.

Поскольку вы сохранили данные возврата из вышеуказанной формы, теперь у вас должен быть список карт, идентификаторов карт и еще чего-то в вашей базе данных. Так что просто переверните их и когда-либо заставляйте пользователя щелкать по умолчанию, извлекайте идентификатор карты и обновляйте свойство default_source по объекту клиента значением идентификатора карты.

 

3 Примеры

Это будет отражать три вышеупомянутых шага с некоторыми очень короткими фрагментами кода (с использованием PHP, но должно быть достаточно легко следовать).

Примечание Я пропускаю ошибки и исключения для краткости. Когда вы выполняете какое-либо взаимодействие с внешним источником, всегда рекомендуется проявлять осторожность при обработке исключений - в основном предполагайте, что служба не удастся.

 

3.1 Создание клиента

// Send details to Stripe
$customer = \Stripe\Customer::create([
    'email' => $this->user->email,
    'description' => $this->user->name,
]);

// Then update our application
$this->user->stripe_customer_id = $customer->id;
$this->user->save();

 

3.2 Создание карты

3.2.1 Javascript

module.exports = (function() {
    function CreditCard() {
        $('#payment-form').submit(function(e) {
            var $form = $(this);

            // Disable the submit button to prevent repeated clicks
            $form.find('button').prop('disabled', true);

            Stripe.card.createToken($form, function(status, response) {
                var $form = $('#payment-form');
                if (response.error) {
                    // Show the errors on the form
                    $form.find('.payment-errors').text(response.error.message);
                    $form.find('.payment-errors').parents(".row").show();
                    $form.find('button').prop('disabled', false);
                } else {
                    // token contains id, last4, and card type
                    var token = response.id;
                    var cardId = response.card.id;
                    var last4 = response.card.last4;
                    var brand = response.card.brand;
                    var expMonth = response.card.exp_month;
                    var expYear = response.card.exp_year;

                    // Insert the token into the form so it gets submitted to the server
                    $form.append($('<input type="hidden" name="stripeToken" />').val(token));
                    $form.append($('<input type="hidden" name="cardId" />').val(cardId));
                    $form.append($('<input type="hidden" name="last4" />').val(last4));
                    $form.append($('<input type="hidden" name="brand" />').val(brand));
                    $form.append($('<input type="hidden" name="expMonth" />').val(expMonth));
                    $form.append($('<input type="hidden" name="expYear" />').val(expYear));

                    // and re-submit
                    $form.get(0).submit();
                }
            });

            // Prevent the form from submitting with the default action
            return false;
        });
    }

    return CreditCard;
})();

 

3.2.2 Бэкэнд

public function save(string $token, string $cardId, string $last4, string $brand, int $expMonth, int $expYear)
{
    // Store in our application
    $creditCard = $this->user->creditCards()->create([
        'token_id' => $token,
        'card_id' => $cardId,
        'last4' => $last4,
        'brand' => $brand,
        'exp_month' => $expMonth,
        'exp_year' => $expYear
    ]);
}

 

3.3 Установка значения по умолчанию

    Customer::retrieve($this->user->stripe_customer_id);
    $customer->default_source = $cardId;
    $customer->save();

Ответ 3

Создать новую карту и назначить карту как источник по умолчанию

Если вы хотите создать новую карту и установить новую карту, которая будет считаться картой по умолчанию, попробуйте это.

* Обратите внимание, что маркер полосы должен поступать из запроса strs js, и идентификатор клиента полосы будет, скорее всего, получен от аутентифицированного пользователя.

// Get the customer
$customer = Customer::retrieve("cus_9jF6ku4f2pztRo");

// Add a new card to the customer
$card = $customer->sources->create(['source' => "tok_19PmcMI94XzVK71QeIwtUJmM"]);

// Set the new card as the customers default card
$customer->default_source = $card->id;
$customer->save();