2016-12-05 49 views
2

我正在使用这种贝宝形式(付款是好的)的订阅计划,并没有得到任何IPN通知,但是当我使用paypal生成的标准贝宝形式一切都与IPN通知是好的。有没有办法用这种形式获得IPN?谢谢如何在同一表单中使用Paypal IPN通知和notify_url?

这是我的表格。如果我从这个表单中删除notify_url,我只能获取notify_url或IPM上的数据。

PS>主要问题!有没有办法使用ipn + notify_url?例?

<form action="https://www.paypal.com/a-bin/webscr" method="post" target="_top"> 

     <!-- Identify your business so that you can collect the payments. --> 
     <input type="hidden" name="business" value="[email protected]****.***"> 

     <!-- Specify a Buy Now button. --> 
     <input type="hidden" name="cmd" value="_xclick-subscriptions"> 

     <!-- Specify details about the item that buyers will purchase. --> 
     <table> 
      <tbody><tr> 
       <td> 
        <input type="hidden" name="on1" value="Mobile/Cell Phone number:"><strong>Mobile/Cell Phone number:</strong> 
       </td> 
       <td> 
        <input type="text" maxlength="200" name="os1" required=""> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <input id="item_name" type="hidden" name="item_name" value="kp4"> 
        <input id="item_number" type="hidden" name="item_number" value="1"> 
        <label>Subscription Plans</label> 
       </td> 
       <td> 
        <!-- <input type="hidden" name="a3" value="5.00"> --> 
        <input data-name="kp4" data-id="1" type="radio" name="a3" value="0.01" checked=""> 0,01 /month <br> 
        <input data-name="kp5" data-id="2" type="radio" name="a3" value="0.02"> 0,01 /month <br> 
        <input data-name="kp6" data-id="3" type="radio" name="a3" value="0.03">0,01 /month <br> 
        <input data-name="kp7" data-id="4" type="radio" name="a3" value="0.04> 0,01 /month <br> 
        <input data-name="kp8+" data-id="5" type="radio" name="a3" value="0.05"> 0,05 /month <br> 
        <input type="hidden" name="p3" value="1"> 

        <input type="hidden" name="t3" value="M"> 
        <input type="hidden" name="src" value="1"> 
        <input type="hidden" name="sra" value="1"> 
        <input type="hidden" name="custom" value="ORG"> 
       </td> 
      </tr> 
     </tbody></table> 
     <!-- Specify Currency Code --> 
     <input type="hidden" name="currency_code" value="USD"> 
     <input type="hidden" name="no_shipping" value="1"> 
     <input type="hidden" name="rm" value="2"> 

     <!-- Specify URLs --> 
     <input type="hidden" name="notify_url" value="***payment-success.php?site_name=ORG"> 
     <input type="hidden" name="cancel_return" value="****payment-cancel.php"> 
     <input type="hidden" name="return" value="***payment-success.php"> 

     <input type="image" name="submit" border="0" src="https://www.paypalobjects.com/en_US/i/btn/btn_subscribeCC_LG.gif" alt="PayPal - The safer, easier way to pay online"> 
     <img alt="" border="0" width="1" height="1" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif"> 
    </form> 
+1

你有没有检查你的IPN历史?我担心你有一个自定义的通知URL,但只有一个监听器。 –

+0

@AnaheimElectronics感谢您的回答。但是,“只有一个听众”是什么意思?据我所知我的通知IPN网址用于贝宝帐户中的每个通知。我在哪里可以阅读有关听众的内容?我可以在历史中看到,我错过的通知是通过PayPal发送的,但我没有在我的转储中看到它们,但其他人在那里。我正在使用3个网站,其中一个PayPal帐户和一个IPN通知网址。但是没有看到我的测试IPN支付为0.01 $ – SERG

+0

您的'notify_url'需要接受一个POST列表,并且不会失败处理它们。对于'return'和'notify_url'使用相同的页面没有太大意义。但是你当然可以使用动态'notify_url':我已经做了好几年了。 – EJP

回答

3

PS>主要的问题!有没有办法使用ipn + notify_url? 示例?

简而言之:没有

可你想要的结果可以实现吗? 是的

这一直困扰着贝宝多年的事情,仍然如此。

有一种非常流行的方法(对于那些知道)来解决这个使用PHP和卷曲,并由Codeseekah分发。 (不附属)

概念

一个单一的IPN的网址是设置贝宝通知您 支付的应用。 IPN处理程序代码将PayPal的有效载荷广播到您可能有选择性地或批量使用的其他IP地址 。

  • 多宝IPN的URL现在可以
  • 无需更改任何IPN代码,除非它通过IP过滤请求
  • 可以集中IP过滤到广播IPN,这意味着更容易维护时,PayPal的IP范围变化
  • 可以集中记录
  • 可以排队和转播如果卫星(所有其他IPN的网址)都无法访问

守则

这IPN广播代码是在PHP,但概念是不特定语言。只需简单地移植代码,它就可以做得很好,甚至更好。

<?php 
    /* 
    * This is a PayPal IPN (Instant Payment Notification) broadcaster 
    * Since PayPal does not provide any straightforward way to add 
    * multiple IPN listeners we'll have to create a central IPN 
    * listener that will broadcast (or filter and dispatch) Instant 
    * Payment Notifications to different destinations (IPN listeners) 
    * 
    * Destination IPN listeners must not panic and recognize IPNs sent 
    * by this central broadcast as valid ones in terms of source IP 
    * and any other fingerprints. Any IP filtering must add this host, 
    * other adjustments made as necessary. 
    * 
    * IPNs are logged into files for debugging and maintenance purposes 
    * 
    * this code comes with absolutely no warranty 
    * https://codeseekah.com 
    */ 

    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 */ 
    $ipns = array(
     'mystore' => 'http://mystore.com/ipn.php', 
     'myotherstore' => 'http://mybigstore.com/paypal_ipn.php', 
     'myotherandbetterstore' => 'http://slickstore.com/paypal/ipn.php' 
    ); 

    /* Fingerprints */ 

    if (/* My Store IPN Fingerprint */ 
    preg_match('#^\d+\|[a-f0-9]{32}$#', $_POST['custom']) /* Custom hash */ 
    and $_POST['num_cart_items'] == 2 /* alwayst 1 item in cart */ 
    and strpos($_POST['item_name1'], 'MySite.com Product') == 0 /* First item name */ 
) $urls []= $ipns['mystore']; /* Choose this IPN URL if all conditions have been met */ 

    if (/* My Other Store IPN Fingerprint */ 
    sizeof(explode('_', $_POST['custom'])) == 7 /* has 7 custom pieces */ 
) $urls []= $ipns['myotherstore']; /* Choose this IPN URL if all conditions have been met */ 

    /* My Other And Better Store IPN Fingerprint */ 
    $custom = explode('|', $_POST['custom']); 
    if (
    isset($custom[2]) and $custom[2] == 'FROM_OB_STORE' /* custom prefixes */ 
) $urls []= $ipns['myotherandbetterstore']; /* Choose this IPN URL if all conditions have been met */ 

    /* ... */ 


    /* 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(); /* Thank you, bye */ 

    /* 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'; 
    } 
?> 

完整的文章是https://codeseekah.com/2012/02/11/how-to-setup-multiple-ipn-receivers-in-paypal/

注:笔者非常活跃,回复所有问题。