Я создал подписной веб-сайт, который позволяет людям иметь несколько подписок. Я решил пойти с Stripe для оплаты и обработки карт. Потребовалось очень мало времени, чтобы интегрировать его в мой проект Symfony2. Мне удалось создать подписку, клиентов и добавить карты в течение нескольких часов. Тогда я столкнулся с проблемой. Если у клиента есть несколько карт, я хотел, чтобы у них была возможность выбирать, какую карту он хотел бы использовать при создании новой подписки. Это звучало легко. После 2 дней и около 30 часов прочесывания их документации я должен сказать, что не могу понять, как заставить это работать.
Я настроил это так: когда клиент создает карту, я сохраняю «идентификатор карты» в своей базе данных вместе с брендом. Это просто позволяет загружать детали на стороне сервера при запросе страницы. Клиент, создающий новую подписку, видит свои карты и выбирает, какую из них он хочет использовать для новой подписки. Это передается моему php-скрипту через AJAX для создания новой подписки. Однако, когда я пытаюсь использовать определенную карту, я получаю ошибку 400, указывающую, что «идентификатор карты» не является токеном. Я знаю, что это не токен, поскольку токен использовался для добавления карты в учетную запись клиента, но как в целом указать точную карту, которую клиент хочет использовать?
ПРИМЕЧАНИЕ. При использовании нового токена создается еще один экземпляр карты. Опция отсутствует.
PHP:
require_once('../stripe-php/init.php');
//Set Secret API Key
\Stripe\Stripe::setApiKey("sk_test_XXXXXXXXXXXXXXXXXXXXX");
//Retrieve Customer
$cu = \Stripe\Customer::retrieve($_POST['customer_id']);
//Create Subscription using saved customer "card id"$createSubscription = $cu->subscriptions->create(array("plan" => $_POST['sub_option'], "source" => $card));
ПОСТ ПОЛОЖЕНО:
plan: "500-2016"source: "card_xxxxxxxxxxxxxxxxxxxxx"
ОШИБКА ПОЛОСЫ: ТИП 400
error:
type: "invalid_request_error"message: "No such token: card_xxxxxxxxxxxxxxxxxxxxxxx"param: "source"
Я получил ответ от поддержки Stripe на это: это невозможно для одного Customer
иметь подписки с разными источниками оплаты. Все счета за подписку всегда выставляются на текущий default_source
для клиента. Так что если вы измените значение по умолчанию, как предложил Джайлс Беннетт, вы измените его для все подписки, независимо от того, что было по умолчанию во время создания.
Если вам нужен один пользователь, чтобы иметь подписки с более чем одним источником, вам нужно создать несколько полос Customer
объекты для этого пользователя, с другим default_source
для каждого.
Поскольку я не получил никакой информации от SO или Stripe, я несколько пришел к выводу, что это невозможно сделать. Я нашел похожий вопрос на другом форуме, который закончился тем, что результаты были — Нет ответа от Stripe — и что это не может быть сделано. Хотя документация Stripe не затрагивает эту тему, похоже, что подписка может быть снята только с карты по умолчанию. Для подписок нет объекта «Карта», как для «Оплаты».
Я понимаю, что эта ветка довольно старая, но натолкнувшись на нее, пытаясь ответить на тот же вопрос самостоятельно, это решение может быть полезным для тех, кто придет позже.
Stripe API говорит, что параметр «source» для вызова API для создания новой подписки является необязательным — если он пропущен, то по умолчанию будет использоваться карточка клиента по умолчанию. Если он включен, то это может быть только токен (т. Е. Новая карта) или словарная запись (опять же, для новой карты, только без токена).
Решением может быть сначала обновить исходный код клиента. Используя Cartalyst через Laravel, так как мы:
$customer = Stripe::customers()->update( "customer_id", [
'default_source' => "card_id"]);
Затем вы можете перейти к добавлению своей подписки в обычном режиме — ей будет присвоена новая карта по умолчанию. При необходимости (в зависимости от вашего приложения) вы также можете сначала сохранить прежний идентификатор карты по умолчанию в переменной, чтобы затем установить его в качестве карты по умолчанию после новой подписки.
Надеюсь, это поможет.