我正在使用 Micha 的 PayPal IPN 脚本并且在大多数情况下它运行良好:https://github.com/Quixotix/PHP-PayPal-IPN
当我在网站上单击“立即付款”时,它会使用正确的信息重定向到 paypal,允许付款,但返回时什么也没有发生,即它没有按应有的方式升级用户。现在我已经在 IPN 之外测试了脚本我的代码并且它工作完美所以在我看来 IPN 脚本正在丢失 session ?
这是我的按钮代码:
<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
}
如上所述,'//upgrade user' 下的代码在外部工作正常,但从 paypal 返回时,它显然没有保持 session 。它不会抛出任何错误,它只是什么都不做。
我哪里做错了?我如何确保 session 信息将从 PayPal 传回。
谢谢
最佳答案
您的问题有一个简短的答案:IPN 不是作为用户完成的。
要扩展答案,IPN 的工作原理如下。您付款,访问者返回您的网站,PayPal ping 您的 IPN URL。重要的一点是粗体 - 请求将来自 PayPal 而不是来自用户,因此不会继承用户的 session !
原因很简单 - IPN URL 应该是私有(private)的,因为如果不是私有(private)的,您可以进行各种愚蠢的恶作剧(包括创建虚拟交易)。正是出于这个原因,用户永远不会看到这个地址。 (另一个原因是并非所有浏览器都会遵循重定向 - IPN 旨在 100% 的时间提供信息)。
如果您想这样做,您需要向 IPN 请求传递一个参数来指示用户是谁。传递用户 ID 是一个非常的坏主意 - 因为参数是可修改的。相反,生成某种包含用户信息的事务 ID,然后传递它。在 IPN 调用中,您将作为自定义参数取回此变量,这将允许您从数据库中获取内容并执行任何您想做的事情,同时知道用户是谁。
希望这对您有所帮助。
关于php - PayPal IPN 在返回时丢失 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13603875/