Archive for the ‘ASP.NET’ Category

Работа с PayPal

Posted: Март 3, 2011 in .NET, ASP.NET

Создание тестового аккаунта
Для начала нужно зайти на PayPal’s Sandbox Test Environment и зарегистрироваться как продавец и покупатель.
Для теста в action нужно использовать https://www.sandbox.paypal.com/cgi-bin/webscr, для реального приложения — https://www.paypal.com/cgi-bin/webscr

Простейший случай

	
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_xclick" />
    <input type="hidden" name="business" value="ваш_email" />
	<input type="hidden" name="item_name" value="Товар" />
    <input type="hidden" name="amount" value="3.00" /> 
    <input type="submit" value="Купить" />
</form>

Чтобы добавить доставку, необходимо вставить

	
	<input type="hidden" name="shipping" value="1.00">

Все переменные можно посмотреть в HTML Variables по адресу https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_Appx_websitestandard_htmlvariables
Примечание: все суммы должны быть с двумя знаками после точки.

Пожертвования
Чтобы принимать пожертвования, нужно поменять значение cmd на _donations.

Корзина
Если вы не хотите реализовывать у себя на сайте механизм корзины, то у PayPal на этот случай есть готовое решение

		
Товар 1:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="paypal">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="add" value="1">
    <input type="hidden" name="business" value="ваш_email">
    <input type="hidden" name="item_name" value="Товар 1">
    <input type="hidden" name="amount" value="10.00">
    <input type="hidden" name="shopping_url" value="http://ваша_страница_с_товарами">
    <input type="hidden" name="return" value="http://ваша_страница_в_случае_удачного_добавления">
    <input type="hidden" name="cancel_return" value="http://ваша_страница_в_случае_отмены">
    <input type="hidden" name="bn" value="PP-ShopCartBF:x-click-but22.gif:NonHosted">
    <input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but22.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
    <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>

Товар 2:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="paypal">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="add" value="1">
    <input type="hidden" name="business" value="ваш_email">
    <input type="hidden" name="item_name" value="Товар 2">
    <input type="hidden" name="amount" value="5.00">
    <input type="hidden" name="shipping" value="1.00">
    <input type="hidden" name="shopping_url" value="http://ваша_страница_с_товарами">
    <input type="hidden" name="return" value="http://ваша_страница_в_случае_удачного_добавления">
    <input type="hidden" name="cancel_return" value="http://ваша_страница_в_случае_отмены">
    <input type="hidden" name="bn" value="PP-ShopCartBF:x-click-but22.gif:NonHosted">
    <input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but22.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
    <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>

Просмотреть корзину:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="paypal">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="display" value="1">
    <input type="hidden" name="business" value="ваш_email">
    <input type="hidden" name="shopping_url" value="http://ваша_страница_с_товарами">
    <input type="image" src="https://www.paypal.com/en_US/i/btn/view_cart_02.gif" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
</form>

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

	
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_xclick-subscriptions"/> 
    <input type="hidden" name="business" value="ваш_email"/> 
    <input type="hidden" name="item_name" value="Какой-то сервис"/> 
    <input type="submit" value="Подписаться" /> 

    <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>

PostPayment обработка
Хотелось бы узнать, когда покупатель оплатил товар, чтобы как можно скорее начать обрабатывать его заказ. Для этого у PayPal есть несколько возможностей.

AutoReturn
Простейшим способом является AutoReturn. Для этого вам нужно установить Return URL в вашем профайле. Вам выдадут значение для return переменной в html form. Тогда пользователь будет попадать на эту страницу в случае удачной оплаты. Вам также будут переданы переменные

  • tx — Transaction ID
  • st — Payment status
  • amt — Payment amount
  • cc — Currency code

Payment Data Transfer (PDT)
В этом случае вам нужно установить AutoReturn и Payment Data Transfer поставить в On. Вам будет сгенерирован PDT Identity Token. Вот как это будет выглядеть

  • Пользователь платит и возвращается на страницу: http://www.yourdomain.com/Thanks.aspx?tx=%5BTransactionID%5D.
  • Из code-behind Thanks.aspx, вы выбираете значение tx и отправляете HTTP POST по адресу https://www.paypal.com/cgi-bin/webscr со следующими параметрами: cmd=_notify-synch&tx=[TransactionID]&at=[PDTIdentityToken] (или https://www.sandbox.paypal.com/cgi-bin/webscr для песочницы)
  • PayPal на ваш запрос в следующем формате:

    SUCCESS
    first_name=Firstname
    last_name=Lastname
    payment_status=Completed
    payer_email=firstname@lastname.com
    payment_gross=50.00
    mc_currency=USD

  • и т.д.

Instant Payment Notification (IPN)
Недостатком PDT является то, что это user-driven процесс. То есть вы ничего не узнаете, если пользователь закрыл браузер и не перешел на вашу страницу. Поэтому для более серьезной интеграции с PayPal рекумендуется использовать back-end технологию IPN. IPN это механизм, который отправляет вам HTTP POST запросы, информируя о важных событиях. Нужно также разрешить эту опцию в вашем профайле, указав ваш IPN handler. При наступлении какого-нибудь события произойдет следующее

Ссылки
http://www.codeproject.com/KB/aspnet/paypal_c_aspnet.aspx

WatiN

Posted: Ноябрь 1, 2010 in .NET, ASP.NET

WatiN (произносится как What-in) — замечательный фрейворк для тестирования веб сайтов. Загружает весь DOM страницы, после чего позволяет находить элементы по нескольким атрибутам, поддерживает Ajax, фреймы, i-фреймы, popup диалоги, Html диалоги, создание скриншотов страниц… А еще это замечательный инструмент для написания ботов (вот здесь и вспоминается, для чего делались капчи). Простенький бот для контакта, который будет постить сообщения на стене, выглядит следующим образом

class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            string login = "email";
            string password = "password";

            using (var browser = 
                new IE("http://vkontakte.ru/index.php"))
            {
                browser.TextField(Find.ByName("email"))
                    .Value = login;

                browser.TextField(Find.ByName("pass"))
                    .Value = password;

                browser.Link(Find.ByUrl("javascript:quick_login()"))
                    .Click();

                browser.GoToNoWait("http://vkontakte.ru/wall.php");

                browser.WaitForComplete();

                browser.Link(Find.ByText("Написать на стене"))
                    .Click();

                browser.WaitForComplete();

                browser.TextField(Find.ByName("message"))
                    .Value = "Привет";

                browser.Link(Find.ByUrl("javascript:postWall(this)"))
                    .Click();
            }
        }
    }

Полезные ссылки

Desktop приложения удобно разрабатывать по ряду причин. Одна из них это «оконная функциональность». Под этим термином я подразумеваю вызов диалоговых окошек. Например у нас в базе есть таблица с сотрудниками и таблица с сим-картами. У нас есть отдельные страницы для редактирования справочников сотрудников и сим-карт. Теперь нам нужно выдать сотрудникам сим-карты. Для этого в редактировании записей о сотрудниках заводим выпадающий список с сим-картами. При выдаче сим-карт обнаруживаем, что у нас в справочнике сим-карт не хватает какого-то номера. Теперь нам надо перейти в справочник сим-карт, добавить номер, перейти в справочник сотрудников, выдать сотруднику вновь заведенный номер. Или же при выдаче сим-карт вызывать диалоговое окно, где можно завести номер, и тут же назначить его сотруднику. В веб-приложениях такая функциональность реализуется при помощи iframe. Задачу нам облегчит FancyBox. Визиткой jQuery стали красивые диалоговые окна с затемненным background, одним из которых является FancyBox. Подключаем его

<script type="text/javascript">
	$(document).ready(function() {
	$("#SimCardAdd").fancybox({
			'width': '75%',
			'height': '75%',
			'autoScale': false, 'transitionIn': 'none',
			'transitionOut': 'none',
			'type': 'iframe'
		});
	});
</script>

Теперь вставляем ссылку на страницу добавления сим-карты

<a href="/SimCardAdd.aspx" id="SimCardAdd">Добавить</a>

В результате получаем

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