После того, как у вас будет полный процесс адаптации клиентов и вы правильно предоставите доступ к платным услугам и функциям, вы неизбежно начнете получать запросы в службу поддержки, в которых клиенты хотят обновить способы оплаты в файле, обновить и понизить версию между планами, просмотреть выставление счетов. история и многое другое. Мы называем это «управлением жизненным циклом клиента».

Два основных варианта поддержки управления выставлением счетов — создать его самостоятельно или использовать клиентский портал Stripe. Подобно Stripe Checkout, клиентский портал представляет собой страницу, размещенную Stripe, на которую вы перенаправляете существующих клиентов с активными подписками. На портале они могут выполнять такие действия, как обновление своих способов оплаты и обновление, отмена, обновление или приостановка своих подписок. Портал для клиентов настраивается с помощью API или с помощью настроек на панели управления Stripe.

Скриншот некоторых параметров настройки клиентского портала с панели управления.  https://dashboard.stripe.com/settings/billing/портал

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

Самый быстрый способ интеграции — одиночный вызов API для создать сеанс клиентского портала который вернет URL-адрес, на который вы можете перенаправить клиентов. Самый простой сеанс требует только передачи идентификатора клиента (который мы создали во время регистрации, помните?):

session = Stripe::BillingPortal::Session.create({
  customer: 'cus_F6sbKqBiA0Ms4g',
})
redirect_to session.url, allow_other_hosts: true, status: :see_other
Войти в полноэкранный режим

Выйти из полноэкранного режима


Обработка изменений с помощью вебхуков

Когда клиенты вносят изменения в свои подписки на клиентском портале, важно, чтобы наше приложение отражало эти изменения. В предыдущей статье о предоставлении доступа к SaaS с помощью веб-перехватчиков мы обсудили несколько типов событий веб-перехватчиков, которые важно обрабатывать для давать доступ. Вы также должны убедиться, что вы обрабатываете customer.subscription.deleted событие веб-перехватчика, которое представляет собой отмену подписки клиентом. В этом случае мы находим Subscription в базе данных по ID и обновляем ее статус на статус полезной нагрузки события webhook: canceled.

def handle_subscription_deleted(event)
  subscription = event.data.object
  sub = Subscription.find_by(stripe_id: subscription.id)
  sub.update!(
    status: subscription.status,
  )
end
Войти в полноэкранный режим

Выйти из полноэкранного режима


Настройка сеансов портала

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

Например, вы можете предложить клиентам с устаревшими планами возможность перейти на более высокий уровень устаревшего плана, но потребовать, чтобы новые клиенты использовали набор уровней по умолчанию с другими ценами. Одним из решений может быть создание пользовательской конфигурации портала для устаревших пользователей, которая включает в себя список устаревших продуктов и цен в features.subscription_update.products множество.

Имея идентификатор объекта конфигурации клиентского портала, вы можете создавать новые сеансы клиентского портала, передавая конфигурацию для изменения функций, видимых клиентом с помощью этого сеанса портала.

config = Stripe::BillingPortal::Configuration.create({
  features: {
    customer_update: {
      allowed_updates: ['email', 'tax_id'],
      enabled: true,
    },
    invoice_history: {enabled: true},
    payment_method_update: {enabled: true},
    subscription_update: {
      enabled: true,
      default_allowed_updates: ['quantity', 'price'],
      products: [{
        product: 'prod_MBsdZlqD3StDZo', # Legacy product
        prices: [
          'price_1LTUryCZ6qsJgndJl0mhzex1', # Legacy monthly
          'price_1LXWGHCZ6qsJgndJBOEgbbxs', # Legacy annual
        ],
      }],
    },
  },
  business_profile: {
    privacy_policy_url: 'https://example.com/privacy',
    terms_of_service_url: 'https://example.com/terms',
  },
})

portal_session = Stripe::BillingPortal::Session.create({
  customer: 'cus_La7iFhdBoBP29t',
  configuration: config.id
})

redirect_to portal_session.url, allow_other_host: true, status: :see_other
Войти в полноэкранный режим

Выйти из полноэкранного режима


Что видят клиенты

В зависимости от конфигурации клиенты увидят двухпанельный пользовательский интерфейс, показывающий их текущий план, способ оплаты, платежную информацию и действия, которые они могут предпринять.

Снимок экрана пользовательского интерфейса самообслуживания для управления подпиской на клиентском портале, показывающий текущий план пользователя, способы оплаты и информацию для выставления счетов.


Следующие шаги

Если вы зашли так далеко в сериале, отличная работа! Теперь у вас есть все основные строительные блоки для запуска повторяющегося приложения SaaS с помощью Stripe. Мы хотели бы услышать ваши отзывы о шаблонах интеграции и передовых методах, изложенных в этой серии. Пожалуйста, напишите мне, что вы строите: @cjav_dev в Твиттере.


Об авторе

Си Джей Авилла

Си Джей Авилла (@cjav_dev) — защитник разработчиков в Stripe, разработчик Ruby on Rails и ютубер. Он любит изучать и преподавать новые языки программирования и веб-фреймворки. Когда он не за компьютером, он проводит время с семьей или катается на велосипеде 🚲.