Обработка выполненного или невыполненного платежа
Введение
Существенным преимуществом E-Gold является отсутствие аттестации участников и связанных с ними ограничений на операции. Таким образом, открыв e-gold счет, можно сразу пользоваться всеми возможностями системы по автоматизации приема платежей.
E-Gold предлагает два интерфейса для программистов:
- e-gold Shopping Cart Interface (SCI) - дает возможность принимать платежи, в том числе и автоматически. Именно этот интерфейс используется в большинстве случаев и будет рассматриваться в этой статье.
- e-gold Automation Interface - данные методы позволяют программистам выполнять любые действия со счетом e-gold: перевод средств, просмотр баланса и истории платежей, баланса по счету...) из своих программ.
Два интерфейса аналогичны применяемым в WebMoney Merhant (для приема платежей) и WM HTTPS-interface (позволяет получать информацию о счетах и автоматически выплачивать деньги). В большинстве случаев (магазины, прием оплаты за услуги, САР системы и т.п.) наиболее актуален прием платежей. Также нужно учитывать, что использование автоматического вывода денег (Automation Interface) требует значительного снижения настроек безопасности счета и хранения пароля на сервере. Поэтому чаще всего ввод осуществляется в автоматическом режиме, а вывод в ручном.
Ссылки для быстрой оплаты в E-Gold
В самом простом случае покупателю открывается заполненное окно платежа e-gold, с подставленными значениями суммы, валюты, получателя и т.п., а автоматическая обработка не производится. Это единственный вариант, если ваш хостинг не поддерживает серверных языков программирования (в наличии только html).
Наиболеее простой метод заключается в создании специальной ссылки, содержащий все данные, вот несколько примеров:
- http://1809702.e-gold.com - окно перевода без суммы на счет 1809702
- http://1809702-USD0.02.e-gold.com - перевод 2 центов e-gold
- http://1809702-USD2.e-gold.com - перевод $2 e-gold
- http://1809702-USD1.03-Silver.e-gold.com - перевод $1.03 e-silver
- http://1809702-USD5-Palladium.e-gold.com - перевод $5 e-palladium
Хороший пример приведен на официальном сайте (для его работы должен быть включен Java Script):
Пример приема оплаты в e-gold по ссылкам через SCI
Заполните поля формы (поставьте номер своего счета, сумму и т.п.), для генерации ссылки оплаты e-gold.
|
Простая форма приема платежей E-Gold
Если вы нуждайтесь в большем количестве вариантов, чем метод ссылок, то в нижеприведенной HTML форме, настройте параметры, выделенные красным цветом.Пример взят с сайта e-gold.
<form action="https://www.e-gold.com/sci_asp/payments.asp"
method="POST" target=_top>
<div align="center">
<input type="hidden" name="PAYEE_ACCOUNT" value="1809702">
<input type="hidden" name="PAYEE_NAME" value="Название организации">
Введите сумму оплаты:<br>
<input type=text name="PAYMENT_AMOUNT" size=4>
<input type=hidden name="PAYMENT_UNITS" value=1>
USD worth of e-gold
<input type=hidden name="PAYMENT_METAL_ID" value=1>
<input type="hidden" name="STATUS_URL" value="mailto:YourEmailAddress@YourDomain">
<input type="hidden" name="NOPAYMENT_URL"
value="ссылка на страницу с сообщением о ошибке/отказе от оплаты">
<input type="hidden" name="NOPAYMENT_URL_METHOD" value="LINK">
<input type="hidden" name="PAYMENT_URL"
value="ссылка на страницу успешной оплаты">
<input type="hidden" name="PAYMENT_URL_METHOD" value="LINK">
<input type="hidden" name="BAGGAGE_FIELDS" value="CUSTOMERID">
<input type="hidden" name="CUSTOMERID" value="0">
<input type="hidden" name="SUGGESTED_MEMO" value='Примечание к платежу'>
<br>
<input type="submit" name="PAYMENT_METHOD" value="Оплатить сейчас">
</div></form>
Подробное описание параметров формы можно найти на официальном сайте, также они будут рассмотрены далее в статье. Наиболее важные из них:
- PAYEE_ACCOUNT - счет получателя платежа;
- PAYMENT_AMOUNT - сумма платежа в выбранной валюте/металле;
- PAYMENT_UNITS - валюта, эквивалент металла которой переводится, как правило, имеет значение 1 = USD;
- PAYMENT_METAL_ID - металл, которой реально переводится, как правило, имеет значение 1 = Gold;
- STATUS_URL - в этом примере, email адрес, на который будет высылаться уведомление о платеже, может задаваться http или https страница сайта, которой будут переданы параметры для проверки платежа;
- SUGGESTED_MEMO - примечание платежа, если его не заполнять, то у покупателя будет возможность ввести текст самостоятельно.
Основные этапы автоматического приема e-gold
Если вы уже сталкивались с интерфейсами других платежных систем (например, WebMoney), то найдете много общего, поэтому последующее изложение материала по своей структуре сильно похоже на схожую статью о WebMoney. Можно сказать, что e-gold предлагает предельно простой вариант, без различных дополнительных возможностей (например, WebMoney имеет тестовые платежи и форму предварительного запроса).
Вот основные шаги, которые потребуется реализовать:
- задать на сайте e-gold специальный пароль для приема платежей (Alternate password) и получить его md5-код;
- Форма для ввода суммы платежа и формирования заказа - служит для фиксации заказа в базе данных, который будет использоваться для проверки платежа и зачисления денег покупателю на его внутренний счет;
- Форма запроса платежа и отправки его SCI - генерируется веб-сайтом продавца для формирования запроса на проведение платежа в сервисе SCI и передачи его через веб-браузер покупателя;
- Обработка оповещения о платеже - генерируется сервисом e-gold SCI для передачи оповещения о платеже на веб-сайт продавца. Оповещение передается без использования веб-браузера покупателя;
- Обработка выполненного или невыполненного платежа - генерируется сервисом e-gold SCI в случае успешного (неуспешного) выполнения платежа и передается на веб-сайт продавца через веб-браузер покупателя.
Обратите внимание, что вам нужно будет реализовать только две html формы для ввода суммы и для запроса платежа и отправки в e-gold SCI. В остальных случаях будет вызываться ваша специальная страница, в которую методами GET или POST будут передаваться параметры платежа, указанные на сайте e-gold.
Удобно использовать одну динамическую страницу, которая по переданным ей параметрам будет определять, что именно от нее требуется. Если же Ваш хостинг не поддерживает серверных скриптов (php, perl, asp и т.п.), то зачисление денег сделать будет нельзя. Надо будет реализовать, как показано в простом примере на сайте e-gold 3 html формы, для отправки платежа и для вывода сообщений о удачном или неудачном завершении.
Форма для ввода суммы платежа и формирования заказа
Это обычная форма, которая у меня выглядит следующим образом:
<FORM action=Ваш_скрипт.php method=post>
<TABLE width=500 align=center border=0>
<TD>Валюта:</TD>
<TD><SELECT size=1 name=CurrencyId><OPTION value=1 selected>USD</OPTION>
<OPTION value=2>RUR</OPTION></SELECT></TD></TR>
<TR>
<TD>Платежная система:</TD>
<TD><SELECT size=1 name=mk><OPTION value=1 selected>WebMoney</OPTION>
<OPTION value=2>E-Gold</OPTION></SELECT></TD></TR>
<TR>
<TD>Сумма:</TD>
<TD><INPUT maxLength=6 size=10 value=0 name=Sum> разделитель "."</TD></TR>
<TR>
<TD>Примечание:</TD>
<TD><INPUT maxLength=100 size=50 name=Note></TD></TR>
<TR>
<TD></TD>
<TD><INPUT type=submit value=Выполнить name=Submit></TD></TR>
</TABLE>
</FORM>
Как вы видите, в этой универсальной форме предусмотрен выбор платежной системы, валюты, суммы и назначения платежа. В своем скрипте следует сохранить в базу данных или текстовый файл все эти данные и сгенерировать уникальный идентификатор платежа (PayID), по которому далее будет выполняться проверка. Если выбрана платежная система e-gold, то нужно показать форму запроса платежа.
Форма запроса платежа и отправки его e-gold SCI
Эта форма должна генерироваться скриптом из предыдущего раздела, ее поля подробно описаны в инструкции SCI. И она может выглядеть следующим образом:
После нажатия кнопки Выполнить, перед Вами откроется стандартное окно выполнения переводов E-Gold. В случае успешного перевода, деньги автоматически зачислятся на Ваш счет в системе SB-MONEY.RU. Если деньги будут перечислены, но произойдет ошибка, то они будут зачислены вручную в течении 24 часов.
<FORM action="https://www.e-gold.com/sci_asp/payments.asp" method="post">
<input type="hidden" name="PAYEE_ACCOUNT" value="1809702">
<input type="hidden" name="PAYEE_NAME" value="SB-MONEY.RU">
<input type="hidden" name="PAYMENT_AMOUNT" value="0.55">
<input type="hidden" name="PAYMENT_UNITS" value="1">
<input type="hidden" name="PAYMENT_METAL_ID" value="1">
<input type="hidden" name="PAYMENT_ID" value="433">
<input type="hidden" name="STATUS_URL" value="http://sb-money.ru/user_cash_res.php">
<input type="hidden" name="PAYMENT_URL" value="http://sb-money.ru/user_cash_res.php?compl">
<INPUT type="hidden" name="PAYMENT_URL_METHOD" value="POST">
<input type="hidden" name="NOPAYMENT_URL" value="http://sb-money.ru/user_cash_res.php?err">
<INPUT type="hidden" name="NOPAYMENT_URL_METHOD" value="POST">
<input type="hidden" name="SUGGESTED_MEMO" value="Transfer into SB-MONEY.RU">
<input type="hidden" name="BAGGAGE_FIELDS" value="">
</FORM>
В данном примере значение суммы, назначение платежа, PAYMENT_ID (433) генерируются автоматически в предыдущей форме. Естественно эту форму можно подделать и передать e-gold другие параметры, поэтому на последующих этапах будет проводить проверка. На этом этапе проверку сделать нельзя т.к. управление из этой форму передается SCI.
При генерации основания платежа SUGGESTED_MEMO, старайтесь включать в него необходимые для идентификации покупателя данные.
Как вы видите здесь явно передается url страниц с сообщениями о результатах платежа (PAYMENT_URL, NOPAYMENT_URL) и подтверждения платежа (STATUS_URL). По умолчанию используется передача параметров методом POST и его можно явно не указывать.
Номера платежа (PAYMENT_ID) и сохраненной в базе данных продавца информации достаточно для идентификации оплаты и надежной защиты от взлома. Дополнительные поля несут косметическую цель и не их использование не требуется в практических задачах.
Неудобно, что при отсутствии пользовательских полей все равно нужно передавать пустой параметр BAGGAGE_FIELDS. Во многих скриптах в этом поле передается id участника.
Обработка оповещения о платеже
Оповещение отправляется e-gold SCI сайту продавца (страница STATUS_URL) без участия браузера клиента, после выполнения платежа. Необходимо проверить правильность выполнения платежа и при его корректности зачислить деньги на внутренний счет или, например, отправить оплаченный товар почтой. Если сайт продавца будет недоступен, то сообщение отправляется повторно через некоторый интервал времени. В качестве страницы получающей уведомление могут указываться только "mailto:", "http://", and "https://" - нестандартные порты не поддерживаются.
Проверить, является ли вызов предварительным можно по параметру V2_HASH, который передается только в форме оповещения:
if (isset($_POST['V2_HASH'])){
//ваши действия по проверке платежа, при ошибки просто выходим по exit
//...
//если не было ошибок, зачисляем деньги или отправляем товар
//...
}
Нужно проверять следующие данные, полученные через "Форму оповещения о платеже":
- Проверить, действительно ли данные переданы от сервиса e-gold SCI (Проверка источника данных)
- Проверить, не исказились ли данные в процессе передачи (Проверка целостности данных)
- Проверить сумму платежа
- Проверить кошелек продавца
- Проверить не выполнялся ли платеж ранее
- Проверьте время платежа
Большая часть этих проверок достаточна проста в реализации. Проверка корректности ключа выполняется следующим образом:
//константе EG_ALTERNATE - присвойте значение вашего Alternate пароля
$PAYEE_ACCOUNT = isset($_POST['PAYEE_ACCOUNT']) ? (string)$_POST['PAYEE_ACCOUNT'] : '';
//загружаем остальные параметры аналогичным образом
$code = md5($PAYMENT_ID.':'.$PAYEE_ACCOUNT.':'.$PAYMENT_AMOUNT.':'.$PAYMENT_UNITS.':'.
$PAYMENT_METAL_ID.':'.$PAYMENT_BATCH_NUM.':'.$PAYER_ACCOUNT.':'.
strtoupper(md5(EG_ALTERNATE)).':'.$ACTUAL_PAYMENT_OUNCES.':'.
$USD_PER_OUNCE.':'.$FEEWEIGHT.':'.$TIMESTAMPGMT);
if ($code != strtolower($V2_HASH)){
exit; //неверный хеш-код
}
Обязательно проверьте валюту, в эквиваленте которой вам перевели сумму (PAYMENT_AMOUNT).
Обратите внимание на двойное использование strtolower. Дело в том, что md5 в php (и ее аналог в perl), возвращают текст в нижнем регистре, а SCI (как и WebMoney Merhant) возвращает хэш код в верхнем регистре.
Безопасность обеспечивается передачей хэш кода, в котором принимает участие md5 секретного ключа. Обязательно используйте секретный ключ максимальной длины. Особенное внимание надо обратить внимание на файл, в котором хранится константа с ключом. Лучше всего его держать за пределами расшаренной папки public_html (или просто html) и выставить на него соответствующие права доступа.
Проверку сайта e-gold рекомендует выполнять по ip адресу - 63.240.230.x
Время платежа можно проверить по полю TIMESTAMPGMT. Нужно поставить два ограничения: не принимать платежи из будущего и разумно ограничить прошедшие платежи, например, сроком в 1 день.
Для отслеживания попыток атаки, желательно протоколировать ошибки в файле на хостинге, который регулярно просматривать. Можно сразу посылать письмо, но при большом количестве транзакций это не эффективно. Также желательно фиксировать факт предварительного вызова и при обработке оповещения проверять был ли предварительный вызов.
Интересной особенностью является то, что STATUS_URL передаются только POST параметры, если вы зададите параметры в адресе, то они будут отброшены платежной системой.
Достаточно интересным вопросом является учет (вычет) комисии, которая берется в продавца (получателя средств). Во многих случаях ею пренебрегают, хотя для небольших платежей она достигает до 40% от суммы перевода. Вот пример расчета реально полученной суммы (с вычетом комиссии), округленной до центов:
$ACTUAL_AMOUNT = floor(100 * ((float)$USD_PER_OUNCE) *
((float)$ACTUAL_PAYMENT_OUNCES - (float)$FEEWEIGHT)) / 100;
Обработка выполненного или невыполненного платежа
Удобно использовать ту же страницу для этих целей. Тип вызова может определяться по значению переданного GET параметра res. Здесь обычно просто выводится сообщение пользователю о завершении операции. Можно также выдать ее детали, которые можно извлечь из полученных POST параметров.
Нередко здесь сразу показывается страница с балансом счета пользователя или через некоторое время происходит автоматический редирект на нее.
У e-gold нет режима тестирования приема переводов, для отладки следует выполнять переводы со своего счета на свой же счет минимальными суммами (например, $0.01).
В заключение отмечу, что все это достаточно просто в реализации, а отсутствие особых требований и аттестации со стороны платежной системы e-gold делают ее очень привлекательной для автоматического приема платежей.