Отправить форму через cURL и переадресовать браузер в PayPal - программирование
Подтвердить что ты не робот

Отправить форму через cURL и переадресовать браузер в PayPal

Я разрабатываю сайт, на котором у клиентов есть несколько вариантов оплаты, включая PayPal Payments Standard. Поскольку я собираю много данных о клиенте, я хотел бы обработать форму на своем сервере перед отправкой пользователя на сервер PayPal. Один из вариантов - объединить данные в одну строку, назначить строку в поле custom, а затем обработать ее в ответе IPN, но я считаю, что это очень неэлегантное решение. Вместо этого, после сбора пользовательских данных, я пытаюсь использовать cURL для отправки стандартной формы HTML PayPal. Как я могу перенаправить пользователя в PayPal, чтобы завершить процесс оформления заказа?

  // Process PayPal payment
  if ($method == 'PayPal') {

    // Prepare POST data
    $query = array();
    $query['notify_url'] = 'http://example.com/ipn';
    $query['cmd'] = '_cart';
    $query['upload'] = '1';
    $query['business'] = '[email protected]';
    $query['address_override'] = '1';
    $query['first_name'] = $first_name;
    $query['last_name'] = $last_name;
    $query['email'] = $email;
    $query['address1'] = $ship_to_address;
    $query['city'] = $ship_to_city;
    $query['state'] = $ship_to_state;
    $query['zip'] = $ship_to_zip;
    $query['item_name_'.$i] = $item['description'];
    $query['quantity_'.$i] = $item['quantity'];
    $query['amount_'.$i] = $item['info']['price'];

    // Prepare query string
    $query_string = '';
    foreach ($query as $key=>$value) {
      $query_string .= $key.'='.urlencode($value).'&';
    }
    $query_string = rtrim($query_string, '&');

    // Open connection
    $ch = curl_init();

    //set the url, number of POST vars, POST data
    curl_setopt($ch,CURLOPT_URL, 'https://www.paypal.com/cgi-bin/webscr');
    curl_setopt($ch,CURLOPT_POST, count($query));
    curl_setopt($ch,CURLOPT_POSTFIELDS, $query_string);

    // Execute post
    $result = curl_exec($ch);

    // Close connection
    curl_close($ch);
  }
4b9b3361

Ответ 1

ПРЕДУПРЕЖДЕНИЕ: этот ответ имеет дефицит безопасности. Передача конфиденциальных данных (таких как элемент и цена) через клиента позволяет клиенту изменять транзакцию. то есть. изменить элемент или изменить цену. См. Документацию PayPal на как реализовать IPN.

Вы должны перенаправить пользователя с помощью функции php header и отправить vars как GET not POST.

// Process PayPal payment
if ($method == 'PayPal') {

    // Prepare GET data
    $query = array();
    $query['notify_url'] = 'http://jackeyes.com/ipn';
    $query['cmd'] = '_cart';
    $query['upload'] = '1';
    $query['business'] = '[email protected]';
    $query['address_override'] = '1';
    $query['first_name'] = $first_name;
    $query['last_name'] = $last_name;
    $query['email'] = $email;
    $query['address1'] = $ship_to_address;
    $query['city'] = $ship_to_city;
    $query['state'] = $ship_to_state;
    $query['zip'] = $ship_to_zip;
    $query['item_name_'.$i] = $item['description'];
    $query['quantity_'.$i] = $item['quantity'];
    $query['amount_'.$i] = $item['info']['price'];

    // Prepare query string
    $query_string = http_build_query($query);

    header('Location: https://www.paypal.com/cgi-bin/webscr?' . $query_string);
}

Ответ 2

Вместо того, чтобы отправлять все данные в PayPal и обратно, вы должны хранить данные на своем сервере и отправлять только идентифицирующий токен. Любые данные, которые вы отправляете в PayPal (через браузер пользователя), могут быть перехвачены и изменены. Это серьезная угроза безопасности.

Если вы отправляете только токен, нет возможности для подделки.

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

Вы должны использовать IPN или какую-либо аналогичную почтовую обработку, потому что PayPal является единственным, кто знает, действительно ли был произведен платеж. Do не доверять любым данным, которые вы получаете от пользователя.

Ответ 3

выполняя завиток, он будет делать от конца до конца вызовы на стороне сервера, он не будет отражать поведение интерфейса.

вам нужно создать форму со скрытым полем и javascript для автоматической отправки формы после загрузки страницы.