Использование Stripe Checkout, чтобы позволить покупателю приобрести продукт

Мне еще предстоит найти ответ на то, что должно быть очень простым подходом к использованию Stripe (на мой взгляд). Как с помощью Stripe Checkout я могу разрешить человеку оплачивать продукт, который я уже создал в разделе «Продукты» на панели инструментов? Вся документация, которую я нашел, показывает, как получить данные о продукте и т. д., и это здорово, но на самом деле в ней не объясняется, как разрешить покупателю приобрести продукт с помощью Checkout. Я использую PHP, но был бы более чем рад увидеть какие-либо примеры на любом языке, чтобы следовать траектории.


person Justin H    schedule 24.08.2018    source источник
comment
Вы просто хотите взимать с них стоимость вашего продукта? Продукты действительно описывают планы и не имеют индивидуальных цен. Если вы не создаете подписки, вам нужно пойти другим путем.   -  person Kisaragi    schedule 24.08.2018
comment
Нет, это легкая часть. Я хочу, чтобы они действительно покупали продукт, с которым связана ежемесячная стоимость подписки. Stripe присваивает идентификатор продукта, и я просто пытаюсь понять, как кто-то вообще может его купить, если, например, API не позволяет использовать атрибут data-product. Запрашивает только сумму в долларах.   -  person Justin H    schedule 24.08.2018
comment
Вы хотите подписать клиента на определенный план?   -  person Kisaragi    schedule 24.08.2018
comment
Да. У меня есть 3 плана, перечисленных под 1 продуктом.   -  person Justin H    schedule 24.08.2018


Ответы (1)


Если вы пытаетесь сделать это с помощью checkout.js или stripe elements, это невозможно. Вам нужно будет обрабатывать этот сервер на стороне:

Сначала получите токен, представляющий карту, отправленную клиентом с помощью подписки на Stripe Elements.

Скрипт:

    $('.btn-save-sub').click(function () {
         //if your customer has chosen a plan, for example 
          var plan = $("#plan_id").val();
          var stripe = Stripe(//your public key here );
          var elements = stripe.elements();

          /**create and mount cc and cc exp elements**/
          var card = elements.create('card'); //complete card element, can be customized
          card.mount('#card-element');

          card.addEventListener('change', function(event) {
               var displayError = document.getElementById('card-errors');
               if (event.error) {
                   displayError.textContent = event.error.message;
               }else{
                   displayError.textContent = '';
               }
            });

           var form = document.getElementById('subscription_add_new_source');

           stripe.createToken(card).then(function(result) {
                if (result.error) {
                    var errorElement = document.getElementById('card-errors');
                    errorElement.textContent = result.error.message;
                }else{
                    //post result.token.id  and plan_id to your server, this token represents the card you will be using 
                }
        });
    });

Теперь на стороне сервера у вас есть токен и plan_id (если вы решили разрешить клиенту выбирать план). Теперь мы подпишем клиента на план, используя PHP Bindings.

 //you have posted a plan_id to be used, you will create a subscription for that plan id, create a card objecting using the token you have, and attach that card as a default source to the stripe customer

 $stripe_customer= //retrieve it, if you don't have one, create it

Создание клиента с помощью Stripe API

Когда у вас есть клиент, вы сначала создадите объект карты и назначите его в качестве источника по умолчанию:

//create new card
$new_card = $stripe_customer->sources->create(array('sources'=>$posted_token));

//assign newly created card as customer's default source
//subscriptions can only charge default sources 
$stripe_customer->default_source = $new_card->id; 

//finally, create a subscription with the plan_id 
$subscription = \Stripe\Subscription::create(
        array(
            'customer' => $stripe_customer->id,
            'items' => array(
                array(
                    'plan' => $posted_plan_id,       
                )
            ),
            'trial_end' =>$end // represents the first day a  customer will be charged for this plan, pass a timestamp 
        )
    );
person Kisaragi    schedule 24.08.2018
comment
Существует параметр data-panel-label, который можно использовать для отображения текста типа "Подписаться" вместо "Заплатить $x, если с помощью кассы. Но да, вы правы, вам нужно создать клиента и подписаться на план на стороне сервера, используя токен, который вы получаете от Checkout/Element, хороший ответ. - person karllekko; 24.08.2018