【问题标题】:PayPal IPN losing session on return?PayPal IPN 在返回时丢失会话?
【发布时间】:2012-11-28 11:21:43
【问题描述】:

我正在使用 Micha 的 PayPal IPN 脚本,并且在大多数情况下它运行良好:https://github.com/Quixotix/PHP-PayPal-IPN

当我在网站上单击“立即付款”时,它会重定向到带有正确信息的贝宝,允许付款,但在返回时没有任何反应,即它不会按应有的方式升级用户。现在我已经在 IPN 之外测试了我的代码的脚本,它运行良好,所以在我看来 IPN 脚本正在丢失会话?

这是我的按钮代码:

<form name="_xclick" action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_xclick">
    <input type="hidden" name="business" value="EMAIL_TO">
    <input type="hidden" name="currency_code" value="GBP">
    <input type="hidden" name="item_name" value="Text Light">
    <input type="hidden" name="amount" value="0.01">
    <input type="hidden" name="return" value="http://domain.co.uk/editors">
    <input type="hidden" name="notify_url" value="http://domain.co.uk/account/upgrade">
    <input type="submit" value="Pay now" class="btn btn-preview" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
</form>

所以通知 url(IPN 代码)是 /account/upgrade ——据我所知,这是它应该执行升级任务的地方?所以这是我的(精简)代码

if ($verified) {

    $errmsg = '';

    // some error checking

    if (!empty($errmsg)) {

        // manually investigate errors from the fraud checking

    } else {

        // upgrade user
        $package = serialize($_SESSION['package']);
        $this->db->update('users',array('id' => $_SESSION['user']['id']),array('payment_plan' => $package));

    }

} else {

    // not verified, investigate problems
}

如上所述,“// 升级用户”下的代码在外面可以正常工作,但从贝宝返回时,显然没有保持会话。它没有抛出任何错误,只是什么都不做。

我哪里出错了?我如何确保会话信息将从 PayPal 传回。

谢谢

【问题讨论】:

    标签: php session paypal paypal-ipn


    【解决方案1】:

    您的问题有一个简短的回答:IPN 不是作为用户完成的。

    为了扩展答案,以下是 IPN 的工作原理。您付款,访问者返回您的网站,PayPal ping 您的 IPN URL。重要的一点是粗体 - 请求将来自 PayPal 而不是来自用户,因此不会继承用户的会话!

    这样做的原因很简单 - IPN URL 应该是私有的,因为如果不是这样,您可以做各种愚蠢的恶作剧(包括创建虚拟交易)。由于这个原因,用户永远不会看到这个地址。 (另一个原因是并非所有浏览器都会遵循重定向 - IPN 旨在 100% 的时间提供信息)。

    如果您想这样做,您需要向 IPN 请求传递一个参数来指示用户是谁。传递用户 ID 是一个非常个坏主意 - 作为可修改的参数。相反,生成某种包含用户信息的事务 ID,然后传递它。在 IPN 调用中,您会将此变量作为自定义参数取回,这将允许您从数据库中获取内容并执行您想做的任何事情,同时知道用户是谁。

    希望这会有所帮助。

    【讨论】:

    • 谢谢你的解释,IPN url不是因为notify_url隐藏字段总是可见的吗?
    • 如果你用这个覆盖了 IPN 调用,请确保你用 PayPal 仔细检查交易是否存在......因为 IPN 数据格式是众所周知的,有人很可能有一些乐趣。不过,其余部分仍然适用 - PayPal 服务器会对此进行 ping,而不是您的用户。
    • 谢谢,这似乎是一个有效的解决方案:好的,我知道问题所在,paypal 不知道会话是什么,所以它无法应用退货解决方案的更改:在付款处理页面(就在买家点击前往贝宝之前)他们的“包裹”的详细信息应与用户 ID 和会话 ID 一起存储在数据库中。我们可以将此状态设为“未确认”吗?我们将会话 ID 与付款信息一起发送到贝宝,在返回时我们捕获会话 ID 并在数据库中查询它,它会提取信息并将其应用于用户?
    • 这是要走的路——尽管您应该依靠 IPN 和 paypal 确认(通过 CURL)来做到这一点。将会话 ID 作为一个额外的字段传递——如果我没记错的话,你总共会得到三个。或者,传递订单 ID 并将订单内容存储在服务器上。
    【解决方案2】:

    我在其他地方看到了一个对我有用的答案。对于 return_url,我只是删除了我的网址的“www”部分。因此,我将 retun_url 改为“https://www.mywebsite.com/ReturnPage.aspx”,而不是“https://mywebsite.com/ReturnPage.aspx”。这似乎使会话保持不变。

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 2014-03-25
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2015-10-14
      • 2011-06-21
      相关资源
      最近更新 更多