Книга рецептов WEB-девелопера

вторник, 30 октября 2007 г.

Внедрение PayPal на сайт, работающий под ASP.NET

Намедни возникла задача внедрения PayPal на коммерческий сайт, работающий под ASP.NET. После детального изучения данного вопроса в рунете выяснилось, что инфы по нему практически нет. Посему думаю, что будет уместно осветить данный вопрос. Начнем, как всегда, с постановки задачи.

Постановка задачи
Имеем интернет-магазин, на котором пользователь выбирает товар, вводит данные о своей кредитке и оплачивает его через инет. Инфа о кредитке вводится непосредственно на сайте. Транзакция на снятие денег должна проходить через PayPal.

Решение
Шаг 1. Регистрация в PayPal Sandbox
Чтобы иметь возможность тестирования необходимо зарегистрироваться в тестовой среде, которая называется Sandbox. Делается это следующим образом:
1. Заходим на https://developer.paypal.com там регистрируем новый аккаунт.
2. Логинимся на https://developer.paypal.com, заходим в закладку Test Accounts и создаем там новый тестовый аккаунт продавца. Во время создания выбираем опцию seller. В поле password будет стоять пароль, необходимый для того чтобы потом залогиниться в SandBox. После создания появится аккаунт с Email'ом типа blabla_1234567890_biz@email.com и паролем, который был в поле password. Используя их
3. Логинимся на https://www.sandbox.paypal.com. После залогинивания необходимо принять Billing Agreement.

Шаг 2. Интеграция в сайт
Гиморный вариант
1. На странице PayPal API: SOAP Interface скачиваем SDK для платформы .NET
2. Устанавливаем инстальник, идем в директорию установки и забираем оттуда из директории bin библиотеки log4net.dll и paypal_base.dll. По идее, в них лежит все необходимое для того чтобы заставить систему оплаты работать. Примеры работы с этими библиотека лежат в сэмпловом сайте, который поставляется вместе с SDK.
Негиморный, но урезаный вариант
Урезанность заключается в том, что данным способом возможно делать только DirectPayment, но нам больше и не надо. Так что, считаю этот вариант оптимальным.
1. Скачать обертку для PayPal SDK, которая умеет делать DirectPayment. Обертка представляет собой библиотеки log4net.dll и paypal_base.dll, а так же собственно обертку SiteMechanics.PayPalDirect.dll. В ней содержатся интерфейсы, IMerchantProfile и IBuyerProfile,  а так же дефолтные наследники от них. Эти интерфейсы используются классом PayPalHelper, который собственно и выполняет оплату через PayPal. Таким образом,  чтобы воспользоваться оберткой необходимо отнаследовать два интерфейса, заполнить у наследников все поля и передать в метод DoDirectPayment объекты наследники. Возвращаемый объект содержит поле Ack, если он равен Success, то оплата прошла успешно, если же нет, то в поле Errors содержатся все возникшие ошибки. Если наследовать интерфейсы впадлу, то можно заюзать уже готовые наследники MerchantProfile и BuyerProfile. Пример кода смотри ниже:

MerchantProfile merchant = new MerchantProfile(
 "blabla_1234567890_biz@email.com",
 "1234567890",
 "odifhp9p83948rlwkcmnwli430948f3ojldkjflskdjlsdkjsf0o98209",
 "sandbox");
BuyerProfile buyer = new BuyerProfile(
   "John","Doe",
   "1 Main St","", "San Jose","CA","95131",
   "Visa", "4197058882575379","926",
   10,2010
);
PayPalResponse PayPalResponse = PayPalHelper.DoDirectPayment("13.45", merchant, buyer);

Подводные камни:
1. Тестовая кредитка покупателя:
CreditCardType: Visa
CreditCardNumber: 4197058882575379
VerificationCode: 926
ExpirationDate 2010-10
2. Среда выполнения у нас тестовая, поэтому в качестве параметра Environment используем "sandbox", чтоб включить реальный PayPal, надо указать "live", но это надо уточнить в официальной доке.
3. Инфу для MerchantProfile брать в разделе API Credentials на https://developer.paypal.com
4. Данная обертка использует способ передачи между PayPal сервером и сайтом, которая называется 3-token, есть еще возможность это делать на основе сертификатов, но это мне показалось гиморным, поэтому я не разбирался с этим. RTFM.
5. Если вы получаете ошибку "Security header is not valid ", значит неверно указаны параметры для MerchantProfile
6. Если вы получаете ошибку "This transaction cannot be processed due to an invalid merchant configuration", значит не было принято Billing Agreement. Смотри третий пункт раздела "Регистрация в PayPal Sandbox"

Предупреждаю сразу, что обертка не проходила усиленное тестирование и вы как всегда все юзаете на свой страх и риск. Но вроде бы там все должно работать. Если что, пишите сюда paradoxs.mail@gmail.com

Чтиво:
https://developer.paypal.com/us/cgi-bin/devscr?cmd=help/main
https://www.paypal.com/IntegrationCenter/ic_home.html
https://www.paypal.com/IntegrationCenter/ic_sandbox.html
https://www.paypal.com/IntegrationCenter/ic_downloads.html
http://google.com

Ярлыки: , , ,

понедельник, 27 августа 2007 г.

Кой-какие полезные скрипты

1. viewObject предназначен для отображения всех полей какого-либо объекта. Выводит окошко в котором представлены все поля объекта и их значения. Пример

<script type="text/javascript" src="scripts/view_object.js"></script>
<div id="test_div">Bla-bla</div>
<script>
    var test_div = document.getElementById("test_div");
    viewObject(test_div);
</script>

2. BrowserDetect Скрипт для определения браузера и его версии. Умеет отлавливать IE, Firefox, Opera, Safari и всякие другие. Пример

<script type="text/javascript" src="scripts/browser_version.js"></script>
<script>
alert("Client: " + BrowserDetect.browser +" ver: "+ BrowserDetect.version);
</script>

3. SWFObject Предназначен для вставки SWF объекта в страницу так, чтобы вокруг него не появлялась дебильная рамочка, которую особенно любит рисовать эксплорер и чтобы не приходилось тыкать по SWFке дважды, чтоб ее активировать. Пример:

<script type="text/javascript" src="scripts/swfobject.js"></script>
<div id="flashcontent">
<strong>You need to <a href="http://www.macromedia.com/go/getflashplayer">upgrade your Flash Player</a></strong>
</div>
<script type="text/javascript">
    var fo = new SWFObject("swf/flash.swf", "navigation", "1083", "767", "8.0.22", "#FFFFFF", true);
    fo.addParam("wmode", "transparent");
    fo.write("flashcontent");
</script>

flash.swf - полный путь до выводимого Flash-объекта
navigation - ID флешки (не обязятельно)
1083 - высота флешки
767 - ширина флешки
8.0.22 - версия плеера для корректной работы флешки
#FFFFFF - фон выводимой области

Ярлыки: , , ,

Абсолютно позиционируемый DIV поверх SELECT

Довольно известная бага IE6. Заключается в том, что если накрыть SELECT дивом, то SELECT ВСЕГДА отрисовывается поверх, несмотря ни на какие z-index.

Причина
Выдержка из MSDN: This element is a windowed control and does not support the z-index attribute or zIndex property. Иначе говоря SELECT при обработке страницы заменяется виндовым контролом и ему глубоко накласть на z-index;

Постановка задачи
Сделать так чтоб SELECT отображался корректно под DIV'ом

Решение
1. Написать собственный класс, на основе использования слоев, который заменит собой SELECT
2. Детектить браузер c помощью скрипта, и делать SELECT'у style.display = "none"
3. Накрывать SELECT iframe'ом. Но это не всегда возможно, особенно если DIV должен быть полупрозрачный.
4. Воспользоваться скриптом, который дивным образом решает эту проблему. WCH.
А теперь пример кода:
    <script type="text/javascript" src="scripts/WCH.js"></script>
    <style>
    #al {
        font-weight: bold;
        font-size:12px;
        color: #fff;
        background-color: #900;
        padding: 20px;
        border: 1px solid #000;
        width: 100px;
        height: 100px;
        position: absolute;
        left: 200px;
        top:70px;
        z-index: 10;
    }
    </style>
    <script type="text/javascript">
        function pageload() {
            WCH.Apply('al');
        }
        if (window.attachEvent) {
            window.attachEvent("onload", pageload);
        }
    </script>
    <div id="al">Layer with pos:absolute and z-index:10</div>
    <p>
     <select style="width:500px;">
         <option value="Fractions" selected="selected">Option-1</option>
         <option value="Decimals">Option-2</option>
         <option value="American">Option-3</option>
     </select>
    </p>
    <p>
     <select style="width:500px;">
         <option value="Fractions" selected="selected">Option-1</option>
         <option value="Decimals">Option-2</option>
         <option value="American">Option-3</option>
     </select>
    </p>

Лекарство взято отсюда. Пример там же.

Ярлыки: , , , ,

воскресенье, 26 августа 2007 г.

Вызов JavaScript после обновления UpdatePanel

Многие веб-девелоперы столкнулись с такой проблемой как вызов клиентского скрипта, находящегося внутри аяксовой апдейт панели. Они бля, не работают при обновлении панели....просто не работают и все....

Постановка задачи
Сделать так, чтобы после отработки UpdatePanel вызывался клиентский JavaScript

Решение
Причина в том, что ScriptManager который находится на странице не обрабатывает клиентские скрипты, поэтому надо сделать подписку на событие, обернуть скрипт в функцию и вызывать ее в качестве обработчика. Показываю...
<script language="javascript" type="text/javascript">
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(ShowBeforeAlert);
    function ShowBeforeAlert(sender, args){
        alert("Function before UpdatePanel refresh");    
    }
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ShowAfterAlert);
    function ShowAfterAlert(sender, args){
        alert("Function after UpdatePanel refresh");    
    }
</script>
<asp:UpdatePanel runat="server" UpdateMode="Conditional" id="UpdatePanel">
<contenttemplate>
    <script language="javascript" type="text/javascript">    
        alert("Page Load");        
    </script>
    <asp:button runat="server" id="TestButton" Text="Test"/>
</contenttemplate>
</asp:UpdatePanel>

Ярлыки: , ,

Начало

Вот уже год как я работаю веб-программистом. Стаж маленький - скажут многие. И многие будут правы, но... этого времени достаточно, чтоб понять как все непросто обстоит с браузерной совместимостью.

Я работаю в компании Site-Mechanics. Мы занимаемся разработкой сайтов в основном для буржуев, а потому критерии качества сайта у нас достаточно высокие.

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

Все вопросы освещаемые здесь будут касаться следующих технологий:
ASP.NET, AJAX, JavaScript, C#, MSSQL, CSS.

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

Вот. Вроде бы и все.....Добро пожаловать