Рабочий пример PayPal Сайт Платежи Pro Hosted Solution Iframe? - PullRequest
3 голосов
/ 08 сентября 2011

Я хочу использовать PayPals Платежи через веб-сайт Pro Hosted Solution , поэтому мы можем принимать платежи через PayPal без того, чтобы наши пользователи чувствовали, что они покидают сайт, и мы не должны быть PCI-совместимыми.

Мы хотим, чтобы это работало в следующем формате:

  • пользователь нажимает на страницу покупки для предмета и выбирает количество и нажимает купить сейчас кнопка
  • AJAX-запрос отправляется на сервер для проверки количества / подсчета итогов и т. Д.
  • AJAX-запрос возвращает URL для iframe
  • Iframe заполняется страницей, и после завершения загрузки отображается iframe
  • Пользователь заполняет данные кредитной карты, и PayPal завершает транзакцию
  • Страница успеха, на которой PayPal перенаправляет iframe для вызова некоторого JavaScript на родительской странице для перенаправления на другой URL.

Итак, У меня есть страница выбора количества,
Я знаю, как отправлять данные на сервер и проверять количество / подсчитать сумму

Что я не знаю, как это сделать, с этого момента отправить запрос в PayPal, чтобы получить URL для iframe.

То, что я пытался сделать (в качестве очень простого автономного примера):

<?php

class paypal {

    private $APIuser;
    private $APIpass;
    private $APIsign;
    private $APIvers = '74.0';  
    private $APIaddr = 'https://api-3t.sandbox.paypal.com/nvp';
    private $post_params = array();

    function __construct($APIuser, $APIpass, $APIsign){
        $this->APIuser = $APIuser;
        $this->APIpass = $APIpass;
        $this->APIsign = $APIsign;
    }

    function param($name, $value = null){
        $this->post_params[$name] = $value;
        return $this;
    }

    function getUrl(){

        $post = $this->post_params;
        $post['pwd']        = $this->APIpass;
        $post['user']       = $this->APIuser;
        $post['method']     = 'BMCreateButton';
        $post['version']    = $this->APIvers;
        $post['signature']  = $this->APIsign;
        $post['buttoncode'] = 'CLEARTEXT';
        $post['buttontype'] = 'PAYMENT';

        $post_string = '?';
        foreach($post as $k => $v)
            $post_string .= $k.'='.urlencode($v).'&';

        $post_string = substr($post_string, 0, -1);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->APIaddr.$post_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $out = curl_exec($ch);
        curl_close($ch);

        $out = explode('&', $out);
        $final = array();
        foreach($out as $k => &$v){
            $v = explode('=', $v);
            $final[$v[0]] = urldecode($v[1]);
        }
        return $final;
    }
}

//mock variables
$price = 10.00;
$APIu  = 'xxxxxxxxxx';
$APIp  = 'xxxxxxxxxx';
$APIs  = 'xxxxxxxxxx';  


$paypal = new paypal($APIu, $APIp, $APIs);
$paypal->param('L_BUTTONVAR0=subtotal', $price*$_GET['quantity']);
$paypal->param('L_BUTTONVAR1=template', 'templateD');
$resp = $paypal->getUrl();
?>
<iframe width="100%" height=100%" src="<?php echo $resp['EMAILLINK']; ?>"></iframe>

Поначалу кажется, что все работает нормально, пока вы не введете данные своей кредитной карты для тестовых покупателей и не наберете

Пожалуйста, вернитесь на страницу оплаты и исправьте адрес.

Что я делаю не так / что мне нужно для этой работы?

1 Ответ

0 голосов
/ 09 сентября 2011

На самом деле, попробуйте следующий вызов API и дайте мне знать, если это работает для вас:

МЕТОД = BMCreateButton &
BUTTONTYPE = PAYMENT &
BUTTONCODE = TOKEN &
L_BUTTONVAR0 = промежуточная сумма = 11 &
L_BUTTONVAR1 = налог = 2 &
L_BUTTONVAR2 = доставка = 3 &
L_BUTTONVAR3 = обработка = 4 &
L_BUTTONVAR4 = template = templateC

...