26 декабря 2012 г.

PayPal Standard Checkout в Sandbox. Часть 1.

Самый простой способ интеграции оплаты через PayPal - использовать Website Payments Standard. Это просто форма с данными о покупке и кнопка, например, "Buy Now". После нажатия на кнопку пользователь попадает на сайт PayPal, где и заканчивает процесс оплаты. Среди прочего, в форме можно указать URL, куда сервером PayPal будут отправляться сообщения (Instant Payment Notification) после каждого изменения статуса оплаты заказа.

В этой заметке я перевожу "private" как "секретный" и "public" как "открытый" применительно к ключам и сертификатам.

В Sandbox в меню "Test Account" нажимаем Preconfigured. Создаем два аккаунта: один для продавца, другой для покупателя. Покупателю в графе баланс указываем сумму, которую он будет тратить на покупки. Примеры заполнения формы ниже:

Создаем учетную запись покупателя
Создаем учетную запись продавца
Для защиты информации будем использовать Encrypted Website Payments. Это один из способов защиты передаваемой информации, рекомендованных PayPal. Данные в виде name-value pair (пара ключ-значение) шифруются и присваиваются полю с именем encrypt. Также cmd должно быть установлено в правильное значение.

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

О способах защиты, рекомендованных PayPal, можно почитать тут: Securing Your PayPal Payments Standard Buttons.

OpenSSL для Windows можно скачать тут (я использовал Win64 OpenSSL v1.0.1c). Это ссылка с официального сайта, с этой страницы. После запуска инсталлятор сообщил мне, что на компьютере не установлена Visual C++ 2008 Redistributables, которая необходима для работы программы. Скачиваем тут же.

Из командной строки переходим в директорию OpenSSL/bin.
Генерируем секретный ключ.
openssl genrsa -out my.sandbox-prvkey.pem 1024 -config openssl.cfg

На основе секретного ключа генерируем открытый сертификат.
openssl req -new -key my.sandbox-prvkey.pem -x509 -days 365 -out my.sandbox-pubcert.pem 
-config openssl.cfg

-x509 означает самоподписанный сертификат. С этой опцией используется опция -days.
После ввода команды в диалоговом режиме можно будет ввести информацию о владельце сертификата (название организации, страна, e-mail и т.д.). PayPal использует только сертификаты X.509.

Теперь нужно создать сертификат p12. Нужно будет придумать и ввести пароль, который будет использоваться позже для подписывания сообщения. Сам сертификат p12, похоже, в процессе шифрования не участвует.
openssl pkcs12 -export -in my.sandbox-pubcert.pem -inkey my.sandbox-prvkey.pem -out my.sandbox-cert.p12

Теперь нам надо загрузить наш сертификат и скачать сертификат PayPal. Чтобы зайти на тестовый PayPal, согласно документации, нужно выбрать аккаунт из списка в "Test Accounts" на developer.paypal.com и нажать кнопку "Enter Sandbox Test Site". Но какой бы я аккаунт не выбрал, я почему-то всегда заходил в первый в списке аккаунт, поэтому я просто заходил на  www.sandbox.paypal.com  из другого браузера.

Заходим в тестовый аккаунт продавца на sandbox.paypal.com, только в качестве логина используем не "Login Email", который мы задавали при регистрации тестового аккаунта, а фиктивный почтовый ящик, который был присвоен тестовому аккаунту автоматически (указан в списке тестовых пользователей, раздел Test Accounts в левом меню Sandbox).
E-mail тестовой учетной записи продавца,
который используется в качестве логина на  sandbox.paypal.com



Теперь My Account -> Profile -> My Settings, Encrypted Payment Settings.



В разделе Your Public Certificates добавляем наш сгенерированный открытый сертификат. После загрузки он появится в списке. На интересует присвоенный ему Cert ID. Его мы будем передавать в форме.



В разделе PayPal Public Certificate есть кнопка Download. Скачиваем открытый сертификат  PayPal. С нашей стороны он будет использоваться для шифрования данных формы.

PayPal предоставляет готовые решения для шифрования формы  на нескольких языках программирования. Их можно скачать на странице SDKs and Downloads в разделе "Website Payments Standard".

Продолжение следует.

7 декабря 2012 г.

CodeIgniter. Настройка хостинга GoDaddy

Чтобы работали ссылки типа http://yourdomain.com/controller/action/data надо настроить mod_rewrite так, чтобы путь передавался фронт-контроллеру index.php как строка запроса (/index.php?$1):
RewriteEngine on
RewriteCond %{REQUEST_URI} !\.(css|js|jpg|gif)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?$1 [L,QSA]

Также нужно сообщить фреймворку, что информацию о пути нужно брать из строки запроса:
<?php
$config['uri_protocol']    = 'QUERY_STRING';
?>

Подстановка index.php в ссылки, естественно, должна быть отключена:
<?php
$config['index_page'] = "index.php?";
?>