【问题标题】:Uploading custom cart to Paypal from PHP page using POST使用 POST 从 PHP 页面上传自定义购物车到 Paypal
【发布时间】:2011-08-24 21:27:11
【问题描述】:

我在 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 发送所有内容。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    最好的解决方案是使用 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

    【讨论】:

    • 我认为这是我真正需要的。谢谢!
    【解决方案2】:

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

    PayPal IPN Sample PHP

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

    【讨论】:

    • 好的,让我看看我的流程是否正确。客户选择要购买的项目 > 显示带有特殊 PayPal html 变量的结帐页面 > 客户点击购买 > 重定向到 PayPal 购买页面 > 客户付款并重定向回我的网站 > IPN 发送到我的 PHP IPN 检查页面 > 该页面重新发送 IPN 数据到 PayPal 进行验证 > 如果经过验证,请检查数据库以查看支付的价格是否正确。好的,但是如何让 PayPal 将我的数据库的 CustomerID 与 IPN 通知一起发送,以便我知道哪个客户付款?另外在什么时候我将订单存储在我的数据库中?结帐时?
    【解决方案3】:

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

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

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

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

    CMIIW :)

    【讨论】:

    • 我想我正在尝试创建一个页面来将订单存储在我的数据库中,然后使用 cURL 提交购物车,如this link。 cUrl 将使用 POST 将数据从我的服务器直接提交到 PayPal,但它不会将用户重定向到相同的 PayPal 页面。您需要在 URL 中使用某种唯一代码,以便用户也可以在那里被重定向。如果是这样,那将是理想的,但我认为它更多地用于发布数据,然后将响应返回给 PHP 脚本。
    【解决方案4】:

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

    【讨论】:

    • 也许贝宝会告诉您的退货网站正确的金额或使用某种签名?然后你可以说“购物车被侵犯,没有送货” - 或者那种^^
    • 如果服务器使用 cURL 将服务器端生成的 POST 变量直接提交到 PayPal,然后将用户重定向到同一 PayPal 页面,则用户无法编辑 POST 变量。您需要在 URL 中使用某种唯一的交易代码,以便用户被重定向到相同的 PayPal 页面,并且整个购物车详细信息已经在 PayPal 上为他们提供。他们无法编辑内容。
    • 如果 PHP 服务器执行 cURL POST,用户无法对其进行操作。但是,如果客户端网络浏览器这样做 - 他可以。不一定使用普通浏览器并且很容易,但我可以编写自己的浏览器来更改特殊的 POST 变量。以 100 美元的价格订购 10000 美元的设备听起来不错,而且可能值得付出努力。
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 2019-01-11
    • 2012-09-25
    • 1970-01-01
    • 2015-06-01
    • 2017-12-17
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多