2016-11-15 42 views
0

我在PayPal中有一些與我的notify_url有關的問題。握手很好,但更新我的數據庫的代碼不起作用。因此,爲了調試,我使用了return.php url來輸出一些數據,並嘗試調試並回顯問題所在。PayPal notify_url無法通過strcmp驗證

這裏是我做的,到目前爲止,調試(上return.php)

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

echo "<br>test REQ: ".$req."<br><br>";; 

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 


$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 

if (!$fp) 
{ 
    echo "FP NOT WORKIGN"; 
} 
else 
{ 
    echo "FP WORKIGN<br><br>"; 

    fputs ($fp, $header . $req); 

    while (!feof($fp)) 
    { 
     echo "whie: YES<br>"; 
     $res = fgets ($fp, 1024); 
     if (strcmp ($res, "VERIFIED") == 0) 
     { 
      echo "verified<br>"; 

      if($status == "Completed") 
      { 
       echo "<br>####### completed<br>"; 
      } 
     } 
    } 
} 

我的結果是我得到REQ的回聲,我得到FP工作的回聲,我得到的回聲「,而YES 「5次,但我沒有」VERIFIED「的回聲。所以它似乎腳本沒有通過if (strcmp ($res, "VERIFIED") == 0)

我現在卡住了,我該如何解決這個問題?不知道什麼是錯的

這是我的$ REQ的迴音(如果它可以幫助調試)

test: cmd=_notify-validate&mc_gross=1.00&protection_eligibility=Ineligible&payer_id=3EW5DFETD3E4L&tax=0.00&payment_date=15%3A35%3A43+Nov+14%2C+2016+PST&payment_status=Completed&charset=windows-1252&first_name=test&mc_fee=0.33¬ify_version=3.8&custom=1000%40%40Katia%40%40213+st-louis%40%40lemoyne%40%40quebec%40%40j4r+2l3%40%40Canada%40%401%40%40CAD%40%400%40%401.00&payer_status=verified&business=louisefrigon1-facilitator%40gmail.com&quantity=1&payer_email=louisefrigon1-buyer%40gmail.com&verify_sign=AFcWxV21C7fd0v3bYYYRCpSSRl31AchhgWj8TBE3e7K7SSx6jHwconuT&txn_id=6E11719159210262F&payment_type=instant&last_name=buyer&receiver_email=louisefrigon1-facilitator%40gmail.com&payment_fee=&receiver_id=LMCZ83V6LRE4S&txn_type=web_accept&item_name=Superfood+Powder&mc_currency=CAD&item_number=&residence_country=CA&test_ipn=1&handling_amount=0.00&transaction_subject=&payment_gross=&shipping=0.00&merchant_return_link=click+here&auth=A1CZ8ecFDP.O-dZHCSU6ouq8Gxn8qrDXHyoUX9qI-CEmFlvuS1Rq8FlqPmP8dCqlTffcxTJX84-huLEvRi5C.fA 

回答

0

fgets()結果包括換行符,但"VERIFIED"沒有一個換行符。比較之前,您需要將其剝離。

$res = trim(fgets($fp, 1024)); 

還有使用strcmp(),如果你只是想測試兩個字符串是否相等,只需使用==沒有意義的。

if ($res == "VERIFIED") { 
    ... 
} 

但是不要自己嘗試執行HTTP協議,請使用curl

$req = 'cmd=_notify-validate&' . http_build_query($_POST); 
$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $req); 
$res = curl_exec($ch); 
if ($res == "VERIFIED") { 
    echo "verified<br>"; 
    if($status == "Completed") 
    { 
     echo "<br>####### completed<br>"; 
    } 
} else { 
    echo "$res<br>"; 
} 
+0

好吧,我改變了這一點,我回應了我的$ res。我得到res = HTTP/1.0 400錯誤請求。這是爲什麼 ?我究竟做錯了什麼? – user3011784

+0

我不確定。當我在今年早些時候將代碼切換到使用SSL時,我使用'curl'重寫了它,而不是手動執行HTTP協議。 – Barmar

+0

,你會有一個示例代碼,我可以使用...如果捲曲更容易...我不在乎...只要我得到它的工作;) – user3011784