Обновить данные карты оплаты подписки stripe rails

#ruby-on-rails #rubygems #stripe-payments

#ruby-on-rails #rubygems #stripe-платежи

Вопрос:

Я использую ruby 2.4.0p0 (редакция 57164 2016-12-24) [x86_64-linux], Rails 5.2.4.4 и, используя stripe 5.26.0
, я создал подписку на stripe

  customer = if current_user.stripe_customer_id?
                 Stripe::Customer.retrieve(current_user.stripe_customer_id)
               else
                 Stripe::Customer.create({
                                             :email => current_user.email,
                                             :source => params[:stripeToken],
                                             :description => "Tukaweb Stripe Subscriptions customer= #{current_user.email}"
                                         },
                                         {
                                             api_key: Rails.configuration.stripe[:secret_key]
                                         }
                 )
               end
    ## check if user have already took the subscription
    if current_user.subscriptions.where(payment_status: 'paid', software_package_id:  @subscription.software_package_id).empty?
      ## with trail period
      subscription = Stripe::Subscription.create({
                                                     customer: customer,
                                                     items: [
                                                         {price: 'price_1HVF68E9ijv19IzXdDVmKN5e'},
                                                     ],
                                                     trial_end: (Time.now   1.month).to_i,
                                                 })
    else
      ## without trail period
      subscription = Stripe::Subscription.create({
                                                     customer: customer,
                                                     items: [
                                                         {price: 'price_1HVF68E9ijv19IzXdDVmKN5e'},
                                                     ],
                                                 })
    end

    current_user.update({
                            stripe_customer_id: customer.id
                        })
  

Теперь я хочу обновить данные карты подписки на полосу, что выдает ошибку:

 customer = Stripe::Customer.retrieve(current_user.stripe_customer_id)
stripe_subscription = SoftwareUser.find(params[:software_user_id])
subscription = customer.subscriptions.retrieve(stripe_subscription.stripe_subscription_id)
subscription.source = params[:stripeToken]
subscription.save
  

Ошибка как:

 Stripe::InvalidRequestError (Received unknown parameter: source):
  

не могли бы вы подсказать, как обновить данные карты для подписки.

Ответ №1:

Это сбой, потому что в подписке нет атрибута источника.

В данном конкретном случае вы полагаетесь на тот факт, что при создании подписки она вернется к использованию источника клиента по умолчанию для финансирования подписки [1], поскольку способа оплаты по умолчанию не существует. Если вы хотите изменить источник, который оплачивает подписку, вам придется изменить источник клиента по умолчанию [2].

Все, что было сказано, рекомендация сегодня — вообще не использовать источники, а скорее создать PaymentMethod [3] с использованием Stripe.js и Элементы. Вы прикрепляете этот метод оплаты к клиенту [4], затем вы должны установить этот способ оплаты по умолчанию либо в счете [5], подписке [6], либо в клиенте [7].

Шаги более подробно описаны здесь [8].

[1] https://stripe.com/docs/api/subscriptions/create?lang=ruby#create_subscription-default_payment_method

[2] https://stripe.com/docs/api/customers/object?lang=ruby#customer_object-default_source

[3] https://stripe.com/docs/js/payment_intents/confirm_card_payment

[4] https://stripe.com/docs/api/payment_methods/attach?lang=ruby

[5] https://stripe.com/docs/api/invoices/object?lang=ruby#invoice_object-default_payment_method

[6] https://stripe.com/docs/api/subscriptions/object?lang=ruby#subscription_object-default_payment_method

[7] https://stripe.com/docs/api/customers/object?lang=ruby#customer_object-invoice_settings-default_payment_method

[8] https://stripe.com/docs/billing/subscriptions/fixed-price#create-subscription

Комментарии:

1. итак, чтобы создать способ оплаты, на сервере должен быть стандарт безопасности данных индустрии платежных карт, потому что для создания способа оплаты сервер должен иметь номер карты. и cvc или есть какой-то js, который укажет цель.

2.Приношу свои извинения, эта ссылка на создание метода оплаты на стороне сервера несколько вводила в заблуждение. Лучший способ минимизировать нагрузку на PCI и убедиться, что данные карты надежно передаются в Stripe в соответствии с PCI, вы должны использовать Stripe.js и элементы для обозначения реквизитов карты или использования Stripe Checkout для сбора сведений о методе оплаты. Оба подхода описаны (в отношении подписок) в этих руководствах: stripe.com/docs/billing/subscriptions/…stripe.com/docs/billing/subscriptions/checkout/fixed-price