Конечным результатом должна быть HTML-страница с кнопкой оплаты Stripe, которая позволяет посетителю ввести данные своей карты по заданной цене и нажать «Купить».

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

Оттуда деньги будут на вашей учетной записи Stripe, и вам нужно будет (самостоятельно) доставить продукт (цифровой или другой) вашему посетителю и обработать налоговую отчетность (о которой я коснусь в конце этого поста. ).

Предположения

В этом руководстве предполагается, что вы немного знакомы с JavaScript (через узел) - или, по крайней мере, хорошо знакомы с копированием и вставкой! Это также предполагает, что вы просто хотите продать вещь и не хотите или не нуждаетесь в полностью управляемой системе (для отслеживания запасов и т. Д.), Хотя, конечно, вы можете добавить это, я просто не собираюсь рассказывать об этом!

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

Это также предполагает, что вы находитесь в одной из 25 стран, которые поддерживает Stripe.

Наконец, если вы находитесь в Европе, вам нужно будет указать НДС, и, конечно же, в Великобритании, независимо от того, зарегистрированы вы в качестве плательщика НДС или нет, вам нужно будет сообщить VATMOSS - я объясню на конец поста, как то, над чем я работаю, может помочь.

1. Получите аккаунт

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

Теперь вам нужно собрать свои API-ключи.

Стоит создать каталог, в котором будет жить ваш код. Затем поместите тестовые ключи в файл с именем .dev.env, а живые ключи в .env, например. Мы также собираемся указать здесь валюту и стоимость:

STRIPE_SECRET=sk_test_BQokikJOvBiI2HlWgH4olfQ2
STRIPE_PUBLIC=pk_test_6pRNASCoBOKtIshFeQd4XMUh
STRIPE_CCY=gbp
STRIPE_COST=999

Обратите внимание, что коды валют - коды ISO (по умолчанию - доллары США), а стоимость указана в центах за пенсы, поэтому приведенный выше пример значения составляет 9,99 фунтов стерлингов.

2. Используйте Stripe’s Checkout.

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

Stripe имеет встраиваемый процесс оформления заказа. Вы добавляете встроенную форму туда, где хотите разместить кнопку, и Stripe обновит форму с помощью JavaScript (обратите внимание, что это также предполагает, что вы на 100% полагаетесь на JavaScript для обработки первого шага платежа).

Я собираюсь дать вам шаблонный код JavaScript, который позволит вам обслуживать это и обрабатывать автономную и онлайн-среду. А пока вам понадобится страница продукта (я назвал свою index.html) с формой оформления заказа:

<!DOCTYPE html>
<html>
<head>
  <title>My ebook</title>
</head>
<body>
  <h1>Buy "My Book"</h1>
  <p>It's all about me!</p>

  <!-- this is copied from the Stripe checkout embed -->
  <form action="/your-server-side-code" method="POST">
    <script
      src="https://checkout.stripe.com/checkout.js" class="stripe-button"
      data-key="pk_test_6pRNASCoBOKtIshFeQd4XMUh"
      data-amount="999"
      data-currency="EUR"
      data-name="My Company"
      data-description="My Book"
      data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
      data-locale="auto">
    </script>
  </form>
  <!-- end of Stripe embed -->

</body>
</html>

Несколько замечаний:

  1. Действие формы, мы обновим это через мгновение, чтобы указать на ваш URL-адрес списания (мы перейдем к этому позже).
  2. Есть значения, которые мы повторили из файлов .env, мы обновим их позже, чтобы вы могли управлять ими из единой точки кода.
  3. data-key - ваш публикуемый ключ.
  4. data-amount указывается в центах (или пенни), то есть цена, деленная на 100, поэтому цена, указанная выше, будет показывать 9,99 евро (также потому, что валюта данных находится в евро).
  5. Если вы хотите указать собственный текст на кнопке, вам нужно будет добавить data-label = "My custom button text".
  6. Я настоятельно рекомендую добавить в форму data-zip-code = ”true”, это означает, что Stripe запросит у вашего пользователя почтовый индекс, который поможет с подтверждением налогообложения (особенно для VATMOSS).

После того, как у вас все заработало и вы используете свой тестовый публикуемый ключ, вы сможете смоделировать покупку своей вещи с помощью номеров тестовых карточек Stripe. Для читателей, не являющихся гражданами США, прокрутите немного вниз по этой ссылке, и вы найдете карточки для конкретных стран - я нашел это очень полезным для тестирования налоговых расчетов позже в процессе.

3. Завершение списания

Не обращая внимания на то, что нам нужно где-то запустить этот серверный код, следующий код - это все, что вам нужно для завершения обработки транзакции. Обратите внимание, что принцип работы Stripe’s Checkout заключается в том, что Stripe фиксирует данные карты посетителя, а ваш сервер никогда не видит карту (это хорошо). Ваш сервер получит токен, и этот токен будет использован для завершения транзакции:

// load the stripe module pass in your secret token
// this will configure the `stripe` object for your
// account that you created earlier
const stripe = require('stripe')(process.env.STRIPE_SECRET);

// this function will charge the user's card,
// note that `req` is the http request, we'll
// see how to connect this all up later.
module.exports = (req) => {
  // the token is generated by Stripe and POST'ed
  // to the `action` URL in our form
  const token = req.body.stripeToken;

  // now we create a charge which returns a `promise`
  // so we need to make sure we correctly handle
  // success and failure, but that's outside of this
  // function (and we'll see it later)
  return stripe.charges.create({
    // ensures we send a number, and not a string
    amount: parseInt(process.env.STRIPE_COST, 10),
    currency: process.env.STRIPE_CCY,
    source: token,
    description: 'My Book', // 👈 remember to change this!
    // this metadata object property can hold any
    // extra private meta data (like IP address)
    metadata: {},
  });
}

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

Я включу полный код в репозиторий git, чтобы вы могли загрузить и просмотреть его, но основной способ обработки сообщения прост:

app.post('/charge', (req, res, next) => {
  charge(req).then(data => {
    res.render('thanks');
  }).catch(error => {
    res.render('error', error);
  });
});

При успешном выполнении POST в конечную точку / charge запрос передается нашему модулю начисления (описанному в предыдущем блоке кода), и если обещание выполнено успешно, мы показываем страницу «спасибо», в противном случае мы показываем пользователю ошибку - хотя Я бы рекомендовал проверить конкретные ошибки и показать удобное для пользователя сообщение, вместо того, чтобы делать то, что я делаю выше, и передавать ошибку прямо на страницу.

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

4. Конфигурация

Как я уже упоминал ранее, у нас будет конфигурация для разработки (через .dev.env) и производственная (через .env). У вас, конечно, нет для этого, но это немного упрощает тестирование, и, в частности, с Stripe вы получаете два набора ключей API: один для тестирования, а другой - для получения денег. .

Я обычно использую эти два файла для управления средами и их условную загрузку в зависимости от значения NODE_ENV. NODE_ENV - это то, что мы устанавливаем в среде при запуске node.

Например, чтобы установить NODE_ENV = production в командной строке, вы можете запустить:

$ NODE_ENV=production node app.js

Внутри кода нашего приложения мы используем пакет под названием dotenv и загружаем файл * .env в соответствии с:

const dotenv = require('dotenv');
const envfile = process.env.NODE_ENV === 'production' ?
      '.env' :    // production
      '.dev.env'; // development

// load the contents of the env file into
// the `process.env` object.
dotenv.config({
  silent: true,
  path: `${__dirname}/${envfile}`,
});

Важно, это необходимо сделать перед попыткой прочитать какое-либо из значений process.env. *, как мы это делаем в логике начисления.

Также важно, что файлы .env содержат личную информацию. Не кладите их туда, где их можно будет прочитать (обратите внимание на те, которые я вам пока показывал, с использованием собственных тестовых API-ключей Stripe). Это означает: не размещайте эти файлы в общедоступном репозитории github и не размещайте эти файлы в Интернете, где их можно будет прочитать.

5. Развертывание

Теперь, когда у вас есть элементы логики, нам нужно получить на сайте URL-адрес, по которому люди будут покупать эту вещь. В настоящее время я очень неравнодушен к платформе Zeit’s now (Я писал об этом недавно и включаю несколько советов по развертыванию).

Однако, и это важно, если вы решите использовать Zeit, но используете уровень бесплатного пользования (по умолчанию), каждый файл, который вы развертываете, будет общедоступным. Поэтому вам нужно удалить файл .env и установить значения среды в командной строке при развертывании. Что хорошо в использовании process.env для значений, так это то, что даже если вы удалите файл .env, ни один из ваших кодов не нуждается в изменении.

Во-первых, создайте файл с именем .gitignore и включите (как минимум) .env - это означает, что git проигнорирует этот файл, но также команда Zeit now не будет загружать файл.

Использование следующей команды приведет к развертыванию с использованием now и включит все значения вашей среды в качестве аргумента (с использованием -e KEY = VALUE) в команду now:

$ now $(sed -e 's/^/-e /' .env)

Одно предостережение в отношении приведенного выше выражения: ваш файл .env не может содержать комментарии и не может содержать пробелов.

Или вы можете использовать такой продукт, как Surge.sh или Heroku, или что-нибудь, что вам удобно.

6. Налог

Я упомянул налог. Если вы находитесь в ЕС (или ... в Великобритании ... # brexit), вам нужно будет сообщать о любых налогах на основе ЕС, что не так уж сложно, но наверняка неудобно. В Великобритании это известно как VATMOSS, я уверен, что в других странах ЕС у него есть не менее запутанные названия.

Есть доступные услуги, и я написал свой собственный мини-продукт для этого (конечно, вам понадобятся продажи в ЕС, чтобы увидеть какие-либо данные) на сайте taxdo.eu. Taxdo сейчас бесплатен (так как я участвую в бета-тестировании), но вы можете зарегистрироваться и попробовать (или отправить мне отзыв).

Есть также продукты, которые сделают за вас весь процесс, в частности Quaderno (хотя я лично не пробовал, их название постоянно упоминается в этой области). Если вы хотите узнать больше о VATMOSS, я настоятельно рекомендую прочитать Материал Рэйчел Эндрю.

Заключительные примечания

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

Изначально опубликовано в B: log Реми Шарпа