Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Создаём сайт, применяя Laravel и Recurly. Часть 2

Anna | 29.05.2014 | нет комментариев

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

Вступление

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

Приступаем к работе

Есть две библиотеки Recurly — клиентская библиотека PHP, которую мы ранее установили с поддержкой composer (в первой части) и Recurly JS. Recurly JS — это клиентская библиотека для динамической интеграции формы, которая неопасно обрабатывает информацию с карт.
Информация карт размещается на серверах Recurly, а не в нашем веб-приложении, что сокращает нашу головную боль.

Скачаем библиотеку Recurly JS и скопируем recurly.min.js из папки сборки в папку public/js/libs и добавим его в макете перед закрывающим тегом:

<script src="/js/libs/recurly.min.js"></script>
</body>

Мы также обязаны применять CSS-жанры, которые применяются для отображения формы оплаты. Сделайте каталог в директории css/recurly и скопируйте в него директорию themes, а после этого мы будем ссылаться на него в соответствующем разделе нашего макета

<link href="/css/recurly/themes/default/recurly.css" rel="stylesheet">

Когда вы 1-й раз залогинитесь позже создания учетной записи с Recurly, вам предложат сделать свои планы подписок. В первой части мы сделали три различных яруса подписок — бронза, серебро и золото. Вы неизменно можете изменить их либо добавить новые, но нет никакого урона в том, что мы сделаем это теперь.

Сделайте план под наименованием Бронзовый; Будьте внимательны, необходимо что бы план кода был установлен “bronze” (в нижнем регистре). Установить цену — я написал ути app/views/home файлsignup.blade.php со дальнейшим оглавлением:

@extends('layouts.default')

@section('content')

  <h1>Signup</h1>

  <p>Please select your plan...</p>

  <div>
    <div>
      <div>
      <h2>Bronze</h2>
      <span>
Нам нужно расширить макет по умолчанию так, что мы сумеем вставлять JavaScript код в футер (низ). Добавьте следующую строку позже последнего тега сценария:
@yield('scripts')

 Сейчас сделаем новейший маршрут:
Route::get('/user/register/payment', function() {
    Recurly_js::$privateKey = Config::get('recurly.private_key');
    $plan = 'bronze'; // todo: get this from vars
    $user = Session::get('register_user');
    $signature = Recurly_js::sign(array(
        'account'      => array(
            'account_code' => 'user_' . $user->id
        ),
        'subscription' => array(
            'plan_code'    =>  $plan,
            'currency'     => Config::get('recurly.default_currency')
        )
    ));

    return View::make('user/register')->with(array(
        'plan'      => $plan,
        'subdomain' => Config::get('recurly.subdomain'),
        'currency'  => Config::get('recurly.default_currency'),
        'signature' => $signature
    ));
});

 Несколько примечаний по этому коду:
  • Мы надлежащий установить тайный ключ в классе Recurly_js, тот, что мы будем принимать из файла конфигурации сделанного ранее.
  • Данные на подписку (план) мы обязаны получать из предыдущего этапа, сделанного в регистрации. Данный кусок оставлен как независимое упражнение
  • Нам необходимо сделать сигнатуру (подпись) для Recurly.js, применяя несколько частей информации, в их числе идентификатор пользователя, тот, что мы создаем объединяя класс (пользователя) и его ID
  • Эта подпись передается на ряду с иной информацией в данном представлении

 Страница оплаты состоит из 2-х частей, первая часть — примитивный HTML:
@extends('layouts.default')

@section('content')

  <div id="recurly-subscribe">
  </div>

@stop 

 Recurly.js внедряет свой клиентский сгенерированный код формы оплаты в данный div.

 Дальше, мы добавим JavaScript к сегменты, которая получает итог внизу образца макета:
@section('scripts')
<script>
Recurly.config({
    subdomain: '{{ $subdomain }}',
    currency: '{{ $currency }}'
});

Recurly.buildSubscriptionForm({
    target: '#recurly-subscribe',
    // Signature must be generated server-side with a utility
    // method provided in client libraries.
    signature: '{{ $signature }}',
    successURL: '/user/register/confirm',
    planCode: '{{ $plan }}',
    distinguishContactFromBillingInfo: true,
    collectCompany: false,
    termsOfServiceURL: 'http://www.example.com/terms',
    acceptPaypal: true,
    acceptedCards: ['mastercard',
                    'discover',
                    'american_express', 
                    'visa'],
    account: {
        firstName: 'Joe',
        lastName: 'User',
        email: 'test@example.net',
        phone: '555-555-5555'
    },
    billingInfo: {
        firstName: 'Joe',
        lastName: 'User',
        address1: '123 somestreet',
        address2: '45',
        city: 'San Francisco',
        zip: '94107',
        state: 'CA',
        country: 'US',
        cardNumber: '4111-1111-1111-1111',
        CVV: '123'
    }
});
</script>
@stop

 Тут происходит волшебство — Recurly строит форму оплаты и выводит его в div c id #recurly-subscribe, которая требует часть информации, мы пришли к виду, тот, что требует генерируемые подписи.
 После этого, обратный вызов, тот, что Recurly возвращает позже удачной отправки формы, которая определяется в successURL следующими параметрами:
Route::post('/user/register/confirm', function() {
    $recurly_token = Input::get('recurly_token');
    Recurly_js::$privateKey = Config::get('recurly.private_key');
    $result = Recurly_js::fetch($recurly_token);
    var_dump($result);
});

 И вновь мы инициализируем Recurly.js с секретным ключем из конфигурации, и используем его для извлечения объекта, представленного токеном, тот, что Recurly посылает в качестве переменной POST (recurly_token). Это будет экземпляром Recurly_Subscription, из которого дозволено извлечь разную информацию. Я вывожу это с поддержкой var_dump(), что бы взглянуть на данные.

 Для начала, давайте получим код плана, что бы узнать на что подписался пользователь:
$plan_code = $result->plan->plan_code;

 Сейчас, необходимо обнаружить соответствующую роль, подметьте — мы дали им имена “bronze”, “silver” и “gold”.
$role = Role::where('name', '=', $plan_code)->first();

 После этого получим пользователя из сессии (а после этого удалим его из сессии):
$user = Session::get('register_user');
Session::forget('register_user');

 Дальше, мы предоставляем роль для соответствующего нового пользователя:
$user->roles()->attach($role);

 После этого, мы обязаны удалить отложенную роль:
$role_pending = $role_pending = Role::where('name', '=', 'pending')->first();
DB::table('role_user')->where('user_id', '=', $user->id)->where('role_id', '=', $role_pending->id)->delete();

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

Страница управления учетными записями


 Давайте сотворим примитивную страницу, с которой пользователи сумеют руководить своим счетом.
 Видимо, это будет требовать того, Дабы пользователь вошел в систему, следственно мы обязаны применить аутентификационный фильтр. 
 Взамен того, Дабы указывать данный фильтр для всякой защищенной страницы, мы можем поставить все соответствующие маршруты в группу, вот так:
Route::group(array('before' => 'auth'), function() {
    Route::get('/user/account', function() {
        // User must be logged in
    });
    Route::get('user/account/billing', function() {
        // User must be logged in
    });
});

 Вызов страницы учетной записи примитивен:
Route::get('/user/account', function() {
    return View::make('user/account/index');
});

 Сейчас адрес вида app/views/user/account/index.blade.php:
@extends('layouts.default')

@section('content')

    <h1>Your Account</h1>

    <ul>
    <li><a href="/user/account/edit">Edit your account information</a></li>
    <li><a href="/user/account/plan">Update your subscription plan</a></li>
        <li><a href="/user/account/billing">Update your Billing information</a></li>
    </ul>

@stop

 Начнем с информационного обновления биллинговой страницы. Безусловно, мы не бережем платежную информацию людей, так как на страницу оплаты, Recurly будет сделать и заполнять форму для вас, объявляя (POSTing) новую информацию к Recurly без него когда-нибудь неподалеку от вашего веб-приложения.
Route::get('user/account/billing', function() {
    Recurly_js::$privateKey = Config::get('recurly.private_key');

    $account_code = 'user_' . Auth::user()->id;

    $signature = Recurly_js::sign(
        array('account' => array('account_code' => $account_code))
    );

    return View::make('user/account/billing')->with(array(      
        'subdomain'     => Config::get('recurly.subdomain'),
        'currency'      => Config::get('recurly.default_currency'),
        'account_code'  => $account_code,
        'signature'     => $signature
    ));
});

 Это дюже схоже на страницу оплаты в том плане, что мы инициализируем библиотеки Recurly.js, создавая подписи (правда и с применением разной информации) и, проходя через несколько параметров в представление.
 Путь app/views/user/account/billing.blade.php
 следует в существенной степени той же схеме, на страницу оплаты:
@extends('layouts.default')

@section('content')

 <div id="recurly-billing">
 </div>

@stop

@section('scripts')
<script>
Recurly.config({
    subdomain: '{{ $subdomain }}',
    currency: '{{ $currency }}'
});

Recurly.buildBillingInfoUpdateForm({
    target: '#recurly-billing',
    successURL: '/user/account/billing/confirm',
    accountCode: '{{ $account_code }}',
    signature: '{{ $signature }}'
});
</script>
@stop

 Наконец, дюже примитивный обратный вызов, когда пользователь заполнил информацию об оплате:
Route::post('user/account/billing/confirm', function()
{
    return Redirect::to('/user/account')->with('success', 'Your billing information has been updated.');
});

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

Push-уведомления



 В дополнение к вероятностям для запроса API Recurly, сервис «ping» приложение с уведомлением, когда происходит какое-либо событие.
 Эти уведомления не следует путать с мобильного многообразием, впрочем — они абсолютно различные.
 По существу служба отправляет POST-запрос к URI, и посылает XML документ как тело запроса. Вы можете применять библиотеки Recurly, что бы извлечь нужную информацию, и делать соответственно. Эти уведомления детально описаны в документации Recurly. 

 Давайте определим нашу функцию обратного вызова, когда было получено уведомление:
Route::post('recurly', function(){
    $xml = file_get_contents ("php://input");
    $notification = new Recurly_PushNotification($xml);

    switch ($notification->type) {
        // ... process notification
    }
});

 Вы, вероятно, осознали, что, как только кто-то подписался и уплатил за службу, он остается неопределенным подписчиком, и не ясно, продолжается ли их подписка либо нет. Так, крупнейший интерес представляет уведомление об отмене подписки. Мы можем применять уведомление от Recurly, что бы определить неактивные подписки и отзывать соответствующие роли. Скажем:
switch ($notification->type) {
    case 'canceled_subscription_notification':
        // get the account code
        $account_code = $notification->account->account_code;
        // extract the user ID (account_code format is user_ID)
        $user_id = intval(substr($account_code, (strpos($account_code, '_') 1)));   
        // find the user in question
        $user = User::find($user_id);
        // get the plan code
        $plan_code = $notification->subscription->plan->plan_code;
        // find the corresponding role...
        $role = Role::where('name', '=', $plan_code)->first();
        // ...and revoke it
        DB::table('role_user')->where('user_id', '=', $user->id)->where('role_id', '=', $role)->delete();
        break;

    // ... process notification
}


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

 На этом подлинная статья заканчивается. Спасибо каждому, кто прочитал мою статью. Местами, я не понимал, что хочет сказать автор, вы осознаете это при прочтении. Если вам будет увлекателен итог, то я выложу на гитхаб то, что получилось у меня (Теперь, к сожалению не могу выложить — нет времени доделать практику по 2-й части). Спасибо за уделенное время!
 Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB