Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как мы подружились с PayPal

Anna | 31.05.2014 | нет комментариев

Драгоценный иноземный гость с фамилией слишком знаменитой, Дабы ее называть, гражданин PayPal только-только «сошел с корабля» на отечественный «причал», но теснее поспел стать своим на балу, где энергично вертят танцы всех жанров и направлений электронные платежные системы русского сегмента. Мы не стали стоять в стороне и поторопились завести пригодное знакомство со столь уважаемым товарищем, добавив, наконец, и его добродушное имя в свой список друзей. С какой стороны подойти, о чем говорить и как привлечь его внимание читаем в маленький истории под катом.

Дружба начинается с улыбки

1-й трусливый шаг на пути к огромный дружбе – представление, то есть, регистрация, где в персональных данных нужно предоставить информацию о торговой деятельности компании, что и было нами добросовестно исполнено.

Впрочем взамен легких и непринужденных отношений, которым мы поспели мысленно обрадоваться, нас ждало неприветливое сообщение об ограничении счета и просьба предоставить целый ряд дополнительных документов для подтверждения нашего аккаунта. Не поспели мы собрать все нужное, как, к счастью, в середине сентября PayPal гораздо упростил процедуру подключения юридических лиц. Требовалось только заполнить особую для этого форму на стороне PayPal. Но и сейчас рано было радоваться — первые несколько дней форма просто не работала. Мы Добросовестно заполняли все непременные и необязательные поля, но всякий раз получали ошибку передачи данных и, как ни усердствовали, это повторялось вновь и вновь. Не растеряв решительности и имея в резерве много упорства, через неделю мы повторили “эксперимент” и, наконец, получили долгожданное доказательство, а в скором времени и сокровенное письмо от компании PayPal.

Подлинный друг познается в API

Разобраться во всех тонкостях протокола PayPal дело не легкое. Разбросанные по различным частям сайта куски документаций, тяжелое достояние SOAP, общая мешанина стека протоколов (NVP, SOAP, REST) и нехватка примеров сделали свое дело. Классический пример неразберихи, действие реализуемое одним протоколом, немыслимо исполнить иным и напротив.
Но путь в 1000 миль начинается с первого шага, отбросив все сомнения прочь, будем применять особенно знаменитый на данный момент REST API, а в качестве обертки к нему возьмем их личный PHP SDK. Некоторые вещи, правда, все равно придется додумывать самим, изучая код.

Всеобщую идею дозволено описать в следующих шагах:

  1. Регистрируем PayPal Application, для приобретения пар значений client_id и secret_key для live и sandbox режима:
  2. Изготавливаем OAuth авторизацию:
    $apiContext = new ApiContext(new OAuthTokenCredential(
    $clientId, $clientSecret));
    $apiContext->setConfig([ 'mode' => 'live']);
    
  3. Делаем запрос на создание платежа. Если вы планируете принимать оплату со счета paypal, а также привязанной к нему карты не позабудьте указать способ оплаты: paypal
    $payer = new Payer();
    $payer->setPaymentMethod('paypal');
    $amount = new Amount();
    $amount->setCurrency('RUB');
    $amount->setTotal('10');
    $item1 = new Item();
    $item1->setName('Продажа товара/услуги')->setCurrency('RUB')->setQuantity(1)->setPrice('10');
    // Ид товара/услуги на вашей стороне
    $item1->setSku('1000');
    $itemList = new ItemList();
    $itemList->setItems(array($item1));
    $transaction = new Transaction();
    $transaction->setAmount($amount);
    $transaction->setDescription('Payment to UnitPay');
    $transaction->setItemList($itemList);
    $payment = new Payment();
    $payment->setIntent('sale');
    $payment->setPayer($payer);
    $payment->setTransactions(array($transaction));
    $payment>setRedirectUrls(array(
        "return_url" => $resultUrl,
        "cancel_url" => $resultUrl
    ));
    $payment->create($apiContext);
    
  4. В результат получаем номер платежа в PayPal и redirectURL формы оплаты, куда и перебрасываем пользователя:
    // ID платежа, объединяем его с заказом и сберегаем в БД
    $payment->getId();
    $links = $payment->getLinks();
    foreach ($links as $link) {
        if ($link->getMethod() == 'REDIRECT') {
            header('location:'.$link->getHref());
            return;
        }
    }
    
  5. Доказательство счета заказчиком:
  6. Механический возврат заказчика с GET параметрами token, PayerID на $resultUrl (см. шаг 3).
  7. Деньги списаны, но платеж еще не исполнен. Говорим PayPal, что да, мы верно подтверждаем платеж:
    $apiContext = new ApiContext(new OAuthTokenCredential(
        $clientId, $clientSecret));
    $apiContext->setConfig([ 'mode' => 'live']);
    $payment = Payment::get($payment->getExternalPaymentId(), $apiContext);
    $paymentExecution= new PaymentExecution();
    $paymentExecution->setPayerId($payerId);
    $payment->execute($paymentExecution, $apiContext);
    
  8. Опционально PayPal изготавливает уведомление о платежах на указанный URL, именуется это у них IPN:
    Всякое такое полученное уведомление нужно валидировать ответным запросом в сторону PayPal. Также необходимо сверять сумму платежа, валюту и email получателя. Остается только дождаться сокровенного ранга completed и платеж дозволено считать исполненным. Если вы не хотите связываться с IPN, то неизменно дозволено легко опрашивать платформу PayPal о рангах требуемых платежей, к примеру, через cron, правда IPN все же комфортней:

    $ipn = new PPIPNMessage(null, array(['mode' => 'live']));
    if (!$ipn->validate()) {
    	throw new Exception('Не пройдена валидация платежа на стороне PayPal');
    }
    // $_GET['txn_id']          Ид платежа PayPal
    // $_GET['mc_gross']        Сумма платежа
    // $_GET['mc_currency']     Валюта платежа
    // $_GET['payer_email']     Еmail плательщика 
    // $_GET['item_number1']    Ид первого товара
    // $_GET['payment_status']  Ранг заказа
    // $_GET['receiver_email']  Email получателя
    switch ($_GET['payment_status']) {
    	// Платеж удачно исполнен, оказываем службу
    	case 'completed': break;
    	// Платеж не прошел
    	case 'failed': break;
    	// Платеж хорош продавцом
    	case 'denied': break;
    	// Деньги были возвращены клиенту
    	case 'refunded': break;
    }
    

На наш взор, множество шагов данной схемы избыточные: дозволено убрать повторные проверки в адрес PayPal на этапе уведомлений о платеже, легко предварительно подписав присланные данные. Это же касается и лишних действий с подтверждением теснее сделанного платежа пользователя. Также, помимо хранения номера платежа PayPal, придется организовывать хранение token’а для однозначной идентификации заказа и выполнения шага 7. Альтернативный вариант заключается в образовании Url’а возврата с уникальным ключом.

На данный момент API PayPal один из самых запутанных и неоднозначных среди знаменитых платежных систем, но с иной стороны если, не сворачивая, идти по протоптанной тропинке, то все получится.

Не имей сто рублей, а имей сто друзей

В свою очередь мы упростили подключение и работу с PayPal и готовы предоставить ряд платежных инструментов на выбор.

Если вы только задумались над тем, как реализовать прием платежей для своего плана и какие способы оплаты вам подойдут помимо PayPal, то рекомендуем самый стремительный и примитивный метод подключения — универсальная форма оплаты UnitPay. Среди прочих способов оплаты будет доступен и PayPal.

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

А что для стран СНГ?

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

В завершение

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB