2013-12-02 3 views
0

Я пытаюсь настроить повторяющиеся платежи в paypal с помощью PHP. Но проблема, с которой я столкнулась, заключается в том, что я не знаю, поступаю ли я правильно. У меня есть этот класс, который делает запрос к Paypal API:Как настроить периодические платежи в paypal

<?php 
class Paypal { 

    protected $_errors = array(); 


    protected $_credentials = array(
     'USER' => 'my-user-id', 
     'PWD' => 'my-pass', 
     'SIGNATURE' => 'my-signature', 
    ); 


    protected $_endPoint = 'https://api-3t.sandbox.paypal.com/nvp'; 


    protected $_version = '74.0'; 

    public function request($method,$params = array()) { 
     $this -> _errors = array(); 
     if(empty($method)) { 
     $this -> _errors = array('API method is missing'); 
     return false; 
     } 

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


     $request = http_build_query($requestParams + $params); 

     $http_header = array(
     'X-PAYPAL-SECURITY-USERID' => 'my-user-id', 
     'X-PAYPAL-SECURITY-PASSWORD' => 'my-pass', 
     'X-PAYPAL-SECURITY-SIGNATURE' => 'my-signature', 
     'X-PAYPAL-REQUEST-DATA-FORMAT' => 'JSON', 
     'X-PAYPAL-RESPONSE-DATA-FORMAT' => 'JSON' 
    ); 


     $curlOptions = array (
     CURLOPT_HTTPHEADER => $http_header, 
     CURLOPT_URL => $this -> _endPoint, 
     CURLOPT_VERBOSE => 1, 
     CURLOPT_SSL_VERIFYPEER => true, 
     CURLOPT_SSL_VERIFYHOST => 2, 
     CURLOPT_RETURNTRANSFER => 1, 
     CURLOPT_POST => 1, 
     CURLOPT_POSTFIELDS => $request 
    ); 

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


     $response = curl_exec($ch); 

     if (curl_errno($ch)) { 
     $this -> _errors = curl_error($ch); 
     curl_close($ch); 
     return false; 

     } else { 
     curl_close($ch); 
     $responseArray = array(); 
     parse_str($response,$responseArray); 
     return $responseArray; 
     } 
    } 
} 
?> 

Тогда я делаю первоначальный запрос, как это:?

session_start(); 
require_once('Paypal.php'); 
$paypal = new Paypal(); 
$amount = 1; 

$requestParams = array(
    'RETURNURL' => 'http://localhost/tester/paypal/new_test/test_done.php', 
    'CANCELURL' => 'http://localhost/tester/paypal/new_test/test_cancel.php', 
    'NOSHIPPING' => '1', 
    'ALLOWNOTE' => '1', 
    'L_BILLINGTYPE0' => 'RecurringPayments', 
    'L_BILLINGAGREEMENTDESCRIPTION0' => 'site donation' 
); 

$orderParams = array(
    'PAYMENTREQUEST_0_AMT' => '1', 
    'PAYMENTREQUEST_0_CURRENCYCODE' => 'USD', 
    'PAYMENTREQUEST_0_ITEMAMT' => $amount 
); 

$item = array(
    'L_PAYMENTREQUEST_0_NAME0' => 'site donation', 
    'L_PAYMENTREQUEST_0_DESC0' => 'site donation', 
    'L_PAYMENTREQUEST_0_AMT0' => $amount, 
    'L_PAYMENTREQUEST_0_QTY0' => '1' 
); 


$response = $paypal->request('SetExpressCheckout', $requestParams + $orderParams + $item); 
$sandbox_location = 'https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token='; 


if(is_array($response) && $response['ACK'] == 'Success'){ 
    $token = $response['TOKEN']; 
    $_SESSION['token'] = $token; 
    header('Location: ' . $sandbox_location . urlencode($token)); 
} 

>

Как вы можете видеть, что я» m, используя метод API SetExpressCheckout, чтобы получить нужный мне токен и сохранить его в сеансе, чтобы я мог использовать его позже с запросом на CreateRecurringPaymentsProfile.

Я в настоящее время перенаправлены на страницу, похожее на это:

enter image description here

После того как пользователь сделал вход с PayPal и подтвердить сумму, которую она перенаправляет на страницу успеха, что я указал, который содержит этот код:

session_start(); 
require_once('Paypal.php'); 

$amount = 1; 
$paypal = new Paypal(); 

$token_param = array('TOKEN' => $_SESSION['token']); 

$current_date = date('Y-m-d'); 

$recurring_payment_params = array(
    'PROFILESTARTDATE' => gmdate('Y-m-d H:i:s', strtotime($current_date . ' + 1 months')), 
    'DESC' => 'site donation', 
    'BILLINGPERIOD' => 'Month', 
    'BILLINGFREQUENCY' => '1', 
    'TOTALBILLINGCYCLES' => '0', 
    'AMT' => $amount 
); 


$recurringpayment_response = $paypal->request('CreateRecurringPaymentsProfile', $recurring_payment_params + $token_param); 

Это работает, я уточнена в песочнице внимания, что возвращающийся платежный профиль был создана и что следующие фактуры в следующем месяц. Но проблема в том, что он не очень заметен в интерфейсе paypal (снимок экрана ранее), который они платят за подписку. Возможно, я неправильно получаю URL-адрес перенаправления? (https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=) или мне нужно добавить дополнительные аргументы в метод SetExpressCheckout? Пожалуйста помоги.

ответ

1

Вы показываете экран входа в систему. После входа в систему вы увидите информацию о подписке, и кнопка будет видеть «Согласиться и заплатить» или «Согласиться и продолжить» (в зависимости от вашего значения пользователя в обратном URL), а не просто «Платить» или «Продолжить».

+0

Кстати, вас может заинтересовать моя [библиотека классов PHP для PayPal] (http://www.angelleye.com/download-angell-eye-php-class-library-for-paypal/). Это по сути делает то же самое, что вы сделали здесь, но он устанавливает каждый возможный параметр для каждого возможного вызова API для вас, поэтому все, что вам нужно сделать, это заполнить значения. Он также содержит комментарии с подробностями о каждом параметре, извлеченном из документации PayPal, поэтому он действительно экономит много времени. –

+0

Да, есть кнопка «Согласен» и «Продолжить», если я установил экспресс-платеж как повторяющийся платеж, но после прочтения текста он явно не кажется очевидным, что его повторяющаяся оплата. Но как я это сделал в коде, правильно? – user225269

+0

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

Смежные вопросы