Приступая к работе с PayPal API

PayPal является самой популярной платформой для приема онлайн-платежей сегодня.

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

Отказ от ответственности: API PayPal является одним из самых худших, которые я когда-либо имел дело.Несоответствия, иногда плохое или противоречивые документы, непредсказуемые сбои и внимание изменения, и основные различия между живым и песочницы версии все сговорились, чтобы сделать PayPal API довольно боль в заднице, чтобы работать.За эти годы, я взял мою куски от работы совсем немного с PayPal API, и я опубликовали результаты своего жесткого извлеченные уроки в качестве коммерческого PHP PayPal API component на исходный код рынке Binpress.

PayPal at LeWeb, Copyright Jean-Christophe Capelli, Some Rights Reserved

Различные оплаты Options

PayPal предлагает различные варианты оплаты, которая может ввести в заблуждение сначала:

  • Экспресс CheckoutПремьер-службы PayPal.Express Checkout позволяет принимать платежи без торговый счет и без того, чтобы соответствовать особым требованиям, кроме проверки Вашего счета (или через банковский счет или кредитную карту).Раньше вы могли бы получить Express Checkout платежей от PayPal только для пользователей, но с тех пор PayPal добавил кредитной карты вариант для не-пользователей PayPal, делая эту услугу доступной практически любому человеку с кредитную карту.Обратите внимание, что процесс Express Checkout происходит на платформу PayPal и поэтому никогда не может быть полностью интегрирован в вашего сайта experience.
  • Прямые PaymentПрямой метод оплаты позволяет получить кредитную карту платежи непосредственно через вызов API.Это позволяет организовать процесс оплаты на вашем сайте в полном объеме, что может сделать для более полного торговый опыт для своих клиентов.Прямой метод оплаты имеет несколько вариантов, которые позволяют авторизовать платеж и завершить его в более поздние даты: с соответствующим названием Авторизация и Capture методами.Эти изменения являются частью Платежи сайта Pro API,которая доступна только для США, Канады и Великобритании accounts.
  • новое PaymentsЭто позволяет установить повторяющиеся транзакции (т.е. абонентская плата)
  • Mass PaymentsЭто позволяет перевести деньги на несколько счетов в once.
  • Адаптивная PaymentsВот еще один API для отправки средств нескольким получателям, с некоторыми отличиями от API массовым платежам.(Я уже говорил, что API PayPal сбивает с толку и немного избыточным?)

Этот список не является исчерпывающим, но охватывает основные варианты оплаты ( см. в документации по API для more).

Создание API Requests

PayPal поддерживает два основных форматов на HTTP: NVP и SOAP.NVP это сокращение от пары имя-значение, и SOAP выступает за простой протокол доступа к объектам.Я расскажу NVP подход, который я предпочитаю, чтобы SOAP, относительно подробные и сложные syntax.

Каждый из методов API имеет различные параметры, но все они имеют некоторые основные parameters, которые используются для идентификации API счета и подписать сделку.К ним относятся:

  • USERВаш PayPal пользователь API name.
  • PWDВаш PayPal API password.
  • VERSIONНомер версии NVP API услуг, таких как 74.0. (Последняя на момент написания статьи)
  • SIGNATUREВаша подпись PayPal API строку.Этот параметр является необязательным, если вы используете сертификат authenticate.

Последний обязательный параметр составляет METHOD, который заявляет, которая API метода мы calling.

Запросы осуществляются через HTTPS.Мы будем использовать CURL строить наш основной запрос, а затем инкапсулировать процесса в классе:

class Paypal {
   /**
    * Last error message(s)
    * @var array
    */
   protected $_errors = array();

   /**
    * API Credentials
    * Use the correct credentials for the environment in use (Live / Sandbox)
    * @var array
    */
   protected $_credentials = array(
      'USER' => 'seller_1297608781_biz_api1.lionite.com',
      'PWD' => '1297608792',
      'SIGNATURE' => 'A3g66.FS3NAf4mkHn3BDQdpo6JD.ACcPc4wMrInvUEqO3Uapovity47p',
   );

   /**
    * API endpoint
    * Live - https://api-3t.paypal.com/nvp
    * Sandbox - https://api-3t.sandbox.paypal.com/nvp
    * @var string
    */
   protected $_endPoint = 'https://api-3t.sandbox.paypal.com/nvp';

   /**
    * API Version
    * @var string
    */
   protected $_version = '74.0';

   /**
    * Make API request
    *
    * @param string $method string API method to request
    * @param array $params Additional request parameters
    * @return array / boolean Response array / boolean false on failure
    */
   public function request($method,$params = array()) {
      $this -> _errors = array();
      if( empty($method) ) { //Check if API method is not empty
         $this -> _errors = array('API method is missing');
         return false;
      }

      //Our request parameters
      $requestParams = array(
         'METHOD' => $method,
         'VERSION' => $this -> _version
      ) + $this -> _credentials;

      //Building our NVP string
      $request = http_build_query($requestParams + $params);

      //cURL settings
      $curlOptions = array (
         CURLOPT_URL => $this -> _endPoint,
         CURLOPT_VERBOSE => 1,
         CURLOPT_SSL_VERIFYPEER => true,
         CURLOPT_SSL_VERIFYHOST => 2,
         CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem', //CA cert file
         CURLOPT_RETURNTRANSFER => 1,
         CURLOPT_POST => 1,
         CURLOPT_POSTFIELDS => $request
      );

      $ch = curl_init();
      curl_setopt_array($ch,$curlOptions);

      //Sending our request - $response will hold the API response
      $response = curl_exec($ch);

      //Checking for cURL errors
      if (curl_errno($ch)) {
         $this -> _errors = curl_error($ch);
         curl_close($ch);
         return false;
         //Handle errors
      } else  {
         curl_close($ch);
         $responseArray = array();
         parse_str($response,$responseArray); // Break the NVP string to an array
         return $responseArray;
      }
   }
}

Обратите внимание, что я использую файл CA сертификата SSL для проверки сертификатов.Вы можете получить файл с Curl website или любого надежного источника.Измените путь к файлу сертификата в соответствии с которой вы разместили it.

Ответ будет возвращено в NVP формате, а также, и я переформатировать его в массив перед его возвращением.Параметр с именем ACK означает статус запроса: Success или SuccessWithWarning, когда запрос успешно, и Error или Warning, когда запрос fails.

Запрос может потерпеть неудачу по многим причинам, и есть разные причины для каждого метода API, которые подробно описаны в manual.Мы пройдемся по некоторым дальше в этой статье и искать пути, чтобы справиться с ними.Имейте в виду, что значения параметров чувствительны к регистру, поэтому код противих accordingly.

Экспресс Checkout

Один из самых популярных API, является Express Checkout API, который позволяет принимать платежи без открытия Website Payments Pro счета (который доступен только для проверено счетов в США) или хостинг фактической сделки самостоятельно (что требует дополнительного обеспечения).

Процесс Express Checkout работает следующим образом:

  1. Мы просим проверки маркера от PayPal с использованием транзакции детали;
  2. В случае успеха, мы перенаправить пользователя на PayPal конечную точку, используя полученный маркер;
  3. Пользователь завершает или отмена оплаты на PayPal платформы и перенаправляется обратно на наш сайт;
  4. Мы завершения платежа либо когда пользователь перенаправляется обратно или через Моментальная оплата Notification. (IPN)

Express Checkout flow

1.Получение Оформить заказ Token: SetExpressCheckout

Мы начинаем процесс Express Checkout, передавая сведения о заказе на PayPal API, и мы получаем маркер строка, которая идентифицирует его.Этот знак будет использоваться на следующем этапе, чтобы перенаправить PayPal.

Вот необходимые параметры:

  • METHODЭто API метод, который мы используем (т.е. SetExpressCheckout).
  • RETURNURLURL-адрес, который пользователь будет перенаправлен после оплаты процессе completed.
  • CANCELURLURL-адрес, который пользователь будет перенаправлен после того, как отменили оплату process.
  • PAYMENTREQUEST_0_AMTОбщая сумма сделки.Это должно быть два знака после запятой, с десятичного разделителя будучи период (.).Дополнительный разделитель тысяч должна быть запятая (,).
  • PAYMENTREQUEST_0_ITEMAMTОбщая стоимость товаров в порядке, за исключением доставки, налоги и другие расходы.Если нет никаких дополнительных затрат, то это должно быть то же значение, PAYMENTREQUEST_0_AMT.

Мы можем передать дополнительные параметры, чтобы добавить больше информации о порядке, некоторые из которых имеют значения по умолчанию:

  • PAYMENTREQUEST_0_CURRENCYCODEОплата в валюте, а три буквы кода.По умолчанию USD.
  • PAYMENTREQUEST_0_SHIPPINGAMTОбщая стоимость груза для этого order.
  • PAYMENTREQUEST_0_TAXAMTОбщая сумма налога за этот заказ.Это необходимо, если за налоговый пункт указан (см. ниже)
  • PAYMENTREQUEST_0_DESCЗаказа description.

Мы можем также добавить информацию о отдельные элементы в следующем порядке:

  • L_PAYMENTREQUEST_0_NAMEmЭлемента name.
  • L_PAYMENTREQUEST_0_DESCmЭлемента description.
  • L_PAYMENTREQUEST_0_AMTmЭлемента cost.
  • L_PAYMENTREQUEST_0_QTYmКоличество item.

Переменный индекс m идентифицирует элемент.(Используйте ту же переменную для всех деталей этого же пункта).

Есть много других дополнительных параметров, которые могут быть найдены в API documentation.

Мы будем использовать функции, которые мы писали выше, чтобы построить SetExpressCheckout запрос:

//Our request parameters
$requestParams = array(
   'RETURNURL' => 'http://www.yourdomain.com/payment/success',
   'CANCELURL' => 'http://www.yourdomain.com/payment/cancelled'
);

$orderParams = array(
   'PAYMENTREQUEST_0_AMT' => '500',
   'PAYMENTREQUEST_0_SHIPPINGAMT' => '4',
   'PAYMENTREQUEST_0_CURRENCYCODE' => 'GBP',
   'PAYMENTREQUEST_0_ITEMAMT' => '496'
);

$item = array(
   'L_PAYMENTREQUEST_0_NAME0' => 'iPhone',
   'L_PAYMENTREQUEST_0_DESC0' => 'White iPhone, 16GB',
   'L_PAYMENTREQUEST_0_AMT0' => '496',
   'L_PAYMENTREQUEST_0_QTY0' => '1'
);

$paypal = new Paypal();
$response = $paypal -> request('SetExpressCheckout',$requestParams + $orderParams + $item);

2.Перенаправление на PayPal Checkout с помощью экспресс Token

Если запрос выполнен успешно, то мы получим маркер проверки в TOKEN Параметр response.

if(is_array($response) && $response['ACK'] == 'Success') { //Request successful
      $token = $response['TOKEN'];
      header( 'Location: https://www.paypal.com/webscr?cmd=_express-checkout&token=' . urlencode($token) );
}

Пользователь теперь проходит через процесс покупки на веб-сайте PayPal.Когда они подтвердить или отменить его, они вернутся к одному из адресов, которые мы указали в request.

3.Завершение Transaction

Предположим, что пользователь подтверждает сделку, они будут перенаправлены на наш сайт по PayPal.На данный момент, мы должны использовать два соответствующих методов API:. DoExpressCheckoutPayment завершит сделку, но до этого мы могли бы получить дополнительную информацию о покупателе использованием GetExpressCheckoutDetails

PayPal будет перенаправлять пользователя обратно от покупки с маркером проверки, которые мы будем использовать для вызова этих методов.Маркер будет доступен в URL запроса параметров через token параметр.Мы будем проверять его существование в подтверждение URL, а затем отправить наши запросы API, если мы найдем it.

GetExpressCheckoutDetails метод требует только маркер проверки.DoExpressCheckoutPayment требуется несколько дополнительных параметров:

Comments are closed.