如何以相同的形式使用Paypal IPN通知和notify_url?

时间:2016-12-05 19:29:17

标签: paypal paypal-ipn

我正在使用这样的PayPal表格(付款没问题)用于订阅计划而且没有得到任何IPN通知,但是当我使用由paypal生成的标准PayPal表格时,所有IPN通知都可以。有没有办法通过这种形式获得IPN?感谢

这是我的表格。如果我从此表单中删除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="info@****.***">

        <!-- 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 个答案:

答案 0 :(得分:3)

  

PS&GT;主要问题!有没有办法同时使用ipn + notify_url?   实施例

简而言之:

但是你能达到预期的效果吗?的

多年来,这一直困扰着Paypal,但仍然存在。

有一种非常流行的方法(对于那些知道的人)使用php和curl解决这个问题,并由Codeseekah分发。 (不隶属)

  

概念

     

为PayPal设置单个IPN URL以通知您的应用程序   付款。 IPN处理程序代码将PayPal的有效负载广播给其他人   您可以选择性地或批量使用的IPN网址。

     
      
  • 现在可以使用多个PayPal IPN网址
  •   
  • 除非按IP过滤请求,否则无需更改任何IPN代码
  •   
  • 可以将IP过滤集中到广播IPN中,这意味着当PayPal的IP范围发生变化时更容易维护
  •   
  • 可以集中记录
  •   
  • 如果无法访问卫星(所有其他IPN URL),则可以进行排队和重播
  •   

守则

此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/

注意:作者非常积极并回答所有问题。