PayPal IPN在回归时失去了会话?

时间:2012-11-28 11:21:43

标签: php session paypal paypal-ipn

我正在使用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>

所以通知网址(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
}

如上所述,'// upgrade user'下的代码在外面工作正常,但是从paypal返回时,显然没有保持会话。它没有抛出任何错误,它只是没有做任何事情。

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

由于

2 个答案:

答案 0 :(得分:3)

您的问题有一个简短的答案:IPN不是以用户身份完成的。

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

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

如果您想这样做,您需要将参数传递给IPN请求,以指示该用户是谁。传递用户ID是非常坏主意 - 作为可修改的参数。而是生成包含用户信息的某种事务ID,并传递给它。在IPN调用中,您将此变量作为自定义参数返回,这将允许您从数据库中获取内容并执行任何操作,了解用户是谁。

希望这会有所帮助。

答案 1 :(得分:0)

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