Pull to refresh

Интеграция PayPal на сайт в качестве платежной системы и проблема с https

Reading time 3 min
Views 26K
Недавно предстояло сделать редизайн сайта с последующим перестроением всей CMS. В процессе работы обратил внимание на интеграцию PayPal в качестве платежной системы. О плюсах данной платежной системы или какой-то выгоде сказать однозначно не могу, выбор заказчика, ну а так как его основная деятельность Mail Forwarding (пересылка и доставка посылок из США), то ему удобней использовать данную платежную систему.

Общие статистические цифры о PayPal – 143 миллионов пользователей в 203 стран мира, хотя при этом до недавнего времени у нас в России невозможно было вывести средства на свой банковский счет.

Процесс оплаты на сайте реализован следующим способом, клиент авторизуется на сайте, вводит необходимую сумму для пополнения своего личного счета.



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



Собственно простейшая форма:

<form id="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" id="amount" name="amount" value=""/>
<input type="hidden" name="cmd" value="_xclick"/>
<input type="hidden" name="business" value="Указываем Ваш PayPal E-mail"/>
<input type="hidden" name="item_name" value="Наименование платежа"/>
<input type="hidden" name="item_number" value="Номер товара или ID аккаунта"/>
<input type="hidden" name="currency_code" value="Валюта"/>
<input type="hidden" name="button_subtype" value="services"/>
<input type="hidden" name="no_note" value="1"/>
<input type="hidden" name="no_shipping" value="1"/>
<input type="hidden" name="return" value="Страница возврата"/>
<input type="hidden" name="notify_url" value="Страница для уведомлений"/>
<input type="hidden" name="cancel_return" value="Страница, если пользователь аннулировал заказ"/>
<input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHostedGuest"/>
<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"/>
<input type="submit" value="Пополнить"/> 
</form>


Нам необходимо, чтобы PayPal автоматически передавал данные обо всех платежах, в реальном времени, чтобы пользователи сайта мгновенно получали доступ к своим средствам. Для этого включаем функцию IPN (Instant payment notifications) в Profile-My Selling Tools в личном кабинете вашего счета PayPal, указав при этом ссылку для приема уведомлений на вашем сайте.



Кусок кода для приема уведомлений и внесении платежных данных в БД. Так как на сайте используется PHP5, необходимо установить библиотеку cURL.


$postdata=""; 
  foreach ($_POST as $key=>$value) $postdata.=$key."=".urlencode($value)."&"; 
  $postdata .= "cmd=_notify-validate"; 
  $curl = curl_init("https://www.paypal.com/cgi-bin/webscr"); 
  curl_setopt ($curl, CURLOPT_HEADER, 0); 
  curl_setopt ($curl, CURLOPT_POST, 1); 
  curl_setopt ($curl, CURLOPT_POSTFIELDS, $postdata); 
  curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); 
  curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1); 
  $response = curl_exec ($curl); 
  curl_close ($curl); 


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

PayPal больше не поддерживает SSLv3 сертификат из-за уязвимости, также я слышал, что при переходе на https у многих отказывался работать IPN, в таком случае можно просто сделать отдельный поддомен вида payments.mysite.com на 80 порт, который будет принимать все уведомления от платежной системы.
Tags:
Hubs:
-7
Comments 9
Comments Comments 9

Articles