使用POST从PHP页面上传自定义购物车到Paypal

时间:2011-05-13 12:03:41

标签: php database paypal shopping-cart paypal-sandbox

我在PayPal上使用网站付款标准。所以我有一个自定义购买页面,基本上是我的许可证列表(从数据库中提取):

licence type A: $100
licence type B: $200
licence type C: $300

他们选择其中一个(单选按钮),然后单击购买按钮。这会将页面发布到我的处理PHP页面,该页面从上一页获取所选的licence_id,然后使用它从数据库中选择正确的许可证信息(价格,许可证持续时间)等。然后它为用户存储新的许可证(但是尚未支付Paypal付款的未付款。)

然后我的PHP代码使用以下代码重定向到Paypal网站进行付款:

// Set the transaction details to be sent to PayPal
$urlParams = array(
    'cmd' => '_cart',
    'upload' => 1,
    'charset' => 'utf-8',
    'business' => my_business_email@domain.com,
    'return' => 'http://mysite.com/paymentprocessed.php',
    'currency_code' => 'NZD',
    'amount_1' => $licencePrice,
    'item_name_1' => $licenceName,
    'quantity_1' => 1
);

// Build the URL
$urlParams = http_build_query($urlParams, '', '&');
$url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';

header('location:' .$url. '?' . $urlParams);
exit();

这实质上重定向用户并通过GET将参数发送到PayPal。令人惊讶的是它有效!然而,明显的安全问题是用户只需编辑地址栏中的变量并更改价格即可获得廉价/免费许可。

那么可以让我的PHP页面改为POST信息,并将浏览器重定向到该页面,以便用户可以完成paypal交易吗?因此,关键数据会从我的网络服务器直接发布到PayPal,用户将无法编辑付款信息。

我想您可以使用IPN确保他们支付了适当的金额,我仍然会这样做。但是我还是不想通过GET发送所有内容。

谢谢!

4 个答案:

答案 0 :(得分:2)

最好的解决方案是使用Express Checkout。这使您可以比标准按钮为您提供更大的灵活性。

如果您正在考虑使用IPN,那么您就足以整合Express Checkout。实际上,它是1个API调用,然后是重定向到PayPal,还有至少1个API调用来完成付款。

典型流程如下:
1.调用SetExpressCheckout API。如果您对此不熟悉,可以使用PayPal的NVP API界面轻松实现这一目标。您只需将数据作为GET NVP字符串发送到https://api-3t.paypal.com/nvp,然后以相同的格式获得回复。
2.从响应中获取令牌,然后重定向到https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=XXXXXXX(https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=XXXXXXX进行沙箱测试)<登记/> 3.一旦买家退回,PayPal将向您的RETURNURL追加PAYERID。如果找不到,请调用GetExpressCheckoutDetails API并提供令牌以检索它  4.使用PAYERID和TOKEN,拨打DoExpressCheckoutPayment以完成付款。

要开始使用此功能,我建议您查看他们在https://www.x.com/community/ppx/sdks#NVP提供的PHP NVP SDK

答案 1 :(得分:1)

如何发送帖子数据以及重定向? 简答:你不能。

答案很长: 客户端和目标服务器之间发生发布请求。数据不包含在标题中,甚至不包含在URL中(与GET请求一样),而是作为单独的有效负载。这意味着您唯一的基于客户的选择确实是发送到浏览器的自动提交表单。

另一个问题是,为什么将数据压缩到重定向是非常重要的。在尝试将现有协议强制转换为他们不想做的事情之前,您可能需要重新评估您的设计。退后几步,尝试通过更简单的方法找到达到总体目标的方法。结果可能会为您和您的访客带来许多麻烦。

可能的替代方案之一是存储您的数据服务器端,正如ergophobe似乎建议的那样。您可以根据GET请求中的cookie或普通CGI变量再次检索它。

CMIIW:)

答案 2 :(得分:1)

您可以使用PayPal IPN发布回调,以查看许可证的价格是否与客户刚刚购买的许可证相匹配。

PayPal IPN Sample PHP

您还可以将订单存储在数据库中,然后在付款进行时检查订单详细信息。如果订单不匹配,它将显示您选择的消息。

答案 3 :(得分:0)

我不确定如何处理paypal请求,但只是将GET更改为POST不是一种保护。高级用户仍然可以访问POST变量并进行编辑。 paypal应该提供一种保护数据完整性的机制!