Мой опыт знакомства с BrainTree

от автора

image
Итак, началось все с того, что на работе к проекту понадобилось прикрутить систему оплаты BrainTree. Поискав на русскоязычных сайтах инструкцию как это сделать, я понял, что придется во всем разбираться самому.
Сначала вкратце о BrainTree. Система предназначена для электронных платежей с помощью кредитных карт.
Поддерживаются однократные платежи, а также периодические платежи (подписки).
На сайте BrainTree есть раздел Developers. Там довольно понятно изложена инструкция по настройке и запуску оплаты на вашем сайте с использованием различных языков программирования:

  • Ruby
  • Perl
  • Python
  • Java
  • PHP
  • Microsoft .NET
  • Node JS

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

Безопасность

Для шифрования номера карты и CVV на клиентской стороне используется JavaScript библиотека. Далее данные с формы передаются на ваш сервер, который соединяется сервером BrainTree для осуществления операции. В ответе BrainTree отправляет результат действия, который можно по-разному обработать: выдать ошибку, осуществить подписку и прочее.
image
Я рассмотрю пример использования данной системы на сайте MVC 4.
Для начала создадим новый проект с шаблоном по умолчанию. (Предполагается, что Вы уже зарегистрировались, это не так уж тяжело).

Однократные платежи

Для того чтобы начать использовать BrainTree необходимо скачать библиотеку и подключить её к проекту.
Далее заходим в BrainTree под своим логином и копируем конфигурацию с использованием вашего языка (у нас .Net).
image

Внутри контроллера создаем статическую переменную.

public static BraintreeGateway Gateway = new BraintreeGateway         {             Environment = Braintree.Environment.SANDBOX,             PublicKey = "your_public_key",             PrivateKey = "your_private_key",             MerchantId = "your_merchant_id"         }; 

При этом не забываем подключить библиотеку BrainTree.

using Braintree; 

Теперь необходимо создать страничку и разместить форму.

<h1>Braintree Credit Card Transaction Form</h1>     <div>       <form action="@Url.Action("CreateTransaction")" method="POST" id="braintree-payment-form">         <p>           <label>Card Number</label>           <input type="text" size="20" autocomplete="off" data-encrypted-name="number" />         </p>         <p>           <label>CVV</label>           <input type="text" size="4" autocomplete="off" data-encrypted-name="cvv" />         </p>         <p>           <label>Expiration (MM/YYYY)</label>           <input type="text" size="2" name="month" /> / <input type="text" size="4" name="year" />         </p>         <input type="submit" id="submit" />       </form>     </div> 

Также для того чтобы зашифровать номер карты и cvv нужно использовать Braintree.js library. Публичный ключ можно получить в панели управления BrainTree.

     <script type="text/javascript" src="https://js.braintreegateway.com/v1/braintree.js"></script>     <script type="text/javascript">       var braintree = Braintree.create("YourClientSideEncryptionKey");       braintree.onSubmitEncryptForm('braintree-payment-form');     </script> 

Теперь на сервере необходимо принять эту форму.

[HttpPost]     public ActionResult CreateTransaction(FormCollection collection)     {         TransactionRequest request = new TransactionRequest         {             Amount = 1000.0M, //Здесь указывается сумма транзакции в USD             CreditCard = new TransactionCreditCardRequest             {                 Number = collection["number"],                 CVV = collection["cvv"],                 ExpirationMonth = collection["month"],                 ExpirationYear = collection["year"]             },             Options = new TransactionOptionsRequest             {                 SubmitForSettlement = true             }         };          Result<Transaction> result = Gateway.Transaction.Sale(request);          if (result.IsSuccess())         {             Transaction transaction = result.Target;             ViewData["TransactionId"] = transaction.Id;         }         else         {             ViewData["Message"] = result.Message;         }          return View();     } 

А также создать страницу для отображения результатов выполнения транзакции.

@if (ViewData.ContainsKey("TransactionId")) {     <h2>Success! Transaction ID: @ViewData["TransactionId"]</h2> } else {     <h2>Error: @ViewData["Message"]</h2> } 

После этого можно начать тестирование нашей системы. Для проверки используем номер карты «4111111111111111» и cvv «111», т.к. другие система не принимает. В качестве даты карты можно использовать любую валидную дату.

Периодические платежи

Для начала необходимо создать план подписки (а может и не один, если предполагаются различные варианты подписок) в панели управления BrainTree. Для этого нужно в левой панели выбрать Recurring Billing > Plans. Далее создаем новый план:
image
При необходимости добавляем ему пробный период:
image
А так же устанавливаем длительности цикла оплаты и длительность подписки:image
Теперь создаем страничку с формой для введения данных о карте и о подписчике. Таким образом мы создаем клиента. Не забываем добавить шифрование номера карты и cvv перед оправкой формы.

    <h1>Braintreegateway recurring billing</h1>     <div id="braintreegateway-div-net">                   <h3>Braintree Credit Card Transaction Form</h3>     <div>       <form action="@Url.Action("CreateCustomer")" method="POST" id="braintree-payment-form1">         <p>           <label>First name</label>           <input type="text" data-encrypted-name="first_name" />         </p>         <p>           <label>Last name</label>           <input type="text"  data-encrypted-name="last_name" />         </p>         <p>           <label>Postal code</label>           <input type="text"  data-encrypted-name="postal_code" />         </p>         <p>           <label>Card Number</label>           <input type="text" size="20" autocomplete="off" data-encrypted-name="number" />         </p>         <p>           <label>CVV</label>           <input type="text" size="4" autocomplete="off" data-encrypted-name="cvv" />         </p>           <p>               <label>Expiration (MM/YYYY)</label>                              <input type="text" size="2" name="month"  /> / <input type="text" size="4" name="year" />                          </p>           <table> </table>         <input type="submit" id="submit" value="Create account"/>       </form>     </div>     <script type="text/javascript" src="https://js.braintreegateway.com/v1/braintree.js"></script>     <script type="text/javascript">         var braintree = Braintree.create("YourClientSideEncryptionKey");         braintree.onSubmitEncryptForm('braintree-payment-form1');     </script>     </div> 

Обработаем на сервере передачу формы:

[HttpPost] public ActionResult CreateCustomer(FormCollection collection) {     CustomerRequest request = new CustomerRequest     {         FirstName = collection["first_name"],         LastName = collection["last_name"],         CreditCard = new CreditCardRequest         {             BillingAddress = new CreditCardAddressRequest             {                 PostalCode = collection["postal_code"]             },             Number = collection["number"],             ExpirationMonth = collection["month"],             ExpirationYear = collection["year"],             CVV = collection["cvv"]         }     };      Result<Customer> result = Constants.Gateway.Customer.Create(request);     if (result.IsSuccess())     {         Customer customer = result.Target;         ViewData["CustomerName"] = customer.FirstName + " " + customer.LastName;         ViewData["CustomerId"] = customer.Id;     }     else     {         ViewData["Message"] = result.Message;     }      return View(); } 

Возвращаем страничку с информацией об ошибке, либо с кнопкой «Подписаться».

@if (ViewData.ContainsKey("CustomerId")) { <h2>Customer created with name: @ViewData["CustomerName"]</h2> @Html.ActionLink("Click here to sign this Customer up for a recurring payment", "CreateSubscription", "Home", new { id = ViewData["CustomerId"] }, null) } else { <h2>Error: @ViewData["Message"]</h2> } 

И обрабатываем кнопку создания подписки

public ActionResult CreateSubscription(string id)     {         try         {             Customer customer = Constants.Gateway.Customer.Find(id);             string paymentMethodToken = customer.CreditCards[0].Token;              SubscriptionRequest request = new SubscriptionRequest             {                 PaymentMethodToken = paymentMethodToken,                 PlanId = "test_plan_1"             };             Result<Subscription> result = Constants.Gateway.Subscription.Create(request);              return Content("Subscription Status " + result.Target.Status);         }         catch (Braintree.Exceptions.NotFoundException e)         {             return Content("No customer found for id: " + id);         }     } 

После совершения данных действий клиенты смогут платить за подписку к Вашему продукту.

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

ссылка на оригинал статьи http://habrahabr.ru/post/196244/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *