PayPal通知网址和返回网址。使用PHP接收变量而无需IPN

18

我试图向PayPal设置一个简单的支付选项,但是在返回和通知URLS方面遇到了一些困惑。我对PHP相当陌生,在asp中以前已经完成过这个任务,但现在我感到迷失了。

所以,我的基本PayPal表单:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="PayPalForm" name="PayPalForm"  target="_top">
 <input type="hidden" name="cmd" value="_xclick">
 <input type="hidden" name="business" value="email@hotmail.com">
 <input type="hidden" name="amount" value="0.01">
 <input type="hidden" name="item_name" value="Composite Door">
 <input type="hidden" name="item_number" value="<?php echo $orderID ?>">
 <input type="hidden" name="currency_code" value="GBP">
 <input type="hidden" name="cancel_return" value="http://www.mydomain.co.uk/paypal-notcompleted.php">
<input type="hidden" name="return" value="http://www.mydomain.co.uk/paypal-completed.php">
<input type="hidden" name="notify_url" value="http://www.mydomain.co.uk/paypal-completed.php"> 
</form>


  <script>
    document.PayPalForm.submit();
   </script>

你可以看到表单提交到PayPal,然后根据结果返回,如果失败/取消,则跳转到paypal-notcompleted.php。

如果成功,则跳转到paypal-completed.php。这是我无法理解的地方,我没有设置IPN,我想做的只是获取一些由 PayPal 返回给我的变量,运行一个简单的插入查询并在确认消息中显示一些详细信息给客户。

我是否允许将notify_url和return_url设为同一页?

为什么Paypal不会将完整预期的内容(如此处所见:Paypal的通知URL)发布到页面上呢?

我知道这与XML之类的东西有关,但我认为我可以使用$_GET获取PayPal发送回来的变量。有人用这种方式做过吗?能告诉我出了什么问题吗?

3个回答

21
要将详细信息返回到您的返回URL,您需要使用PDT。它与IPN非常相似,只是用于您的返回URL,而IPN则用于在服务器上使用第三方IPN监听脚本。 PDT非常适合在返回URL页面上简单显示交易,但不建议使用PDT进行任何后付款处理(例如数据库更新,发送电子邮件收据等),因为即使在启用了您的PayPal帐户中的自动返回功能,也不能保证用户会回到此页面。
每次发生交易时都会触发IPN,无论用户是否在完成付款后回到您的网站。
通知URL仅用于IPN,并且会覆盖您在PayPal配置文件中为IPN设置的任何设置。要返回数据到您的返回URL,需要在PayPal帐户配置文件中配置PDT。
您需要为返回和通知使用不同的URL,否则相同的代码将运行两次:一次是当用户返回您的站点时,另一次是从PayPal IPN POST。

我这里有一个快速问题。我的代码可以成功处理通过PayPal的正常付款,我正在使用notify_url来获取IPN。然而,我的客户创建了PayPal付款按钮,我在HTML中使用它,如<input type="hidden" name="hosted_button_id" value="XZXZXZXZXZX">。所以问题是,我的客户还创建了订阅按钮,因此客户每周都会从他们的PayPal账户中扣款,在这种情况下,notify_url会在每次支付活动时被调用吗?如果是这样,我们如何从POST参数中识别自动付款? - Ravi Dhoriya ツ
1
很遗憾,未来的订阅付款将不会使用在原始设置中传递的notify_url值。相反,它将落到接收付款的PayPal帐户配置的任何内容上,因此,如果您需要一切按照您的要求工作,您可以让客户配置其帐户以指向您的URL。 - Drew Angell
谢谢安德鲁!我会让我的客户在档案中设置notify_url。 :) - Ravi Dhoriya ツ
@AndrewAngell。如果确保只发生一次履行,则可以使用相同的URL作为“return_url”和“notify_url”,这对于IPN来说是必须的,因为消息可能会被多次接收,特别是如果它们由于某种原因而被拦截。也就是说,需要保留本地交易状态,以便比较IPN消息以确定需要采取什么操作。 - Patanjali
嗨,Drew,现在的情况可能已经改变了吗?你的回答已经8年了,根据IPN vs PDT,PayPal建议使用PDT,如果您可以确保网站正在运行,这不应该是一个问题。您提到了关于“...即使在启用了PayPal帐户中的自动返回功能”的问题。-在付款URL中使用notify_url的情况如何? PayPal会可靠地调用它吗? - Peter VARGA

11

支付数据传输(PDT)

returncancel_return url 是一次性的支付数据传输(PDT)调用,主要是为了让用户在您的网站上完成交易。它只是传递信息以帮助您的网站完成该任务。无法保证买家不会在返回之前退出,因此您不能仅使用这些进行任何事务后处理。

即时付款通知(IPN)

notify_url 由即时付款通知(IPN)过程使用,并在交易状态发生每个更改时调用。它旨在成为交易生命周期期间采取的所有操作的完整记录,您可以依赖它来驱动后端流程,如会计、订单履行或取消。IPN 过程采取措施确保过程的完整性。

它们的目的不同,因此所涉及的信息和安全性也不同。有关优缺点,请参见此处

IPN 消息可能会有严重延迟,因此请使用所有三个变量

请注意,虽然大多数 IPN 消息在 PayPal 交易完成后几秒钟内发送,但我曾经遇到过几个小时的延迟,因此它们是可靠的,但不一定及时。

我建议同时使用 returnreturn_cancelnotify_url,前两个将立即返回,以便您可以向用户提供即时反馈,并更新后端数据/启动履行流程,但在用户在返回之前退出 PayPal 时,请作为备份使用后者。告知您的买家返回您的网站,以确保及时处理其订单。

只需管理订单状态,以使IPN在PDT已完成时不触发履行,这基本上是为了确保重复的已完成IPN消息在第一次之后不重新触发履行。

Notify_url仍用于同一交易的后续消息

同一交易的IPN消息仍会发送到相同的notify_url地址。我查看了我们的IPN历史记录,一个Refund IPN消息会发送到原始的notify_url

即使更改了IPN首选项,这种情况仍将持续,与https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNSetup/相符:

除非您禁用了接收IPN消息的首选项,否则IPN消息始终会发送到您的通知URL。即使您没有在个人资料中启用接收IPN消息,或者通过关闭IPN消息来重置您的首选项,PayPal仍将向您指定的特定付款的通知URL发送IPN消息。 在您启用接收IPN后,因为您在个人资料中禁用了首选项而未发送的IPN消息将出现在IPN历史记录中。在它们出现在历史记录中之后,您可以选择是否重新发送它们。

我不确定类似争议或后续订阅付款这样的相关交易是否仍将使用原始的notify_url。也许真正知道的人可以提供答案。


PayPal 的文档不够完整,但据我所知,你对于 notify_url 是错误的。初始响应(例如待处理的电子支票或重复付款设置)将被发送到 notify_url POST 变量中指定的 URL(如果存在),所有未来的响应(例如一周后清算的电子支票或重复付款)将被发送到 PayPal 账户中配置的单个 IPN URL。 - kritzikratzi
@kritzikratzi。如果你要坚称“你错了”,那么你需要提供一些证据,否则你只是在胡说八道。 - Patanjali

6

您的通知网址和返回网址都是不同的。您的返回网址将在客户成功支付后直接引导客户返回,并附带一些返回信息。另外,通知网址用于获取客户购买的完整交易详细信息,这些信息无法由客户访问,主要用于您的数据库或存储目的。


notify_url与配置文件中的IPN值相同...但是notify_url可以使其更加动态化,这样PayPal就会与notify_url通信,而不是配置文件中的IPN URL。希望这样说清楚了。 - Malachi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接