2016-12-05 75 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/

注:筆者非常活躍,回覆所有問題。