Статьи

Как обрабатывать кредитные карты с PayPal Payments Pro с использованием PHP

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

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


Первое, что мне нравится делать с любым проектом, — это создать базовую структуру, организованную для проекта. В этом случае наша структура очень проста, так как наш проект будет состоять только из 2 файлов:

Структура каталогов

Как вы уже догадались, мы будем хранить нашу информацию о конфигурации в config.php, и мы фактически обработаем код обработки в process-credit-card.php .


В нашем файле /includes/config.php будут /includes/config.php наши значения для необходимой нам API-информации PayPal, включая URL-адрес конечной точки, версию API, а также имя пользователя, пароль и подпись API, которые мы будем использовать.

1
2
3
4
5
6
7
8
9
// Set sandbox (test mode) to true/false.
$sandbox = TRUE;
 
// Set PayPal API version and credentials.
$api_version = ‘85.0’;
$api_endpoint = $sandbox ?
$api_username = $sandbox ?
$api_password = $sandbox ?
$api_signature = $sandbox ?

Просматривая код config.php , вы видите, что сначала мы устанавливаем переменную для $sandbox . Сейчас мы оставим это в TRUE потому что мы хотим взаимодействовать с тестовыми серверами PayPal для целей разработки. Вам нужно помнить, чтобы изменить это на FALSE когда вы будете готовы переместить свой проект на работающий сервер.

Затем, основываясь на значении $sandbox мы устанавливаем значения для других переменных для нашей информации API. Вы просто захотите заполнить эти заполнители своими собственными данными соответственно. Теперь мы готовы создать наш скрипт обработки кредитных карт.


Теперь мы можем начать строить нашу страницу process-credit-card.php . Первое, что нам нужно сделать, это включить наш конфигурационный файл.

1
2
// Include config file
require_once(‘includes/config.php’);

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

1
PARAM1=value1&PARAM2=value2&PARAM3=value3…etc.

Итак, вы можете подумать: «Как узнать, что использовать для имен моих переменных в моей строке?». Хорошая новость заключается в том, что PayPal предоставляет очень хорошую документацию по этому вопросу. Мы можем видеть все возможные переменные, которые мы можем передать PayPal, включая данные клиента, детали заказа и данные кредитной карты. Часть этой информации требуется для обработки платежа, но многие доступные переменные являются необязательными. В демонстрационных целях мы будем делать это довольно просто и просто передадим необходимую информацию.

Мы будем хранить все наши параметры запроса в массиве, чтобы мы могли циклически проходить через этот массив, чтобы легко генерировать нашу строку NVP. Все запросы требуют следующие параметры по умолчанию:

  • METHOD — Имя вызова API, который вы делаете.
  • USER — имя пользователя API
  • PWD — пароль API
  • SIGNATURE — подпись API
  • VERSION — версия API

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Store request params in an array
$request_params = array
                    (
                    ‘METHOD’ => ‘DoDirectPayment’,
                    ‘USER’ => $api_username,
                    ‘PWD’ => $api_password,
                    ‘SIGNATURE’ => $api_signature,
                    ‘VERSION’ => $api_version,
                    ‘PAYMENTACTION’ => ‘Sale’,
                    ‘IPADDRESS’ => $_SERVER[‘REMOTE_ADDR’],
                    ‘CREDITCARDTYPE’ => ‘MasterCard’,
                    ‘ACCT’ => ‘5522340006063638’,
                    ‘EXPDATE’ => ‘022013’,
                    ‘CVV2’ => ‘456’,
                    ‘FIRSTNAME’ => ‘Tester’,
                    ‘LASTNAME’ => ‘Testerson’,
                    ‘STREET’ => ‘707 W. Bay Drive’,
                    ‘CITY’ => ‘Largo’,
                    ‘STATE’ => ‘FL’,
                    ‘COUNTRYCODE’ => ‘US’,
                    ‘ZIP’ => ‘33770’,
                    ‘AMT’ => ‘100.00’,
                    ‘CURRENCYCODE’ => ‘USD’,
                    ‘DESC’ => ‘Testing Payments Pro’
                    );

Вы заметите, что мы используем наши переменные конфигурации из config.php , а затем я просто загружаю статические данные для других значений. Однако в стандартном проекте вы, скорее всего, будете заполнять эти значения данными формы, данными сеанса или некоторыми другими формами динамических данных.

Теперь мы можем просто перебрать этот массив для генерации нашей строки NVP.

1
2
3
4
5
6
// Loop through $request_params array to generate the NVP string.
$nvp_string = »;
foreach($request_params as $var=>$val)
{
    $nvp_string .= ‘&’.$var.’=’.urlencode($val);
}

Значение $nvp_string теперь:

1
METHOD=DoDirectPayment&USER=sandbo*****e.com&PWD=12***74&SIGNATURE=AiKZ******6W18v&VERSION=85.0&PAYMENTACTION=Sale&IPADDRESS=72.135.111.9&CREDITCARDTYPE=MasterCard&ACCT=5522340006063638&EXPDATE=022013&CVV2=456&FIRSTNAME=Tester&LASTNAME=Testerson&STREET=707+W.+Bay+Drive&CITY=Largo&STATE=FL&COUNTRYCODE=US&ZIP=33770&AMT=100.00&CURRENCYCODE=USD&DESC=Testing+Payments+Pro

Эта строка является тем, что мы отправим в PayPal по нашему запросу.


Теперь, когда наша строка NVP готова к отправке, нам нужно отправить ее на сервер PayPal для соответствующей обработки. Для этого мы будем использовать методы PHP CURL.

01
02
03
04
05
06
07
08
09
10
11
// Send NVP string to PayPal and store response
$curl = curl_init();
        curl_setopt($curl, CURLOPT_VERBOSE, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);
        curl_setopt($curl, CURLOPT_URL, $api_endpoint);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $nvp_string);
 
$result = curl_exec($curl);
curl_close($curl);

Здесь вы можете видеть, что мы настроили CURL с несколькими простыми опциями, и мы соответственно используем наши $api_endpoint и $nvp_string .

Эти данные будут отправлены в PayPal, и мы получим ответ API обратно в нашей переменной $result чтобы мы могли видеть результат и отправлять пользователя на страницу об успешном или неудачном обращении в зависимости от того, успешен вызов или нет.


Значение, которое мы вернем в $result с предыдущего шага, будет строкой NVP, такой же, как та, которую мы сгенерировали и отправили в PayPal. Когда мы запускаем наш текущий скрипт, мы получаем успешный ответ, который выглядит следующим образом:

1
TIMESTAMP=2012%2d04%2d16T07%3a59%3a36Z&CORRELATIONID=9eb40cd84a7d3&ACK=Success&VERSION=85%2e0&BUILD=2764190&AMT=100%2e00&CURRENCYCODE=USD&AVSCODE=X&CVV2MATCH=M&TRANSACTIONID=160896645A8111040

Один очень простой способ разобрать этот результат — использовать parse_str() PHP parse_str() . Это загрузит все данные ответа в переменные PHP, соответствующие именам и значениям, возвращенным в ответе. Например, если мы делаем следующее:

1
2
// Parse the API response
$nvp_response_array = parse_str($result);

В итоге мы получили бы доступ к следующим переменным PHP:

  • $TIMESTAMP
  • $CORRELATIONID
  • $ACK
  • $VERSION
  • $BUILD
  • $AMT
  • $CURRENCYCODE
  • $AVSCODE
  • $CVV2MATCH
  • $TRANSACTIONID

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

Значение $ACK — это то, что скажет нам, был ли вызов API успешным или нет. Значения для $ACK могут быть:

  • Success
  • SuccessWithWarning
  • Failure
  • FailureWithWarning
  • Вы можете просто перенаправить своего пользователя туда, куда ему нужно пойти, и показать ему информацию, основанную на этом значении.

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

1
TIMESTAMP=2012%2d04%2d16T08%3a08%3a52Z&CORRELATIONID=590d41dbb31e0&ACK=Failure&VERSION=85%2e0&BUILD=2764190&L_ERRORCODE0=10527&L_SHORTMESSAGE0=Invalid%20Data&L_LONGMESSAGE0=This%20transaction%20cannot%20be%20processed%2e%20Please%20enter%20a%20valid%20credit%20card%20number%20and%20type%2e&L_SEVERITYCODE0=Error&AMT=100%2e00&CURRENCYCODE=USD

Теперь, когда мы используем parse_str() мы получаем следующие переменные PHP:

  • $TIMESTAMP
  • $CORRELATIONID
  • $ACK
  • $VERSION
  • $BUILD
  • $L_ERRORCODE0
  • $L_SHORTMESSAGE0
  • $L_LONGMESSAGE0
  • $L_SEVERITYCODE0
  • $AMT
  • $CURRENCYCODE

В этом случае $ACK показывает Failure, поэтому мы знаем, что вызов не был успешным, и мы можем проверить параметры ошибки для более подробной информации о том, что пошло не так.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
// Function to convert NTP string to an array
function NVPToArray($NVPString)
{
    $proArray = array();
    while(strlen($NVPString))
    {
        // name
        $keypos= strpos($NVPString,’=’);
        $keyval = substr($NVPString,0,$keypos);
        // value
        $valuepos = strpos($NVPString,’&’) ?
        $valval = substr($NVPString,$keypos+1,$valuepos-$keypos-1);
        // decoding the respose
        $proArray[$keyval] = urldecode($valval);
        $NVPString = substr($NVPString,$valuepos+1,strlen($NVPString));
    }
    return $proArray;
}

Это позволяет мне видеть все доступные данные ответа, просто просматривая содержимое массива:

Если я снова запускаю свой скрипт, я получаю следующий результат на экране:

01
02
03
04
05
06
07
08
09
10
11
12
13
Array
(
[TIMESTAMP] => 2012-04-16T08:15:41Z
[CORRELATIONID] => 9a652cbabfdd9
[ACK] => Success
[VERSION] => 85.0
[BUILD] => 2764190
[AMT] => 100.00
[CURRENCYCODE] => USD
[AVSCODE] => X
[CVV2MATCH] => M
[TRANSACTIONID] => 6VR832690S591564M
)

И если я снова вызову ошибку, я получу следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
Array
(
[TIMESTAMP] => 2012-04-16T08:18:46Z
[CORRELATIONID] => 2db182b912a9
[ACK] => Failure
[VERSION] => 85.0
[BUILD] => 2764190
[L_ERRORCODE0] => 10527
[L_SHORTMESSAGE0] => Invalid Data
[L_LONGMESSAGE0] => This transaction cannot be processed.
[L_SEVERITYCODE0] => Error
[AMT] => 100.00
[CURRENCYCODE] => USD
)

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


Как видите, обработка кредитных карт с помощью PayPal Payments Pro на самом деле очень простая процедура. Это просто включает несколько стандартных шагов для работы с веб-сервисами API, и базовые знания по работе с данными массива также могут помочь.

Удачи и счастливого кодирования!