2011-09-14 89 views
1

有沒有辦法來驗證之前,貝寶支付進行訂單之前支付的一種方式?
php paypal。驗證接受的付款

我用我自己的購物車。 當客戶點擊提交訂單,我重定向上的其他網頁呼叫的用戶,PayPalRedirect.php

PayPalRedirect.php

<form name="paypalform" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"> 
<input type="hidden" name="cmd" value="_cart"> 
<input type="hidden" name="upload" value="1"> 
<input type="hidden" name="invoice" value="<? echo $idInvoice; ?>"> 
<input type="hidden" name="business" value="[email protected]"> 
<input type="hidden" name="notify_url" value="http://mydomain.com/catalog/IPNReceip"> 


<? 
    $cpt = 1; 
     foreach($ordering as $k => $v) 
     { 
     ?> 
      <input type="hidden" name="item_name_<? echo $cpt?>" value="<? echo$v->Product->ProductNumber; ?>"> 
      <input type="hidden" name="quantity_<? echo $cpt?>" value="<? echo $v->Qty; ?>"> 
      <input type="hidden" name="amount_<? echo $cpt?>" value="<? echo $v->Price ?>"> 
      <? 
      $cpt++; 
     } 
    ?> 


<input type="hidden" name="currency_code" value="CAD"> 
<input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with PayPal - it's fast, free and secure!"> 
</form> 

我用這個JavaScript提交表單時頁面已加載:

<script> 
document.forms.paypalform.submit(); 
</script> 

此時一切正常。用戶重定向到PayPal頁面並且可以登錄到PayPal然後支付訂單。

我在這一點問題。是否有與貝寶的方式在我的身邊來調用Web服務(例如:http://mydomain.com/ValidatePayment.php),並通過SHOPING車,貝寶收到確認價格是正確的所有項目。如果價格不正確,我想回復paypal支付無效並取消交易。所有這些在客戶點擊paypal頁面之前。 如果有可能,我該怎麼做?

非常感謝

+1

你的邏輯逃脫,我驗證一個事務處理沒有進行交易? – 2011-09-14 22:38:11

+0

我的英語是VErrry很糟糕,那可能是問題所在。在簡歷中。我只是想確保沒有人可以在發佈到貝寶之前更改商品價格的價值。我想要阻止的方式是,當客戶點擊PayPal上的PayNow時,如果PayPal可以打電話給我的網站並給我他收到的項目,然後我可以回答PayPal詢問:「是的所有項目的價格是正確的「還是」不是價格不正確「。如果我發送消極的,我想停止交易..我希望它更清楚。 –

+0

貝寶建議您在收到貝寶付款確認時檢查付款金額是否正確。請參閱下面的答案。除了確認付款金額外,您還應該檢查付款是否已清除。貝寶還會向您發送有關付款是否已清除或正在等待的信息。 – jdias

回答

4

我不認爲有可能做你想做的事。一旦您將客戶轉交給PayPal,他們將處理付款並在最後向您發送確認。

如果你想確保客戶支付正確的金額,你應該檢查PayPal發送給你的確認。

您可能知道Paypal有兩種支付確認機制 - PDT和IPN。

PDT依賴於客戶端回來給你的網站在付款後。一旦客戶進行支付,Paypal將向您發送一份包含交易細節的PDT消息。這些信息可用於向客戶顯示收據。問題在於客戶在付款後立即關閉瀏覽器。如果發生這種情況,您可能永遠不會收到PDT消息。

IPN不依賴於客戶端回來到您的網站上。客戶每次付款時,Paypal都會向您發送一封含有交易詳情的IPN信息。

您可以使用其中之一或兩者來確認付款已完成。而且您還可以檢查付款是否符合您期望的金額。

看,我在我的網站使用流量之下:

1 - 客戶按下按鈕進行支付與PayPal

2 - 我的網站發送客戶貝寶與交易的細節

3 - 貝寶處理付款

4 - 一旦付款完成,貝寶將發送客戶端返回到我的網站與PDT消息。

5 - 我的網站向PayPal發送確認信息,檢查PDT信息是否合法,並且來自Paypal。

6 - 貝寶發回的消息與交易的所有細節,包括支付的價格。

7 - 我的網站檢查貝寶的確認消息並顯示收據在屏幕上我的客戶

8 - 貝寶也將發送IPN消息一次支付我的賣家賬戶進行。

9 - 當我的網站收到IPN消息時,它會發回一條消息給PayPal,以確認該消息是合法的並且源自PayPal。

10 - 我的網站會檢查Paypal發回的確認信息,確認付款是正確的。

請注意,在大多數情況下,我會從Paypal(一個PDT和一個IPN)收到兩條消息。這沒關係,因爲我跟蹤每筆交易,並且如果我收到了一筆已經標記爲已付款的交易的IPN,我只需放棄IPN消息。

請注意,如果您收到PDT消息,您確實不需要IPN消息。不過,我建議你實施這兩種方法,以防止在貝寶有機會將他發回您的網站之前客戶端關閉瀏覽器。

在這兩個郵件(PDT和IPN)中,Paypal會告訴您付款是否已清除。正如您可能知道的那樣,某些付款類型在提交到Paypal後幾天纔會清除。貝寶建議您在付款清除前不要運送產品。一旦支付清除,PayPal將向您發送另一個IPN消息。

我的網站上有兩個腳本 - 一個處理PDT消息,另一個處理IPN消息。處理付款確認時它們非常相似。看下面的例子:

$req = 'cmd=_notify-synch'; 

$tx_token = $_GET['tx']; 
$auth_token = "enter your own authorization token"; 
$req .= "&tx=$tx_token&at=$auth_token"; 

// post back to PayPal system to validate 
$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 ('http://www.sandbox.paypal.com', 80, $errno, $errstr, 30); 
// If possible, securely post back to paypal using HTTPS 
// Your PHP server will need to be SSL enabled 
// replace www.sandbox.paypal.com with www.paypal.com when you go live 
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 

if (!$fp) 
{ 
    // HTTP ERROR 
} 
else 
{ 
    fputs ($fp, $header . $req); 
    // read the body data 
    $res = ''; 
    $headerdone = false; 
    while (!feof($fp)) 
    { 
     $line = fgets ($fp, 1024); 
     if (strcmp($line, "\r\n") == 0) 
     { 
      // read the header 
      $headerdone = true; 
     } 
     else if ($headerdone) 
     { 
      // header has been read. now read the contents 
      $res .= $line; 
     } 
    } 

    // parse the data 
    $lines = explode("\n", $res); 
    $keyarray = array(); 
    if (strcmp ($lines[0], "SUCCESS") == 0) 
    { 
     for ($i=1; $i<count($lines);$i++) 
     { 
      list($key,$val) = explode("=", $lines[$i]); 
      $keyarray[urldecode($key)] = urldecode($val); 
     } 
     $firstname = $keyarray['first_name']; 
     $lastname = $keyarray['last_name']; 
     $itemname = $keyarray['item_name']; 
     $amount = $keyarray['payment_gross']; 
     $invoiceid = $keyarray['invoice']; 
     $profileid = $keyarray['subscr_id']; 
     // check the payment_status is Completed 
     // check that txn_id has not been previously processed 
     // check that receiver_email is your Primary PayPal email 
     // check that payment_amount/payment_currency are correct 
     // process payment 
     // show receipt to client 
    } 
} 

我希望這可以幫助。請隨時提出後續問題。

祝你好運!

+0

不錯的解釋。如果付款金額不正確,我將能夠退還客戶,並讓他知道付款金額不正確。再次感謝。 –

+0

您也可以將paymentaction設置爲'授權'並結合上述技術。這樣你甚至不必退還這筆錢。您可以分別使用DoCapture或DoVoid API簡單地捕獲和/或使事務失效。 – Robert

+0

感謝羅伯特,我會試一試,然後回來給你一個我正在做的更新。再次感謝所有。 –