0

我在 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

4 回答 4

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

于 2011-05-13T16:30:18.497 回答
1

如何将发布数据与重定向一起发送?简短的回答:你不能。

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

另一个问题是为什么将数据压缩到重定向中对您如此重要。在尝试将现有协议强制执行它们并非旨在执行的操作之前,您可能需要重新评估您的设计。退后几步,尝试找出一种通过更简单的方式实现总体目标的方法。结果可能会为您和您的访问者省去很多麻烦。

正如 ergophobe 所暗示的那样,一种可能的选择是存储您的数据服务器端。您可以基于 cookie 或 GET 请求中的普通 CGI 变量再次检索它。

CMIIW :)

于 2011-05-13T12:11:28.240 回答
1

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

PayPal IPN 示例 PHP

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

于 2011-05-13T12:30:55.937 回答
0

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

于 2011-05-13T12:09:21.867 回答