2013-12-16 60 views
1

我已經構建了一個應用程序,該應用程序向PayPal發送一個包含登錄用戶的GUID的通知url,購買完成後調用該url,並且在驗證之後,用戶數據庫條目將purchased列從0更新爲1.PayPal的生產工作與沙盒不同

然後,用戶單擊返回到應用程序按鈕,然後基於purchased列顯示高級功能。

我在沙盒中過去幾個月一直在測試這個。 100%的測試時間(包括此問題後),購買完成後顯示高級選項卡。

客戶非常興奮,並且繼續前進到生產。我已經建立IPN與完全相同的URL,除了從www.sandbox.paypal.com切換到www.paypal.com並將沙箱業務列出的帳戶更改爲個人業務外,我幾乎完全沒有改變。

這個問題是,按鈕現在不顯示,直到,你刷新屏幕。點擊之前按預期工作的「返回到應用程序」按鈕,現在不顯示高級選項卡。一旦我點擊刷新 - 然後顯示。如果我把所有的東西都切換回沙箱設置,繁榮 - 它再次正常工作。

這裏是現在購買按鈕的代碼與生產賬戶:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="buynowForm" target="_top"> 
<input type="hidden" name="cmd" value="_xclick"> 
<input type="hidden" name="business" value="ACCOUNT EMAIL"> 
<input type="hidden" name="lc" value="US"> 
<input type="hidden" name="item_name" value="Product"> 
<input type="hidden" name="amount" value="10.00"> 
<input type="hidden" name="currency_code" value="USD"> 
<input type="hidden" name="button_subtype" value="services"> 
<input type="hidden" name="no_note" value="1"> 
<input type="hidden" name="no_shipping" value="1"> 
<input type='hidden' name='notify_url' value='http://app.com/purchase/<?php echo $data[0]['uid'] ?>'> 
<input type='hidden' name='return' value='http://app.com/'> 
<input type="hidden" name="rm" value="1"> 
<input type="hidden" name="cbt" value="Return to Product Plus"> 
<input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHosted"> 
<input type="submit" class="hidden-print visible-print" border="0" name="buysubmit" value="Click For Product Plus" alt="Click for Product Plus"> 
<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"> 

,這裏是上面叫工藝路線:

$app->post('/purchase/:uid', function ($uid) use ($app) { 

$request = Slim::getInstance()->request(); 
$inputs = json_decode($request->getBody()); 
$db_conn = conn(); 

$req = 'cmd=_notify-validate'; 
    foreach ($_POST as $key => $value) 
    { 
     if (get_magic_quotes_gpc()) 
     { 
      $_POST[$key] = stripslashes($value); 
      $value = stripslashes($value); 
     } 
     $value = urlencode($value); 
     $req .= "&$key=$value"; 
    } 

    $url = "https://www.paypal.com/cgi-bin/webscr"; 
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req); 
    $result = curl_exec($ch); 
    curl_close($ch); 

    if (strcmp ($result, "VERIFIED") == 0) 
    { 
     $sql_st = 'UPDATE `user_data` SET `purchased` = 1 WHERE uid=:uid'; 

      $sql = $db_conn->prepare($sql_st); 
      if ($sql->execute(array('uid'=>$uid))) { 
      $data = array('status' => "Ok"); 
      } else { 
      $data = array('status' => print_r(mysql_error())); 
      } 
    } 
    else 
    { 
     // Did Not Process IPN Properly 
    } 

}); 

真的希望這只是事情對我而言難以置信的愚蠢。任何幫助/指導表示讚賞。

+0

技術支持,順便說一句,在這裏沒有任何幫助。仍然不確定如何解決。在滯後或隊列中找不到任何東西,可能導致速度減慢。感覺非常難倒。 –

+0

這令人難以置信的令人沮喪。測試也是有問題的,因爲唯一的測試方法是使用沙箱(我認爲是這樣)。如果測試的唯一方法是沙箱,並且它完美地工作,那麼它應該在生產中工作...... UGH! –

+0

它似乎是即時付款通知不是即時的。似乎需要大約10-15秒,最有可能在隊列中。在解決問題的過程中,希望儘快報告。 –

回答

0

基本上這裏的解決方案是其中一個選項 -

  1. 構建完成的次要方法 - 換句話說,該IPN是不是防禦所購買升級軟件的第一線。我所有的東西都在工作,但IPN(notify_url)調用的時間太慢,無法立即升級。將它們返回到執行升級然後重定向的頁面。

  2. 將升級後的功能存儲在不同的路線後面 - 這是PayPal的建議。基本上,請有app.com/basic和app.com/upgraded。這不是很理想,我也不建議它作爲一個永久的解決方案。

總結 - 這是PayPal已知的問題。沙箱和生產工作流程基本上不同 - 不是按功能或API,而是在使用中 - 生產級別帳戶受到的打擊更多,處理通知所用的時間也更慢。

希望這可以幫助別人。

+0

這是一個指向相同問題的鏈接 - http://www.warriorforum.com/main-internet-marketing-discussion-forum/201089-paypal-ipn-delays-question.html –