27 февраля 2015 г.

301 редирект с www с учетом протокола

Для Apache 2.4.
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ %{REQUEST_SCHEME}://%1/$1 [R=301,L]

2 февраля 2015 г.

Xdebug для LAMPP

Установка Xdebug согласно инструкции http://xdebug.org/docs/install#source

[Если не установлен autoconf]
$ sudo apt-get install autoconf
$ export PHP_AUTOCONF=/usr/bin/autoconf


$ tar -xzf xdebug-2.2.7.tgz
$ cd ./xdebug-2.2.7/
$ /opt/lampp/bin/phpize
$ ./configure --enable-xdebug --with-php-config=/opt/lampp/bin/php-config
$ make
$ sudo make install

$ locate xdebug.so
/opt/lampp/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so


$ tail /opt/lampp/etc/php.ini
[Xdebug]
zend_extension=/opt/lampp/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.profiler_enable=0

3 апреля 2013 г.

Actionscript 2. Ссылка в TextField

На сцену добавлено поле TextField, ролик грузит XML, достает из него адрес электронной почты и вставляет его в поле. Нужно сделать почту ссылкой. Первое, что пришло в голову - использовать возможность текстового поля отображать html. Сделал, как сказано в документации: установил свойство html текстового поля в true, свойству htmlText присвоил html-код ссылки. Поле не отображает вообще ничего. Пробовал разные варианты - не хочет работать и всё. Я не знаю всех тонкостей флеша, нечасто приходится с ним работать.

Оказывается, есть ещё один способ сделать текст в текстовом поле ссылкой. У объекта TextFormat есть свойство url. Создаем объект TextFormat, присваиваем свойству url значение "mailto:наша@почта" и применяем этот формат к текстовому полю:

var format:TextFormat = new TextFormat();
format.url = 'mailto:наша@почта';
txtEmail.text = 'наша@почта';
txtEmail.setTextFormat(format);


Метод setTextFormat объекта TextField позволяет задавать формат как для всего текста, так и для отдельных символов и их групп.

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?";
?>

3 ноября 2012 г.

PHP. Добавляем комментарий в JPEG

Ниже приведен пример скрипта, в котором я получаю содержимое картинки, хранящейся на диске, и преобразовываю его в шестнадцатеричное представление. Далее я создаю строку комментария. Она состоит из
  • маркера COM (комментарий), который в шестнадцатеричном представлении выглядит так: 'fffe',
  • двух байтов, указывающих длину комментария + 2 этих байта ('0008' строка содержит 6 байт),
  • собственно, строки комментария.
Хотя комментарий в файле JPEG может появляться где угодно, для простоты примера, я дописываю комментарий в начало файла, сразу после маркера начала изображения (SOI - 'ffd8'). В конец файла комментарий дописывать нельзя, потому что маркер конца изображения (EOI - 'ffd9') должен следовать сразу после сжатых данных. Потом я вывожу картинку в браузер.
<?php
    $image = file_get_contents('head1.jpg');
    $imageHex = bin2hex($image);
    
    $hexString = '636f6d6d656e';
    $commentBlock = 'fffe0008'.$hexString;
    $imageHex = str_replace('ffd8', 'ffd8'.$commentBlock, $imageHex);
    
    $imageBin = pack('H*', $imageHex);
    header('Content-Type: image/jpeg');
    echo $imageBin;
?>

Вместо функции pack можно использовать hex2bin, добавленную в PHP 5.4.0.