Как принимать платежи с помощью полосы

8 января 2018

Обработка кредитных карт, к сожалению, намного сложнее, чем мы могли бы надеяться, как разработчиков. Учитывая, что это такая общая задача, действительно ли необходимо, чтобы мы прыгали через бесчисленные обручи (конечно, окруженные огнем) с единственной целью обработки платежа? Торговцы? Шлюзы? SSL? Безопасность? Очень быстро, казалось бы, простая операция может стать чрезвычайно запутанной и, что более важно, опасной задачей. В любое время, когда вы обнаружите, что работаете с конфиденциальными данными пользователя, вам лучше быть на цыпочках.

Было бы неудивительно, если бы была служба, которая сделала этот процесс настолько простым, насколько это возможно? Служба, созданная разработчиками для разработчиков. Какая мысль! Введите Stripe; нет торговых счетов, нет шлюзов. Вызов API, а также несколько рекомендаций по безопасности - это все, что вам нужно, чтобы начать принимать платежи по кредитным картам сегодня.

Хотя Stripe не является бесплатным, они запрашивают только 2,9% от каждого заряда (плюс 0,30 центов). Это оно. Никаких сборов за установку, платы за хранение, скрытых расходов - ничто из этого. Всего 2,9%. Неплохо!


5 Функции клавишной полосы

    Простой: обработка кредитных карт вручную сложна и опасна. С Stripe это делает cinch! Вы даже можете обработать сборы из командной строки! Cheap: Различные продавцы платежей печально известны своими скрытыми платежами. Stripe сообщает вам, что именно вы можете ожидать: 2,9% за плату + 30 центов. Нет платы за установку. Никаких скрытых платежей. Нет платы за хранение карт. Инновационный API: API-интерфейс Stripe является чистым, спокойным и простым в использовании. Used By Cool Kids: Если усыновление является проблемой, это не обязательно. Бесчисленные сервисные рычаги Stripe, в том числе Reddit, Grooveshark и Shopify.Built Разработчики: очень четко, Stripe была создана, чтобы поцарапать зуд разработчика. Команда полна разработчиков и предпринимателей, как и вы.

Давайте сделаем это

Продано? Я тоже. Давайте обработаем наш первый тестовый платеж. Конечно, прежде чем начать, зайдите на сайт stripe.com, создайте новую учетную запись (бесплатно) и заполните различные формы, такие как дескриптор оператора и ваши банковские данные.

Для зарядки пользователя требуются два основных этапа:

    Извините информацию о кредитной карте пользователя и отправьте запрос AJAX на сервер Stripe, который вернет уникальный токен, который представляет это безопасные данные. Используя свой серверный язык выбора (PHP для этой статьи), создайте новую плату Stripe, пропуская уникальный token.

Создайте форму оплаты

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

<form action=" method="POST">
  <script
    src="https://checkout.stripe.com/v2/checkout.js" class="stripe-button"
    data-key="pk_test_G5YhIkq2PEq84lwU064TZENT"
    data-amount="2000"
    data-name="Demo Site"
    data-description="2 widgets ($20.00)"
    data-image="/128x128.png">
  </script>
</form>

Однако в большинстве ситуаций вам потребуется полный контроль. Таким образом, для целей настоящей статьи мы будем использовать пользовательскую форму. В этом разделе мы выполним три функции:

    Используем форму для сбора информации о кредитной карте пользователя. Преобразуйте эти данные в уникальный одноразовый файл tokeSubmit формы на сервер вместе с toke

. Форма основного платежа может выглядеть как:

<form action=" method="POST" id="payment-form">
  <span class="payment-errors"></span>
  <div class="row">
    <label>
      <span>Card Number</span>
      <input type="text" data-stripe="number">
    </label>
  </div>
  <div class="row">
    <label>
      <span>CVC</span>
      <input type="text" data-stripe="cvc">
    </label>
  </div>
  <div class="row">
    <label>
      <span>Expiration (MM/YYYY)</span>
      <input type="text" data-stripe="exp-month">
    </label>
    <input type="text" data-stripe="exp-year">
  </div>
  <button type="submit">Buy Now</button>
</form>

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

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

Обратите внимание на пользовательские атрибуты на входах, такие как data-stripe = "number". Stripe предлагает плагин stripe.js, который помогает в процессе компиляции предоставленных пользователем данных и генерации токена. Stripe будет искать эти атрибуты и получать их соответствующие значения.

Чтобы использовать stripe.js, укажите скрипт в своем проекте и установите свой опубликованный ключ, который будет предоставлен при регистрации с помощью Stripe. Мы также будем использовать jQuery в этой статье, хотя это, безусловно, не требуется.

<script src="//code.jquery.com/jquery-2.0.2.min.js"></script>
<script src="//js.stripe.com/v2/"></script>
<script>
    (function() {
        Stripe.setPublishableKey('YOUR PUBLISHABLE KEY');
    })();
</script>

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

Затем нам нужно создать уникальный одноразовый токен для данных кредитной карты пользователя. Для этой цели мы можем использовать объект Stripe, предоставленный скриптом, который мы импортировали. Еще лучше, нам не нужно беспокоиться о сериализации данных платежной формы; просто пройдите через объект jQuery формы, а Stripe будет обрабатывать остальные.

// Event Listeners
$('#payment-form').on('submit', generateToken);
var generateToken = function(e) {
    var form = $(this);
    // No pressing the buy now button more than once
    form.find('button').prop('disabled', true);
    // Create the token, based on the form object
    Stripe.create(form, stripeResponseHandler);
    // Prevent the form from submitting
    e.preventDefault();
};
var stripeResponseHandler = function(status, response) {};

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

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

Ваш обратный вызов может выглядеть так:

var stripeResponseHandler = function(status, response) {
    var form = $('#payment-form');
    // Any validation errors?
    if (response.error) {
        // Show the user what they did wrong
        form.find('.payment-errors').text(response.error.message);
        // Make the submit clickable agai
        form.find('button').prop('disabled', false);
    } else {
        // Otherwise, we're good to go! Submit the form.
        // Insert the unique token into the form
        $('<input>', {
            'type': 'hidden',
            'name': 'stripeToken',
            'value': response.id
        }).appendTo(form);
        // Call the native submit method on the form
        // to keep the submission from being canceled
        form.get(0).submit();
    }
};

Это очень просто! Отправьте запрос AJAX в API Stripe (используя их полезный плагин JavaScript), извлеките сгенерированный токен, вставьте его в форму и разместите на своем сервере!

Зарядка

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

Stripe предлагает несколько серверных библиотек для регистрации новых сборов или даже для организации подписки. Скорее всего, ваш предпочтительный язык представлен (PHP, Ruby, Python и т. Д.).

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

    Добавить свой API-интерфейс. Используя библиотеку Stripe, выполните вызов API, пройдя через детали транзакции. Завершите оплату.

Обратитесь к странице библиотеки Stripe для инструкций по установке. Если вы используете PHP, как мы будем в этой статье, рекомендуется использовать Composer для загрузки пакета Stripe.

{
    "require": {
        "stripe/stripe-php": "dev-master"
    }
}

Composer - это будущее управления зависимостью PHP, поэтому заходите на борт сейчас, если вы еще этого не сделали. Базовая плата Stripe может принимать форму:

// Set your API key
Stripe::setApiKey("YOUR API KEY");
try {
    Stripe_Charge::create([
        'amount' => 2000, // this is in cents: $20
        'currency' => 'usd',
        'card' => $_POST['stripeToken'],
        'description' => 'Describe your product'
    ]);
} catch (Stripe_CardError $e) {
    // Declined. Don't process their purchase.
    // Go back, and tell the user to try a new card
}

Это оно! Ключ API будет аутентифицировать вас как действительного пользователя Stripe. Подобно опубликованному ключу, Stripe предоставит вам две разные версии этого ключа: один для тестирования и производства, соответственно.

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

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

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


SSL

Пока, да, работа Stripe завершена, а с другой - нет. Независимо от поставщика платежей, в любое время, когда вы работаете с информацией о кредитной карте, безопасность должна быть главной проблемой. Мы уже сделали первые шаги, убедившись, что данные кредитной карты никогда не касаются сервера, но еще многое предстоит сделать. Затем мы должны обеспечить подключение пользователя к вашему серверу. Другими словами, вам нужен сертификат SSL. Ни в коем случае не пропустите этот шаг!

"SSL (Secure Sockets Layer) - стандартная технология безопасности для установления зашифрованной связи между веб-сервером и браузером. Эта ссылка гарантирует, что все данные, передаваемые между веб-сервером и браузерами, остаются конфиденциальными и целостными ». - info.ssl.com

Когда пользователь предлагает веб-сайт свою информацию о кредитной карте, они ожидают увидеть https в адресной строке. К счастью, покупка SSL-сертификата намного проще, чем раньше. Фактически, большинство хостов предлагают надстройку SSL, которая превращает весь процесс в один клик. То же самое можно сказать о различных вариантах SaaS, таких как Pagoda Box или Heroku.

Tip: после включения SSL возможно, что изображения и активы сломаются. Чтобы исправить это, убедитесь, что все URL-адреса используют https, а не http. Или, как лучшее решение, используйте URL-адрес, относящийся к протоколу.
<!-- Not good for SSL -->
<img src="http://domain.com/images/foo.jpg" alt="Foo Bar">
<!-- Better -->
<img src="//domain.com/images/foo.jpg" alt="Foo Bar">

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

Предполагая, что ваш хост предлагает однострочное дополнение SSL, просто укажите своего пользователя в https: версию страницы заказа, и все готово!


Советы и рекомендации

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

1. Специальные номера кредитных карт

Очевидно, что вы не хотите использовать реальные номера кредитных карт для проверки своих платежных форм! К счастью, Stripe уже подумала об этом; они включают в себя ряд номеров кредитных карт, которые имитируют конкретные ответы, такие как успешный платеж, неверный номер, неправильный код CVC и многие другие.

Вот несколько номеров карт, на которые вы часто ссылаетесь:

Visa Подтверждено: 4242424242424242Mastercard Утверждено: 5555555555554444Card Отклонено: 4000000000000002Некоторый номер: 4242424242424241

2. С помощью окружения разумно

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

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

Сначала мы устанавливаем производственные ключи:

<?php // app/config/stripe.php
return [
    'apiKey' => 'PRODUCTION API KEY',
    'publishableKey' => 'PRODUCTION PUBLISHABLE KEY'
];

И для разработки мы переопределяем производственные ключи своими тестовыми аналогами:

<?php // app/config/development/stripe.php
return [
    'apiKey' => 'TEST API KEY',
    'publishableKey' => 'TEST PUBLISHABLE KEY'
];

Теперь, когда для приложения требуется ключ API, используя Config:: get ('stripe.apiKey'), возвращаемое значение будет определяться средой. Успех!

3. Не перенастраивайте свое приложение на полосу

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

Спросите себя: «Если в будущем мне нужно поменять место на Stripe с другим провайдером, насколько это будет сложно?» Подсказка: что-то большее, чем «всего лишь мгновение», является запахом кода.

Вместо этого код для интерфейса - возможно, BillingProvider или BillingGateway. Таким образом, вы можете создавать различные реализации интерфейса: один для Stripe или один для другой службы полностью, если возникнет такая необходимость. В этих различных реализациях будут храниться функции, относящиеся к услугам. Если в какой-то момент вы найдете более дешевого поставщика биллинга, чем Stripe, замена реализации BillingProvider на Stripe с помощью версии ServiceX займет всего лишь мгновение - то есть, как только вы создадите новую реализацию, которая запрашивает API биллинга ServiceX.

Вот скелет о том, как это может выглядеть:

// Define the interface
interface BillingProvider {
    public function charge($creditInfo);
}
// Create a Stripe implementatio
class StripeBilling {
    public function charge($creditInfo)
    {
        // Stripe_Charge::charge(...);
    }
}
// Create a ServiceX implementatio
class ServiceXBilling {
    public function charge($creditInfo)
    {
        // charge user with ServiceX
    }
}

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

class PaymentController {
    protected $billing;
    public function __construct(BillingProvider $billing)
    {
        $this->billing = $billing;
    }
}

С этим стилем разработки, если вам действительно нужно уйти от Stripe, вам не нужно будет прикасаться к контроллеру. Поскольку Stripe не жестко закодирован, он не знает разницы!

4. Не оставляйте покупателя висящим

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

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

5. SSL-сертификаты

Если вам необходимо вручную приобрести сертификат SSL, на выбор есть ряд услуг. Основываясь на предыдущем опыте, вы можете рассчитывать потратить тридцать минут на час. Имейте в виду, что большинство сертификатов не являются бесплатными и могут варьироваться от 10 до 500 долларов США в зависимости от поставщика.

Команда Stripe рекомендует DigiCert и Namecheap, хотя, если вы предпочитаете, вы можете рассмотреть бесплатное решение, такое как StartSSL.

6. Не полагайтесь на цену формы

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

7. Цифровой файл не должен быть общедоступным

Объект, который вы продаете, никогда не должен быть доступен публике, даже если URL, по вашему мнению, длинный и запутанный настолько, что большинство из них никогда не узнает его. Это плохая практика по ряду причин.

Вместо этого создайте таблицу загрузок, в которой содержатся уникальные коды покупок, а также их ассоциированные идентификаторы продуктов. Таким образом, когда запрашивается URI, например загрузка 23gsfga831g, ваше приложение будет:

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

Чтобы принять меры, вы также можете установить ограничение на загрузку. Для этого просто потребовалось бы добавить в таблицу покупок поле download_count. С каждым запросом это число должно быть увеличено на единицу. Как только это число достигнет вашего установленного порога, загрузка больше не будет предоставляться. Это может быть полезно в тех случаях, когда вы хотите, чтобы ссылки на скачивание не были разделены.


Заключение

Замечательная вещь о Stripe заключается в том, что она переводит сложную, запутанную и опасную операцию в один простой API-вызов. Нет торговых счетов, нет шлюзов, нет скрытых платежей. Есть причина, по которой они говорят, что Stripe смехотворно проста в использовании. Это!