我正在开发一个网站,客户可以使用多种付款方式,包括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);
}
答案 0 :(得分:39)
警告:此答案存在安全漏洞。通过客户端传递敏感数据(例如项目和价格)允许客户端修改交易。即。更改项目,或更改价格。请参阅how to implement IPN上的PayPal文档。
您应该使用php header
函数重定向用户,并将变量发送为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);
}
答案 1 :(得分:4)
您应该将数据保留在服务器上并仅发送识别令牌,而不是尝试将所有数据发布到PayPal并返回。您发送到PayPal的任何数据(通过用户的浏览器)都可以被拦截和修改。这是一个严重的安全隐患。
如果您只发送令牌,则无法篡改。
阅读PayPal规范,它有关于如何实现这些内容的指南。
您必须使用IPN或类似的后期处理,因为PayPal是唯一知道付款是否实际发生的人。 不信任您从用户那里获得的任何数据。
答案 2 :(得分:1)
做curl会在后端进行端到端调用,它不会反映前端行为。
你必须创建一个带有隐藏字段和javascript的表单,以便在页面加载后自动提交表单。