我正在使用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传回。
由于
答案 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”。这似乎可以保持会话完整。