• Microsoft .NET
  • ASP.NET
  • Руководство по Catharsis - часть 3: быстрая разработка приложений

Введение в PayPal для C# - разработчики ASP.NET - Регулярные платежи

ОГЛАВЛЕНИЕ

Регулярные платежи

Если вы продаете ежемесячное обслуживание, а не продукт, то вас заинтересуют функции регулярных платежей, предоставляемые PayPal. Они касаются работы с разными переменными, имеющими разное значение. Допустим, вам нужно установить 3 -дневное бесплатное опробование, после чего пользователь должен будет платить вам $10.00 в месяц, чтобы продолжать использовать сервис. Следующая HTML форма решает данную задачу:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_xclick-subscriptions"/>
    <input type="hidden" name="business" value="Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript."/>
    <input type="hidden" name="item_name" value="Something"/>
    <input type="submit" value="Subscribe!" />

    <input type="hidden" name="a1" value="0"/>
    <input type="hidden" name="p1" value="3"/>
    <input type="hidden" name="t1" value="D"/>
    <input type="hidden" name="a3" value="10.00"/>
    <input type="hidden" name="p3" value="1"/>
    <input type="hidden" name="t3" value="M"/>
    <input type="hidden" name="src" value="1"/>
    <input type="hidden" name="srt" value="0"/>
    <input type="hidden" name="sra" value="1"/>

</form>
 

Переменные и ресурсы HTML

После прочтения предыдущего примера вы можете задаться вопросом, что делают определенные переменные (a1? p1? srt?). К счастью, PayPal предоставляет страницу "Переменные HTML Variables для стандарта платежей через вебсайт", на которой можно прочитать о любой интересующей вас переменной.

Другой прекрасный ресурс - "примеры PayPal лыжника". Там есть примеры почти для всех сценариев платежей, которые могут прийти на ум – вместо загромождения данной статьи лишними примерами, посетите указанную страницу, если захотите реализовать более сложную HTML форму PayPal.

Обработка постоплаты

Во время установки HTML формы PayPal возникает первый вопрос – после того как пользователь заплатит, можно ли реализовать какой-либо алгоритм обработки постоплаты? И не без причины; можно придумать многочисленные сценарии постоплаты – от отправки простого электронного письма "Спасибо" до обновления базы данных сайта и предоставления пользователю доступа к ресурсам с ограниченным доступом, за которые он заплатил. В зависимости от ваших знаний и требуемого уровня устойчивости для алгоритма последующей обработки, вы можете пойти тремя путями; их можно комбинировать.

 

Самовозврат

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

  1. Войдите в ваш первый или бизнес-аккаунт
  2. Нажмите вложенную вкладку “Профиль”
  3. Нажмите “Настройки платежей” через вебсайт в колонке “Настройки продажи”
  4. Нажмите радиокнопку “Включить” рядом с меткой “Самовозврат”
  5. Введите требуемый URL, на который должны возвращаться ваши пользователи, в текстовое поле, помеченное URL возврата
  6. Нажмите кнопку “Сохранить” внизу страницы

Указание URL самовозврата в вашем профиле PayPal

Если вы укажете URL самовозврата в вашем профиле и зададите переменную возврат в вашей HTML форме, переменная возврат затрет URL переменную профиля.

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

  • tx - идентификатор транзакции
  • st - состояние платежа
  • amt - сумма платежа
  • cc - код валюты

В заключение этого раздела еще одна вещь. Причина, по которой слово "автоматически" в первом предложении выделено курсивом: если пользователь платит с кредитной карты, его автоматически не перенаправит на ваш URL возврата; ему придется нажать на кнопку "Вернуться к торговцу". Если это кажется вам странным, знайте, что вы не одиноки; однако из-за правовых вопросов PayPal отказывался и до сих пор отказывается менять способ обработки оплаты кредитной картой в самовозврате.

Передача данных о платеже (PDT)

После просмотра списка переменных, предоставляемых самовозвратом, вероятно, вы задались вопросом – можно ли получить больше данных о выполненной транзакции? Именно здесь вступает в действие PDT – надстройка над функциональностью самовозврата. Поэтому нужно включить самовозврат и затем PDT в вашем профиле; это делается следующим образом:

  1. Войдите в ваш первый или бизнес-аккаунт
  2. Нажмите вложенную вкладку “Профиль”
  3. Нажмите “Настройки платежей” через вебсайт в колонке “Настройки продажи”
  4. Нажмите радиокнопку Включить рядом с меткой Самовозврат
  5. Введите URL скрипта, который будет обрабатывать HTTP запрос PDT, отправленный из PayPal
  6. Под “Передачей данных о платеже”, нажмите радиокнопку “Включить”
  7. Нажмите “Сохранить”.

После выполнения этих действий вы получите маркер идентичности PDT, необходимый для запрашивания PayPal. Если вы не скопировали маркер после нажатия на “Сохранить”, знайте, что вы всегда можете увидеть его в ваших “Настройках платежей” через вебсайт:

Передача данных о платеже и маркер идентичности

Теперь, когда у вас есть маркер идентичности, вы можете запрашивать у PayPal больше данных, после того как был посещен ваш URL возврата. Ниже приведен порядок действий при использовании PDT:

  1. Пользователь платит и перенаправляется на вашу страницу самовозврата, например: http://www.yourdomain.com/Thanks.aspx?tx=[TransactionID].
  2. Из кода, лежащего в основе Thanks.aspx, разбирается значение tx и создается HTTP POST tohttps://www.paypal.com/cgi-bin/webscr со следующими параметрами: cmd=_notify-synch&tx=[TransactionID]&at=[PDTIdentityToken]. (Если используется Sandbox, то создается HTTP POST по адресу https://www.sandbox.paypal.com/cgi-bin/webscr.)
  3. PayPal отвечает на ваш HTTP POST в следующем формате:
    • SUCCESS
      first_name=Firstname
      last_name=Lastname
      payment_status=Completed
      payer_email=firstname%40lastname.com
      payment_gross=50.00
      mc_currency=USD
      custom=Custom+value+you+passed+with+your+HTML+form
      etc.

  4. Делайте с данными все что хотите.

Ниже показано, как описанное выше  выглядит в коде C#:

 protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        authToken = WebConfigurationManager.AppSettings["PDTToken"];

        //считывание маркера txn из строки запроса
        txToken = Request.QueryString.Get("tx");


        query = string.Format("cmd=_notify-synch&tx={0}&at={1}",
                              txToken, authToken);

        // Создание обратного запроса
        string url = WebConfigurationManager.AppSettings["PayPalSubmitUrl"];
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

        // Задание значений для обратного запроса
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.ContentLength = query.Length;

        // Запись строк IPN обратного запроса
        StreamWriter stOut = new StreamWriter(req.GetRequestStream(),
                                 System.Text.Encoding.ASCII);
        stOut.Write(query);
        stOut.Close();

        // Выполнение запроса к PayPal и получение ответа
        StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
        strResponse = stIn.ReadToEnd();
        stIn.Close();

        // проверка корректности
        Label2.Text = strResponse;

        // Если ответ был “УСПЕХ”, разбирается строка ответа и выводятся данные
        if (strResponse.StartsWith("SUCCESS"))
        {
            PDTHolder pdt = PDTHolder.Parse(strResponse);
            Label1.Text =
                string.Format("Спасибо {0} {1} [{2}] за ваш платёж в размере {3} {4}!",
                pdt.PayerFirstName, pdt.PayerLastName,
                pdt.PayerEmail, pdt.GrossTotal, pdt.Currency);
        }
        else
        {
            Label1.Text = "Произошла ошибка...";
        }
    }
}

В коде, присоединенном к статье, в папке PDT, вы найдете дополнительные классы, которые помогут вам в выполнении ранее указанной последовательности.

Как и в случае самовозврата, одно замечание перед завершением темы – посмотрите на переменную custom (пользовательский) в ответе PayPal на ваш HTTP POST. Вероятно, вам захочется использовать эту переменную, так как она позволяет вам передавать некоторую информацию со страницы платежа на страницу постобработки, не показывая ее пользователю. Чтобы назвать однократное использование, в некоторых моих реализациях PayPal пользователь отслеживается с ее помощью – когда он начинает процесс оплаты, и когда/завершает ли он его.