Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PayPal IPN在返回时丢失会话?_Php_Session_Paypal_Paypal Ipn - Fatal编程技术网

Php PayPal IPN在返回时丢失会话?

Php PayPal IPN在返回时丢失会话?,php,session,paypal,paypal-ipn,Php,Session,Paypal,Paypal Ipn,我正在使用Micha的PayPal IPN脚本,在大多数情况下,它工作得很好: 当我点击网站上的Pay now时,它会重定向到paypal,并提供正确的信息,允许进行支付,但返回时什么也不会发生,即它不会像应该的那样升级用户。现在我已经在IPN之外测试了脚本我的代码,它工作得非常完美,所以在我看来IPN脚本正在丢失会话 这是我的按钮代码: <form name="_xclick" action="https://www.paypal.com/cgi-bin/webscr" method="

我正在使用Micha的PayPal IPN脚本,在大多数情况下,它工作得很好:

当我点击网站上的Pay now时,它会重定向到paypal,并提供正确的信息,允许进行支付,但返回时什么也不会发生,即它不会像应该的那样升级用户。现在我已经在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>
如上所述,“//upgrade user”下的代码在外部运行良好,但从paypal返回后,显然无法保持会话。它没有抛出任何错误,只是没有做任何事情

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


谢谢

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

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

原因很简单——IPN URL应该是私有的,如果不是的话,你可以做各种愚蠢的把戏(包括创建虚拟交易)。正是由于这个原因,用户从未看到过这个地址。(另一个原因是并非所有浏览器都会遵循重定向——IPN的设计目的是在100%的时间内提供信息)

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


希望这有帮助。

我在其他地方看到了一个对我有用的答案。对于返回url,我只是删除了我的网址中的“www”部分。因此,我将retun_url改为“”而不是“”。这似乎保持了会话的完整性。

感谢您的解释,IPN url不是因为notify_url隐藏字段而始终可见吗?如果您使用此字段覆盖IPN调用,请确保您与PayPal再次检查交易是否存在。。。由于IPN数据格式是众所周知的,可能有人会从中得到一些乐趣。其余的仍然适用,虽然-贝宝服务器ping这个,而不是你的用户。谢谢,这似乎是一个有效的解决方案:好的,所以我知道问题,贝宝不知道会话是什么,所以它不能应用更改返回解决方案:在付款处理页面上(就在买家点击前往贝宝之前)其“包”的详细信息应与用户id和会话id一起存储在数据库中。。我们可以给它一个“未确认”的状态吗?我们将会话id与支付信息一起发送给paypal,返回时我们捕获会话id并在数据库中查询,它提取信息,我们可以将其应用于用户?这是一种方法-尽管您应该依靠IPN和paypal的确认(通过CURL)来实现。将会话ID作为一个额外字段传递-如果我没有记错的话,您总共得到三个会话ID。或者,传递订单ID并将订单内容存储在服务器上。
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
}