Paypal多个IPN设置

时间:2012-12-22 10:03:00

标签: php paypal-ipn

当使用IPN让我们说3个网站时,我并不是100%清楚这一点,如果有知识的人可以根据我的情况向我解释这一点,我会很感激。

我已经设置了我的sanbox测试业务帐户以使用IPN侦听器:site1.com/listener.php(工作正常)。

我想知道如何使用相同的paypal帐户为我的其他网站设置更多的监听器。

在我的方案中,我正在为所有网站使用仅订阅付款

问题1: ipn_notification_url 变量。 这个变量,如果设置,在付款时告诉paypal,总是使用它作为监听器ipn url?例;如果订阅失败或类似的事情,当下一次付款时?

因此,当paypal需要IPN我的监听器时,它将使用变量中的监听器而不是帐户配置文件设置中的设置URL?或者,此变量是否仅用于处理时的实际付款?

问题2: 是否可以区分网站,如果需要有一个主监听器,处理转发到正确的监听网址?示例:custom = userId,receiver_id = Sitename

问题2实际上类似于问题1. POSTED变量是否会从我的订阅中自动进行的初始付款 STICK到付款 。因此,当paypal需要向我发送IPN更新时,它将始终使用我的变量集中的url初始付款?

感谢您对此的任何启发。

2 个答案:

答案 0 :(得分:3)

您可以通过表单中的隐藏输入元素提供三个URL,其名称为:

  1. notify_url:这是此次购买的所有通知
  2. 的网址。
  3. return:这是成功完成结帐时用户将返回的网址。
  4. cancel_return:这是取消PayPal结账时用户将返回的网址。
  5. 因此,如果您在按钮中使用notify_url,则每个网站,每个按钮,甚至每个按钮渲染都可以有所不同,如果您有这样的用途。

    请注意,notify_url会覆盖您在“付款偏好设置”中设置的内容。

    关于(2),您还可以提供rm变量,如下所示:

    0:用户通过GET返回 1:用户通过GET返回,没有付款变量。 2.通过PUT返回用户,返回所有支付变量,即作为按钮发送给PayPal的回显。

    我不清楚0和1之间的区别。

    请参阅PayPal HTML Variables

    编辑在我现在无法找到的SO的另一个答案中,PayPal人员声明您可以在notify_url本身传递任意参数,该参数将以您发送它们的方式返回。

答案 1 :(得分:3)

我从http://codeseekah.com/找到了这个脚本,它可以让你设置多个PayPal IPN监听器。它允许您过滤通知,这意味着您可以根据您设置的条件发送给不同的侦听器(非常有用!):

<?php

    ini_set( 'max_execution_time', 0 ); // Do not abort with timeouts
    ini_set( 'display_errors', 'Off' ); // Do not display any errors to anyone
    $urls = array(); // The broadcast session queue

    // List of IPN listener points ** ADJUST THESE TO POINT TO YOUR LISTENERS
    $ipns = array(
            'first' => 'http://www.yourwebsite1.co.uk//paypal/ipn.php',
            'second' => 'http://www.yourwebsite2.co.uk//paypal/ipn.php',
            'third' => 'http://www.yourwebsite3.co.uk//paypal/ipn.php'
        );

    // ** ADJUST THESE CONDITIONS TO FILTER 
    if($_POST['txn_type']!='cart') $urls []= $ipns['first']; // Choose this IPN URL if all conditions have been met
    if(isset($_POST['auction_buyer_id'])) $urls []= $ipns['second']; // Choose this IPN URL if all conditions have been met
    $urls []= $ipns['third']; // maybe this one is always sent to

    // Broadcast
    if ( !sizeof($urls) ) $urls = $ipns; // No URLs have been matched
    $urls = array_unique( $urls ); // Unique, just in case

    // Broadcast (excluding IPNs from the list according to filter is possible
    foreach ( $urls as $url ) broadcast( $url );

    header( 'HTTP/1.1 200 OK', true, 200 );
    exit();

    // Perform a simple cURL-powered proxy request to broadcast
    function broadcast( $url ) {

        // Format POST data accordingly
        $data = array();
        foreach ($_POST as $key => $value) $data []= urlencode($key).'='.urlencode($value);
        $data = implode('&', $data);

        // Log the broadcast
        file_put_contents('_logs/'.time().'.'.reverse_lookup( $url ).'-'.rand(1,100), $data);

        $ch = curl_init(); // Initialize

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, count($data));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        curl_exec($ch); // Execute HTTP request
        curl_close($ch); // Close
    }

    function reverse_lookup( $url ) {
        global $ipns;
        foreach ( $ipns as $tag => $_url ) {
            if ( $url == $_url ) return $tag;
        }
        return 'unknown';
    }
?>

只需定制您需要的部分(使用** s),将其保存在文件中,例如名为“multiple-paypal-ipn.php”,然后将其放在您的一台服务器上。然后在您的PayPal IPN网址设置(在PayPal中)中输入您刚刚放置它的完整网址,例如http://www.yourwebsite/paypal/multiple-paypal-ipn.php

这为我节省了大量的时间,希望对其他人有用!_g