17

我正在开发一个网站,客户有多种付款方式,包括 PayPal 付款标准。由于我正在收集有关客户的大量数据,因此我想在将用户发送到 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@example.com';
    $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);
  }
4

3 回答 3

40

警告:此答案存在安全缺陷。通过客户端传递敏感数据(例如商品和价格)允许客户端修改交易。IE。更改项目或更改价格。请参阅有关如何实施 IPN的 PayPal 文档。

您应该使用 phpheader函数重定向用户并将变量作为 GET 而不是 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'] = 'social@jackeyes.com';
    $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);
}
于 2013-02-12T23:24:28.107 回答
4

与其尝试将所有数据发布到 PayPal 并返回,不如将数据保存在您的服务器上并仅发送一个识别令牌。您发送到 PayPal(通过用户的浏览器)的任何数据都可能被拦截和修改。这是一个严重的安全隐患。

如果您只发送令牌,则没有篡改的机会。

阅读 PayPal 规范,它有关于如何实现这些东西的指南。

必须使用 IPN 或一些类似的后处理,因为 PayPal 是唯一知道是否实际付款的人。不要相信您从用户那里获得的任何数据。

于 2013-02-12T22:46:29.133 回答
1

做 curl 它将在后端进行端到端调用,它不会反映前端行为。

您必须制作一个带有隐藏字段和 javascript 的表单,以便在页面加载后自动提交表单。

于 2013-02-12T22:45:28.530 回答